diff --git a/AUTHORS b/AUTHORS index 2f8343c..2a7ab48 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,53 +1,154 @@ -Developers: +-- Developers -- + Mike K. Bennett Michael Curtis Jan Toenjes Diederik van der Boor Richard Conway Valerio Pilo + Antonio Nastasi + Ruben Vandamme + Sjors Gielen + Adam Goossens -Translations: - Arabic - Mohamed Aser - Youssef Chahibi - Brazilian Portuguese - Mauricio Rother - Darlan Campos - 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 + Ma'moun Diraneyya + + Brazilian Portuguese: + + Mauricio Rother + Leonel Freire + Sergio Rafael Lemke + Maurício Arozi Moraes + + Catalan: + + Jaume Cornadó + Adrià Arrufat + + 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 + Heimen Stoffels + + Estonian: + + Jyri Toomessoo + + Finnish: + + Markus Vuori + Joonas Niilola + Jussi Timperi + Antony Hussi + + French: + + Choplair + Vincent Fretin + Andrea Blankenstijn + Barthe Guillaume + Scias + + German: + + Jan Tönjes + Panagiotis Papadopoulos + + Greek: + + Panagiotis Papadopoulos + Dimitrios Glentadakis + + Hungarian: + + Páder Rezső + Pauli Henrik + + Italian: + + David Vignoni + Valerio Pilo + Vincenzo Reale + Andrea Decorte + + 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 + Manuel Ramírez + + 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 +185,26 @@ 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 + + Andrea Decorte + - Group selection in 'contact added user' dialog + + Dario Freddi + - Chat history dialog + KMerlin - Inspiration and assorted code @@ -95,5 +216,11 @@ Also tranks to: KScreensaver - Idle timer code - Liu Sizhuang - - P4-Context field support + BasKet + - Close-to-tray icon screenshot code + + Amarok + - Custom crash handler implementation + + Quassel + - KNotify not giving focus bug fix and KWin focus stealing prevention workaround diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0ab383a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,250 @@ +PROJECT( kmess ) + + +#### System checks #### + +# 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 ) + +# Check for KDE 4 +FIND_PACKAGE( KDE4 REQUIRED ) + +# Check for libxml2 +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' + 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 ) +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' + 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', 'libqca2-dev' and 'libqca2-plugin-ossl' + on openSUSE: 'libqca2' and 'libqca2-devel' + on Fedora: 'qca2' and 'qca2-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 +OPTION( WANT_XSCREENSAVER "Build with X11 screensaver auto-away support" ON ) +IF( WANT_XSCREENSAVER ) + MACRO_BOOL_TO_01( X11_Xscreensaver_FOUND HAVE_XSCREENSAVER ) + 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' + 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 ) +ENDIF( WANT_XSCREENSAVER ) + +# 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' + 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" ) + +# Check for libgif +INCLUDE( "cmake/giflib_hack.cmake" ) +MACRO_OPTIONAL_FIND_PACKAGE( GIF ) +MACRO_BOOL_TO_01( GIF_FOUND HAVE_LIBGIF ) +MACRO_LOG_FEATURE( GIF_FOUND "GIF" "Handwriting messages support" "http://sourceforge.net/projects/giflib/" FALSE "" +" Optional support to send handwriting messages compatible with Windows Live Messenger. + * You will need to install both the library and development packages of the GIF Library, giflib. + * Usually the package names for this library are: + on Ubuntu: 'libgif4' and 'libgif-dev' + on openSUSE: 'giflib' and 'giflib-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 #### + +INCLUDE( MacroLibrary ) +INCLUDE( KDE4Defaults ) + +ADD_DEFINITIONS( ${QT_DEFINITIONS} ${KDE4_DEFINITIONS} ) + +INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${LIBXML2_INCLUDE_DIR} ) + + +#### Define the app version number #### + +# 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.0beta2" ) + + +#### Define compiler flags #### + +# 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 -Wconversion + SET( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -Wall" ) + SET( CMAKE_CXX_FLAGS_DEBUGFULL "-O0 -g3 -fno-inline -Wall -Woverloaded-virtual -Wsign-compare -Wundef" ) + # the -fvisibility option makes symbols also visible to the KDE backtrace dumper, but + # the MinGW gcc doesn't seem to understand it well, so only add it if we're not on win32 + IF( NOT WIN32 ) + SET( CMAKE_CXX_FLAGS_DEBUGFULL "${CMAKE_CXX_FLAGS_DEBUGFULL} -fvisibility=default" ) + ENDIF( NOT WIN32 ) +ENDIF( CMAKE_COMPILER_IS_GNUCXX ) + + +# Define the default build type +# Possible values: +# - none +# - release +# - debug +# - debugfull (even fewer optimisations) +# - relwithdebinfo (release with debug info) +# - minsizerel (minsize release) +# Uncomment the next line to always force building in full debug mode +SET( CMAKE_BUILD_TYPE debugfull ) + +# Enable the KMess debug output when compiling a debug build +IF( CMAKE_BUILD_TYPE STREQUAL debugfull OR KMESS_DEBUG_OUTPUT EQUAL 1 ) + SET( KMESS_ENABLE_DEBUG_OUTPUT "1" ) +ELSE( CMAKE_BUILD_TYPE STREQUAL debugfull OR KMESS_DEBUG_OUTPUT EQUAL 1 ) + SET( KMESS_ENABLE_DEBUG_OUTPUT "0" ) +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" ) +ELSE( KMESS_ENABLE_BINRELOC EQUAL 1 ) + SET( KMESS_ENABLE_BINRELOC "0" ) +ENDIF( KMESS_ENABLE_BINRELOC EQUAL 1 ) + +# Disable LikeBack if not needed +IF( KMESS_DISABLE_LIKEBACK EQUAL 1 ) + SET( KMESS_DISABLE_LIKEBACK "1" ) +ELSE( KMESS_DISABLE_LIKEBACK EQUAL 1 ) + SET( KMESS_DISABLE_LIKEBACK "0" ) +ENDIF( KMESS_DISABLE_LIKEBACK 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" ) +ENDIF( NOT CMAKE_INSTALL_PREFIX ) + +IF( CMAKE_USE_CPACK EQUAL 1 ) + MESSAGE( STATUS "Enabling the CPack package target..." ) + # source: http://www.vtk.org/Wiki/CMake:Packaging_With_CPack + INCLUDE( InstallRequiredSystemLibraries ) + # the installer will be named ${PACKAGENAME}-{VERSIONMAJOR}.{VERSIONMINOR}.{VERSIONPATCH}-win32.exe. + # the installer will say "Welcome to the ${INSTALL_DIRECTORY} Setup Wizard and install to ${INSTALL_DIRECTORY} too, and + # put the program in start menu under the ${INSTALL_DIRECTORY} name. + # it will ask if ${PACKAGENAME} should be put in PATH. + SET( CPACK_PACKAGE_NAME "KMess" ) + SET( CPACK_PACKAGE_DESCRIPTION_SUMMARY "KMess (package description)" ) + SET( CPACK_PACKAGE_VENDOR "The KMess team" ) + SET( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README" ) + SET( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING" ) + SET( CPACK_PACKAGE_VERSION_MAJOR "1" ) + SET( CPACK_PACKAGE_VERSION_MINOR "0" ) + SET( CPACK_PACKAGE_VERSION_PATCH "0" ) + SET( CPACK_PACKAGE_INSTALL_DIRECTORY "KMess" ) + IF( WIN32 AND NOT UNIX ) + # There is a bug in NSI that does not handle full unix paths properly. Make + # sure there is at least one set of four (4) backslashes. + SET( CPACK_GENERATOR "NSIS" ) + SET( CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/data/icons\\\\hi32-app-kmess.png" ) + SET( CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\kmess.exe" ) + SET( CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} KMess (display name)" ) + SET( CPACK_NSIS_HELP_LINK "http:\\\\\\\\kmess.org" ) + SET( CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\kmess.org" ) + SET( CPACK_NSIS_CONTACT "project@kmess.org" ) + SET( CPACK_NSIS_MODIFY_PATH ON ) + ELSE( WIN32 AND NOT UNIX ) + SET( CPACK_STRIP_FILES "bin/kmess" ) + SET( CPACK_SOURCE_STRIP_FILES "" ) + ENDIF( WIN32 AND NOT UNIX ) + + SET( CPACK_PACKAGE_EXECUTABLES "kmess" "KMess" ) + INCLUDE( CPack ) +ENDIF( CMAKE_USE_CPACK EQUAL 1 ) + +#### Other settings #### + +# Generate config-kmess.h +CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/config-kmess.h.in ${CMAKE_CURRENT_BINARY_DIR}/config-kmess.h ) +INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} ) + +# continue in directories +ADD_SUBDIRECTORY( src ) +ADD_SUBDIRECTORY( po ) +ADD_SUBDIRECTORY( data ) +ADD_SUBDIRECTORY( doc ) + +# Also add the tests if compiling in development mode +IF( CMAKE_BUILD_TYPE STREQUAL debugfull AND KMESS_DEBUG_OUTPUT EQUAL 1 ) + ADD_SUBDIRECTORY( tests ) +ENDIF( CMAKE_BUILD_TYPE STREQUAL debugfull AND KMESS_DEBUG_OUTPUT EQUAL 1 ) diff --git a/ChangeLog b/ChangeLog index 437eec8..c1a0c33 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,16 +1,2708 @@ ---- 1.5.2 released --- +--- 2.0beta2 released --- + +2009-05-10 (dazjorz) + * Re-added check for getSessionInfo() (or participants > 1) in contactJoined. + +2009-05-10 (Pano) + * Merged an updated Italian translation by Andrea Decorte. + * Merged an updated Finnish translation by Antony Hussi. + * Merged an updated Catalan translation by Adrià Arrufat. +2009-05-10 (Ruben) + * Fixed bug in Konqueror plugin. Thanks to Pano. + * Added Dutch translation for Konqueror Plugin. + +2009-05-09 (Ruben) + * Fixed bug causing the "Away Message" Dialog to appear twice. Bug reported by Pano. + +2009-05-09 (Pano) + * Merged an updated German translation. + +2009-05-08 (Pano) + * Merged an updated Brazilian Portuguese translation by Maurício Arozi Moraes. + +2009-05-08 (dazjorz) + * The "contact joined" is now always shown, even if it's the first message + etc. + * Removed all tags around the strings again... (Sorry translators!) + * Added a piece of code for CPack in CMakeLists, so we can build an installer + for Windows and possibly OS X. + * Let the build process only link in libgif if it was found. + * Skip installing the message handler on Windows, because it makes debug + output disappear there. + +2009-05-07 (Pano) + * Merged an updated Brazilian Portuguese translation by Maurício Arozi Moraes. + +2009-05-07 (dazjorz) + * Fixed searching for a contact with a contact with MSN+ tags in his name in + the InvitedDialog, it now searches through the cleaned string instead of + through the formatted string. + * Fixed the Individuals group also displaying the number of online contacts. + * Merged a slightly altered patch by Ralesk, which now *correctly* splits the + string also for languages like Arabic. + * Made the languages list in LikeBack bold, because it tends to be ignored. + * Made the first given language in LikeBack actually the first listed language. + +2009-05-06 (dazjorz) + * Split string in kmessview, needed for an Arabic translation which + apparantly needs to make the difference between a count of 1 or != 1 for the + 'online' part too. + +2009-05-05 (Pano) + * Merged an updated Dutch translation by Heimen Stoffels. + +2009-05-04 (Pano) + * Merged an updated Dutch translation by Sander Pientka. + * Merged an updated German translation. + +2009-05-03 (Pano) + * Updated the KMess handbook a little + +2009-05-03 (Diederik) + * Fixed automatic reconnecting when network manager is initialized at KDE login. + +2009-05-03 (dazjorz) + * Merged a patch by me and Valerio, which disables the inks and winks button + if the contact doesn't support the respective feature (also keeping in mind + the WLM inks bug). + * Fixed crash when quitting KMess after doing the testMsnPlusInteractive() + test. + +2009-05-02 (Pano) + * Merged an updated Dutch translation by Sander Pientka. + +2009-05-01 (dazjorz) + * Removed the last > and } from a link if there is no < or { in it. + * Fixed behaviour of the pre-wordwrapper if the string that is currently + being wrapped ends inside a HTML entity. + +2009-04-28 (Pano) + * Merged an updated Brazilian Portuguese translation by Maurício Arozi Moraes. + * Merged an updated Catalan translation by Adrià Arrufat. + * Merged an updated Greek translation by Dimitrios Glentadakis. + +2009-04-28 (dazjorz) + * Fixed #460 with the help of Ed Schouten: encoding issues in the chat + history dialog. They were caused by a QByteArray being converted to a + QString. + * Modified the notice when no logs could be found for a contact, and added + another notice when no logs could be found and chat logging is disabled. + +2009-04-28 (Adam) + * Require the user to enter a friendly name for an account before saving or updating + * Display a console warning in MsnNotificationConnection if we try to set an empty friendly name: ignores + setting empty friendly names now. Stops the NS booting us with a 209 error. + +2009-04-27 (Pano) + * Added tooltips to strings in the account settings that lacked them + +2009-04-27 (Valerio) + * Fixed sorting of Away and Idle contacts in the contact list: now idle ones are always shown above + away ones. + * Added warning message in chat when an handwritten message can't be sent or received. + * Enabled by default the "Hide notifications when busy" option. + +2009-04-27 (dazjorz) + * Implemented workaround for KWin bug: clicking buttons in knotify popups + wouldn't give a window focus, and kwin focus stealing prevention was blocking + focus asking; now kmess workarounds the prevention and gives itself focus. + * Implemented maximum length for the Personal Message input, based on + research on the max length WLM 8.5 and 2009 (chat window only) will display. + * Fixed documentation in account.h, account.cpp, addcontactdialog.cpp, + kmessdbusadaptor.h, filetransferp2p.cpp, application.h, + httpsoapconnection.cpp, offlineimservice.cpp, msnnotificationconnection.cpp, + msnobject.h, kmessshared.cpp and likeback.h. + +2009-04-26 (Valerio) + * Fixed chat session restarting. + * Fixed LikeBack's introductory dialog box. + +2009-04-25 (sifcenter) + * Fixed sending of oim when the user has a long nickname. The server accepts friendly name up to 48 chars. + +2009-04-24 (Pano) + * Merged an updated Traditional Chinese translation by the Tryneeds-Chinese Translation Platform. + +2009-04-22 (Valerio) + * Fixed sending long offline messages. + * Fixed ampersands displayed incorrectly in chat tab labels. + +2009-04-22 (Pano) + * Merged translations to the kmesssendplugin.desktop file. + * Merged an updated Dutch translation by Heimen Stoffels. + * Synced the translators section of the manual with the AUTHORS file. + +2009-04-21 (Diederik) + * Small fix of r4660 (disabling buttons). winks also require multi-packet, and wlm bug tests for 1-on-1 chat. + +2009-04-21 (Valerio) + * Disable the Winks and/or Handwriting buttons if any contacts in a chat don't support it (or we can't + send those). + * Show the contact list tooltips even if the window doesn't have focus. + * Improved cleaning up of SOAP connections after a disconnection. + * Improved the timers to detect login process timeouts. + * Fixed zooming in chat. It won't properly "zoom" now, but simply scale the font. + +2009-04-21 (Adam) + * LikeBack welcome message no longer displays if the LikeBack bar is disabled: the message doesn't make + sense without the bar so best not to show the message in this case. + * Fixed some compile time warnings. + +2009-04-21 (Pano) + * Merged an updated French translation by Scias. + * Merged an updated German translation. + * Merged an updated Italian translation by Andrea Decorte. + +2009-04-20 (Adam) + * Removed an unused variable in chat.h left over from a reverted commit + * Select the correct menu entry for contact picture display size on startup. + +2009-04-19 (dazjorz) + * Added notice in likebackdialog why we want users to specify their e-mail + address. + * Made e-mail address enabled by default. + * Made LikeBack send new comments in utf-8. + * Added a warning when you try to send an ink to a WLM 8.5 client with ISF + support; this doesn't work now. + +2009-04-19 (Valerio) + * Fixed the Contact List widget rendering again. + * Improved the SOAP server redirection system. + * Added workaround for Qt development versions > 4.5.0, to allow connecting again. + * Improved a bit the looks of the Contact List and Account Settings. + * Removed many languages from the LikeBack dialog. + * Made LikeBack's feedback dialog to be non-modal. + * Added default label in the Contact Added User dialog when the contact's friendly name is unknown. + * Added new wink receiving messages, shown when receiving winks which don't carry a name. + * Made non-interactive data transfers really quiet: no more errors will be shown in chat for random + picture transfers. + +2009-04-18 (sifcenter) + * Polished a bit the code of chat class. + * Fixed an issue in the chatmaster code: The switchboard could be still "active" for the kmess and for the NS server, + but the remote contact could be disconnected by network problem. When the contact came back online again and continue to chat + with the user the new switchboard is not attached to the chat. The issue for the moment is managed by createChat. + Please be attention to this issue because we lost messages ( we can view the messages received only + on debug messages but not in chat ). Refer to the code to understand well what happens. + +2009-04-18 (dazjorz) + * Fixed libxml parsing errors: now removing invalid characters which may not + appear in XML strings in ChatMessageStyle. + +2009-04-17 (dazjorz) + * Made KMess only save passwords when a change is detected. Fixes this bug on + the forums: http://www.kmess.org/board/viewtopic.php?p=10373 + * Fixed a very rare crash in DirectConnectionPool. + +2009-04-17 (Valerio) + * Fixed MimeMessage bug, which caused text messages containing a string used in P2P and multipart + messages to be interpreted as binary messages. + +2009-04-16 (dazjorz) + * Added gif encoding support, fixes bug #409. + * Fixed some ink cropping bugs and made inks look more smooth. + * Added libgif as a dependency to KMess. + * Added support for receiving application/x-ms-ink messages. (though kmess + will assume it's gif) + * Fixed sending ink messages to Live Messenger 8.5: Now sending headers in + the "right order". (yeah, as if there's something like order in these... f*** you MS) + * Added '+' symbol as an allowed character in e-mail addresses in the + RichTextParser. + +2009-04-16 (Adam) + * In an offline messaging session nudges/winks will now cause a switchboard refresh if the contact in the session + has come online. + +2009-04-15 (sifcenter) + * Switched to reference variables in some code of contact* classes. + +2009-04-14 (sifcenter) + * Use UnAckedMessage* instead of UnAckedMessage in QHash of SB, that stores all unacked messages, to avoid + using of MimeMessage copy costructor when unAckedMessages_.remove() is called. + +2009-04-14 (Valerio) + * Fixed the scrollbar background in the contact list window. + * Fixed incorrect detection of ticket expiration time. + * Disabled "connection problem" message, it was too unreliable with some clients, most notably WLM. + +2009-04-13 (Valerio) + * Fixed a tiny HTML encoding issue in the chat XML. + * Another huge set of improvements to the Chat History Dialog: + - The generation of chat logs from the XML files is now threaded. + - Generation can be interrupted to look to the chats with another contact. + - The UI doesn't block and makes it visually clear that it's loading stuff. + - It reacts better to invalid chat logs ("No chats" is shown). + - Message date and times are correctly shown according to the account settings. + - Removed the "Do not filter" checkbox as it was pretty much useless. + +2009-04-13 (sifcenter) + * Fixed an issue on add emoticon dialog: the emoticon preview wasn't update correctly. + * Fixed the press of enter key on CL: the chat wasn't opened. + * Don't submit the request the changing of the name of one group if the new name is the same of the old one. + +2009-04-13 (Pano) + * Merged an updated Catalan translation by Adrià Arrufat. + +2009-04-13 (Adam) + * Fixed startup state of Show History Box checkbox. Now matches account settings. + * Group chats now always open in their own chat tab. + * Removed a useless method from the ContactsWidget class. + +2009-04-12 (Ruben) + * Fixed crash when setting contact in ChatHistoryDialog. + * Added "Show Chat History" when rightclicking on a contact. + * Show a messagebox when trying to view the chat history of a contact without a history. + +2009-04-12 (Valerio) + * Changed the Transfers Window to a window from a dialog: it now appears quietly minimized. + * Changed the Transfer Entries appearance (removed their frames, made them to look more Oxygen). + +2009-04-12 (dazjorz) + * Fixed 'configure' to set debugging to be enabled when the build is + debugfull (CMake automatically does this anyway and also overrides the + --enable-debug-output option) + * Added data hash methods and variables to Emoticon, EmoticonTheme, + EmoticonManager. + * Fixed checking if we already have an emoticon: now using the data hash + instead of the shortcut. + * Fixed some warnings and failing asserts in DirectConnectionBase and P2PApplication. + * Removed unneeded hack from EmoticonTheme: html entities in emoticon + shortcuts (i.e. &) ) will not collide with ;) because it's in the regexp + as ;). + +2009-04-11 (Ruben) + * Disable reconnection timer when the user reconnects using the ChatWindow reconnect button. + +2009-04-11 (Pano) + * Merged an updated Catalan translation by Adrià Arrufat. + +2009-04-11 (sifcenter) + * Fixed the behavior of picture frame on initial view when the user doesn't want one picture. + * Fixed the behavior of kmess when the user remove his picture: now the right msnobject is sent. + * Fixed a regression introduced at r4564. + +2009-04-11 (Valerio) + * Refined a bit the new LikeBack Feedback Bar. + * Changed the Add Emoticon Dialog height. + * Fixed resizing of the chat style preview in the Account Settings. + * Fixed spacing between emoticons in the Emoticons Panel. + * Fixed saving the detected MSN client name. + * Prevented KMess from creating new chats just to report P2P error messages. + * Fixed showing the sent wink's name when it is not known. + * Fixed connecting to a new account without saving the password. + * Reorganized the View menu entries in the Contact List window. + +2009-04-10 (sifcenter) + * Added a workaroud to avoid the blinking of window on task bar also after the windows became active. + * Small improvements to code of dialogs classes. + * Added a small check to user pictures dialog to avoid corrupt view of list. + +2009-04-10 (Valerio) + * Improved LikeBack: + - Now it will also be enabled in release builds, but then the feedback bar + will be disabled by default. + - Moved the "Show Feedback Icons" checkbox from the feedback dialog to the + Help menu, along with the "Send a Comment" action. + - Made it to keep the "Show Feedback Icons" setting even when the + application version changes. + * Rewritten the LikeBack Feedback Bar, it works a lot more smoothly with all + window managers. + * Fixed chat window messages for winks sending and receiving. + * When sending a wink, added showing its name and the actual wink (if enabled). + +2009-04-10 (Pano) + * Merged an updated Italian translation by Andrea Decorte. + * Fixed/changed a bunch of strings + +2009-04-10 (dazjorz) + * Fixed the pending emoticon regexp sometimes matching zero-width space: It's + now (correctly) rebuilt every time the pendingEmoticons_ list is changed. + * If the zero-length match bug hits (it shouldn't from now on), more + information is outputted, and the code tries to save the situation instead of + going into an endless loop. + +2009-04-09 (sifcenter) + * Fixed the issue about the storing of passwords. Ticket #450. + * Improved the code on the settings classes. + * Restored the blinking of windows in task bar. + +2009-04-08 (dazjorz) + * Fixed KWallet failing to save passwords on crashes etc: the wallet is now + only opened when it's needed and closed after it has done its job. + +2009-04-08 (Adam) + * Added a submenu to the contact frame that can open different areas of the + contact properties dialog. + +2009-04-08 (Pano) + * Merged an updated Brazilian Portuguese translation by Sergio Rafael Lemke. + +2009-04-08 (dazjorz) + * Fixed warning in contactlist model + +2009-04-07 (dazjorz) + * Added group list checking: makes sure there are no duplicates and gaps in + the contact list. + * Fixed code from getGroupBySortPosition, it does not need to handle gaps + anymore now the contact list is corrected. + +2009-04-06 (dazjorz) + * Added a lot of hacks to fix contact list sorting issues: + * Fixed getGroupBySortPosition function to actually return the right group in + an unordered groups list + * Fixed slotGroupMoved (with some hacks...) to swap correctly with the + correct group. + * For this, added a getOldSortPosition to Group, to find out what group was + swapped with in the second run of slotGroupMoved. + +2009-04-04 (dazjorz) + * Fixed memory leaks in EmoticonTheme, ChatView, KMessInterface and + MsnStatus. + * Fixed bug in NetworkWindow where a slot may be called just after cleaning + up the object, causing incorrect, non-allocated memory to be read. + * Possibly fixed endian issues in + MsnNotificationConnection::loginSucceeded(). I say "possibly", since there's + currently no way to test for me. + +2009-04-04 (Adam) + * Fixed the order in which contacts are removed from a chat when a SB session closes. + * Contacts widget now behaves correctly when contacts leave a chat. + +2009-04-04 (sifcenter) + * Improved the code for the emoticon theme, emoticon manager and emoticon class. + * Fixed issue when the player finds only empty strings: now kmess doesn't show the multimedia pm in this case. + +2009-04-04 (Pano) + * Merged an updated Greek translation by Dimitrios Glentadakis. + +2009-04-03 (dazjorz) + * Fixed "invalid read error" from Valgrind in MsnNotificationConnection + * Fixed memory leak in ChatMessageView + * Fixed memory leak in AddEmoticonDialog + * Fixed and optimized friendly name handling in MsnObject + * Fixed two invalid free's in XAutoLock + * Fixed invalid free in xsltransformation.cpp + +2009-04-03 (Adam) + * Fixed changing a contacts groups via the contact properties when the properties were opened + via the chat window. + * Contacts widget now shows the correct contacts when the SB session is lost during a group chat. + * Chat window tabs and window title now show the correct participants when the SB session is lost + during a group chat. + * Chat window UI now enables properly when re-invited into a group chat after a disconnect. + * When the NS connection fails all group chats revert to 1-1 chats with the last remaining contact (like WLM). + * Fixed pending invitations: they now invite the correct contact. + +2009-04-03 (Valerio) + * Rewritten the Chat History dialog. It works now, and it is a lot faster also. + * Added a workaround for the connection issues of today. + +2009-04-02 (Valerio) + * Fixed time of arrival of Offline Messages, it was sometimes offset by many hours. + * Fixed showing delivery errors when sending offline messages. + * Fixed authentication tokens expiration time on login, they were sometimes expired at, + time of arrival, or about to expire. + * Fixed renewal of authorization codes after their expiration after 8 hours of connection. + * Fixed group chat reactivation after a reconnection. If you get reinvited to the same + chat, the tab will be reenabled. + +2009-04-02 (dazjorz) + * Fixed richtextparser bug: When a valid pending regexp was given that + matched empty strings, the program would freeze. This is a hotfix, the + pending regexps should actually be fixed. + +2009-04-01 (Adam) + * If the user adds themself to their contact list do not show that contact in the + invite contact dialog (can't invite yourself to a chat). + +2009-03-31 (dazjorz) + * Re-enabled -fvisibility=default if we're not on Windows (fixes KDE + backtraces) + +2009-03-31 (Adam) + * Disallow editing the current account's handle (prevents a crash) + * Fixed the buddy shortcut for the sound chooser in contact properties. + * Fixed a display issue with the group list in the contact properties dialog when that + dialog was opened through a chat. + * Added a little more debugging information to the Now Playing class, including the + player name from MPRIS. + +2009-03-31 (Valerio) + * Fixed chats started by contacts sometimes stealing chat window focus as if they were + user requested. + * Changed the color of presence messages. + * Fixed bug which allowed duplicates of the same presence message. + * Fixed drag and drop bug, it was possible to drop a contact to the Individuals group. + * Disallow dragging and dropping for contacts and groups which can't be moved. + * Fixed bug where the status of contacts in chat was not updated in tab names after + reconnecting. + * Merged patch by Andrea Decorte to fix contact names in the invite dialog. + * Fixed the Dim chat style. + * Improved session messages: don't show them if they would be the first message, and + always show them if the Show Session Messages option is enabled. + +2009-03-30 (dazjorz) + * Fixed compiling on Windows with MinGW. + +2009-03-30 (Pano) + * Replaced some specific words in the KMess manual with aquivalent KDE entities. + * Merged an updated Brazilian Portuguese translation by Maurício Arozi Moraes. + * Merged an updated German translation. + +2009-03-30 (Ruben) + * Contact notification sound chooser in ContactPropertiesDialog is now a KUrlRequester. + * Filetype of contact notification sound is now matched against Phonon backend capabilities. + +2009-03-30 (sifcenter) + * Improved the code of Contact Frame. + +2009-03-30 (Valerio) + * Removed the debugging network socket, and added Local Mode #ifs instead, to allow using the + new KMess Test Server. + +2009-03-29 (Pano) + * Merged an updated Traditional Chinese translation by the Tryneeds-Chinese Translation Platform. + * Synchronised the "Translators" section of the user manual with the AUTHORS file. + +2009-03-29 (sifcenter) + * Merged a patch from Andrea Decorte to "show copy music entry only when needed" in chat window context menu. + * Added the ability to disable all notification from one contact. + +2009-03-29 (Diederik) + * Improved the user manual, made small corrections and refrazes. + +2009-03-29 (Valerio) + * Fixed chat window search, broken a week ago (winks fixing). + +2009-03-28 (dazjorz) + * Fixed socket read errors never appearing. + +2009-03-28 (Valerio) + * Completely rewritten and updated the user manual for the 2.0 release. + * Fixed dragging and dropping contacts on special groups. + +2009-03-28 (sifcenter) + * Fixed the issue about the contact context menu in chat window. We must find out a method to leave transparent the + container but that leave also the "frame sunken" on picture. + * Fixed the frame for the unknow contacts when the user is in multi-chat. Ticket #420. + * Removed the transparent from stylesheet in contact widgets because it's the responsable of some problems at + Contact properties dialog, context menu, tooltip and all QWidgets childs. + * Fixed the size of images in contact list tooltip and in chat windows' contacts panale. Ticket #430. + * Merged the patch of fontknocker for the model list and improved a bit the code. + +2009-03-27 (Valerio) + * Removed an unneeded signal emission. + * Added interpretation for another OIM response fault. + * Finished drag&drop support - now works within the contact list and from it + to chat. + * Removed the "Search for contact" website links, I can't find these pages + anymore. + * Added a check to avoid showing the "close all tabs" confirmation dialog, if + the user wanted to close all tabs. + * Merged slightly changed patch by Andrea Decorte, adding the two missing actions + to the Contact Frame contextmenu: Copy Music and Properties. + +2009-03-26 (Pano) + * Merged an updated Spanish translation by Manuel Ramírez. + * Merged an updated Brazilian Portuguese translation by Maurício Arozi Moraes. + +2009-03-26 (dazjorz) + * Made offline contact chat windows reusable for when a contact comes online. + * Fixed wrong signal arguments in msnswitchboardconnection. + * Reverted removal of friendlyName.isEmpty() check, because the friendlyName + is an optional argument and setFriendlyName() outputs a warning if + friendlyName is empty. + * Merged patch by alexjp, fixing loading idle timer settings upon KMess + start. + * Fixed Kopete detection and fixed a typo in contactbase.h. + * Fixed incorrect signal connection in msnswitchboardconnection (signal from + offlineimservice). + * Fixed P2P transfer bug (#437) with Vale's help. + +2009-03-25 (dazjorz) + * Fixed failing assert caused by SOAP message handler. + * Merged patch by Andrea Decorte, which resets the quick retype index when + switching tabs (and keeps it local in the chat window). + * Made ctrl+down also work when there was no saved message - it's more + intuitive and less bug-prone that way. + +2009-03-25 (Adam) + * Fixed gradient problem with Oxygen again. + +2009-03-25 (Pano) + * Merged an updated French translation by Barthe Guillaume. + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + * Merged an updated German translation. + +2009-03-25 (Valerio) + * Fixed playing Winks. + +2009-03-24 (Adam) + * Fixed typing notifications not appearing in WLM 2009. + +2009-03-24 (dazjorz) + * Fixed soft hyphen showing up as a zero-width character in copy-pastes. + * Added abort() call to the crash handler, so KMess will coredump and a + possible second crash handler will help us with bughunting. + * Merged slightly altered patch by Andrea Decorte, fixing scrolling up and + down in message history in tabbed chats. + +2009-03-24 (Valerio) + * Fixed Winks button not being disabled when the network connection is lost. + * Fixed bug where chat messages sent to a contact who just went offline were being sent + again as normal messages if the contact in chat came back online. + +2009-03-23 (Adam) + * Work around possible Qt bug which resets not just font colour but font face as well when + message edit box is cleared. + * Truly empty groups (with no contacts) are hidden now if "Show Empty Groups" is disabled. + * Fixed bug where offline contacts were not included in the search + * Fixed gradient problem for the list of contacts in a chat window. Now displays properly + under KDE4 with Oxygen theme. + +--- 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 receiving pictures/emoticons/winks from WLM 2009. - * Using kapp->invokeBrowser() to open web pages, should fix opening the wrong browser. + * 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) + * Changed group name for special groups: only display the total number of contacts they contain. + * Fixed removing the last custom emoticon left a ghost emoticon until restart. + * Fixed the chat window display and positioning issues. + * Added an error dialog when trying to autoconnect to an account which doesn't have a saved password. + * Improved chat window raising. + * Fixed options box not being grayed out while connecting. + * Removed two options from the selectable contact list picture size menu. Also improved the pertinent methods names. + * Improved the groups tooltip on the contact list. + * Merged patch from Fontknocker: + - Added an option to block notifications when the status is set to Busy. + - Added an option to disable displaying of received winks. + - Added the date of the last received message from a contact. + +2008-08-08 (Valerio) + * Improved groups sorting, the order of special groups is now forced. + * Improved search, it now behaves in a sane way: + - Groups containing no results are hidden + - Groups containing results are always visible expanded + - Search is only performed within the currently visible items in the list + - The search bar is colored when using regular expressions (type regexp: first) + +2008-08-06 (Diederik) + * Changed the info message that you haven't added any custom emoticons. + * Make the order of menu items between the contact sidebar and contact list consistent. + * Made the contact properties dialog more compact (TODO item width of groups). + +2008-08-06 (Valerio) + * Added Solid support to detect whether a network becomes available and disconnects. + +2008-08-05 (Valerio) + * Added a third mode to display contact list items: Mixed. It sorts contacts by their group like the usual 'By Group' + setting, but this mode also groups together all Offline contacts. + +2008-08-02 (Valerio) + * Fixed bug causing contact list display issues when grouping contacts by online status. + * Fixed searching the contact list: it didn't show all groups, and the search was case sensitive. + +2008-08-01 (Valerio) + * Improved the contact list sorting method; the new way is the "right" one, and it's faster, also. + * Fixed possible model/view issues when disconnecting. + * Made KMess to remember the value of the 'Show Empty Groups' setting. + * Fixed groups being all hidden when the 'Show Empty Groups' setting was disabled. + +2008-07-31 (Valerio) + * Fixed initial status of the Connect button in the Initial View (it had no icon). + * Added to geek links the ability to parse the path on the server and simple query strings. + * Fixed displaying nicknames which contain HTML entities in the chat window. + +2008-07-30 (Valerio) + * Improved the contact list model, it's now a whole lot more compliant to the ModelTest class requirements. + * Fixed the group expansion in the contact list. + +2008-07-29 (Valerio) + * Improved contact list filtering code, fixed a possible issue with empty groups. + * Fixed a model issue when deleting a group. + +2008-07-28 (Valerio) + * Fixed adding groups with special characters. + +2008-07-27 (Diederik) + * Fix possible crashes with P2P support, happening when WLM is running for a long time: + - make sure temporary error handling applications are also deleted properly. + - enforced a more strict policy when to allow direct connections from contacts. + * Added SessionID to waiting state change debug output. + * Fixed case sensitive sorting of the contact list. + +2008-07-24 (Valerio) + * Fixed very long DNS lookups causing a wrong connection attempt after canceling the connection. + * Improved initial view. Changes: + - It will not be deleted everytime you connect/disconnect, but only when disconnecting after a successful login. + - It is now updated when you login via the menu/trayicon. + - It will not continue connecting silently anymore when you try to disconnect, or misbehave similarly. + * Added graying out the auto-away feature options when XScreenSaver support is not active. + * Fixed changing a group's name did not update the contact actions in the contactlist. + * Added option to hide empty groups in the contact list. + * Added error message for an undocumented server error (received when setting an already existing name to a group). + * Improved the server error message detection code, and added dialog boxes for non-fatal errors. + * Fixed moving contacts through groups did not update the group names and their visibility on the list. + +2008-07-19 (Valerio) + * Fixed failing assertion in the model. Thanks a lot to Montserrat for the report, patience and patch testing! + +2008-07-18 (Valerio) + * Don't disconnect when the contact list isn't modifiable. + * Fixed a possible crash while retrieving model data from the contact list view. Thanks jonas.thorell for the report! + * Fixed a possible crash while opening a chat with the "group chats by contact group" option active. Thanks admiral0 for the report! + +2008-07-15 (Valerio) + * Fixed the annoying contact status popups appearing right when logging in; they are now disabled for the first three + seconds. + * Fixed group sorting in the contact list. + * Fixed removal of non-empty groups causing a disconnection. + +2008-07-14 (Valerio) + * Heavily improved the contact list model. + Incidentally, improved contact list search: if you prepend "regexp:" to the search,you're now allowed to search by regular + expression :) + As of now, sorting when two contacts have the same status is a bit dumber, but not too resource-intensive. + - Notes: It now makes use of a filter/sort proxy model for all of our needs, which allows us to make its behavior + customizable in the future, if needed; a lot of mechanisms have been removed so the code should be faster other than + leaner; don't access model internal pointers if your index comes from the proxy. + * Improved a bit the Network Window: + - Added a warning to the Network Window if the user doesn't add a newline to the payload, and offer to add it automatically; + - Replace unix-like newlines with MSN Server (Windows) newlines in payloads. + * Fixed removal of contacts; the contact's item is now properly moved to one of allowed/removed special groups. + * Fixed right-click context menu actions in the contact list. + +2008-07-13 (sifcenter) + * Fixed the new line button signal on chat window. + * Cleaned the header include files on the classes in + - Dialog folder + - Utils folder + - Notification folder + - Contact folder + - Settings folder + - Chat folder + - Network folder + - Main folder + +2008-07-12 (sifcenter) + * Improved the now listening class. Resolved the issue with defunct forks. + * Improved the margin for kmess view layout in CL. Moved the status icon to bottom edge. Thanks to Alek for suggestions. + * Improved scrolling for CL. + * Fixed crash when click on "Edit Note" on one contact not in our CL. + +2008-07-12 (Valerio) + * Merged an improved version of the patch by Matteo Nardi: Implemented KWallet support. + * Fixed crash when opening a chat with a contact present in zero groups, when the "group tabs by contact in the same + group" option is selected. + * Improved the messages for file transfers displayed on the chat window. + * Improved file transfers, do not overwrite existing files when receiving files to a default directory. + * Removed from the Contact Frame the display pic for invited contacts, which have none. Also reformatted a bit of code there. + * Fixed regression, crash when some contacts join a group chat. + * Fixed the chat tabs' widget sizes when changing tabs, they are now uniform between tabs of the same + chat window; plus, the sidebar and message editor stay the size you tell them to be when resizing the chat window. + +2008-07-11 (sifcenter) + * Added ability to choose size of picture showed in contact list. Thanks to Matteo Nardi for suggestion. + * Renamed the string for "new email" over the CL. Thanks to Matteo Nardi for suggestion. + * Removed margin from kmess view layout and added a space between email icon and email string. + +2008-07-10 (Valerio) + * Fixed inability to reconnect after being disconnected. + * Fixed UTF-8 encoding issue when reading Amarok 1.4 songs. Thanks to Mikko and Jaska for the detailed report! + * Fixed keep-alive messages when the number of participants changes. + * Added defines to fine-tune the initial connection timers for the TCP socket, and increased the DNS resolve timeout + to 10 seconds, to bear with slow DNS queries taking over 5 seconds. + +2008-07-09 (Valerio) + * Hid file transfer accepting/rejecting/canceling links after clicking them. + * Added methods to open an Account Settings dialog at a specified tab. + * Added a notice label to the Custom Emoticon settings when none have been added yet. + * Improved the default behavior of the Close All Tabs warning, made the close all tabs action + the default. + * Fixed a wrong signal/slot connection. + * Fixed some warning messages in Account and improved recovery when the display pic is missing. + * Heavily improved email client options in the Global Settings: + - The KDE default mail client is selectable; + - The code to select the mail client at runtime is a lot better and shouldn't fail (the browser setting is improved as well); + - Using the Live Mail webmail on supported accounts can be disabled in favor of the specified mail client. + +2008-07-08 (Valerio) + * Fixed (possibly) a crash when restoring disabled chat windows on reconnection. + * Improved auto-message feature: a new automessage is sent every 30 sec if the contact keeps writing. + * Fixed crash due to circular calling when closing all tabs with Shift+Esc. + * Disabled unsupported UI items when doing offline chat sessions. + * Moved the warning which appeared when closing one tab to the close all tabs event. + * Added a confirmation message when an incoming file transfer is accepted. + +2008-07-08 (sifcenter) + * Added "Edit Notes" action to popup menu into contact frame. Ticket #270. + * Fixed the format of contact's name on invite menu. + * Little improvements in CL. Adjust the space between elements and set bold to groups text. + * Updated dbus interface for Amarok 2. Thanks to Mikko for the informations. + * Hided actions ( in contact frame menu ) to gain some space. + +2008-07-07 (Valerio) + * Added Now Playing support for Amarok 1.x, using the system's DCOP client. + * Made the notification popups to obey the text formatting option for the contact list. + * Moved some FormattedString methods out of inline, for better readability. + * Added two FormattedString enum values to obtain a string with regard to the chat or list text formatting option. + * Made KMess completely compatible with dark KDE color schemes. + * Added a Fresh-dark theme suitable for use with dark KDE color schemes. + +2008-07-06 (sifcenter) + * Fixed the kmess crash when the user close one chat on balloon notification on receive message, and after he try to click + on balloon. Thanks to Ruben for report. + +2008-07-05 (sifcenter) + * Hided actions ( contact menu on CL ) are disabled to gain some space. + * Improved the user pictures dialog. + +2008-07-04 (sifcenter) + * Added the dialog to choose previous avatar.Ticket #132. + * Merged patch by Ruben to improve the message on tabs closing. + +2008-07-04 (Valerio) + * Improved display picture selection. + - Accounts' DPs are now identified by hash instead of an arbitrary number, to avoid duplicates; + - Changed wording in the AccountPage and Account classes to be more consistent; + - Added a KMessShared method to obtain a file's hash, which could be more useful in the future. + * Improved initial view: when an account's settings are changed, update the view to reflect the + changes. + * Changed the main window caption to display "KMess - accountname" instead of "accountname - KMess". + This was necessary because chat windows could be confused with the main window when more than one + instance was running. + +2008-07-03 (sifcenter) + * Fixed the issue with personal avatar. The bug was been introduced when I fixed the problem with + unsupported file image downloaded by msnobject. + +2008-07-03 (Valerio) + * Improved tabbed chat shortcuts and behavior; + - Improved shortcuts system by using Qt native methods; + - Added shortcuts Ctrl+Tab and Ctrl+Shift+Tab to move through tabs, as in Firefox; + - Added shortcuts Alt+Right/Shift+Backspace and Alt+Right/Shift+Backspace to move through tabs; + - Added more and better warning dialogs when closing a tab and all tabs. + +2008-07-02 (Diederik) + * Implemented support for reverse direct connection invitations with picture transfers. + * Fixed warning message for bad direct connection preamble. + * Fixed allowing data fragments when the data preparation packet was rejected. + * Fixed choosing the proper server port for file/picture transfers. + * Fixed sending a decline message again when the user presses the cancel link twice. + * Fixed displaying a null character in the network window. + +2008-07-02 (sifcenter) + * Improved contact frame: added handle to popup menu and now the menu is showed also when + context menu is required on label of pm/friendlyname. Ticket #276. + * Fixed the receiving of avatars. The problem was if a jfif image was saved in png file + the QImageReader returns no supported format. + +2008-07-01 (sifcenter) + * Fixed the cleaned strings showed in rich text label: now the strings are escaped. + +2008-07-01 (valerio) + * Fixed a bug which prevented custom emoticon themes with non-PNG images from loading. + +2008-06-30 (valerio) + * Heavily improved the way MSN Plus! formatting is integrated in KMess. + * Fixed some more overseen issues with MSN Plus formatting. + * Fixed the way widgets are laid out on top of the Contact List. + * Made KMess to also save the contact list settings when saving an account's settings, for additional safety. + * Fixed loading the expanded status of the contact list groups, which often didn't work. + * Fixed opening local files from the Chat Window. + +2008-06-30 (sifcenter) + * Fixed the color for initialStatusLabel_ and removed the link and options box + when the user click on "connect" button. + * Removed useless loginView class and use only InitialView. Added also disconnect + button. Ticket #272. + * Continued work on MSN Plus integration: + - Removed rich text from friendlyname in "typing user" information. + - Removed rich text from contact's tooltip in the CL. + - Added rich text to popups. + - Added rich text to personal friendly name over the CL. + +2008-06-29 (valerio) + * Improved the Contact List model a bit. + * Fixed almost all compiler warnings. + +2008-06-29 (sifcenter) + * Merged patch by Ruben to add dbus interface to kmess. + * Fixed the possible invalid pixmaps loaded in contact properties dialog picture list. + * Fixed the sorting for groups. Maybe the user must be remove the group entries or entire + file: .kde4/share/apps/kmess/contact@email.com/contactlist . Ticket #262. + * Fixed the saving for formatting msn+ choice. + * Adjusted the layout of transfer entry. Ticket #269. + +2008-06-28 (sifcenter) + * Added Group switcher to contact properties dialog. Closed ticket #38. + * Continued work on MSN Plus integration: + - Removed rich text from friendlyname and pm in contact properties dialog. + +2008-06-27 (valerio) + * Continued work on MSN Plus integration: + - Fixed emoticon sizes in chat. + - Fixed the greediness of the tag parser. + - Removed the rich text from the contact list caption. + +2008-06-27 (sifcenter) + * Continued work on MSN Plus integration: + - Removed rich text from caption of tab and chat window. + - Removed rich text from contact frame and history combobox. + +2008-06-26 (valerio) + * Continued work on MSN Plus integration: + - Improved the Rich Text Parser engine with the original version of ChatMessageStyle's parseMsnPlus method, + which has been moved to the RTP itself as a static method; + - Started integrating rich text parsing in the chat and contact list; + - Added two options in the Account Settings to enable or disable formatting. + +2008-06-25 (sifcenter) + * Switched the glow effect into account display picture ( over CL ) from MouseButtonPressed + 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 + 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. + +2008-06-24 (sifcenter) + * Merged the patch by Ruben to hide/show the menu bars by pressing CTRL+M. + +2008-06-22 (Valerio) + * Made the errors at Miscellaneous Global Settings more user-friendly, by offering an automatic fix. + * Fixed the contact frame having empty music/message widgets when chatting with contacts not in list. + +2008-06-22 (sifcenter) + * Added the ability to write notes for a contact. Ticket #200. + * Added one patch for new status changer to keep the compatibility with qt 4.3. Thanks to Ruben for report. + * Reorganized the layout for initialView e loginView classes: added also the account picture. + * Fixed the flooding of server when the player play a song or is stopped. Thanks to Mikko for report. + * Fixed the position for picture smaller then 96x96 in the contact properties dialog and + switched the KSqueezedTextLabel to QLabel to avoid problem with richtext and resizing. + * Adjusted the layout of contact properties ( Information tab ) and added the ability to hide personal message + label if there isn't anyone. + +2008-06-21 (sifcenter) + * Added the ability to send ink with only drawed area. + +2008-06-20 (sifcenter) + * Reorganized the layout for main window. I have left commented the code for toolbar. Thanks to Tyler for the idea. + +2008-06-20 (Valerio) + * Made the errors at Miscellaneous Global Settings more user-friendly, by offering an automatic fix. + +2008-06-18 (sifcenter) + * Added the ability to store the contact last personal message. + * Fixed warning at InkEdit class. + +2008-06-17 (Valerio) + * Added an option to select a default directory where to put received files. + * Added an option to choose the interval of ports used for Peer to Peer (direct) file transfers. + * Fixed the Ink Message Editor active being left active in chats when disconnecting from MSN (you could still 'send' + messages). + +2008-06-17 (sifcenter) + * 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. + * Fixed another little issue with emoticon add dialog. + * Fixed the receiving of inks by switchboard in multi chat. + +2008-06-16 (sifcenter) + * Added the ability to switch the tabs with scroll wheel mouse. Ticket #243. + * Added the ability to view profiles with login into passport services. + * Added the ability to request the passport service with the language setted in account. + * Added the find action to context menu in chat view. + * Fixed a little issue with emoticon add dialog. + * Fixed the command menu "Show my profile". + * Fixed typo. Thanks to Ruben for report. + * Fixed the failed assert at chatwindow: the setWindowTitle was called before adding the first tab. + Moved one method from public to public slot type to avoid issue of one connection. + * Fixed the closing of one background switchboard when a chat window is opened. Ticket #174. + +2008-06-16 (Valerio) + * Fixed the account registration and activation links, they were being shown inappropriately. + * Changed the global email settings behavior. Now Live™ accounts will only access it via the site, + as there's no way to access it via 3rd party clients. Made the email settings page on par with the + browser settings. Also removed some unused parameters from the mail opening call in CurrentAccount. + * Removed the names of translators from the kmess translations file. + +2008-06-15 (Diederik) + * Fixed some window titles in the UI files, which ended up in the translations. + * Moved MsnObjectTransferP2P::getPictureFileName() -> KMessConfig::getMsnObjectFileName(). + * Removed unused includes for account.h, and fixed all fallout. + * Synced credits between main.cpp and the handbook. + * Renamed pictureReceived() signal to msnObjectReceived(). + * Avoid HTML code of the network window appearing in translations. + * Fixed network window tab titles, display the connection title again. + * Fixed inconsistent margins for setting dialog panes. All set to 0 like the KDE notification pane is. + Makes it look much better with different window styles too (like Windows XP). + * Move protected currentAccount_ field to the NS and SB classes. Makes the API less obscure too. + * Fixed ingroup tags of APIDOX headers + * Made all UI inheritances private. + * Fixed a crash in the contact sidebar when an "InvitedContact" left the chat. + +2008-06-15 (sifcenter) + * Switched the image showed into add emoticon dialog from static to movie. + Fixed also one bug when we edit one picture and then we try to add one. + * Fixed the method to authenticate in hotmail service. Now we use the new post method with sha1. + * Fixed the oim class when there are twnChallenge and lockKey in response. Updated also the product key/id. + * Fixed the issue with multichat: now the contact frame is removed and the tab caption is updated. + * Reimplemented the method to open directly the inbox and compose mail. + +2008-06-14 (sifcenter) + * Added a "thumbnail" type for winks. + * Added a close button to popups. + * Fixed the bug with opening of the email client on no hotmail/live accounts. + Maybe on the no live accounts the command URL is empty so the url is empty too. + Thanks to swiftscyth for report. + +2008-06-13 (Valerio) + * Fixed the very annoying bug which prevented emoticon and file transfers and which + closed the chat's connection repeatedly. + * Added a Close All Tabs menu action to the Chat Window, and keyboard shortcuts to: + close a tab (esc), close the whole window (shift+esc), and navigate between tabs + (alt+left/right). + +2008-06-13 (sifcenter) + * Added two algorithm: HMACSha1 and DeriveKey. They are used in MSNP15 SSO and + for access to hotmail ( I have committed they to try these with hotmail ). + * Fixed the focus for new chat opened by remote client. + * Fixed the saving of email/browser settings. Moved some code for open emails from + current account to kmessshared class. + +2008-06-12 (sifcenter) + * Added a right click menu to custom emoticons in sidebar. + * Added the class for parsing the msn plus string. Only for testing for the moment. + * Fixed the position of away auto-reply buttons. + +2008-06-12 (Valerio) + * Fixed giving focus to the wanted tab when opening a new chat. + * Fixed some ChatWindow's caption inconsistencies. + * Improved behavior of ChatWindow when exiting (do not disable then close the tabs). + +2008-06-11 (Diederik) + * Change order of pages in the global settings dialog. + Notifications seam more important to me then misc settings. + * Fix running 'maketrans', paths still referred to old source folders. + +2008-06-10 (valerio) + * Added an account settings option to control how tabbed chats will behave. + * Limited the maximum size of the tabs and improved their usability and appearance. + +2008-06-10 (Diederik) + * Fixed useles tabs appearing in the network window, KMESS_NET_CLOSE() calls is made in the MsnConnection now. + +2008-06-09 (valerio) + * Improved the encapsulation of typing contacts messages, moved all the algorithm in Chat, ChatWindow now + only displays what's told by the Chats. + * Also improved the Test Window behavior, it's working as a 'real' chat now. + * Added an highlighted color to tabs where contacts are typing. + * Cleaned up some more ChatMaster's code. The chat mixing bug should be gone. + * Tried another solution to avoid having an empty chatwindow without any tab in it. + +2008-06-08 (valerio) + * Merged the calls to retrieve a chat based on its participants into one. + * Enabled back the brightening of contact frames when they type. + +2008-06-07 (sifcenter) + * Added closing of tab on mouse middle button clicked. + * Added an alert icon on tab when receiving a message from contact. + * Rewrited some parts of contact list view delegate: fixed the repaint "infinite loop". + * Added the icons to tabs on network window: if there isn't one the close button is not showed. + * Removed the zoom in/out, font color/style buttons from toolbar. They are unless in 99% of the time :P. + +2008-06-07 (Diederik) + * Fixed a crash with tabbed chats, when receiving a custom emoticon in a new tab. + * Added version information to crash reports of KMess, KDE and Qt. + * Fix inconsistent naming of contactChangedMsnObject() vs contactChangeStatus(). + +2008-06-06 (sifcenter) + * Remove the tabBar when there is only one chat. + * Fixed the issue when close the first tab while there are some chats opened. + +2008-06-04 (Diederik) + * Fixed the double frame and typo in the contact properties dialog. + * Fixed a crash in debug builds for unknown contacts. + * Fixed displaying old contact names after login (name was not updated in the ILN command). + * Fixed a crash when a switchboard is being replaced, offlineImService was not initialized. + * Splitted the P2P base class, to make the code easier to understand and maintain. + +2008-06-04 (Valerio) + * Finished the work on tabbed chats. Now they are fully supported and used by KMess. + * Merged patch by Ruben to save the toolbars lock status. + * Fixed chats not working at all, the connection between the chat tab and the server was broken. + * Added chat window caption synchronization with the currently selected tab. + +2008-06-02 (Diederik) + * Fix compatiblity issues with the 'configure' and 'get-svn-version.sh' scripts in Mac OS X 10.4 which uses BSD commands. + * Fix compiling of KMess under Mac OS, the KWindowInfo classes are only available for X11 platforms. + * Apply some layout tweaks, which are not visible with Oxygen but are with the Windows XP theme. + +2008-05-31 (Valerio) + * Fixed receiving messages, the contact sidebar's picture didn't stop glowing. + +2008-05-24 (valerio) + * Changed name to the Chat Window Interface UI file. + * Moved *all* UI-related methods away from ChatWindow and into ChatWindowInterface. + * Made ChatWindow to inherit ChatView. + * Made the ChatMaster to manage ChatWindowInterfaces. + * Renamed the ChatWindow class to just "Chat". + * Renamed the ChatWindowInterface class to "ChatWindow". + +2008-05-24 (sifcenter) + * Fixed the connection for send button in chatview. + * Renamed the class AutoLoginView to LoginView. + +2008-05-23 (sifcenter) + * 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. + * Fixed the position of button in transfer dialog: thanks to Mikko for reporting. + * Fixed the missing arguments in contact added user dialog: thanks to swiftscythe for reporting. + * Fixed the missing connect for textChanged for messageEdit_. + +2008-05-23 (Valerio) + * Fixed sending chat colors, and improved receiving them. + * Improved groups sorting in the contact list, they are now ordered more like they were in KMess 1.5.1 . + +2008-05-22 (Valerio) + * Improved file format detection for new custom emoticon files. + * Added more debugging info to AddEmoticonDialog and changed the way the emoticon name is passed to the theme. + +2008-05-21 (Diederik) + * Fixed configure output message with path to build folder. + * Fixed possible passport login problem by putting the xmlns at the start of the tag. + * Fixed parent of network window warning dialog. + * Refactored HTTP soap connection code, support 'calldata' per request. + Makes SOAP requests robust if there are multiple parallel requests. + * fixed soap faults being processed in parseSoapResult() when the SOAP fault namespace prefix was different. + * Make sure errors in sub SOAP requests by the offline-im service are also handled. + +2008-05-21 (sifcenter) + * Fixed the position problem for buttons in contact properties dialog. + * Fixed the position problem for buttons in add emoticons dialog. + * Merged MasterOfNothing's patch for status label on chatwindow. + +2008-05-19 (sifcenter) + * Fixed the connection for invite button. + +2008-05-18 (Valerio) + * Moved the Sidebar code from Chat View to Chat Window, in preparation for a Tabbed Chat patch. + +2008-05-17 (Diederik) + * Make sure passwords are hidden in the network window. + * Improved configure script to avoid the 'cd' command. + +2008-05-14 (Diederik) + * Fix compiling if XScreensaver libs can't be found. + +2008-05-13 (Valerio) + * Merged an adapted version of K39's patch, reviewed the Chat Logging page of the Account Settings. + * Merged an adapted version of K39's patch, reviewed the Alerts page of the Account Settings. + * Merged an adapted version of K39's patch, reviewed the Chat Style page of the Account Settings. + * Merged an adapted version of K39's patch, reviewed the Chat Window. + * Merged an adapted version of K39's patch, reviewed the Account page of the Account Settings. + * Moved all config directory management and interaction to the KMessConfig class. + * Revised a bit the Chat Window structure and margins. + * Made Account Settings windows to be children of the Account Manager window if they are opened from there. + * Enabled again BinReloc support to the CMake scripts and to the configure wrapper. + +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. + * Make pthread library required for UNIX platforms only. + * Merged path by K39 to compile KMess on Windows. + +2008-05-12 (Valerio) + * Added an UI file to the Network Window. + * Modified the CMake file to completely avoid compiling the Network Window in user builds. + * Added the ability to manually send commands to the server in Network Window's selected tab. + +2008-05-10 (Valerio) + * Fixed a little issue with emoticon themes which prevented kmess from sending custom emoticons. + +2008-05-10 (sifcenter) + * Added the label with transfer rate and eta to file transfer entry. Added also an icon + that shows if the transfer is incoming or outcoming. + +2008-05-09 (sifcenter) + * Improved the sending of oims: now if there is a authentication error, the client requests + one new passport authentication. + +2008-05-09 (Valerio) + * Fixed the buttons in the Accounts Manager and a possible crash. + * Fixed the behavior of the extra options in the initial view, when the account name is unknown. + * Removed some signal forwarding methods, replaced with signal-signal connections. + * Moved the Email Settings to the global configuration dialog. + * Redesigned the Alerts page: it had way too many controls for a single page. + +2008-05-08 (Valerio) + * Added a KMessShared class, to contain globally useful stand-alone methods. + * Added option to choose a custom browser from the Global Settings. + +2008-05-08 (sifcenter) + * Improved the accounts manager page: now the accounts are showed with image, friendly name and + email like a card. + * Added the include "math.h" to msnswitchboardconnection.cpp to avoid issue reported here: + http://kmess.org/board/viewtopic.php?f=4&t=3181 + * Fixed the setting for personal image. + +2008-05-08 (Valerio) + * Improved account directories management; also new accounts should not get duplicated when edited. + * When using the TCP socket, avoid firing the disconnection signal twice. + * After a logout with an HTTP connection, the next login try connecting with TCP first. + +2008-05-07 (sifcenter) + * Added support to huge message sending ( max 10 chunks, 14000 bytes ). + * Added "Listening music" to copy menu. + * Improved the sending of huge messages: now the remote clients that don't support the + recieving of it, will receive the splitted message. + +2008-05-06 (Valerio) + * Rewritten the configuration system. It's now all based on KMessConfig. + While I was at it, I also have adjusted the preferences paths: account files are now entirely stored + in the account folder. + * Avoid reloading an emoticon theme if it is already. + * Simplified the InitialView constructor by removing a parameter, which will be obtained locally instead. + * Fixed account deletion, now the entire deleted account directory is destroyed. + * Fixed issue with new accounts, the 'remember account' option was not honored. + * Fixed issue with guest accounts, now they are correctly added to the Accounts Manager. + * Fixed new accounts weren't being added to the login screen list. + +2008-05-06 (sifcenter) + * Fixed the issue when the statusLabel shows one string larger than the aviable space. + * Fixed some labels: switched from AutoText to RichText. + +2008-05-05 (Valerio) + * Removed parentship between the main window and the settings dialogs. This should fix the window visibility + issues under KDE4. + * Removed the status enum from KMessInterface, which was an unneeded dependency and caused many recompiles. + * Fixed closing a disconnected connection causing debug log warnings. + * Fixed saving the contact list groups order. + * Removed three useless methods from class KMess; fixed the warnings when disconnecting from a guest account. + * Removed an old call to ContactList to set a contact offline, replaced it with the generic changeContactStatus() call. + * Added back the italicized font on the list for contacts which do not have us in their list. + * Added ability to Global Settings Dialog to load and save settings for all of its pages. + +2008-05-05 (sifcenter) + * Added the date to picture files. + * Added the button "clear cache" in the files picture browser. + * Added the notification dialog to global settings. + * Removed the notification dialog button from actions menu. + * Improved search bar: now is hidden by default and it can be called by option in action menu + or by pressing ctrl+f + * Fixed the issue with very long nick + +2008-05-04 (Diederik) + * Easy debugging by displaying error codes in the debug window too. + * Moved SOAP support methods to MsnConnection so these can be used for the SB code too. + +2008-05-04 (Valerio) + * Improved the account management. Added an AccountsManager singleton class which manages + all account-related events. This removes a lot of responsibility from the KMess class. + * Finished work on the Account Manager in the new Global Settings Window. + * Improved the Account Settings dialog's behavior. It will now refuse to close and save if the handle + is invalid. + * Improved a bit the management of the new account directories. + +2008-05-04 (sifcenter) + * Added a KLineEdit for searching contacts in contact list. + * Added the menu "Configure KMess" to the tray icon right-click menu. + * Fixed the issue when adding an invalid account name. + * Improved the sending of oims: now we can send them when we are invisible. + * Improved the sending of oims: use sendRequest instead of sendRawPostRequest. + +2008-05-03 (Valerio) + * Added a Global Settings dialog, along with a stub of an Account Manager, just to fill + the dialog with something. + +2008-05-03 (sifcenter) + * Added some controls for the errors returned in the soap reply for oim: + - Now there is only one lock key for all oims ( stored in current account ). + - The key will re-calculate if in the soap reply there are "Authentication Failed" and "LockKeyChallenge" entries. + - Now there is a feedback in chat window if there is a problem while sending one oim. + * Added tooltips to personal message and friendly name labels in the contact frame of the chat window. + * Added last seen entry to contact's extensions. It's added in one label on contact properties dialog. + * Added a Miscellaneous Settings dialog to Global Settings. It's a stub. + * 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: + - 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. + +2008-05-02 (Valerio) + * Added MSN-HTTP support. Now KMess can connect from behind those corporate firewalls + which only allow browsing the Web. + * Added a socket abstraction layer, adapted all socket code to use it. + * Unified all network-related error messages. + * Fixed the disconnection occurring when trying to chat with an online contact while + being invisible. + * Fixed the "i18n argument missing" warning text which was visible in Transfer Window entries. + +2008-05-02 (sifcenter) + * Change the location for data of account settings + * Change the location for data of contacts settings + * Added the KMessConfig class for retrive informations about configure location + * Added the ability to send Offline Messages to contacts, and to open chats with offline + and invisible contacts. + +--- 2.0alpha released --- + +2008-05-01 (Diederik) + * Final updates to release the alpha: 702 commits since the start of porting. + at subversion revision 3041. + +2008-05-01 (Valerio, Diederik, Sifcenter) + List of all new features not mentioned before: + * Fixed bug which prevented KMess from closing + * Added a log of contacts logins and logouts in the Contact List + * Added chatwindow reactivation when reconnecting + * Added the right-click Copy sidebar option to the contacts in the list, too + * Added automatic stack backtrace output in console if KMess crashes + * Added a wrapper "configure" script to CMake, to make transition easier + +2008-04-11 (sifcenter) + * Added ability to copy links from personal messages and friendlynames of the contacts. + +2008-04-10 (Diederik) + * Fix lost font color settings when using the chat window: + - settings were reset when opening the account settings + - current font color was not selected. + * Fix contact re-invites (chat resumes) to the chat when the first attempt failed. + +2008-04-06 (Diederik) + * Merged KDE 4 porting with trunk: + code porting complete and major are regressions fixed. + at subversion revision 2859. + +2008-03-28 (Valerio) + * Added count of online contacts in group names shown in the Contact List. + +2008-03-26 (Valerio) + * Added combobox to select which group to place new contacts in when adding them to the contact list. + +2008-03-26 (Diederik) + * Implement ink receiving inspired by a patch of sifcenter. + +2008-03-16 (Diederik) + * Improved client name detection, for both normal and third party clients. + * Move ContactExtension settings to a different config section. + +2008-03-13 (Diederik) + * Merged patch from Antonio Nastasi to have fast retype of the last sentence. + +2008-02-09 + * Most crashes and errors cleared away, simple chat messages work again: + see: http://www.codingdomain.com/blog/archives/19-KDE-4-porting-of-KMess.html + +2008-01-29 + * KDE 4 branch compiles again after 190 commits. + +2008-01-15 + * Start of KDE 4 porting as separate branch: + parallel in development of KMess 1.5.1 + at subversion revision 2338. + + +--- 1.5.2 branch --- 2008-08-03 (Valerio) * Fixed group sorting. @@ -47,7 +2739,7 @@ * Fixed a possible crash in PassivePopup (backported from KMess 2). ---- 1.5.1 released --- +--- 1.5.1 branch --- 2008-04-06 (Diederik) * Added a warning message for broken SOCKS implementations which could cause KMess to freeze. @@ -2485,3 +5177,4 @@ New Features (so I don't forget) an email's subject as well as sender. * Stopped deleting ContactActions - the source of much on-exit crashiness. * Ctrl+T can now be used to close the contact sidebar in the chat window. + diff --git a/Doxyfile b/Doxyfile index 1e01131..f3e1463 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1,14 +1,14 @@ -# Doxyfile 1.4.1-KDevelop +# Doxyfile 1.5.5-KDevelop #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = KMess -PROJECT_NUMBER = 1.5.2 +PROJECT_NUMBER = 2.0-beta2 OUTPUT_DIRECTORY = ./apidocs CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ @@ -25,19 +25,28 @@ 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 MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO +SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 2 -ALIASES = +ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -46,6 +55,7 @@ EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = YES +EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO @@ -57,16 +67,19 @@ SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = YES +SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO 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 -FILE_VERSION_FILTER = +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -76,22 +89,28 @@ 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 #--------------------------------------------------------------------------- -INPUT = ./kmess -FILE_PATTERNS = *.cpp *.h *.dox +INPUT = ./src +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.cpp \ + *.h \ + *.dox RECURSIVE = YES -EXCLUDE = *.moc *.moc.cpp *.moc.h +EXCLUDE = *.moc \ + *.moc.cpp \ + *.moc.h EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = */build-*/* -EXAMPLE_PATH = +EXCLUDE_PATTERNS = */build*/* +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 @@ -101,13 +120,15 @@ INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 4 -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- @@ -119,15 +140,20 @@ HTML_FOOTER = doc/apidocs_footer.html HTML_STYLESHEET = doc/doxygen.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +HTML_DYNAMIC_SECTIONS = NO +CHM_FILE = +HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = YES ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO +GENERATE_TREEVIEW = NONE TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -137,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 @@ -150,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 #--------------------------------------------------------------------------- @@ -164,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 @@ -177,54 +203,58 @@ 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 = -PREDEFINED = KMESSTEST KMESS_NETWORK_WINDOW -EXPAND_AS_DEFINED = +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = KMESSTEST \ + KMESS_NETWORK_WINDOW +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 = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = NO CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = NO DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO +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 9cab946..446d3f6 100644 --- a/FEATURES +++ b/FEATURES @@ -1,5 +1,41 @@ KMess Feature list ======================== +- 2.0 - +Support to receive and send Ink (hand-written) messages. +Support to send huge messages. +Options to copy a contact's email, name, message, listened music and links present in the name/message +List of contact events, such as logins and logouts. +Chat Windows can be used again when reconnecting. +Quick retype of previous sent messages, using Ctrl+Up/Ctrl+Down. +MSN connections over HTTP, to deal with corporate firewalls which only allow connections to browse the web. +Support to chat with offline and invisible contacts. +Support to search in the contact list. +Support to send bigger chat messages. +Option to choose the browser used to open web sites, Live Mail, and MSN support sites. +Option to manually send commands to the server in developer builds. +Support to group all chats in the same chat window (tabbed chatting). +Option to select a directory where all received files will be put. +Option to choose the interval of ports used for fast file transfers. +Option to keep short notes for each contact. +Support to MSN Plus text formatting. +Support for DBus remote application control. +Option to choose a previously chosen display picture. +Support for dark KDE color schemes. +More options to improve customization of the Contact List. +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. +Option to view contacts' Display Pictures in the contact list. +Option to enable spell checking in the chat windows. +Disable notification popups when there's a screen saver or a full screen application. +Added option to manually set your own MSN status to Idle. +When closing KMess to tray for the first time, a little screenshot of the notification area will help finding KMess' tray icon. + - 1.5 - Support to exchange (send and receive) custom emoticons and nudges. Receive-only support for winks and offline-im messages. diff --git a/INSTALL b/INSTALL index 4e791c3..b5b3d00 100644 --- a/INSTALL +++ b/INSTALL @@ -1,209 +1,61 @@ -Installation Tip: -================= +Installation Hints: +=================== -In order for KMess to work properly, it must be configured first. -Run the configure script like this: + NOTE: This package is used to build KMess from source code. + If you're looking for a simple way to install KMess, + take a look at http://www.kmess.org/download/. + NOTE: These instructions are meant for UNIX-like systems. If they don't + work for you, please tell us at http://www.kmess.org/board/. + For building on Windows, see this Wiki page: + http://trac.kmess.org/wiki/Compiling%20KMess%20for%20Windows + +To install KMess from this source package you need to create a separate +build directory first. It must be created outside the source folder. After +that, you must configure your build using cmake. + +To ease the building process, KMess comes with a 'configure' script that +creates the directory and runs CMake for you. To build this package, simply +run: + + cd kmess ./configure - -If the ./configure script completed with success, then type - make -and then, as root, type +To install on most systems, you can run: - make install + sudo make install -That's it. +If your system doesn't come with sudo, you can use: + su -c 'make install' +That's it! +Of course, building without the configure script is also possible: -Important: -========== + mkdir build + cd build + cmake .. + make + sudo make install -The configure script tries to detect your KDE3 directory automatically. -If configure fails to detect KDE, you should tell KMess which directory -to use. Basically, we're talking about the parent directory -of /share/apps/k~bunch of kapps~ - -Not doing this will result in emoticons being displayed -as text, and icons being displayed incorrectly as well. - -If configure tells you you're missing something that you think you -have installed on your system, you probably need to install the -"devel" version of that thing. i.e. If it tells you you're missing -libfam, install the libfam-devel rpm. - -More information can be found in the README file. -The following paragraphs below provide generic installation instructions: - - - -Basic Installation +Useful parameters: ================== - These are generic installation instructions. +The configure script automatically makes the right build for you. For a release (non-alpha or beta) +package, the configure script builds KMess in release mode; for an alpha or beta package, KMess will +run in debug mode. When something goes wrong, debug mode will help us find the cause, and fix it. :-) - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). +If you want to modify your build, you can try the following options to the configure script: - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. +--prefix=/usr - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + Install in the /usr directory instead. -The simplest way to compile this package is: +--build-type=(one of debug,debugfull,release,relwithdebuginfo,minsizerel) - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes a while. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Type `make install' to install the programs and any data files and - documentation. - - 4. You can remove the program binaries and object files from the - source code directory by typing `make clean'. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. + Tell CMake to build this specific build type. +Also consider running "ccmake" for an curses-interface to cmake. +ccmake only works after the build directory has been configured with cmake before. diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 70a6231..0000000 --- a/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -SUBDIRS = kmess po doc - -EXTRA_DIST = kmess.kdevelop admin AUTHORS COPYING ChangeLog INSTALL README TODO FEATURES kmess.lsm - -MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files - - - -# Code for standard deps -# (like regenerating configure) -include admin/deps.am -include admin/Doxyfile.am - diff --git a/Makefile.dist b/Makefile.dist deleted file mode 100644 index be59a86..0000000 --- a/Makefile.dist +++ /dev/null @@ -1,14 +0,0 @@ -all: - @echo "This Makefile is only for the CVS repository" - @echo "This will be deleted before making the distribution" - @echo "" - @if test ! -d admin; then \ - echo "Please recheckout this module!" ;\ - echo "for cvs: use checkout once and after that update again" ;\ - echo "for cvsup: checkout kde-common from cvsup and" ;\ - echo " link kde-common/admin to ./admin" ;\ - exit 1 ;\ - fi - $(MAKE) -f admin/Makefile.common cvs - -.SILENT: diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index a86041f..0000000 --- a/Makefile.in +++ /dev/null @@ -1,976 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = . -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/admin/Doxyfile.am \ - $(srcdir)/admin/deps.am $(srcdir)/config.h.in \ - $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ - TODO admin/compile admin/config.guess admin/config.sub \ - admin/depcomp admin/install-sh admin/ltmain.sh admin/missing \ - admin/mkinstalldirs admin/ylwrap -subdir = . -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -#>- html-recursive info-recursive install-data-recursive \ -#>- install-exec-recursive install-info-recursive \ -#>- install-recursive installcheck-recursive installdirs-recursive \ -#>- pdf-recursive ps-recursive uninstall-info-recursive \ -#>- uninstall-recursive -#>+ 6 -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive nmcheck-recursive bcheck-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -SUBDIRS = kmess po doc -EXTRA_DIST = kmess.kdevelop admin AUTHORS COPYING ChangeLog INSTALL README TODO FEATURES kmess.lsm -MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files -#>- all: config.h -#>+ 1 -all: docs-am config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -.SUFFIXES: -am--refresh: - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/admin/deps.am $(srcdir)/admin/Doxyfile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ -#>- cd $(srcdir) && $(AUTOMAKE) --gnu \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu Makefile -#>+ 14 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ - ( \ - cd $(srcdir) && $(AUTOMAKE) --gnu \ - ) || exit 1; echo ' cd $(top_srcdir) && perl admin/am_edit '; cd $(top_srcdir) && perl admin/am_edit && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile - cd $(top_srcdir) && perl admin/am_edit Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) -#>- cd $(srcdir) && $(AUTOCONF) -#>+ 2 - cd $(srcdir) && rm -f configure - cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) - -config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) stamp-h1; \ - else :; fi - -stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status config.h -$(srcdir)/config.h.in: $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f config.h stamp-h1 - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - mkdir $(distdir) - $(mkdir_p) $(distdir)/admin - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || mkdir "$(distdir)/$$subdir" \ - || exit 1; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="../$(top_distdir)" \ - distdir="../$(distdir)/$$subdir" \ - distdir) \ - || exit 1; \ - fi; \ - done - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) -dist-gzip: distdir - $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-tarZ: distdir - $(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\ - *.tar.bz2*) \ - bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' -distuninstallcheck: - @cd $(distuninstallcheck_dir) \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile config.h -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -#>- clean: clean-recursive -#>+ 1 -clean: kde-rpo-clean clean-recursive - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-hdr \ - distclean-libtool distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: install-data-local - -install-exec-am: - -install-info: install-info-recursive - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-info-am uninstall-local - -uninstall-info: uninstall-info-recursive - -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ - check-am clean clean-generic clean-libtool clean-recursive \ - ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-shar dist-tarZ dist-zip distcheck distclean \ - distclean-generic distclean-hdr distclean-libtool \ - distclean-recursive distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-data-local install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic maintainer-clean-recursive \ - mostlyclean mostlyclean-generic mostlyclean-libtool \ - mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-info-am uninstall-local - -$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in $(top_srcdir)/admin/cvs.sh $(top_srcdir)/admin/pkg.m4.in - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh acinclude_m4 - -$(top_srcdir)/configure.in: $(top_srcdir)/subdirs $(top_srcdir)/configure.files $(top_srcdir)/admin/cvs.sh - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh configure_in - -$(top_srcdir)/configure.files: $(top_srcdir)/subdirs $(CONF_FILES) - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh configure.files $(top_srcdir)/admin/cvs.sh - -$(top_srcdir)/Makefile.am: $(top_srcdir)/Makefile.am.in $(top_srcdir)/subdirs $(top_srcdir)/admin/cvs.sh - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh Makefile_am - -$(top_srcdir)/subdirs: $(top_srcdir)/Makefile.am.in $(top_srcdir)/admin/cvs.sh - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh subdirs - -# defining default rules for files that may not be present -$(top_srcdir)/Makefile.am.in: -$(CONF_FILES): -apidox-am-yes: - @if test \! -d "$(top_srcdir)/doc/common/" && test -z "$$DOXDATA" ; then \ - export DOXDATA=$(kde_libs_htmldir)/en/common ; \ - fi ; \ - abs_top_srcdir=`cd $(top_srcdir) && pwd` ;\ - test -d $(top_builddir)/apidocs || \ - ( cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ - --no-modulename --installdir=$(kde_libs_htmldir)/en \ - --no-recurse $(abs_top_srcdir) . ) ; \ - cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ - --recurse --no-modulename --installdir=$(kde_libs_htmldir)/en \ - $$abs_top_srcdir $(subdir) - -apidox-am-toplevel-yes: - @if test \! -d "$(top_srcdir)/doc/common/" && test -z "$$ADMIN" ; then \ - export DOXDATA=$(kde_libs_htmldir)/en/common ; \ - fi ; \ - abs_top_srcdir=`cd $(top_srcdir) && pwd` ;\ - cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ - --no-modulename --installdir=$(kde_libs_htmldir)/en \ - $$abs_top_srcdir - -apidox-am-no: - -apidox-am-toplevel-no: - -apidox: - @if test "$(subdir)" != "."; then \ - $(MAKE) apidox-am-@KDE_HAS_DOXYGEN@ ;\ - else \ - $(MAKE) apidox-am-toplevel-@KDE_HAS_DOXYGEN@ ;\ - fi - -install-data-local: install-apidox - -install-apidox: - @if test "$(subdir)" != "."; then \ - $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir)/html ; \ - if test -f $(top_builddir)/apidocs/$(subdir)/$(subdir).tag; then \ - echo $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/$(subdir).tag $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ - $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/$(subdir).tag $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ - fi; \ - if test -d $(top_builddir)/apidocs/$(subdir)/html; then \ - list=`ls $(top_builddir)/apidocs/$(subdir)/html`; \ - echo "installing $(top_builddir)/apidocs/$(subdir)/html" ;\ - for file in $$list; do \ - $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/html/$$file $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir)/html; \ - done; \ - fi; \ - else\ - if test -d $(top_builddir)/apidocs; then \ - $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs ;\ - list=`cd $(top_builddir)/apidocs && ls -1`; \ - echo "installing $(top_builddir)/apidocs/$$file" ;\ - echo "target directory $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs" ; \ - for file in $$list; do \ - if test -f $(top_builddir)/apidocs/$$file; then \ - $(INSTALL_DATA) $(top_builddir)/apidocs/$$file $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; \ - fi; \ - done ; fi; \ - fi - -uninstall-local: uninstall-apidox - -uninstall-apidox: - @if test "$(subdir)" != "."; then \ - if test -d $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); then \ - rm -rfv $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ - fi \ - else \ - if test -d $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; then \ - rm -rfv $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; \ - fi \ - fi - -install-apidox-recurse: install-apidox - @set fnord $(MAKEFLAGS); amf=$$2; if test -n '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; \ - for subdir in $$list; do \ - if grep '^include .*Doxyfile.am' $(srcdir)/$$subdir/Makefile.am > /dev/null ; then \ - echo "Installing apidox from $$subdir"; \ - if test "$$subdir" != "."; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) GENERATE_FLAG=no install-apidox-recurse) || exit 1; \ - fi ; fi ;\ - done; \ - fi - -.PHONY: apidox-am-yes apidox-am-no install-data-local install-apidox install-apidox uninstall-local uninstall-apidox uninstall-apidox apidox apidox-am-toplevel-no apidox-am-toplevel-yes - -# Local Variables: -# mode: makefile -# End: - -# Code for standard deps -# (like regenerating configure) -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=subdirs Makefile.in configure.in.bot configure.files config.h.in configure.in aclocal.m4 Makefile.dist Doxyfile kmess.spec configure.in.in acinclude.m4 configure Makefile.am - -#>+ 2 -docs-am: - -#>+ 7 -force-reedit: - \ - cd $(srcdir) && $(AUTOMAKE) --gnu \ - - cd $(top_srcdir) && perl admin/am_edit Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-recursive - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/NEWS b/NEWS index 97fd8b9..8b17caf 100644 --- a/NEWS +++ b/NEWS @@ -1,14 +1,214 @@ + +Changes between KMess 2.0-beta2 and 2.0-beta1: +-------------------------------------- +- completed drag&drop support. +- fixed quick retype. +- fixed winks playing and naming support. +- fixed disconnections after many hours of use. +- fixed losing KDE Wallet passwords. +- fixed typing notifications not appearing in WLM 2009. +- fixed long words breaking was breaking copy-pastes. +- fixed weird characters which were breaking the chat styles. +- fixed resending messages already sent as offline messages. +- fixed searching for offline contacts. +- fixed time of arrival of offline messages. +- fixed new chat windows or tabs opened by contacts sometimes stole focus. +- fixed contact list group sorting. +- fixed many memory leaks. +- fixed overflowing contact list background picture and color. +- improved the Chat History dialog and its integration with KMess. +- improved drag and drop support in contact list. +- improved the color of the less important contact status messages in chat. +- improved client detection support. +- improved handwriting message sending. +- improved the file transfers window's behavior. +- improved chat session management. +- improved the LikeBack buttons bar. +- updated English handbook. +- updated Arabic translation by Ma'moun Diraneyya. +- updated Brazilian Portuguese translation by Sergio Rafael Lemke. +- updated Brazilian Portuguese translation by Maurício Arozi Moraes. +- updated Catalan translation by Adrià Arrufat. +- updated Dutch translation by Heimen Stoffels. +- updated Dutch translation by Sander Pientka. +- updated Finnish translation by Antony Hussi. +- updated French translation by Barthe Guillaume. +- updated French translation by Scias. +- updated German translation by Panagiotis Papadopoulos. +- updated Greek translation by Dimitrios Glentadakis. +- updated Italian translation by Andrea Decorte. +- updated Spanish translation by Manuel Ramírez. +- updated Traditional Chinese translation by Yen-chou Chen. +- updated Traditional Chinese translation by the Tryneeds-Chinese Translation Platform. + +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 Brazilian Portuguese translation by Sergio Rafael Lemke. +- updated Dutch translation by Elve 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 tabbed chatting support! +- added offline messaging functionality. +- 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 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 block notifications when the status is set to Busy. +- added option to disable displaying of received winks. +- 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 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. + + +Changes between KMess 2.0-alpha and 1.5.1: +-------------------------------------- +- ported to KDE 4. +- added support to receive ink messages. +- added ability to re-use previously opened chat windows after reconnecting. +- added a log for contact logins and logouts at the bottom of the contact list +- added copy options for name, email, personal message, and links to right-click menu of contacts. +- added fast-retype of previous sentences using Ctrl+Up. +- added group selection box to the "add contact" dialog. +- improved overall user interface. +- improved client name detection of contacts. +- improved contact properties dialog +- fixed font color chooser in the chat window, settings could be lost. +- fixed contact re-invites (chat resumes) to the chat when the first attempt failed. + + Changes between KMess 1.5.2 and 1.5.1: -------------------------------------- - added a warning message if a file transfer is started when a non-P2P capable client. -- fixed receiving pictures/emoticons/winks from WLM 2009. -- fixed dislaying the sender of Offline-IM messages. - fixed displaying passwords in the debug window, make it easier to share debug logs. - fixed displaying old contact names after login. - fixed enabled auto-away settings if the XScreenSaver extension was not found. -- fixed opening the wrong browser when clicking on a link. - 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 6a734d9..a5a808b 100644 --- a/README +++ b/README @@ -2,172 +2,23 @@ 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. -Installation Tip: +Installing KMess: ================= -In order for KMess to work properly, it must be configured first. -Run the configure script like this: - - ./configure - -If the ./configure script completed with success, then type - - make - -and then, as root, type - - make install - -That's it. - - - -Important: -========== - -The configure script tries to detect your KDE3 directory automatically. -If configure fails to detect KDE, you should tell KMess which directory -to use. Basically, we're talking about the parent directory -of /share/apps/k~bunch of kapps~ - -Not doing this will result in emoticons being displayed -as text, and icons being displayed incorrectly as well. - - - -Troubleshooting -=============== - -The following packages are required to install KMess: -- make -- gcc -- gcc-c++ (if available) -- qt -- kdelibs - - -If your distribution uses separate "devel" or "dev" packages, -make sure you have these packages installed also: - - qt-devel (or qt3-devel) - - kdelibs-devel (or kdelibs3-devel) - - x-devel (or xfree-devel/xorg-x11-devel) - - libstdc++-devel - - -Likely the dependencies of these "devel" packages will -be installed automatically. Some worth mentioning are: - - fontconfig-devel - - freetype2-devel - - libfam-devel (or fam-devel) - - libjpeg-devel - - libpng-devel - - zlib-devel - - libart_lgpl-devel - - -If configure tells you you're missing something that you think you -have installed on your system, you probably need to install the -"devel" package of that thing. - - i.e. If it tells you you're missing libfam, install the libfam-devel rpm. - - -If you get this error: - ''configure: error: no acceptable C compiler found in $PATH'' -you need to install the packages "gcc" and "make". - - -If you get this error: - ''Your Installation isn't able to compile simple C++ programs.'' -you need to install "libstdc++-devel" and some distributions -also require a "gcc-c++" package for C++ support. - - -If you get this error: - ''error: Can't find X includes. Please check your installation [...]'' -you need to install the x developer packages. Depending on your distribution, -this can be something like "x-devel", "xfree-devel", "xorg-devel". - - -If you get this eror: - ''checking for libz... configure: error: not found.'' -you need to install the "zlib-devel" package. - - -If you get this error: - ''configure: WARNING: libjpeg not found. disable JPEG support.'' -you need to install the "libjpeg-devel" package. - - -If you get this error: - ''checking for Qt... configure: error: - Qt (>= Qt 3.1 (20021021)) (headers and libraries) not found. - Please check your installation!'' -you need to install the "qt-devel" (or "qt3-devel") package. - - -If you get this error: - ''checking for KDE... configure: error: - in the prefix, you've chosen, are no KDE headers installed. This will fail. - So, check this please and use another prefix!'' -you need to make sure "kdelibs-devel" (or "kdelibs3-devel") is installed! - - - - - -Installing from SVN: -==================== - -If there is any need to install the SVN version, read on. - -The KMess SVN repository contains the latest changes made to KMess. -Each new feature or bugfix will be stored into SVN by developers. -The code in SVN will eventually become the new KMess release. - - NOTE: The SVN version is the equivalent - of an "alpha" or "beta" release; there also is - a little possibility that it won't even compile! - -To install KMess from SVN you need to have the packages "autoconf" -and "automake" installed. - - -To download the SVN version, run these commands: - - svn checkout http://kmess.svn.sourceforge.net/svnroot/kmess/trunk/kmess/ - -If the download succeeds, run this command: - - make -f Makefile.dist - -This will generate the ./configure script and Makefile templates. -Then you can proceed with the normal installation. - - -Each time the SVN version is updated, you can run - - svn update - make -f Makefile.dist - ./configure - make - make install - -and you'll have the latest KMess version installed. - -For more information about accessing the KMess SVN repository, -visit the KMess site at http://kmess.org/svn/ . +Please see the INSTALL file for help with compiling and installing +KMess from source. @@ -184,16 +35,14 @@ This is what you need to do: - Open the language "po" file, and start translating! Also watch for translations marked as "fuzzy", they often need updating. - - The the following commands in the "po" folder: - make - make install - (if this doesn't work, run configure first) + - Update the translations. - Test the new translation. (to test other languages, run 'KDE_LANG= kmess') - - Contact the KMess developers. + - Contact the KMess developers to send your changes! A more detailed tutorial can be found online -at http://www.kmess.org/translating/ +at http://trac.kmess.org/wiki/Translating%20KMess + Building RPM Packages @@ -208,9 +57,9 @@ To build a RPM package for your distribution, run: Building Slackware Packages =========================== -To build a TGZ package for Slackware, also run: +To build a TGZ package for Slackware, run: - rpmbuild -tb kmess-1.4.tar.gz + rpmbuild -tb kmess-2.0.tar.gz diff --git a/TODO b/TODO index a714367..dcf8100 100644 --- a/TODO +++ b/TODO @@ -1,205 +1,9 @@ - Please note this file is replaced by an online Trac installation. - Our trac installation can be found at: http://trac.kmess.org/ +For bugs, future ideas, et cetera, please check our developer site +powered by trac at http://trac.kmess.org/. - If you're looking for junior jobs, you may also contact us - at the KMess help forums. +If you're looking for junior jobs, you may also contact us at the +KMess help forums: http://kmess.org/board/ - Thanks - - - -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: -___ Integrate UPnP support with file transfer invitation code. -___ Make sure KMess can send two files at once with the classic file transfer method (test this). -___ Support a SLP Decline/error message for a sent P2P/SLP transfer invitation, and continue to transfer over the switchboard. -___ Support a second invitation for file transfers, detect when remote client only returns it's internal IP or does not listen. -___ Detect network settings, make the other client server for file transfer (sending a second transfer-invite). -___ Update the classic FileTransfer application to use the new async-cnnect, DirectConnectionPool and showTransfer*() API. - -Critical bugs: -___ Restore the documentation -___ Restore the translations - -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). - -Annoying bugs: -___ Fix repeated picture transfer invitations when contact declines or aborts the invitation (preferably disable only for a few minutes). -___ 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). -___ When opening chat windows, shift their position to make them cascade. - -Low-priority code changes: -___ Add Application::get..TransferAbortMessage(). -___ 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. -___ Detect multiple external IP addresses to advertise in file transfer invite message. -___ Support sending the data-preparation ACK later with Windows Live Messenger picture transfers. -___ Support direct connection setups when requesting contact pictures. -___ Support aborting the data-preparation, also detect when contact does this. -___ Support the datacast emulation over MSNP2P for MSNC1-compatible clients (for winks). -___ Test whether applications need to be aborted when the switchboard reconnects. -___ Check P2P incomingMessages_ / outgoingMessages_ cache for timeouts. -___ 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. -_Y_ Support emoticons folder with KDE 3.3 -_Y_ Support "now playing" by other contacts, use dcop for our status. -_Y_ Handle closed direct connection, KMess keeps using the direct connection. -_Y_ Implement i18n() for chat styles, e.g. use libxml to replace all text nodes, create an XSLT to extract all text nodes. -_Y_ Fix the memory-leak of sentMessages_ for chat messages, these are only cleared at a NAK currently. -_Y_ Send previews of images in msn file transfers. -_Y_ Fix detection of context field splitter in FileTransferP2P::contactStarted1..(), also needed to show image previews. -_Y_ Contact sidebar width is not saved/restord anymore. -_Y_ Contact sidebar width is changed when the chat window resizes. -_Y_ Check if our eventsrc file is found in the KDE-dirs, otherwise warn KMess can't notify or flash the taskbar or play sounds (see: http://www.kmess.org/board/viewtopic.php?t=1619) -_N_ (caused by Beryl bug) "Focus stealing prevention", open the new chat windows in the background by default. -_Y_ Add save log button to network window. -_Y_ Improve removing contacts, offer dialog to block the contact as well (currently always kept in allowed list). -_Y_ Display a message box if the chat logs can't be saved because the folder no longer exists. -_Y_ Automatically save settings when pressing OK, not when closing KMess. -_Y_ Fix settings for balloon notifications, see http://www.kmess.org/board/viewtopic.php?t=559 -_Y_ Now listening icon is SUSE specific -_Y_ Fix MsnConnection::addPercents(), replace with KURL::encode_string(), but test for compatibility. -_Y_ Replace warning message "you can't change your friendly name" with something less unobtrusive. -_Y_ Emoticons are no longer displayed in the chat settings tab. -_Y_ Improve settingsdialog height, for 800x600 displays. -_Y_ Hide the register link when editing an account. -_Y_ Remove the dependency on QWidget for data-classes. -_Y_ Add a balloon if the contact start the chat with an filetransfer/nudge/wink. -_Y_ Implement KDE passive popups so the balloon code can be removed later. -_Y_ Balloon size fix (2 contacts on balloon), might become obsolute when passive popups are used instead. -_Y_ Get rid of the balloons -_Y_ Drag and drop of files in the chat window. -_Y_ Fix newline shortkey Ctrl+Enter / Shift+Enter in GNOME. In fact it didn't work at all, not only in GNOME. :P -_Y_ Delete contact settings when contact no longer exists in the contact list. -_Y_ Implement cleaning up of the kmessrc file, remove old Contact entries that are no longer used. -_Y_ Make moving of contacts smoother, see MsnNotificationConnection::getAdc(). -_Y_ Fix error messages with 'actions -> new contact' on a 'non-existing contact', 'existing contact' and 'contact without @'. -_N_ Move network/extra/httpsoapconnection to the network root folder. -_Y_ Move chat/invitedcontact.h to the contact folder. -_Y_ Implement text/x-keepalive message so be sure when a contact really left a chat. -_Y_ Update binreloc support to version 2.0. -_Y_ Crash with downloading offline-im messages: http://www.kmess.org/board/viewtopic.php?t=1490 -_Y_ Login blocks all gui-events: make all connection attempts async -_Y_ Allow users to scale fonts in the chat window (zoom icons). -_Y_ Fix problems with clicking on contacts rapidly, see http://www.kmess.org/board/viewtopic.php?t=533 -_Y_ Decouple the MsnSwitchboardConnection from the ChatWindow class, for picture transfers in the background. -_Y_ Highlight the text of the contact list item when it's active. -_Y_ Fix contact list background picture scrolling -_Y_ Implement setEnabled() checks for the contact group context menu in KMessView::slotContextMenu(). -_Y_ Optionally download contact pictures when the picture changed but they're not in a chat yet. -_Y_ Test whether a display picture is fully received, and remove the image from the cache otherwise. -_Y_ Limit the maximum number of MSN Object simultaneous downloads, to avoid server flooding. See ChatMaster::slotContactChangedMsnObject(). -_Y_ Fix e-mail support for non-Hotmail accounts, don't attempt to use Hotmail. Use chosen app or default KDE mail app instead). -_Y_ Update the accounts listed in the initial list When one of the registered accounts is deleted. -_Y_ Improve the contact list contact menu -_N_ Check if the mutex lock in MsnConnection is really needed anymore. -_Y_ Restore the context menu in the chat window. -_Y_ Disallow logging in without having entered a password. -_Y_ When the switchboard is disconnected (gray contact pictures), the command to invite new contacts will get ignored when a new switchboard gets ready. -_Y_ In the emoticon settings panel, don't assume "smile.png" will always be available (parse theme, preferably with an EmoticonTheme class). -_Y_ Include a tooltip in the contact sidebar. -_Y_ Include a contact menu in the contact sidebar (see https://www.lab.fi.uva.es/~albgonz/kmesss.jpg) -_Y_ When the contact disables it's picture, should we leave the current one active, or revert the the "unknown" picture? -_Y__ Group chats: remove contact frame when a user leaves the chat. -_Y_ Support removing a contact from just one group. -_Y_ Group chats: fix status bar when multiple users are typing a message. -_Y_ Implement UPnP support -_Y_ Add winks support -_Y_ Add emoticon transfer support -_N_ "Who has me in his/hers contact list?" dialog (allowed/removed groups already reveal this) -_N_ Include the network-window as "--with-network-window" if the network-window-code displays traffic nicer. - - - - -Future ideas: -============= - -MSN Protocol support: -___ Improve old file transfer code, multiple connections like MSN5 does. -___ Implement a settings category ("File transfers") where the user can at least choose: - - "[x] Allow KMess to control my internet router programmatically [learn more]" - - "Use the following port to receive UPnP broadcast responses: [default 1900]" -___ Implement STUN support, also for Connection-Type field, see http://en.wikipedia.org/wiki/STUN and http://en.wikipedia.org/wiki/UDP_hole_punching. -___ 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 -___ 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 +- The KMess team diff --git a/acinclude.m4 b/acinclude.m4 deleted file mode 100644 index e343c38..0000000 --- a/acinclude.m4 +++ /dev/null @@ -1,11921 +0,0 @@ -## -*- autoconf -*- - -dnl This file is part of the KDE libraries/packages -dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) -dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) - -dnl This file is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Library General Public -dnl License as published by the Free Software Foundation; either -dnl version 2 of the License, or (at your option) any later version. - -dnl This library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Library General Public License for more details. - -dnl You should have received a copy of the GNU Library General Public License -dnl along with this library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -dnl Boston, MA 02110-1301, USA. - -dnl IMPORTANT NOTE: -dnl Please do not modify this file unless you expect your modifications to be -dnl carried into every other module in the repository. -dnl -dnl Single-module modifications are best placed in configure.in for kdelibs -dnl and kdebase or configure.in.in if present. - -# KDE_PATH_X_DIRECT -dnl Internal subroutine of AC_PATH_X. -dnl Set ac_x_includes and/or ac_x_libraries. -AC_DEFUN([KDE_PATH_X_DIRECT], -[ -AC_REQUIRE([KDE_CHECK_LIB64]) - -if test "$ac_x_includes" = NO; then - # Guess where to find include files, by looking for this one X11 .h file. - test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h - - # First, try using that file with no special directory specified. -AC_TRY_CPP([#include <$x_direct_test_include>], -[# We can compile using X headers with no special include directory. -ac_x_includes=], -[# Look for the header file in a standard set of common directories. -# Check X11 before X11Rn because it is often a symlink to the current release. - for ac_dir in \ - /usr/X11/include \ - /usr/X11R6/include \ - /usr/X11R5/include \ - /usr/X11R4/include \ - \ - /usr/include/X11 \ - /usr/include/X11R6 \ - /usr/include/X11R5 \ - /usr/include/X11R4 \ - \ - /usr/local/X11/include \ - /usr/local/X11R6/include \ - /usr/local/X11R5/include \ - /usr/local/X11R4/include \ - \ - /usr/local/include/X11 \ - /usr/local/include/X11R6 \ - /usr/local/include/X11R5 \ - /usr/local/include/X11R4 \ - \ - /usr/X386/include \ - /usr/x386/include \ - /usr/XFree86/include/X11 \ - \ - /usr/include \ - /usr/local/include \ - /usr/unsupported/include \ - /usr/athena/include \ - /usr/local/x11r5/include \ - /usr/lpp/Xamples/include \ - \ - /usr/openwin/include \ - /usr/openwin/share/include \ - ; \ - do - if test -r "$ac_dir/$x_direct_test_include"; then - ac_x_includes=$ac_dir - break - fi - done]) -fi # $ac_x_includes = NO - -if test "$ac_x_libraries" = NO; then - # Check for the libraries. - - test -z "$x_direct_test_library" && x_direct_test_library=Xt - test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc - - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS="$LIBS" - LIBS="-l$x_direct_test_library $LIBS" -AC_TRY_LINK([#include ], [${x_direct_test_function}(1)], -[LIBS="$ac_save_LIBS" -# We can link X programs with no special library path. -ac_x_libraries=], -[LIBS="$ac_save_LIBS" -# First see if replacing the include by lib works. -# Check X11 before X11Rn because it is often a symlink to the current release. -for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ - /usr/X11/lib${kdelibsuff} \ - /usr/X11R6/lib${kdelibsuff} \ - /usr/X11R5/lib${kdelibsuff} \ - /usr/X11R4/lib${kdelibsuff} \ - \ - /usr/lib${kdelibsuff}/X11 \ - /usr/lib${kdelibsuff}/X11R6 \ - /usr/lib${kdelibsuff}/X11R5 \ - /usr/lib${kdelibsuff}/X11R4 \ - \ - /usr/local/X11/lib${kdelibsuff} \ - /usr/local/X11R6/lib${kdelibsuff} \ - /usr/local/X11R5/lib${kdelibsuff} \ - /usr/local/X11R4/lib${kdelibsuff} \ - \ - /usr/local/lib${kdelibsuff}/X11 \ - /usr/local/lib${kdelibsuff}/X11R6 \ - /usr/local/lib${kdelibsuff}/X11R5 \ - /usr/local/lib${kdelibsuff}/X11R4 \ - \ - /usr/X386/lib${kdelibsuff} \ - /usr/x386/lib${kdelibsuff} \ - /usr/XFree86/lib${kdelibsuff}/X11 \ - \ - /usr/lib${kdelibsuff} \ - /usr/local/lib${kdelibsuff} \ - /usr/unsupported/lib${kdelibsuff} \ - /usr/athena/lib${kdelibsuff} \ - /usr/local/x11r5/lib${kdelibsuff} \ - /usr/lpp/Xamples/lib${kdelibsuff} \ - /lib/usr/lib${kdelibsuff}/X11 \ - \ - /usr/openwin/lib${kdelibsuff} \ - /usr/openwin/share/lib${kdelibsuff} \ - ; \ -do -dnl Don't even attempt the hair of trying to link an X program! - for ac_extension in a so sl; do - if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done]) -fi # $ac_x_libraries = NO -]) - - -dnl ------------------------------------------------------------------------ -dnl Find a file (or one of more files in a list of dirs) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_FIND_FILE], -[ -$3=NO -for i in $2; -do - for j in $1; - do - echo "configure: __oline__: $i/$j" >&AC_FD_CC - if test -r "$i/$j"; then - echo "taking that" >&AC_FD_CC - $3=$i - break 2 - fi - done -done -]) - -dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs, -dnl if-not-found, test-parameter, prepend-path) -dnl -dnl Look for program-name in list-of-dirs+$PATH. -dnl If prepend-path is set, look in $PATH+list-of-dirs instead. -dnl If found, $variable-name is set. If not, if-not-found is evaluated. -dnl test-parameter: if set, the program is executed with this arg, -dnl and only a successful exit code is required. -AC_DEFUN([KDE_FIND_PATH], -[ - AC_MSG_CHECKING([for $1]) - if test -n "$$2"; then - kde_cv_path="$$2"; - else - kde_cache=`echo $1 | sed 'y%./+-%__p_%'` - - AC_CACHE_VAL(kde_cv_path_$kde_cache, - [ - kde_cv_path="NONE" - kde_save_IFS=$IFS - IFS=':' - dirs="" - for dir in $PATH; do - dirs="$dirs $dir" - done - if test -z "$6"; then dnl Append dirs in PATH (default) - dirs="$3 $dirs" - else dnl Prepend dirs in PATH (if 6th arg is set) - dirs="$dirs $3" - fi - IFS=$kde_save_IFS - - for dir in $dirs; do - if test -x "$dir/$1"; then - if test -n "$5" - then - evalstr="$dir/$1 $5 2>&1 " - if eval $evalstr; then - kde_cv_path="$dir/$1" - break - fi - else - kde_cv_path="$dir/$1" - break - fi - fi - done - - eval "kde_cv_path_$kde_cache=$kde_cv_path" - - ]) - - eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" - - fi - - if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then - AC_MSG_RESULT(not found) - $4 - else - AC_MSG_RESULT($kde_cv_path) - $2=$kde_cv_path - - fi -]) - -AC_DEFUN([KDE_MOC_ERROR_MESSAGE], -[ - AC_MSG_ERROR([No Qt meta object compiler (moc) found! -Please check whether you installed Qt correctly. -You need to have a running moc binary. -configure tried to run $ac_cv_path_moc and the test didn't -succeed. If configure shouldn't have tried this one, set -the environment variable MOC to the right one before running -configure. -]) -]) - -AC_DEFUN([KDE_UIC_ERROR_MESSAGE], -[ - AC_MSG_WARN([No Qt ui compiler (uic) found! -Please check whether you installed Qt correctly. -You need to have a running uic binary. -configure tried to run $ac_cv_path_uic and the test didn't -succeed. If configure shouldn't have tried this one, set -the environment variable UIC to the right one before running -configure. -]) -]) - - -AC_DEFUN([KDE_CHECK_UIC_FLAG], -[ - AC_MSG_CHECKING([whether uic supports -$1 ]) - kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` - AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, - [ - cat >conftest.ui < -EOT - ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" - if AC_TRY_EVAL(ac_uic_testrun); then - eval "kde_cv_prog_uic_$kde_cache=yes" - else - eval "kde_cv_prog_uic_$kde_cache=no" - fi - rm -f conftest* - ]) - - if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then - AC_MSG_RESULT([yes]) - : - $3 - else - AC_MSG_RESULT([no]) - : - $4 - fi -]) - - -dnl ------------------------------------------------------------------------ -dnl Find the meta object compiler and the ui compiler in the PATH, -dnl in $QTDIR/bin, and some more usual places -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_PATH_QT_MOC_UIC], -[ - AC_REQUIRE([KDE_CHECK_PERL]) - qt_bindirs="" - for dir in $kde_qt_dirs; do - qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" - done - qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" - if test ! "$ac_qt_bindir" = "NO"; then - qt_bindirs="$ac_qt_bindir $qt_bindirs" - fi - - KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) - if test -z "$UIC_NOT_NEEDED"; then - KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) - if test -z "$UIC_PATH" ; then - KDE_UIC_ERROR_MESSAGE - exit 1 - else - UIC=$UIC_PATH - - if test $kde_qtver = 3; then - KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) - KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) - - if test x$ac_uic_supports_libpath = xyes; then - UIC="$UIC -L \$(kde_widgetdir)" - fi - if test x$ac_uic_supports_nounload = xyes; then - UIC="$UIC -nounload" - fi - fi - fi - else - UIC="echo uic not available: " - fi - - AC_SUBST(MOC) - AC_SUBST(UIC) - - UIC_TR="i18n" - if test $kde_qtver = 3; then - UIC_TR="tr2i18n" - fi - - AC_SUBST(UIC_TR) -]) - -AC_DEFUN([KDE_1_CHECK_PATHS], -[ - KDE_1_CHECK_PATH_HEADERS - - KDE_TEST_RPATH= - - if test -n "$USE_RPATH"; then - - if test -n "$kde_libraries"; then - KDE_TEST_RPATH="-R $kde_libraries" - fi - - if test -n "$qt_libraries"; then - KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" - fi - - if test -n "$x_libraries"; then - KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" - fi - - KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" - fi - -AC_MSG_CHECKING([for KDE libraries installed]) -ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' - -if AC_TRY_EVAL(ac_link) && test -s conftest; then - AC_MSG_RESULT(yes) -else - AC_MSG_ERROR([your system fails at linking a small KDE application! -Check, if your compiler is installed correctly and if you have used the -same compiler to compile Qt and kdelibs as you did use now. -For more details about this problem, look at the end of config.log.]) -fi - -if eval `KDEDIR= ./conftest 2>&5`; then - kde_result=done -else - kde_result=problems -fi - -KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log -kde_have_all_paths=yes - -KDE_SET_PATHS($kde_result) - -]) - -AC_DEFUN([KDE_SET_PATHS], -[ - kde_cv_all_paths="kde_have_all_paths=\"yes\" \ - kde_htmldir=\"$kde_htmldir\" \ - kde_appsdir=\"$kde_appsdir\" \ - kde_icondir=\"$kde_icondir\" \ - kde_sounddir=\"$kde_sounddir\" \ - kde_datadir=\"$kde_datadir\" \ - kde_locale=\"$kde_locale\" \ - kde_cgidir=\"$kde_cgidir\" \ - kde_confdir=\"$kde_confdir\" \ - kde_kcfgdir=\"$kde_kcfgdir\" \ - kde_mimedir=\"$kde_mimedir\" \ - kde_toolbardir=\"$kde_toolbardir\" \ - kde_wallpaperdir=\"$kde_wallpaperdir\" \ - kde_templatesdir=\"$kde_templatesdir\" \ - kde_bindir=\"$kde_bindir\" \ - kde_servicesdir=\"$kde_servicesdir\" \ - kde_servicetypesdir=\"$kde_servicetypesdir\" \ - kde_moduledir=\"$kde_moduledir\" \ - kde_styledir=\"$kde_styledir\" \ - kde_widgetdir=\"$kde_widgetdir\" \ - xdg_appsdir=\"$xdg_appsdir\" \ - xdg_menudir=\"$xdg_menudir\" \ - xdg_directorydir=\"$xdg_directorydir\" \ - kde_result=$1" -]) - -AC_DEFUN([KDE_SET_DEFAULT_PATHS], -[ -if test "$1" = "default"; then - - if test -z "$kde_htmldir"; then - kde_htmldir='\${datadir}/doc/HTML' - fi - if test -z "$kde_appsdir"; then - kde_appsdir='\${datadir}/applnk' - fi - if test -z "$kde_icondir"; then - kde_icondir='\${datadir}/icons' - fi - if test -z "$kde_sounddir"; then - kde_sounddir='\${datadir}/sounds' - fi - if test -z "$kde_datadir"; then - kde_datadir='\${datadir}/apps' - fi - if test -z "$kde_locale"; then - kde_locale='\${datadir}/locale' - fi - if test -z "$kde_cgidir"; then - kde_cgidir='\${exec_prefix}/cgi-bin' - fi - if test -z "$kde_confdir"; then - kde_confdir='\${datadir}/config' - fi - if test -z "$kde_kcfgdir"; then - kde_kcfgdir='\${datadir}/config.kcfg' - fi - if test -z "$kde_mimedir"; then - kde_mimedir='\${datadir}/mimelnk' - fi - if test -z "$kde_toolbardir"; then - kde_toolbardir='\${datadir}/toolbar' - fi - if test -z "$kde_wallpaperdir"; then - kde_wallpaperdir='\${datadir}/wallpapers' - fi - if test -z "$kde_templatesdir"; then - kde_templatesdir='\${datadir}/templates' - fi - if test -z "$kde_bindir"; then - kde_bindir='\${exec_prefix}/bin' - fi - if test -z "$kde_servicesdir"; then - kde_servicesdir='\${datadir}/services' - fi - if test -z "$kde_servicetypesdir"; then - kde_servicetypesdir='\${datadir}/servicetypes' - fi - if test -z "$kde_moduledir"; then - if test "$kde_qtver" = "2"; then - kde_moduledir='\${libdir}/kde2' - else - kde_moduledir='\${libdir}/kde3' - fi - fi - if test -z "$kde_styledir"; then - kde_styledir='\${libdir}/kde3/plugins/styles' - fi - if test -z "$kde_widgetdir"; then - kde_widgetdir='\${libdir}/kde3/plugins/designer' - fi - if test -z "$xdg_appsdir"; then - xdg_appsdir='\${datadir}/applications/kde' - fi - if test -z "$xdg_menudir"; then - xdg_menudir='\${sysconfdir}/xdg/menus' - fi - if test -z "$xdg_directorydir"; then - xdg_directorydir='\${datadir}/desktop-directories' - fi - - KDE_SET_PATHS(defaults) - -else - - if test $kde_qtver = 1; then - AC_MSG_RESULT([compiling]) - KDE_1_CHECK_PATHS - else - AC_MSG_ERROR([path checking not yet supported for KDE 2]) - fi - -fi -]) - -AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS], -[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || - test -z "$kde_icondir" || test -z "$kde_sounddir" || - test -z "$kde_datadir" || test -z "$kde_locale" || - test -z "$kde_cgidir" || test -z "$kde_confdir" || - test -z "$kde_kcfgdir" || - test -z "$kde_mimedir" || test -z "$kde_toolbardir" || - test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || - test -z "$kde_bindir" || test -z "$kde_servicesdir" || - test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || - test -z "$kde_styledir" || test -z "kde_widgetdir" || - test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" || - test "x$kde_have_all_paths" != "xyes"; then - kde_have_all_paths=no - fi -]) - -AC_DEFUN([KDE_MISSING_PROG_ERROR], -[ - AC_MSG_ERROR([The important program $1 was not found! -Please check whether you installed KDE correctly. -]) -]) - -AC_DEFUN([KDE_MISSING_ARTS_ERROR], -[ - AC_MSG_ERROR([The important program $1 was not found! -Please check whether you installed aRts correctly or use ---without-arts to compile without aRts support (this will remove functionality). -]) -]) - -AC_DEFUN([KDE_SET_DEFAULT_BINDIRS], -[ - kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" - test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" - if test -n "$KDEDIRS"; then - kde_save_IFS=$IFS - IFS=: - for dir in $KDEDIRS; do - kde_default_bindirs="$dir/bin $kde_default_bindirs " - done - IFS=$kde_save_IFS - fi -]) - -AC_DEFUN([KDE_SUBST_PROGRAMS], -[ - AC_ARG_WITH(arts, - AC_HELP_STRING([--without-arts],[build without aRts [default=no]]), - [build_arts=$withval], - [build_arts=yes] - ) - AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no") - if test "$build_arts" = "no"; then - AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts]) - fi - - KDE_SET_DEFAULT_BINDIRS - kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs" - KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) - KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) - if test "$build_arts" '!=' "no"; then - KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) - KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) - fi - KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) - - kde32ornewer=1 - kde33ornewer=1 - if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then - kde32ornewer= - kde33ornewer= - else - if test "$kde_qtver" = "3"; then - if test "$kde_qtsubver" -le 1; then - kde32ornewer= - fi - if test "$kde_qtsubver" -le 2; then - kde33ornewer= - fi - if test "$KDECONFIG" != "compiled"; then - if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then - kde33ornewer= - fi - fi - fi - fi - - if test -n "$kde32ornewer"; then - KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)]) - KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) - fi - if test -n "$kde33ornewer"; then - KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) - AC_SUBST(MAKEKDEWIDGETS) - fi - KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) - - if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then - kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" - test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" - AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) - if test "$KDE_XSL_STYLESHEET" = "NO"; then - KDE_XSL_STYLESHEET="" - else - KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" - fi - fi - - DCOP_DEPENDENCIES='$(DCOPIDL)' - if test -n "$kde32ornewer"; then - KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)' - DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)' - AC_SUBST(KCONFIG_COMPILER) - AC_SUBST(KCFG_DEPENDENCIES) - AC_SUBST(DCOPIDLNG) - fi - AC_SUBST(DCOPIDL) - AC_SUBST(DCOPIDL2CPP) - AC_SUBST(DCOP_DEPENDENCIES) - AC_SUBST(MCOPIDL) - AC_SUBST(ARTSCCONFIG) - AC_SUBST(MEINPROC) - AC_SUBST(KDE_XSL_STYLESHEET) - AC_SUBST(XMLLINT) -])dnl - -AC_DEFUN([AC_CREATE_KFSSTND], -[ -AC_REQUIRE([AC_CHECK_RPATH]) - -AC_MSG_CHECKING([for KDE paths]) -kde_result="" -kde_cached_paths=yes -AC_CACHE_VAL(kde_cv_all_paths, -[ - KDE_SET_DEFAULT_PATHS($1) - kde_cached_paths=no -]) -eval "$kde_cv_all_paths" -KDE_CHECK_PATHS_FOR_COMPLETENESS -if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then - # wrong values were cached, may be, we can set better ones - kde_result= - kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= - kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir= - kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= - kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= - kde_have_all_paths= - kde_styledir= - kde_widgetdir= - xdg_appsdir = xdg_menudir= xdg_directorydir= - KDE_SET_DEFAULT_PATHS($1) - eval "$kde_cv_all_paths" - KDE_CHECK_PATHS_FOR_COMPLETENESS - kde_result="$kde_result (cache overridden)" -fi -if test "$kde_have_all_paths" = "no"; then - AC_MSG_ERROR([configure could not run a little KDE program to test the environment. -Since it had compiled and linked before, it must be a strange problem on your system. -Look at config.log for details. If you are not able to fix this, look at -http://www.kde.org/faq/installation.html or any www.kde.org mirror. -(If you're using an egcs version on Linux, you may update binutils!) -]) -else - rm -f conftest* - AC_MSG_RESULT($kde_result) -fi - -bindir=$kde_bindir - -KDE_SUBST_PROGRAMS - -]) - -AC_DEFUN([AC_SUBST_KFSSTND], -[ -AC_SUBST(kde_htmldir) -AC_SUBST(kde_appsdir) -AC_SUBST(kde_icondir) -AC_SUBST(kde_sounddir) -AC_SUBST(kde_datadir) -AC_SUBST(kde_locale) -AC_SUBST(kde_confdir) -AC_SUBST(kde_kcfgdir) -AC_SUBST(kde_mimedir) -AC_SUBST(kde_wallpaperdir) -AC_SUBST(kde_bindir) -dnl X Desktop Group standards -AC_SUBST(xdg_appsdir) -AC_SUBST(xdg_menudir) -AC_SUBST(xdg_directorydir) -dnl for KDE 2 -AC_SUBST(kde_templatesdir) -AC_SUBST(kde_servicesdir) -AC_SUBST(kde_servicetypesdir) -AC_SUBST(kde_moduledir) -AC_SUBST(kdeinitdir, '$(kde_moduledir)') -AC_SUBST(kde_styledir) -AC_SUBST(kde_widgetdir) -if test "$kde_qtver" = 1; then - kde_minidir="$kde_icondir/mini" -else -# for KDE 1 - this breaks KDE2 apps using minidir, but -# that's the plan ;-/ - kde_minidir="/dev/null" -fi -dnl AC_SUBST(kde_minidir) -dnl AC_SUBST(kde_cgidir) -dnl AC_SUBST(kde_toolbardir) -]) - -AC_DEFUN([KDE_MISC_TESTS], -[ - dnl Checks for libraries. - AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD - AC_SUBST(LIBUTIL) - AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD - AC_SUBST(LIBCOMPAT) - kde_have_crypt= - AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], - AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ - AC_MSG_WARN([you have no crypt in either libcrypt or libc. -You should install libcrypt from another source or configure with PAM -support]) - kde_have_crypt=no - ])) - AC_SUBST(LIBCRYPT) - if test $kde_have_crypt = yes; then - AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) - fi - AC_CHECK_SOCKLEN_T - AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) - if test $ac_cv_lib_dnet_dnet_ntoa = no; then - AC_CHECK_LIB(dnet_stub, dnet_ntoa, - [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) - fi - AC_CHECK_FUNC(inet_ntoa) - if test $ac_cv_func_inet_ntoa = no; then - AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") - fi - AC_CHECK_FUNC(connect) - if test $ac_cv_func_connect = no; then - AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , - $X_EXTRA_LIBS) - fi - - AC_CHECK_FUNC(remove) - if test $ac_cv_func_remove = no; then - AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") - fi - - # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. - AC_CHECK_FUNC(shmat, , - AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) - - # more headers that need to be explicitly included on darwin - AC_CHECK_HEADERS(sys/types.h stdint.h) - - # sys/bitypes.h is needed for uint32_t and friends on Tru64 - AC_CHECK_HEADERS(sys/bitypes.h) - - # darwin requires a poll emulation library - AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") - - # for some image handling on Mac OS X - AC_CHECK_HEADERS(Carbon/Carbon.h) - - # CoreAudio framework - AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ - AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) - FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio" - ]) - - AC_CHECK_RES_INIT - AC_SUBST(LIB_POLL) - AC_SUBST(FRAMEWORK_COREAUDIO) - LIBSOCKET="$X_EXTRA_LIBS" - AC_SUBST(LIBSOCKET) - AC_SUBST(X_EXTRA_LIBS) - AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 - AC_SUBST(LIBUCB) - - case $host in dnl this *is* LynxOS specific - *-*-lynxos* ) - AC_MSG_CHECKING([LynxOS header file wrappers]) - [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] - AC_MSG_RESULT(disabled) - AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS - ;; - esac - - KDE_CHECK_TYPES - KDE_CHECK_LIBDL - KDE_CHECK_STRLCPY - KDE_CHECK_PIE_SUPPORT - -# darwin needs this to initialize the environment -AC_CHECK_HEADERS(crt_externs.h) -AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) - -AH_VERBATIM(_DARWIN_ENVIRON, -[ -#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) -# include -# include -# define environ (*_NSGetEnviron()) -#endif -]) - -AH_VERBATIM(_AIX_STRINGS_H_BZERO, -[ -/* - * AIX defines FD_SET in terms of bzero, but fails to include - * that defines bzero. - */ - -#if defined(_AIX) -#include -#endif -]) - -AC_CHECK_FUNCS([vsnprintf snprintf]) - -AH_VERBATIM(_TRU64,[ -/* - * On HP-UX, the declaration of vsnprintf() is needed every time ! - */ - -#if !defined(HAVE_VSNPRINTF) || defined(hpux) -#if __STDC__ -#include -#include -#else -#include -#endif -#ifdef __cplusplus -extern "C" -#endif -int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); -#ifdef __cplusplus -extern "C" -#endif -int snprintf(char *str, size_t n, char const *fmt, ...); -#endif -]) - -]) - -dnl ------------------------------------------------------------------------ -dnl Find the header files and libraries for X-Windows. Extended the -dnl macro AC_PATH_X -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([K_PATH_X], -[ -AC_REQUIRE([KDE_MISC_TESTS])dnl -AC_REQUIRE([KDE_CHECK_LIB64]) - -AC_ARG_ENABLE( - embedded, - AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]), - kde_use_qt_emb=$enableval, - kde_use_qt_emb=no -) - -AC_ARG_ENABLE( - qtopia, - AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]), - kde_use_qt_emb_palm=$enableval, - kde_use_qt_emb_palm=no -) - -AC_ARG_ENABLE( - mac, - AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]), - kde_use_qt_mac=$enableval, - kde_use_qt_mac=no -) - -# used to disable x11-specific stuff on special platforms -AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no") - -if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then - -AC_MSG_CHECKING(for X) - -AC_CACHE_VAL(kde_cv_have_x, -[# One or both of the vars are not set, and there is no cached value. -if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then - kde_x_includes=NO -else - kde_x_includes=$x_includes -fi -if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then - kde_x_libraries=NO -else - kde_x_libraries=$x_libraries -fi - -# below we use the standard autoconf calls -ac_x_libraries=$kde_x_libraries -ac_x_includes=$kde_x_includes - -KDE_PATH_X_DIRECT -dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. -dnl Unfortunately, if compiling with the N32 ABI, this is not the correct -dnl location. The correct location is /usr/lib32 or an undefined value -dnl (the linker is smart enough to pick the correct default library). -dnl Things work just fine if you use just AC_PATH_X_DIRECT. -dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to -dnl /usr/openwin/include, which doesn't work. /usr/include does work, so -dnl x_includes should be left alone. -case "$host" in -mips-sgi-irix6*) - ;; -*-*-solaris*) - ;; -*) - _AC_PATH_X_XMKMF - if test -z "$ac_x_includes"; then - ac_x_includes="." - fi - if test -z "$ac_x_libraries"; then - ac_x_libraries="/usr/lib${kdelibsuff}" - fi -esac -#from now on we use our own again - -# when the user already gave --x-includes, we ignore -# what the standard autoconf macros told us. -if test "$kde_x_includes" = NO; then - kde_x_includes=$ac_x_includes -fi - -# for --x-libraries too -if test "$kde_x_libraries" = NO; then - kde_x_libraries=$ac_x_libraries -fi - -if test "$kde_x_includes" = NO; then - AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) -fi - -if test "$kde_x_libraries" = NO; then - AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) -fi - -# Record where we found X for the cache. -kde_cv_have_x="have_x=yes \ - kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" -])dnl - -eval "$kde_cv_have_x" - -if test "$have_x" != yes; then - AC_MSG_RESULT($have_x) - no_x=yes -else - AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) -fi - -if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then - X_INCLUDES="" - x_includes="."; dnl better than nothing :- - else - x_includes=$kde_x_includes - X_INCLUDES="-I$x_includes" -fi - -if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE || test "$kde_x_libraries" = "/usr/lib"; then - X_LDFLAGS="" - x_libraries="/usr/lib"; dnl better than nothing :- - else - x_libraries=$kde_x_libraries - X_LDFLAGS="-L$x_libraries" -fi -all_includes="$X_INCLUDES" -all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS" - -# Check for libraries that X11R6 Xt/Xaw programs need. -ac_save_LDFLAGS="$LDFLAGS" -LDFLAGS="$LDFLAGS $X_LDFLAGS" -# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to -# check for ICE first), but we must link in the order -lSM -lICE or -# we get undefined symbols. So assume we have SM if we have ICE. -# These have to be linked with before -lX11, unlike the other -# libraries we check for below, so use a different variable. -# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. -AC_CHECK_LIB(ICE, IceConnectionNumber, - [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) -LDFLAGS="$ac_save_LDFLAGS" - -LIB_X11='-lX11 $(LIBSOCKET)' - -AC_MSG_CHECKING(for libXext) -AC_CACHE_VAL(kde_cv_have_libXext, -[ -kde_ldflags_safe="$LDFLAGS" -kde_libs_safe="$LIBS" - -LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" -LIBS="-lXext -lX11 $LIBSOCKET" - -AC_TRY_LINK([ -#include -#ifdef STDC_HEADERS -# include -#endif -], -[ -printf("hello Xext\n"); -], -kde_cv_have_libXext=yes, -kde_cv_have_libXext=no -) - -LDFLAGS=$kde_ldflags_safe -LIBS=$kde_libs_safe -]) - -AC_MSG_RESULT($kde_cv_have_libXext) - -if test "$kde_cv_have_libXext" = "no"; then - AC_MSG_ERROR([We need a working libXext to proceed. Since configure -can't find it itself, we stop here assuming that make wouldn't find -them either.]) -fi - -LIB_XEXT="-lXext" -QTE_NORTTI="" - -elif test "$kde_use_qt_emb" = "yes"; then - dnl We're using QT Embedded - CPPFLAGS=-DQWS - CXXFLAGS="$CXXFLAGS -fno-rtti" - QTE_NORTTI="-fno-rtti -DQWS" - X_PRE_LIBS="" - LIB_X11="" - LIB_XEXT="" - LIB_XRENDER="" - LIBSM="" - X_INCLUDES="" - X_LDFLAGS="" - x_includes="" - x_libraries="" -elif test "$kde_use_qt_mac" = "yes"; then - dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to - dnl be included to get the information) --Sam - CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp" - CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp" - X_PRE_LIBS="" - LIB_X11="" - LIB_XEXT="" - LIB_XRENDER="" - LIBSM="" - X_INCLUDES="" - X_LDFLAGS="" - x_includes="" - x_libraries="" -fi -AC_SUBST(X_PRE_LIBS) -AC_SUBST(LIB_X11) -AC_SUBST(LIB_XRENDER) -AC_SUBST(LIBSM) -AC_SUBST(X_INCLUDES) -AC_SUBST(X_LDFLAGS) -AC_SUBST(x_includes) -AC_SUBST(x_libraries) -AC_SUBST(QTE_NORTTI) -AC_SUBST(LIB_XEXT) - -]) - -AC_DEFUN([KDE_PRINT_QT_PROGRAM], -[ -AC_REQUIRE([KDE_USE_QT]) -cat > conftest.$ac_ext < -#include -EOF -if test "$kde_qtver" = "2"; then -cat >> conftest.$ac_ext < -#include -#include -EOF - -if test $kde_qtsubver -gt 0; then -cat >> conftest.$ac_ext <> conftest.$ac_ext < -#include -#include -EOF -fi - -echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext -cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC -fi - -rm -f conftest* -CXXFLAGS="$ac_cxxflags_safe" -LDFLAGS="$ac_ldflags_safe" -LIBS="$ac_libs_safe" - -LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" -export LD_LIBRARY_PATH -LIBRARY_PATH="$ac_LIBRARY_PATH" -export LIBRARY_PATH -AC_LANG_RESTORE -]) - -if test "$kde_cv_qt_direct" = "yes"; then - AC_MSG_RESULT(yes) - $1 -else - AC_MSG_RESULT(no) - $2 -fi -]) - -dnl ------------------------------------------------------------------------ -dnl Try to find the Qt headers and libraries. -dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) -dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_PATH_QT_1_3], -[ -AC_REQUIRE([K_PATH_X]) -AC_REQUIRE([KDE_USE_QT]) -AC_REQUIRE([KDE_CHECK_LIB64]) - -dnl ------------------------------------------------------------------------ -dnl Add configure flag to enable linking to MT version of Qt library. -dnl ------------------------------------------------------------------------ - -AC_ARG_ENABLE( - mt, - AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]), - kde_use_qt_mt=$enableval, - [ - if test $kde_qtver = 3; then - kde_use_qt_mt=yes - else - kde_use_qt_mt=no - fi - ] -) - -USING_QT_MT="" - -dnl ------------------------------------------------------------------------ -dnl If we not get --disable-qt-mt then adjust some vars for the host. -dnl ------------------------------------------------------------------------ - -KDE_MT_LDFLAGS= -KDE_MT_LIBS= -if test "x$kde_use_qt_mt" = "xyes"; then - KDE_CHECK_THREADING - if test "x$kde_use_threading" = "xyes"; then - CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" - KDE_MT_LDFLAGS="$USE_THREADS" - KDE_MT_LIBS="$LIBPTHREAD" - else - kde_use_qt_mt=no - fi -fi -AC_SUBST(KDE_MT_LDFLAGS) -AC_SUBST(KDE_MT_LIBS) - -kde_qt_was_given=yes - -dnl ------------------------------------------------------------------------ -dnl If we haven't been told how to link to Qt, we work it out for ourselves. -dnl ------------------------------------------------------------------------ -if test -z "$LIBQT_GLOB"; then - if test "x$kde_use_qt_emb" = "xyes"; then - LIBQT_GLOB="libqte.*" - else - LIBQT_GLOB="libqt.*" - fi -fi - -dnl ------------------------------------------------------------ -dnl If we got --enable-embedded then adjust the Qt library name. -dnl ------------------------------------------------------------ -if test "x$kde_use_qt_emb" = "xyes"; then - qtlib="qte" -else - qtlib="qt" -fi - -kde_int_qt="-l$qtlib" - -if test -z "$LIBQPE"; then -dnl ------------------------------------------------------------ -dnl If we got --enable-palmtop then add -lqpe to the link line -dnl ------------------------------------------------------------ - if test "x$kde_use_qt_emb" = "xyes"; then - if test "x$kde_use_qt_emb_palm" = "xyes"; then - LIB_QPE="-lqpe" - else - LIB_QPE="" - fi - else - LIB_QPE="" - fi -fi - -dnl ------------------------------------------------------------------------ -dnl If we got --enable-qt-mt then adjust the Qt library name for the host. -dnl ------------------------------------------------------------------------ - -if test "x$kde_use_qt_mt" = "xyes"; then - LIBQT="-l$qtlib-mt" - kde_int_qt="-l$qtlib-mt" - LIBQT_GLOB="lib$qtlib-mt.*" - USING_QT_MT="using -mt" -else - LIBQT="-l$qtlib" -fi - -if test $kde_qtver != 1; then - - AC_REQUIRE([AC_FIND_PNG]) - AC_REQUIRE([AC_FIND_JPEG]) - LIBQT="$LIBQT $LIBPNG $LIBJPEG" -fi - -if test $kde_qtver = 3; then - AC_REQUIRE([KDE_CHECK_LIBDL]) - LIBQT="$LIBQT $LIBDL" -fi - -AC_MSG_CHECKING([for Qt]) - -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" -fi -ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO -qt_libraries="" -qt_includes="" -AC_ARG_WITH(qt-dir, - AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]), - [ ac_qt_includes="$withval"/include - ac_qt_libraries="$withval"/lib${kdelibsuff} - ac_qt_bindir="$withval"/bin - ]) - -AC_ARG_WITH(qt-includes, - AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]), - [ - ac_qt_includes="$withval" - ]) - -kde_qt_libs_given=no - -AC_ARG_WITH(qt-libraries, - AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]), - [ ac_qt_libraries="$withval" - kde_qt_libs_given=yes - ]) - -AC_CACHE_VAL(ac_cv_have_qt, -[#try to guess Qt locations - -qt_incdirs="" -for dir in $kde_qt_dirs; do - qt_incdirs="$qt_incdirs $dir/include $dir" -done -qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes" -if test ! "$ac_qt_includes" = "NO"; then - qt_incdirs="$ac_qt_includes $qt_incdirs" -fi - -if test "$kde_qtver" != "1"; then - kde_qt_header=qstyle.h -else - kde_qt_header=qglobal.h -fi - -AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) -ac_qt_includes="$qt_incdir" - -qt_libdirs="" -for dir in $kde_qt_dirs; do - qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" -done -qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" -if test ! "$ac_qt_libraries" = "NO"; then - qt_libdir=$ac_qt_libraries -else - qt_libdirs="$ac_qt_libraries $qt_libdirs" - # if the Qt was given, the chance is too big that libqt.* doesn't exist - qt_libdir=NONE - for dir in $qt_libdirs; do - try="ls -1 $dir/${LIBQT_GLOB}" - if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi - done -fi -for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do - if test -e "$a"; then - LIBQT="$LIBQT ${kde_int_qt}_incremental" - break - fi -done - -ac_qt_libraries="$qt_libdir" - -AC_LANG_SAVE -AC_LANG_CPLUSPLUS - -ac_cxxflags_safe="$CXXFLAGS" -ac_ldflags_safe="$LDFLAGS" -ac_libs_safe="$LIBS" - -CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" -LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" -LIBS="$LIBS $LIBQT $KDE_MT_LIBS" - -KDE_PRINT_QT_PROGRAM - -if AC_TRY_EVAL(ac_link) && test -s conftest; then - rm -f conftest* -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC - ac_qt_libraries="NO" -fi -rm -f conftest* -CXXFLAGS="$ac_cxxflags_safe" -LDFLAGS="$ac_ldflags_safe" -LIBS="$ac_libs_safe" - -AC_LANG_RESTORE -if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then - ac_cv_have_qt="have_qt=no" - ac_qt_notfound="" - missing_qt_mt="" - if test "$ac_qt_includes" = NO; then - if test "$ac_qt_libraries" = NO; then - ac_qt_notfound="(headers and libraries)"; - else - ac_qt_notfound="(headers)"; - fi - else - if test "x$kde_use_qt_mt" = "xyes"; then - missing_qt_mt=" -Make sure that you have compiled Qt with thread support!" - ac_qt_notfound="(library $qtlib-mt)"; - else - ac_qt_notfound="(library $qtlib)"; - fi - fi - - AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! -For more details about this problem, look at the end of config.log.$missing_qt_mt]) -else - have_qt="yes" -fi -]) - -eval "$ac_cv_have_qt" - -if test "$have_qt" != yes; then - AC_MSG_RESULT([$have_qt]); -else - ac_cv_have_qt="have_qt=yes \ - ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" - AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) - - qt_libraries="$ac_qt_libraries" - qt_includes="$ac_qt_includes" -fi - -if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then - KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) -fi - -AC_SUBST(qt_libraries) -AC_SUBST(qt_includes) - -if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then - QT_INCLUDES="" -else - QT_INCLUDES="-I$qt_includes" - all_includes="$QT_INCLUDES $all_includes" -fi - -if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then - QT_LDFLAGS="" -else - QT_LDFLAGS="-L$qt_libraries" - all_libraries="$QT_LDFLAGS $all_libraries" -fi -test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" - -AC_SUBST(QT_INCLUDES) -AC_SUBST(QT_LDFLAGS) -AC_PATH_QT_MOC_UIC - -KDE_CHECK_QT_JPEG - -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' -else -LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)' -fi -test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" -for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do - if test -e "$a"; then - LIB_QT="$LIB_QT ${kde_int_qt}_incremental" - break - fi -done - -AC_SUBST(LIB_QT) -AC_SUBST(LIB_QPE) - -AC_SUBST(kde_qtver) -]) - -AC_DEFUN([AC_PATH_QT], -[ -AC_PATH_QT_1_3 -]) - -AC_DEFUN([KDE_CHECK_UIC_PLUGINS], -[ -AC_REQUIRE([AC_PATH_QT_MOC_UIC]) - -if test x$ac_uic_supports_libpath = xyes; then - -AC_MSG_CHECKING([if UIC has KDE plugins available]) -AC_CACHE_VAL(kde_cv_uic_plugins, -[ -cat > actest.ui << EOF - -NewConnectionDialog - - - - testInput - - - - -EOF - - - -kde_cv_uic_plugins=no -kde_line="$UIC_PATH -L $kde_widgetdir" -if test x$ac_uic_supports_nounload = xyes; then - kde_line="$kde_line -nounload" -fi -kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" -if AC_TRY_EVAL(kde_line); then - # if you're trying to debug this check and think it's incorrect, - # better check your installation. The check _is_ correct - your - # installation is not. - if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then - kde_cv_uic_plugins=yes - fi -fi -rm -f actest.ui actest.cpp -]) - -AC_MSG_RESULT([$kde_cv_uic_plugins]) -if test "$kde_cv_uic_plugins" != yes; then - AC_MSG_ERROR([ -you need to install kdelibs first. - -If you did install kdelibs, then the Qt version that is picked up by -this configure is not the same version you used to compile kdelibs. -The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the -_same Qt version_, compiled with the _same compiler_ and the same Qt -configuration settings. -]) -fi -fi -]) - -AC_DEFUN([KDE_CHECK_FINAL], -[ - AC_ARG_ENABLE(final, - AC_HELP_STRING([--enable-final], - [build size optimized apps (experimental - needs lots of memory)]), - kde_use_final=$enableval, kde_use_final=no) - - if test "x$kde_use_final" = "xyes"; then - KDE_USE_FINAL_TRUE="" - KDE_USE_FINAL_FALSE="#" - else - KDE_USE_FINAL_TRUE="#" - KDE_USE_FINAL_FALSE="" - fi - AC_SUBST(KDE_USE_FINAL_TRUE) - AC_SUBST(KDE_USE_FINAL_FALSE) -]) - -AC_DEFUN([KDE_CHECK_CLOSURE], -[ - AC_ARG_ENABLE(closure, - AC_HELP_STRING([--enable-closure],[delay template instantiation]), - kde_use_closure=$enableval, kde_use_closure=no) - - KDE_NO_UNDEFINED="" - if test "x$kde_use_closure" = "xyes"; then - KDE_USE_CLOSURE_TRUE="" - KDE_USE_CLOSURE_FALSE="#" -# CXXFLAGS="$CXXFLAGS $REPO" - else - KDE_USE_CLOSURE_TRUE="#" - KDE_USE_CLOSURE_FALSE="" - KDE_NO_UNDEFINED="" - case $host in - *-*-linux-gnu) - KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined], - [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined], - [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"], - [KDE_NO_UNDEFINED=""])], - [KDE_NO_UNDEFINED=""]) - ;; - esac - fi - AC_SUBST(KDE_USE_CLOSURE_TRUE) - AC_SUBST(KDE_USE_CLOSURE_FALSE) - AC_SUBST(KDE_NO_UNDEFINED) -]) - -dnl Check if the linker supports --enable-new-dtags and --as-needed -AC_DEFUN([KDE_CHECK_NEW_LDFLAGS], -[ - AC_ARG_ENABLE(new_ldflags, - AC_HELP_STRING([--enable-new-ldflags], - [enable the new linker flags]), - kde_use_new_ldflags=$enableval, - kde_use_new_ldflags=no) - - LDFLAGS_AS_NEEDED="" - LDFLAGS_NEW_DTAGS="" - if test "x$kde_use_new_ldflags" = "xyes"; then - LDFLAGS_NEW_DTAGS="" - KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags], - [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],) - - KDE_CHECK_COMPILER_FLAG([Wl,--as-needed], - [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],) - fi - AC_SUBST(LDFLAGS_AS_NEEDED) - AC_SUBST(LDFLAGS_NEW_DTAGS) -]) - -AC_DEFUN([KDE_CHECK_NMCHECK], -[ - AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]), - kde_use_nmcheck=$enableval, kde_use_nmcheck=no) - - if test "$kde_use_nmcheck" = "yes"; then - KDE_USE_NMCHECK_TRUE="" - KDE_USE_NMCHECK_FALSE="#" - else - KDE_USE_NMCHECK_TRUE="#" - KDE_USE_NMCHECK_FALSE="" - fi - AC_SUBST(KDE_USE_NMCHECK_TRUE) - AC_SUBST(KDE_USE_NMCHECK_FALSE) -]) - -AC_DEFUN([KDE_EXPAND_MAKEVAR], [ -savex=$exec_prefix -test "x$exec_prefix" = xNONE && exec_prefix=$prefix -tmp=$$2 -while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done -exec_prefix=$savex -]) - -dnl ------------------------------------------------------------------------ -dnl Now, the same with KDE -dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) -dnl and $(kde_includes) will be the kdehdrlocation (if needed) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_BASE_PATH_KDE], -[ -AC_REQUIRE([KDE_CHECK_STL]) -AC_REQUIRE([AC_PATH_QT])dnl -AC_REQUIRE([KDE_CHECK_LIB64]) - -AC_CHECK_RPATH -AC_MSG_CHECKING([for KDE]) - -if test "${prefix}" != NONE; then - kde_includes=${includedir} - KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir) - - kde_libraries=${libdir} - KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir) - -else - ac_kde_includes= - ac_kde_libraries= - kde_libraries="" - kde_includes="" -fi - -AC_CACHE_VAL(ac_cv_have_kde, -[#try to guess kde locations - -if test "$kde_qtver" = 1; then - kde_check_header="ksock.h" - kde_check_lib="libkdecore.la" -else - kde_check_header="ksharedptr.h" - kde_check_lib="libkio.la" -fi - -if test -z "$1"; then - -kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" -test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" -kde_incdirs="$ac_kde_includes $kde_incdirs" -AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) -ac_kde_includes="$kde_incdir" - -if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then - AC_MSG_ERROR([ -in the prefix, you've chosen, are no KDE headers installed. This will fail. -So, check this please and use another prefix!]) -fi - -kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" -test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" -kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" -AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) -ac_kde_libraries="$kde_libdir" - -kde_widgetdir=NO -dnl this might be somewhere else -AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) - -if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then -AC_MSG_ERROR([ -in the prefix, you've chosen, are no KDE libraries installed. This will fail. -So, check this please and use another prefix!]) -fi - -if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then -AC_MSG_ERROR([ -I can't find the designer plugins. These are required and should have been installed -by kdelibs]) -fi - -if test -n "$kde_widgetdir"; then - kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" -fi - - -if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then - ac_cv_have_kde="have_kde=no" -else - ac_cv_have_kde="have_kde=yes \ - ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" -fi - -else dnl test -z $1, e.g. from kdelibs - - ac_cv_have_kde="have_kde=no" - -fi -])dnl - -eval "$ac_cv_have_kde" - -if test "$have_kde" != "yes"; then - if test "${prefix}" = NONE; then - ac_kde_prefix="$ac_default_prefix" - else - ac_kde_prefix="$prefix" - fi - if test "$exec_prefix" = NONE; then - ac_kde_exec_prefix="$ac_kde_prefix" - AC_MSG_RESULT([will be installed in $ac_kde_prefix]) - else - ac_kde_exec_prefix="$exec_prefix" - AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) - fi - - kde_libraries="${libdir}" - kde_includes="${includedir}" - -else - ac_cv_have_kde="have_kde=yes \ - ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" - AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) - - kde_libraries="$ac_kde_libraries" - kde_includes="$ac_kde_includes" -fi -AC_SUBST(kde_libraries) -AC_SUBST(kde_includes) - -if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then - KDE_INCLUDES="" -else - KDE_INCLUDES="-I$kde_includes" - all_includes="$KDE_INCLUDES $all_includes" -fi - -KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION" - -KDE_LDFLAGS="-L$kde_libraries" -if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then - all_libraries="$KDE_LDFLAGS $all_libraries" -fi - -AC_SUBST(KDE_LDFLAGS) -AC_SUBST(KDE_INCLUDES) - -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - -all_libraries="$all_libraries $USER_LDFLAGS" -all_includes="$all_includes $USER_INCLUDES" -AC_SUBST(all_includes) -AC_SUBST(all_libraries) - -if test -z "$1"; then -KDE_CHECK_UIC_PLUGINS -fi - -ac_kde_libraries="$kde_libdir" - -AC_SUBST(AUTODIRS) - - -]) - -AC_DEFUN([KDE_CHECK_EXTRA_LIBS], -[ -AC_MSG_CHECKING(for extra includes) -AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]), - kde_use_extra_includes="$withval", - kde_use_extra_includes=NONE -) -kde_extra_includes= -if test -n "$kde_use_extra_includes" && \ - test "$kde_use_extra_includes" != "NONE"; then - - ac_save_ifs=$IFS - IFS=':' - for dir in $kde_use_extra_includes; do - kde_extra_includes="$kde_extra_includes $dir" - USER_INCLUDES="$USER_INCLUDES -I$dir" - done - IFS=$ac_save_ifs - kde_use_extra_includes="added" -else - kde_use_extra_includes="no" -fi -AC_SUBST(USER_INCLUDES) - -AC_MSG_RESULT($kde_use_extra_includes) - -kde_extra_libs= -AC_MSG_CHECKING(for extra libs) -AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]), - kde_use_extra_libs=$withval, - kde_use_extra_libs=NONE -) -if test -n "$kde_use_extra_libs" && \ - test "$kde_use_extra_libs" != "NONE"; then - - ac_save_ifs=$IFS - IFS=':' - for dir in $kde_use_extra_libs; do - kde_extra_libs="$kde_extra_libs $dir" - KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" - USER_LDFLAGS="$USER_LDFLAGS -L$dir" - done - IFS=$ac_save_ifs - kde_use_extra_libs="added" -else - kde_use_extra_libs="no" -fi - -AC_SUBST(USER_LDFLAGS) - -AC_MSG_RESULT($kde_use_extra_libs) - -]) - -AC_DEFUN([KDE_1_CHECK_PATH_HEADERS], -[ - AC_MSG_CHECKING([for KDE headers installed]) - AC_LANG_SAVE - AC_LANG_CPLUSPLUS -cat > conftest.$ac_ext < -#endif -#include -#include "confdefs.h" -#include - -int main() { - printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); - printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); - printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); - printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); - printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); - printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); - printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); - printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); - printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); - printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); - printf("kde_wallpaperdir=\\"%s\\"\n", - KApplication::kde_wallpaperdir().data()); - printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); - printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); - printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); - printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); - printf("kde_moduledir=\\"/tmp/dummy\\"\n"); - printf("kde_styledir=\\"/tmp/dummy\\"\n"); - printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); - printf("xdg_appsdir=\\"/tmp/dummy\\"\n"); - printf("xdg_menudir=\\"/tmp/dummy\\"\n"); - printf("xdg_directorydir=\\"/tmp/dummy\\"\n"); - printf("kde_kcfgdir=\\"/tmp/dummy\\"\n"); - return 0; - } -EOF - - ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$all_includes $CPPFLAGS" - if AC_TRY_EVAL(ac_compile); then - AC_MSG_RESULT(yes) - else - AC_MSG_ERROR([your system is not able to compile a small KDE application! -Check, if you installed the KDE header files correctly. -For more details about this problem, look at the end of config.log.]) - fi - CPPFLAGS=$ac_save_CPPFLAGS - - AC_LANG_RESTORE -]) - -AC_DEFUN([KDE_CHECK_KDEQTADDON], -[ -AC_MSG_CHECKING(for kde-qt-addon) -AC_CACHE_VAL(kde_cv_have_kdeqtaddon, -[ - kde_ldflags_safe="$LDFLAGS" - kde_libs_safe="$LIBS" - kde_cxxflags_safe="$CXXFLAGS" - - LIBS="-lkde-qt-addon $LIBQT $LIBS" - CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" - LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" - - AC_TRY_LINK([ - #include - ], - [ - QDomDocument doc; - ], - kde_cv_have_kdeqtaddon=yes, - kde_cv_have_kdeqtaddon=no - ) - - LDFLAGS=$kde_ldflags_safe - LIBS=$kde_libs_safe - CXXFLAGS=$kde_cxxflags_safe -]) - -AC_MSG_RESULT($kde_cv_have_kdeqtaddon) - -if test "$kde_cv_have_kdeqtaddon" = "no"; then - AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. -It is a separate package (and CVS module) named kde-qt-addon.]) -fi -]) - -AC_DEFUN([KDE_CREATE_LIBS_ALIASES], -[ - AC_REQUIRE([KDE_MISC_TESTS]) - AC_REQUIRE([KDE_CHECK_LIBDL]) - AC_REQUIRE([K_PATH_X]) - -if test $kde_qtver = 3; then - case $host in - *cygwin*) lib_kded="-lkdeinit_kded" ;; - *) lib_kded="" ;; - esac - AC_SUBST(LIB_KDED, $lib_kded) - AC_SUBST(LIB_KDECORE, "-lkdecore") - AC_SUBST(LIB_KDEUI, "-lkdeui") - AC_SUBST(LIB_KIO, "-lkio") - AC_SUBST(LIB_KJS, "-lkjs") - AC_SUBST(LIB_SMB, "-lsmb") - AC_SUBST(LIB_KAB, "-lkab") - AC_SUBST(LIB_KABC, "-lkabc") - AC_SUBST(LIB_KHTML, "-lkhtml") - AC_SUBST(LIB_KSPELL, "-lkspell") - AC_SUBST(LIB_KPARTS, "-lkparts") - AC_SUBST(LIB_KDEPRINT, "-lkdeprint") - AC_SUBST(LIB_KUTILS, "-lkutils") - AC_SUBST(LIB_KDEPIM, "-lkdepim") - AC_SUBST(LIB_KIMPROXY, "-lkimproxy") - AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff") - AC_SUBST(LIB_KDNSSD, "-lkdnssd") - AC_SUBST(LIB_KUNITTEST, "-lkunittest") -# these are for backward compatibility - AC_SUBST(LIB_KSYCOCA, "-lkio") - AC_SUBST(LIB_KFILE, "-lkio") -elif test $kde_qtver = 2; then - AC_SUBST(LIB_KDECORE, "-lkdecore") - AC_SUBST(LIB_KDEUI, "-lkdeui") - AC_SUBST(LIB_KIO, "-lkio") - AC_SUBST(LIB_KSYCOCA, "-lksycoca") - AC_SUBST(LIB_SMB, "-lsmb") - AC_SUBST(LIB_KFILE, "-lkfile") - AC_SUBST(LIB_KAB, "-lkab") - AC_SUBST(LIB_KHTML, "-lkhtml") - AC_SUBST(LIB_KSPELL, "-lkspell") - AC_SUBST(LIB_KPARTS, "-lkparts") - AC_SUBST(LIB_KDEPRINT, "-lkdeprint") -else - AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") - AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") - AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") - AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") - AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") -fi -]) - -AC_DEFUN([AC_PATH_KDE], -[ - AC_BASE_PATH_KDE - AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]), - [ - if test "$enableval" = "no"; - then ac_use_path_checking="default" - else ac_use_path_checking="" - fi - ], - [ - if test "$kde_qtver" = 1; - then ac_use_path_checking="" - else ac_use_path_checking="default" - fi - ] - ) - - AC_CREATE_KFSSTND($ac_use_path_checking) - - AC_SUBST_KFSSTND - KDE_CREATE_LIBS_ALIASES -]) - -dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) -AC_DEFUN([KDE_CHECK_FUNC_EXT], -[ -AC_MSG_CHECKING(for $1) -AC_CACHE_VAL(kde_cv_func_$1, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -save_CXXFLAGS="$CXXFLAGS" -kde_safe_LIBS="$LIBS" -LIBS="$LIBS $X_EXTRA_LIBS" -if test "$GXX" = "yes"; then -CXXFLAGS="$CXXFLAGS -pedantic-errors" -fi -AC_TRY_COMPILE([ -$2 -], -[ -$3 -], -kde_cv_func_$1=yes, -kde_cv_func_$1=no) -CXXFLAGS="$save_CXXFLAGS" -LIBS="$kde_safe_LIBS" -AC_LANG_RESTORE -]) - -AC_MSG_RESULT($kde_cv_func_$1) - -AC_MSG_CHECKING([if $1 needs custom prototype]) -AC_CACHE_VAL(kde_cv_proto_$1, -[ -if test "x$kde_cv_func_$1" = xyes; then - kde_cv_proto_$1=no -else - case "$1" in - setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) - kde_cv_proto_$1="yes - in libkdefakes" - ;; - *) - kde_cv_proto_$1=unknown - ;; - esac -fi - -if test "x$kde_cv_proto_$1" = xunknown; then - -AC_LANG_SAVE -AC_LANG_CPLUSPLUS - kde_safe_libs=$LIBS - LIBS="$LIBS $X_EXTRA_LIBS" - AC_TRY_LINK([ -$2 - -extern "C" $4; -], -[ -$3 -], -[ kde_cv_func_$1=yes - kde_cv_proto_$1=yes ], - [kde_cv_proto_$1="$1 unavailable"] -) -LIBS=$kde_safe_libs -AC_LANG_RESTORE -fi -]) -AC_MSG_RESULT($kde_cv_proto_$1) - -if test "x$kde_cv_func_$1" = xyes; then - AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) - $6 -fi -if test "x$kde_cv_proto_$1" = xno; then - AC_DEFINE(HAVE_$5_PROTO, 1, - [Define if you have the $1 prototype]) -fi - -AH_VERBATIM([_HAVE_$5_PROTO], -[ -#if !defined(HAVE_$5_PROTO) -#ifdef __cplusplus -extern "C" { -#endif -$4; -#ifdef __cplusplus -} -#endif -#endif -]) -]) - -AC_DEFUN([AC_CHECK_SETENV], -[ - KDE_CHECK_FUNC_EXT(setenv, [ -#include -], - [setenv("VAR", "VALUE", 1);], - [int setenv (const char *, const char *, int)], - [SETENV]) -]) - -AC_DEFUN([AC_CHECK_UNSETENV], -[ - KDE_CHECK_FUNC_EXT(unsetenv, [ -#include -], - [unsetenv("VAR");], - [void unsetenv (const char *)], - [UNSETENV]) -]) - -AC_DEFUN([AC_CHECK_GETDOMAINNAME], -[ - KDE_CHECK_FUNC_EXT(getdomainname, [ -#include -#include -#include -], - [ -char buffer[200]; -getdomainname(buffer, 200); -], - [#include - int getdomainname (char *, size_t)], - [GETDOMAINNAME]) -]) - -AC_DEFUN([AC_CHECK_GETHOSTNAME], -[ - KDE_CHECK_FUNC_EXT(gethostname, [ -#include -#include -], - [ -char buffer[200]; -gethostname(buffer, 200); -], - [int gethostname (char *, unsigned int)], - [GETHOSTNAME]) -]) - -AC_DEFUN([AC_CHECK_USLEEP], -[ - KDE_CHECK_FUNC_EXT(usleep, [ -#include -], - [ -usleep(200); -], - [int usleep (unsigned int)], - [USLEEP]) -]) - - -AC_DEFUN([AC_CHECK_RANDOM], -[ - KDE_CHECK_FUNC_EXT(random, [ -#include -], - [ -random(); -], - [long int random(void)], - [RANDOM]) - - KDE_CHECK_FUNC_EXT(srandom, [ -#include -], - [ -srandom(27); -], - [void srandom(unsigned int)], - [SRANDOM]) - -]) - -AC_DEFUN([AC_CHECK_INITGROUPS], -[ - KDE_CHECK_FUNC_EXT(initgroups, [ -#include -#include -#include -], - [ -char buffer[200]; -initgroups(buffer, 27); -], - [int initgroups(const char *, gid_t)], - [INITGROUPS]) -]) - -AC_DEFUN([AC_CHECK_MKSTEMPS], -[ - KDE_CHECK_FUNC_EXT(mkstemps, [ -#include -#include -], - [ -mkstemps("/tmp/aaaXXXXXX", 6); -], - [int mkstemps(char *, int)], - [MKSTEMPS]) -]) - -AC_DEFUN([AC_CHECK_MKSTEMP], -[ - KDE_CHECK_FUNC_EXT(mkstemp, [ -#include -#include -], - [ -mkstemp("/tmp/aaaXXXXXX"); -], - [int mkstemp(char *)], - [MKSTEMP]) -]) - -AC_DEFUN([AC_CHECK_MKDTEMP], -[ - KDE_CHECK_FUNC_EXT(mkdtemp, [ -#include -#include -], - [ -mkdtemp("/tmp/aaaXXXXXX"); -], - [char *mkdtemp(char *)], - [MKDTEMP]) -]) - - -AC_DEFUN([AC_CHECK_RES_INIT], -[ - AC_MSG_CHECKING([if res_init needs -lresolv]) - kde_libs_safe="$LIBS" - LIBS="$LIBS $X_EXTRA_LIBS -lresolv" - AC_TRY_LINK( - [ -#include -#include -#include -#include - ], - [ - res_init(); - ], - [ - LIBRESOLV="-lresolv" - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) - ], - [ AC_MSG_RESULT(no) ] - ) - LIBS=$kde_libs_safe - AC_SUBST(LIBRESOLV) - - KDE_CHECK_FUNC_EXT(res_init, - [ -#include -#include -#include -#include - ], - [res_init()], - [int res_init(void)], - [RES_INIT]) -]) - -AC_DEFUN([AC_CHECK_STRLCPY], -[ - KDE_CHECK_FUNC_EXT(strlcpy, [ -#include -], -[ char buf[20]; - strlcpy(buf, "KDE function test", sizeof(buf)); -], - [unsigned long strlcpy(char*, const char*, unsigned long)], - [STRLCPY]) -]) - -AC_DEFUN([AC_CHECK_STRLCAT], -[ - KDE_CHECK_FUNC_EXT(strlcat, [ -#include -], -[ char buf[20]; - buf[0]='\0'; - strlcat(buf, "KDE function test", sizeof(buf)); -], - [unsigned long strlcat(char*, const char*, unsigned long)], - [STRLCAT]) -]) - -AC_DEFUN([AC_CHECK_RES_QUERY], -[ - KDE_CHECK_FUNC_EXT(res_query, [ -#include -#include -#include -#include -#include -], -[ -res_query(NULL, 0, 0, NULL, 0); -], - [int res_query(const char *, int, int, unsigned char *, int)], - [RES_QUERY]) -]) - -AC_DEFUN([AC_CHECK_DN_SKIPNAME], -[ - KDE_CHECK_FUNC_EXT(dn_skipname, [ -#include -#include -#include -#include -], -[ -dn_skipname (NULL, NULL); -], - [int dn_skipname (unsigned char *, unsigned char *)], - [DN_SKIPNAME]) -]) - - -AC_DEFUN([AC_FIND_GIF], - [AC_MSG_CHECKING([for giflib]) -AC_CACHE_VAL(ac_cv_lib_gif, -[ac_save_LIBS="$LIBS" -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" -else -LIBS="$all_libraries -lgif" -fi -AC_TRY_LINK(dnl -[ -#ifdef __cplusplus -extern "C" { -#endif -int GifLastError(void); -#ifdef __cplusplus -} -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -], - [return GifLastError();], - eval "ac_cv_lib_gif=yes", - eval "ac_cv_lib_gif=no") -LIBS="$ac_save_LIBS" -])dnl -if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) -else - AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) -fi -]) - -AC_DEFUN([KDE_FIND_JPEG_HELPER], -[ -AC_MSG_CHECKING([for libjpeg$2]) -AC_CACHE_VAL(ac_cv_lib_jpeg_$1, -[ -ac_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" -ac_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK( -[ -#ifdef __cplusplus -extern "C" { -#endif -void jpeg_CreateDecompress(); -#ifdef __cplusplus -} -#endif -], -[jpeg_CreateDecompress();], - eval "ac_cv_lib_jpeg_$1=-ljpeg$2", - eval "ac_cv_lib_jpeg_$1=no") -LIBS="$ac_save_LIBS" -CFLAGS="$ac_save_CFLAGS" -]) - -if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then - LIBJPEG="$ac_cv_lib_jpeg_$1" - AC_MSG_RESULT($ac_cv_lib_jpeg_$1) -else - AC_MSG_RESULT(no) - $3 -fi - -]) - -AC_DEFUN([AC_FIND_JPEG], -[ -dnl first look for libraries -KDE_FIND_JPEG_HELPER(6b, 6b, - KDE_FIND_JPEG_HELPER(normal, [], - [ - LIBJPEG= - ] - ) -) - -dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h -dnl requires system dependent includes loaded before it) -jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" -AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) -test "x$jpeg_incdir" = xNO && jpeg_incdir= - -dnl if headers _and_ libraries are missing, this is no error, and we -dnl continue with a warning (the user will get no jpeg support in khtml) -dnl if only one is missing, it means a configuration error, but we still -dnl only warn -if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then - AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) -else - if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then - AC_MSG_WARN([ -There is an installation error in jpeg support. You seem to have only one -of either the headers _or_ the libraries installed. You may need to either -provide correct --with-extra-... options, or the development package of -libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ -Disabling JPEG support. -]) - else - AC_MSG_WARN([libjpeg not found. disable JPEG support.]) - fi - jpeg_incdir= - LIBJPEG= -fi - -AC_SUBST(LIBJPEG) -AH_VERBATIM(_AC_CHECK_JPEG, -[/* - * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system - * headers and I'm too lazy to write a configure test as long as only - * unixware is related - */ -#ifdef _UNIXWARE -#define HAVE_BOOLEAN -#endif -]) -]) - -AC_DEFUN([KDE_CHECK_QT_JPEG], -[ -if test -n "$LIBJPEG"; then -AC_MSG_CHECKING([if Qt needs $LIBJPEG]) -AC_CACHE_VAL(kde_cv_qt_jpeg, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -ac_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS $LIBQT" -LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` -ac_save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK( -[#include ], - [ - int argc; - char** argv; - QApplication app(argc, argv);], - eval "kde_cv_qt_jpeg=no", - eval "kde_cv_qt_jpeg=yes") -LIBS="$ac_save_LIBS" -CXXFLAGS="$ac_save_CXXFLAGS" -AC_LANG_RESTORE -fi -]) - -if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then - AC_MSG_RESULT(yes) - LIBJPEG_QT='$(LIBJPEG)' -else - AC_MSG_RESULT(no) - LIBJPEG_QT= -fi - -]) - -AC_DEFUN([AC_FIND_ZLIB], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_MSG_CHECKING([for libz]) -AC_CACHE_VAL(ac_cv_lib_z, -[ -kde_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" -kde_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK(dnl -[ -#include -], -[ - char buf[42]; - gzFile f = (gzFile) 0; - /* this would segfault.. but we only link, don't run */ - (void) gzgets(f, buf, sizeof(buf)); - - return (zlibVersion() == ZLIB_VERSION); -], - eval "ac_cv_lib_z='-lz'", - eval "ac_cv_lib_z=no") -LIBS="$kde_save_LIBS" -CFLAGS="$kde_save_CFLAGS" -])dnl -if test ! "$ac_cv_lib_z" = no; then - AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) - LIBZ="$ac_cv_lib_z" - AC_MSG_RESULT($ac_cv_lib_z) -else - AC_MSG_ERROR(not found. - Possibly configure picks up an outdated version - installed by XFree86. Remove it from your system. - - Check your installation and look into config.log) - LIBZ="" -fi -AC_SUBST(LIBZ) -]) - -AC_DEFUN([KDE_TRY_TIFFLIB], -[ -AC_MSG_CHECKING([for libtiff $1]) - -AC_CACHE_VAL(kde_cv_libtiff_$1, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -kde_save_LIBS="$LIBS" -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" -else -LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" -fi -kde_save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" - -AC_TRY_LINK(dnl -[ -#include -], - [return (TIFFOpen( "", "r") == 0); ], -[ - kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" -], [ - kde_cv_libtiff_$1=no -]) - -LIBS="$kde_save_LIBS" -CXXFLAGS="$kde_save_CXXFLAGS" -AC_LANG_RESTORE -]) - -if test "$kde_cv_libtiff_$1" = "no"; then - AC_MSG_RESULT(no) - LIBTIFF="" - $3 -else - LIBTIFF="$kde_cv_libtiff_$1" - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) - $2 -fi - -]) - -AC_DEFUN([AC_FIND_TIFF], -[ -AC_REQUIRE([K_PATH_X]) -AC_REQUIRE([AC_FIND_ZLIB]) -AC_REQUIRE([AC_FIND_JPEG]) -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - -KDE_TRY_TIFFLIB(tiff, [], - KDE_TRY_TIFFLIB(tiff34)) - -AC_SUBST(LIBTIFF) -]) - -AC_DEFUN([KDE_FIND_LIBEXR], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_REQUIRE([AC_FIND_ZLIB]) -AC_CACHE_VAL(ac_cv_libexr, -[ - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - AC_MSG_CHECKING([for OpenEXR libraries]) - - if test "$PKG_CONFIG" = "no" ; then - AC_MSG_RESULT(no) - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - if !(`$PKG_CONFIG --exists OpenEXR`) ; then - AC_MSG_RESULT(no) - EXRSTATUS=no - else - if !(`$PKG_CONFIG --atleast-version="1.1.1" OpenEXR`) ; then - AC_MSG_RESULT(no) - EXRSTATUS=old - else - kde_save_LIBS="$LIBS" - LIBS="$LIBS $all_libraries $USER_LDFLAGS `pkg-config --libs OpenEXR` $LIBZ" - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - kde_save_CXXFLAGS="$CXXFLAGS" - EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR` - CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS" - - AC_TRY_LINK(dnl - [ - #include - ], - [ - using namespace Imf; - RgbaInputFile file ("dummy"); - return 0; - ], - eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'", - eval "ac_cv_libexr=no" - ) - LIBS="$kde_save_LIBS" - CXXFLAGS="$kde_save_CXXFLAGS" - AC_LANG_RESTORE - ])dnl - if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then - AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR]) - LIB_EXR="$ac_cv_libexr" - AC_MSG_RESULT($ac_cv_libexr) - else - AC_MSG_RESULT(no) - LIB_EXR="" - fi - fi - fi - fi - AC_SUBST(LIB_EXR) - AC_SUBST(EXR_FLAGS) -]) - - - -AC_DEFUN([AC_FIND_PNG], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_REQUIRE([AC_FIND_ZLIB]) -AC_MSG_CHECKING([for libpng]) -AC_CACHE_VAL(ac_cv_lib_png, -[ -kde_save_LIBS="$LIBS" -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" -else -LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" -fi -kde_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" - -AC_TRY_LINK(dnl - [ - #include - ], - [ - png_structp png_ptr = png_create_read_struct( /* image ptr */ - PNG_LIBPNG_VER_STRING, 0, 0, 0 ); - return( png_ptr != 0 ); - ], - eval "ac_cv_lib_png='-lpng $LIBZ -lm'", - eval "ac_cv_lib_png=no" -) -LIBS="$kde_save_LIBS" -CFLAGS="$kde_save_CFLAGS" -])dnl -if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then - AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) - LIBPNG="$ac_cv_lib_png" - AC_SUBST(LIBPNG) - AC_MSG_RESULT($ac_cv_lib_png) -else - AC_MSG_RESULT(no) - LIBPNG="" - AC_SUBST(LIBPNG) -fi -]) - - -AC_DEFUN([AC_FIND_JASPER], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_REQUIRE([AC_FIND_JPEG]) -AC_MSG_CHECKING([for jasper]) -AC_CACHE_VAL(ac_cv_jasper, -[ -kde_save_LIBS="$LIBS" -LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm" -kde_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" - -AC_TRY_LINK(dnl - [ - #include - ], - [ - return( jas_init() ); - ], - eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'", - eval "ac_cv_jasper=no" -) -LIBS="$kde_save_LIBS" -CFLAGS="$kde_save_CFLAGS" -])dnl -if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then - AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper]) - LIB_JASPER="$ac_cv_jasper" - AC_MSG_RESULT($ac_cv_jasper) -else - AC_MSG_RESULT(no) - LIB_JASPER="" -fi -AC_SUBST(LIB_JASPER) -]) - -AC_DEFUN([AC_CHECK_BOOL], -[ - AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) -]) - -AC_DEFUN([AC_CHECK_GNU_EXTENSIONS], -[ -AC_MSG_CHECKING(if you need GNU extensions) -AC_CACHE_VAL(ac_cv_gnu_extensions, -[ -cat > conftest.c << EOF -#include - -#ifdef __GNU_LIBRARY__ -yes -#endif -EOF - -if (eval "$ac_cpp conftest.c") 2>&5 | - egrep "yes" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_gnu_extensions=yes -else - ac_cv_gnu_extensions=no -fi -]) - -AC_MSG_RESULT($ac_cv_gnu_extensions) -if test "$ac_cv_gnu_extensions" = "yes"; then - AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) -fi -]) - -AC_DEFUN([KDE_CHECK_COMPILER_FLAG], -[ -AC_MSG_CHECKING([whether $CXX supports -$1]) -kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` -AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, -[ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS -$1" - AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) - CXXFLAGS="$save_CXXFLAGS" - AC_LANG_RESTORE -]) -if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then - AC_MSG_RESULT(yes) - : - $2 -else - AC_MSG_RESULT(no) - : - $3 -fi -]) - -AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG], -[ -AC_MSG_CHECKING([whether $CC supports -$1]) -kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` -AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache, -[ - AC_LANG_SAVE - AC_LANG_C - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -$1" - AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], []) - CFLAGS="$save_CFLAGS" - AC_LANG_RESTORE -]) -if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then - AC_MSG_RESULT(yes) - : - $2 -else - AC_MSG_RESULT(no) - : - $3 -fi -]) - - -dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables -dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) -dnl it's all white-space separated -AC_DEFUN([AC_REMOVE_FORBIDDEN], -[ __val=$$1 - __forbid=" $2 " - if test -n "$__val"; then - __new="" - ac_save_IFS=$IFS - IFS=" " - for i in $__val; do - case "$__forbid" in - *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; - *) # Careful to not add spaces, where there were none, because otherwise - # libtool gets confused, if we change e.g. CXX - if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; - esac - done - IFS=$ac_save_IFS - $1=$__new - fi -]) - - -AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER], -[ - AC_MSG_CHECKING([whether $CC is blacklisted]) - - dnl In theory we have tu run this test against $CC and $CXX - dnl in C and in C++ mode, because its perfectly legal for - dnl the user to mix compiler versions, since C has a defined - dnl ABI. - dnl - dnl For now, we assume the user is not on crack. - - AC_TRY_COMPILE([ -#ifdef __GNUC__ -#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0 -choke me -#endif -#endif -], , - kde_bad_compiler=no, - kde_bad_compiler=yes -) - - AC_MSG_RESULT($kde_bad_compiler) - -if test "$kde_bad_compiler" = "yes"; then - AC_MSG_ERROR([ - -This particular compiler version is blacklisted because it -is known to miscompile KDE. Please use a newer version, or -if that is not yet available, choose an older version. - -Please do not report a bug or bother us reporting this -configure error. We know about it, and we introduced -it by intention to avoid untraceable bugs or crashes in KDE. - -]) -fi - -]) - - -AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH], -[ - AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline], - kde_cv_opt_noinline_match, - [ - kde_cv_opt_noinline_match=irrelevant - dnl if we don't use both -O2 and -fno-inline, this check is moot - if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \ - && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then - - ac_cflags_save="$CFLAGS" - CFLAGS="$CFLAGS -D_USE_GNU" - - AC_TRY_LINK([ - #include -], [ const char *pt, *et; - et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ; -], - kde_cv_opt_noinline_match=yes, - kde_cv_opt_noinline_match=no - ) - - CFLAGS="$ac_cflags_save" - fi - ]) -]) - - -dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given -AC_DEFUN([AC_VALIDIFY_CXXFLAGS], -[dnl -if test "x$kde_use_qt_emb" != "xyes"; then - AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) - AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) -else - AC_REMOVE_FORBIDDEN(CXX, [-rpath]) - AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) -fi -]) - -AC_DEFUN([AC_CHECK_COMPILERS], -[ - AC_ARG_ENABLE(debug, - AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]), - [ - case $enableval in - yes) - kde_use_debug_code="yes" - kde_use_debug_define=no - ;; - full) - kde_use_debug_code="full" - kde_use_debug_define=no - ;; - *) - kde_use_debug_code="no" - kde_use_debug_define=yes - ;; - esac - ], - [kde_use_debug_code="no" - kde_use_debug_define=no - ]) - - dnl Just for configure --help - AC_ARG_ENABLE(dummyoption, - AC_HELP_STRING([--disable-debug], - [disables debug output and debug symbols [default=no]]), - [],[]) - - AC_ARG_ENABLE(strict, - AC_HELP_STRING([--enable-strict], - [compiles with strict compiler options (may not work!)]), - [ - if test $enableval = "no"; then - kde_use_strict_options="no" - else - kde_use_strict_options="yes" - fi - ], [kde_use_strict_options="no"]) - - AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]), - [ - if test $enableval = "no"; then - kde_use_warnings="no" - else - kde_use_warnings="yes" - fi - ], [kde_use_warnings="yes"]) - - dnl enable warnings for debug build - if test "$kde_use_debug_code" != "no"; then - kde_use_warnings=yes - fi - - AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]), - [kde_use_profiling=$enableval], - [kde_use_profiling="no"] - ) - - dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS - CFLAGS=" $CFLAGS" - - AC_PROG_CC - - AC_PROG_CPP - - if test "$GCC" = "yes"; then - if test "$kde_use_debug_code" != "no"; then - if test $kde_use_debug_code = "full"; then - CFLAGS="-g3 -fno-inline $CFLAGS" - else - CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS" - fi - else - CFLAGS="-O2 $CFLAGS" - fi - fi - - if test "$kde_use_debug_define" = "yes"; then - CFLAGS="-DNDEBUG $CFLAGS" - fi - - - case "$host" in - *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; - *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; - esac - - if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then - LDFLAGS="" - fi - - CXXFLAGS=" $CXXFLAGS" - - AC_PROG_CXX - - KDE_CHECK_FOR_BAD_COMPILER - - if test "$GXX" = "yes" || test "$CXX" = "KCC"; then - if test "$kde_use_debug_code" != "no"; then - if test "$CXX" = "KCC"; then - CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS" - else - if test "$kde_use_debug_code" = "full"; then - CXXFLAGS="-g3 -fno-inline $CXXFLAGS" - else - CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS" - fi - fi - KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) - - dnl convenience compiler flags - KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) - AC_SUBST(WOVERLOADED_VIRTUAL) - else - if test "$CXX" = "KCC"; then - CXXFLAGS="+K3 $CXXFLAGS" - else - CXXFLAGS="-O2 $CXXFLAGS" - fi - fi - fi - - if test "$kde_use_debug_define" = "yes"; then - CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" - fi - - if test "$kde_use_profiling" = "yes"; then - KDE_CHECK_COMPILER_FLAG(pg, - [ - CFLAGS="-pg $CFLAGS" - CXXFLAGS="-pg $CXXFLAGS" - ]) - fi - - if test "$kde_use_warnings" = "yes"; then - if test "$GCC" = "yes"; then - CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS" - case $host in - *-*-linux-gnu) - CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" - CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wchar-subscripts $CXXFLAGS" - KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"]) - KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"]) - ;; - esac - KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) - KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) - dnl ### FIXME: revert for KDE 4 - KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"]) - fi - fi - - if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then - CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" - fi - - AC_ARG_ENABLE(pch, - AC_HELP_STRING([--enable-pch], - [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]), - [ kde_use_pch=$enableval ],[ kde_use_pch=no ]) - - HAVE_GCC_VISIBILITY=0 - AC_SUBST([HAVE_GCC_VISIBILITY]) - - if test "$GXX" = "yes"; then - gcc_no_reorder_blocks=NO - KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES]) - if test $kde_use_debug_code != "no" && \ - test $kde_use_debug_code != "full" && \ - test "YES" = "$gcc_no_reorder_blocks" ; then - CXXFLAGS="$CXXFLAGS -fno-reorder-blocks" - CFLAGS="$CFLAGS -fno-reorder-blocks" - fi - KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) - KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) - KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"]) - KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) - ENABLE_PERMISSIVE_FLAG="-fpermissive" - - if test "$kde_use_pch" = "yes"; then - AC_MSG_CHECKING(whether gcc supports precompiling c header files) - echo >conftest.h - if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then - kde_gcc_supports_pch=yes - AC_MSG_RESULT(yes) - else - kde_gcc_supports_pch=no - AC_MSG_RESULT(no) - fi - if test "$kde_gcc_supports_pch" = "yes"; then - AC_MSG_CHECKING(whether gcc supports precompiling c++ header files) - if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then - kde_gcc_supports_pch=yes - AC_MSG_RESULT(yes) - else - kde_gcc_supports_pch=no - AC_MSG_RESULT(no) - fi - fi - rm -f conftest.h conftest.h.gch - fi - - KDE_CHECK_FOR_OPT_NOINLINE_MATCH - if test "x$kde_cv_opt_noinline_match" = "xno" ; then - CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`" - fi - fi - AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes") - if test "$CXX" = "KCC"; then - dnl unfortunately we currently cannot disable exception support in KCC - dnl because doing so is binary incompatible and Qt by default links with exceptions :-( - dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) - dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) - - if test "$kde_use_pch" = "yes"; then - dnl TODO: support --pch-dir! - KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) - dnl the below works (but the dir must exist), but it's - dnl useless for a whole package. - dnl The are precompiled headers for each source file, so when compiling - dnl from scratch, it doesn't make a difference, and they take up - dnl around ~5Mb _per_ sourcefile. - dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, - dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) - fi - dnl this flag controls inlining. by default KCC inlines in optimisation mode - dnl all implementations that are defined inside the class {} declaration. - dnl because of templates-compatibility with broken gcc compilers, this - dnl can cause excessive inlining. This flag limits it to a sane level - KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) - KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) - KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) - KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) - dnl Some source files are shared between multiple executables - dnl (or libraries) and some of those need template instantiations. - dnl In that case KCC needs to compile those sources with - dnl --one_instantiation_per_object. To make it easy for us we compile - dnl _all_ objects with that flag (--one_per is a shorthand). - KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) - fi - AC_SUBST(USE_EXCEPTIONS) - dnl obsolete macro - provided to keep things going - USE_RTTI= - AC_SUBST(USE_RTTI) - - case "$host" in - *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; - *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; - *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; - *-*-solaris*) - if test "$GXX" = yes; then - libstdcpp=`$CXX -print-file-name=libstdc++.so` - if test ! -f $libstdcpp; then - AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) - fi - fi - ;; - esac - - AC_VALIDIFY_CXXFLAGS - - AC_PROG_CXXCPP - - if test "$GCC" = yes; then - NOOPT_CFLAGS=-O0 - fi - KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0]) - - AC_ARG_ENABLE(coverage, - AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [ - if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then - ac_coverage_compiler="-fprofile-arcs -ftest-coverage" - ac_coverage_linker="-lgcc" - elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then - ac_coverage_compiler="-fprofile-arcs -ftest-coverage" - ac_coverage_linker="" - else - AC_MSG_ERROR([coverage with your compiler is not supported]) - fi - CFLAGS="$CFLAGS $ac_coverage_compiler" - CXXFLAGS="$CXXFLAGS $ac_coverage_compiler" - LDFLAGS="$LDFLAGS $ac_coverage_linker" - ]) - - AC_SUBST(NOOPT_CXXFLAGS) - AC_SUBST(NOOPT_CFLAGS) - AC_SUBST(ENABLE_PERMISSIVE_FLAG) - - KDE_CHECK_NEW_LDFLAGS - KDE_CHECK_FINAL - KDE_CHECK_CLOSURE - KDE_CHECK_NMCHECK - - ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) -]) - -AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG], - [ - AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - - safe_CXXFLAGS=$CXXFLAGS - safe_LDFLAGS=$LDFLAGS - CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0" - LDFLAGS="$LDFLAGS -shared -fPIC" - - AC_TRY_LINK( - [ - /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */ - #include - int some_function( void ) __attribute__ ((visibility("default"))); - int some_function( void ) - { - std::string s("blafasel"); - return 0; - } - ], [/* elvis is alive */], - kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes) - - CXXFLAGS=$safe_CXXFLAGS - LDFLAGS=$safe_LDFLAGS - AC_LANG_RESTORE - ] - ) - - if test x$kde_cv_val_gcc_visibility_bug = xno; then - CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden" - fi - ] -) - -AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY], -[ - AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY]) - - AC_MSG_CHECKING([grepping for visibility push/pop in headers]) - - if test "x$GXX" = "xyes"; then - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_EGREP_CPP( - [GCC visibility push], - [ #include - ], - [ - AC_MSG_RESULT(yes) - kde_stdc_visibility_patched=yes ], - [ - AC_MSG_RESULT(no) - AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for - visibility support. Disabling -fvisibility=hidden]) - - kde_stdc_visibility_patched=no ]) - - AC_LANG_RESTORE - - kde_have_gcc_visibility=no - KDE_CHECK_COMPILER_FLAG(fvisibility=hidden, - [ - kde_have_gcc_visibility=yes - dnl the whole toolchain is just a mess, gcc is just too buggy - dnl to handle STL with visibility enabled. Lets reconsider - dnl when gcc 4.2 is out or when things get fixed in the compiler. - dnl Contact mueller@kde.org for details. - AC_ARG_ENABLE(gcc-hidden-visibility, - AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]), - [kde_have_gcc_visibility=$enableval], - [kde_have_gcc_visibility=no]) - - AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - - safe_CXXFLAGS=$CXXFLAGS - CXXFLAGS="$CXXFLAGS $all_includes" - - AC_TRY_COMPILE( - [ -#include -#if Q_EXPORT - 0 != 0 -/* if this compiles, then Q_EXPORT is undefined */ -/* if Q_EXPORT is nonempty, this will break compilation */ -#endif - ], [/* elvis is alive */], - kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes) - - CXXFLAGS=$safe_CXXFLAGS - AC_LANG_RESTORE - ] - ) - - if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then - CXXFLAGS="$CXXFLAGS -fvisibility=hidden" - KDE_CHECK_VISIBILITY_GCC_BUG - HAVE_GCC_VISIBILITY=1 - AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported]) - fi - ]) - fi -]) - -AC_DEFUN([KDE_ADD_DEPENDENCIES], -[ - [A]M_DEPENDENCIES(CC) - [A]M_DEPENDENCIES(CXX) -]) - -dnl just a wrapper to clean up configure.in -AC_DEFUN([KDE_PROG_LIBTOOL], -[ -AC_REQUIRE([AC_CHECK_COMPILERS]) -AC_REQUIRE([AC_ENABLE_SHARED]) -AC_REQUIRE([AC_ENABLE_STATIC]) - -AC_REQUIRE([AC_LIBTOOL_DLOPEN]) -AC_REQUIRE([KDE_CHECK_LIB64]) - -AC_OBJEXT -AC_EXEEXT - -AM_PROG_LIBTOOL -AC_LIBTOOL_CXX - -LIBTOOL_SHELL="/bin/sh ./libtool" -# LIBTOOL="$LIBTOOL --silent" -KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" -AC_SUBST(KDE_PLUGIN) - -# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs. -KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)" -AC_SUBST(KDE_CHECK_PLUGIN) - -# we patch configure quite some so we better keep that consistent for incremental runs -AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure') -]) - -AC_DEFUN([KDE_CHECK_LIB64], -[ - AC_ARG_ENABLE(libsuffix, - AC_HELP_STRING([--enable-libsuffix], - [/lib directory suffix (64,32,none,auto[=default])]), - kdelibsuff=$enableval, kdelibsuff="auto") - - if test "$kdelibsuff" = "auto"; then - -cat > conftest.c << EOF -#include -int main() { - return 0; -} -EOF - kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{ - s,.*/lib\([[^\/]]*\)/.*,\1, - p -}'` - rm -rf conftest.* - fi - - if test "$kdelibsuff" = "no" || test "$kdelibsuff" = "none"; then - kdelibsuff= - fi - if test -z "$kdelibsuff"; then - AC_MSG_RESULT([not using lib directory suffix]) - AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) - else - if test "$libdir" = '${exec_prefix}/lib'; then - libdir="$libdir${kdelibsuff}" - AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms - fi - AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories) - AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) - fi -]) - -AC_DEFUN([KDE_CHECK_TYPES], -[ AC_CHECK_SIZEOF(int, 4)dnl - AC_CHECK_SIZEOF(short)dnl - AC_CHECK_SIZEOF(long, 4)dnl - AC_CHECK_SIZEOF(char *, 4)dnl -])dnl - -dnl Not used - kept for compat only? -AC_DEFUN([KDE_DO_IT_ALL], -[ -AC_CANONICAL_SYSTEM -AC_ARG_PROGRAM -AM_INIT_AUTOMAKE($1, $2) -AM_DISABLE_LIBRARIES -AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) -AC_CHECK_COMPILERS -KDE_PROG_LIBTOOL -AM_KDE_WITH_NLS -AC_PATH_KDE -]) - -AC_DEFUN([AC_CHECK_RPATH], -[ -AC_MSG_CHECKING(for rpath) -AC_ARG_ENABLE(rpath, - AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]), - USE_RPATH=$enableval, USE_RPATH=yes) - -if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then - - KDE_RPATH="-R \$(libdir)" - - if test "$kde_libraries" != "$libdir"; then - KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)" - fi - - if test -n "$qt_libraries"; then - KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" - fi - dnl $x_libraries is set to /usr/lib in case - if test -n "$X_LDFLAGS"; then - X_RPATH="-R \$(x_libraries)" - KDE_RPATH="$KDE_RPATH $X_RPATH" - fi - if test -n "$KDE_EXTRA_RPATH"; then - KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" - fi -fi -AC_SUBST(KDE_EXTRA_RPATH) -AC_SUBST(KDE_RPATH) -AC_SUBST(X_RPATH) -AC_MSG_RESULT($USE_RPATH) -]) - -dnl Check for the type of the third argument of getsockname -AC_DEFUN([AC_CHECK_SOCKLEN_T], -[ - AC_MSG_CHECKING(for socklen_t) - AC_CACHE_VAL(kde_cv_socklen_t, - [ - AC_LANG_PUSH(C++) - kde_cv_socklen_t=no - AC_TRY_COMPILE([ - #include - #include - ], - [ - socklen_t len; - getpeername(0,0,&len); - ], - [ - kde_cv_socklen_t=yes - kde_cv_socklen_t_equiv=socklen_t - ]) - AC_LANG_POP(C++) - ]) - AC_MSG_RESULT($kde_cv_socklen_t) - if test $kde_cv_socklen_t = no; then - AC_MSG_CHECKING([for socklen_t equivalent for socket functions]) - AC_CACHE_VAL(kde_cv_socklen_t_equiv, - [ - kde_cv_socklen_t_equiv=int - AC_LANG_PUSH(C++) - for t in int size_t unsigned long "unsigned long"; do - AC_TRY_COMPILE([ - #include - #include - ], - [ - $t len; - getpeername(0,0,&len); - ], - [ - kde_cv_socklen_t_equiv="$t" - break - ]) - done - AC_LANG_POP(C++) - ]) - AC_MSG_RESULT($kde_cv_socklen_t_equiv) - fi - AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv, - [type to use in place of socklen_t if not defined]) - AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv, - [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)]) -]) - -dnl This is a merge of some macros out of the gettext aclocal.m4 -dnl since we don't need anything, I took the things we need -dnl the copyright for them is: -dnl > -dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. -dnl This Makefile.in is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. -dnl > -dnl for this file it is relicensed under LGPL - -AC_DEFUN([AM_KDE_WITH_NLS], - [ - dnl If we use NLS figure out what method - - AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, - [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - - if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then - AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) - GMSGFMT=":" - fi - MSGFMT=$GMSGFMT - AC_SUBST(GMSGFMT) - AC_SUBST(MSGFMT) - - AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - - dnl Test whether we really found GNU xgettext. - if test "$XGETTEXT" != ":"; then - dnl If it is no GNU xgettext we define it as : so that the - dnl Makefiles still can work. - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - AC_MSG_RESULT( - [found xgettext programs is not GNU xgettext; ignore it]) - XGETTEXT=":" - fi - fi - AC_SUBST(XGETTEXT) - - ]) - -# Search path for a program which passes the given test. -# Ulrich Drepper , 1996. - -# serial 1 -# Stephan Kulow: I appended a _KDE against name conflicts - -dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE], -[# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL(ac_cv_path_$1, -[case "[$]$1" in - /*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in ifelse([$5], , $PATH, [$5]); do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test -n "[$]$1"; then - AC_MSG_RESULT([$]$1) -else - AC_MSG_RESULT(no) -fi -AC_SUBST($1)dnl -]) - - -# Check whether LC_MESSAGES is available in . -# Ulrich Drepper , 1995. - -# serial 1 - -AC_DEFUN([AM_LC_MESSAGES], - [if test $ac_cv_header_locale_h = yes; then - AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, - [AC_TRY_LINK([#include ], [return LC_MESSAGES], - am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) - if test $am_cv_val_LC_MESSAGES = yes; then - AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) - fi - fi]) - -dnl From Jim Meyering. -dnl FIXME: migrate into libit. - -AC_DEFUN([AM_FUNC_OBSTACK], -[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, - [AC_TRY_LINK([#include "obstack.h"], - [struct obstack *mem;obstack_free(mem,(char *) 0)], - am_cv_func_obstack=yes, - am_cv_func_obstack=no)]) - if test $am_cv_func_obstack = yes; then - AC_DEFINE(HAVE_OBSTACK) - else - LIBOBJS="$LIBOBJS obstack.o" - fi -]) - -dnl From Jim Meyering. Use this if you use the GNU error.[ch]. -dnl FIXME: Migrate into libit - -AC_DEFUN([AM_FUNC_ERROR_AT_LINE], -[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, - [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], - am_cv_lib_error_at_line=yes, - am_cv_lib_error_at_line=no)]) - if test $am_cv_lib_error_at_line = no; then - LIBOBJS="$LIBOBJS error.o" - fi - AC_SUBST(LIBOBJS)dnl -]) - -# Macro to add for using GNU gettext. -# Ulrich Drepper , 1995. - -# serial 1 -# Stephan Kulow: I put a KDE in it to avoid name conflicts - -AC_DEFUN([AM_KDE_GNU_GETTEXT], - [AC_REQUIRE([AC_PROG_MAKE_SET])dnl - AC_REQUIRE([AC_PROG_RANLIB])dnl - AC_REQUIRE([AC_HEADER_STDC])dnl - AC_REQUIRE([AC_TYPE_OFF_T])dnl - AC_REQUIRE([AC_TYPE_SIZE_T])dnl - AC_REQUIRE([AC_FUNC_ALLOCA])dnl - AC_REQUIRE([AC_FUNC_MMAP])dnl - AC_REQUIRE([AM_KDE_WITH_NLS])dnl - AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) - AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ -__argz_count __argz_stringify __argz_next]) - - AC_MSG_CHECKING(for stpcpy) - AC_CACHE_VAL(kde_cv_func_stpcpy, - [ - kde_safe_cxxflags=$CXXFLAGS - CXXFLAGS="-Werror" - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_COMPILE([ - #include - ], - [ - char buffer[200]; - stpcpy(buffer, buffer); - ], - kde_cv_func_stpcpy=yes, - kde_cv_func_stpcpy=no) - AC_LANG_RESTORE - CXXFLAGS=$kde_safe_cxxflags - ]) - AC_MSG_RESULT($kde_cv_func_stpcpy) - if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then - AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) - fi - - AM_LC_MESSAGES - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - AC_MSG_CHECKING(for catalogs to be installed) - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - AC_MSG_RESULT($LINGUAS) - fi - - dnl Construct list of names of catalog files to be constructed. - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - ]) - -AC_DEFUN([AC_HAVE_XPM], - [AC_REQUIRE_CPP()dnl - AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - - test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= - test -z "$XPM_INCLUDE" && XPM_INCLUDE= - - AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]), - xpm_test=$withval, xpm_test="yes") - if test "x$xpm_test" = xno; then - ac_cv_have_xpm=no - else - AC_MSG_CHECKING(for XPM) - AC_CACHE_VAL(ac_cv_have_xpm, - [ - ac_save_ldflags="$LDFLAGS" - ac_save_cflags="$CFLAGS" - if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then - LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" - else - LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" - fi - CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" - test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" - AC_TRY_LINK([#include ],[], - ac_cv_have_xpm="yes",ac_cv_have_xpm="no") - LDFLAGS="$ac_save_ldflags" - CFLAGS="$ac_save_cflags" - ])dnl - - if test "$ac_cv_have_xpm" = no; then - AC_MSG_RESULT(no) - XPM_LDFLAGS="" - XPMINC="" - $2 - else - AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) - if test "$XPM_LDFLAGS" = ""; then - XPMLIB='-lXpm $(LIB_X11)' - else - XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' - fi - if test "$XPM_INCLUDE" = ""; then - XPMINC="" - else - XPMINC="-I$XPM_INCLUDE" - fi - AC_MSG_RESULT(yes) - $1 - fi - fi - AC_SUBST(XPMINC) - AC_SUBST(XPMLIB) -]) - -AC_DEFUN([AC_HAVE_DPMS], - [AC_REQUIRE_CPP()dnl - AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - - test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= - test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= - DPMS_LIB= - - AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]), - dpms_test=$withval, dpms_test="yes") - if test "x$dpms_test" = xno; then - ac_cv_have_dpms=no - else - AC_MSG_CHECKING(for DPMS) - dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. - dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". - AC_CACHE_VAL(ac_cv_have_dpms, - [ - if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then - AC_MSG_RESULT(no) - ac_cv_have_dpms="no" - else - ac_save_ldflags="$LDFLAGS" - ac_save_cflags="$CFLAGS" - ac_save_libs="$LIBS" - LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries" - LIBS="-lX11 -lXext $LIBSOCKET" - CFLAGS="$CFLAGS $X_INCLUDES" - test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" - AC_TRY_LINK([ - #include - #include - #include - #include - int foo_test_dpms() - { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], - ac_cv_have_dpms="yes", [ - LIBS="-lXdpms $LIBS" - AC_TRY_LINK([ - #include - #include - #include - #include - int foo_test_dpms() - { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], - [ - ac_cv_have_dpms="-lXdpms" - ],ac_cv_have_dpms="no") - ]) - LDFLAGS="$ac_save_ldflags" - CFLAGS="$ac_save_cflags" - LIBS="$ac_save_libs" - fi - ])dnl - - if test "$ac_cv_have_dpms" = no; then - AC_MSG_RESULT(no) - DPMS_LDFLAGS="" - DPMSINC="" - $2 - else - AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) - if test "$ac_cv_have_dpms" = "-lXdpms"; then - DPMS_LIB="-lXdpms" - fi - if test "$DPMS_LDFLAGS" = ""; then - DPMSLIB="$DPMS_LIB "'$(LIB_X11)' - else - DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' - fi - if test "$DPMS_INCLUDE" = ""; then - DPMSINC="" - else - DPMSINC="-I$DPMS_INCLUDE" - fi - AC_MSG_RESULT(yes) - $1 - fi - fi - ac_save_cflags="$CFLAGS" - CFLAGS="$CFLAGS $X_INCLUDES" - test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" - AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO, - [Define if you have the DPMSCapable prototype in ]) - AC_CHECK_DECL(DPMSCapable, - AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),, - [#include - #include ]) - AH_TEMPLATE(HAVE_DPMSINFO_PROTO, - [Define if you have the DPMSInfo prototype in ]) - AC_CHECK_DECL(DPMSInfo, - AC_DEFINE(HAVE_DPMSINFO_PROTO),, - [#include - #include ]) - CFLAGS="$ac_save_cflags" - AC_SUBST(DPMSINC) - AC_SUBST(DPMSLIB) -]) - -AC_DEFUN([AC_HAVE_GL], - [AC_REQUIRE_CPP()dnl - AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - - test -z "$GL_LDFLAGS" && GL_LDFLAGS= - test -z "$GL_INCLUDE" && GL_INCLUDE= - - AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]), - gl_test=$withval, gl_test="yes") - if test "x$kde_use_qt_emb" = "xyes"; then - # GL and Qt Embedded is a no-go for now. - ac_cv_have_gl=no - elif test "x$gl_test" = xno; then - ac_cv_have_gl=no - else - AC_MSG_CHECKING(for GL) - AC_CACHE_VAL(ac_cv_have_gl, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_save_ldflags=$LDFLAGS - ac_save_cxxflags=$CXXFLAGS - ac_save_libs=$LIBS - LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries" - LIBS="$LIBS -lGL -lGLU" - test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11" - LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET" - CXXFLAGS="$CFLAGS $X_INCLUDES" - test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" - AC_TRY_LINK([#include -#include -], [], - ac_cv_have_gl="yes", ac_cv_have_gl="no") - AC_LANG_RESTORE - LDFLAGS=$ac_save_ldflags - CXXFLAGS=$ac_save_cxxflags - LIBS=$ac_save_libs - ])dnl - - if test "$ac_cv_have_gl" = "no"; then - AC_MSG_RESULT(no) - GL_LDFLAGS="" - GLINC="" - $2 - else - AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) - if test "$GL_LDFLAGS" = ""; then - GLLIB='-lGLU -lGL $(LIB_X11)' - else - GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' - fi - if test "$GL_INCLUDE" = ""; then - GLINC="" - else - GLINC="-I$GL_INCLUDE" - fi - AC_MSG_RESULT($ac_cv_have_gl) - $1 - fi - fi - AC_SUBST(GLINC) - AC_SUBST(GLLIB) -]) - - - dnl shadow password and PAM magic - maintained by ossi@kde.org - -AC_DEFUN([KDE_PAM], [ - AC_REQUIRE([KDE_CHECK_LIBDL]) - - want_pam= - AC_ARG_WITH(pam, - AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]), - [ if test "x$withval" = "xyes"; then - want_pam=yes - pam_service=kde - elif test "x$withval" = "xno"; then - want_pam=no - else - want_pam=yes - pam_service=$withval - fi - ], [ pam_service=kde ]) - - use_pam= - PAMLIBS= - if test "x$want_pam" != xno; then - AC_CHECK_LIB(pam, pam_start, [ - AC_CHECK_HEADER(security/pam_appl.h, - [ pam_header=security/pam_appl.h ], - [ AC_CHECK_HEADER(pam/pam_appl.h, - [ pam_header=pam/pam_appl.h ], - [ - AC_MSG_WARN([PAM detected, but no headers found! -Make sure you have the necessary development packages installed.]) - ] - ) - ] - ) - ], , $LIBDL) - if test -z "$pam_header"; then - if test "x$want_pam" = xyes; then - AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!]) - fi - else - AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) - PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" - use_pam=yes - - dnl darwin claims to be something special - if test "$pam_header" = "pam/pam_appl.h"; then - AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/]) - fi - - dnl test whether struct pam_message is const (Linux) or not (Sun) - AC_MSG_CHECKING(for const pam_message) - AC_EGREP_HEADER([struct pam_message], $pam_header, - [ AC_EGREP_HEADER([const struct pam_message], $pam_header, - [AC_MSG_RESULT([const: Linux-type PAM])], - [AC_MSG_RESULT([nonconst: Sun-type PAM]) - AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] - )], - [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) - fi - fi - - AC_SUBST(PAMLIBS) -]) - -dnl DEF_PAM_SERVICE(arg name, full name, define name) -AC_DEFUN([DEF_PAM_SERVICE], [ - AC_ARG_WITH($1-pam, - AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]), - [ if test "x$use_pam" = xyes; then - $3_PAM_SERVICE=$withval - else - AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. -You may want to enforce it by using --with-pam.]) - fi - ], - [ if test "x$use_pam" = xyes; then - $3_PAM_SERVICE="$pam_service" - fi - ]) - if test -n "$$3_PAM_SERVICE"; then - AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) - AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) - fi - AC_SUBST($3_PAM_SERVICE) -]) - -AC_DEFUN([KDE_SHADOWPASSWD], [ - AC_REQUIRE([KDE_PAM]) - - AC_CHECK_LIB(shadow, getspent, - [ LIBSHADOW="-lshadow" - ac_use_shadow=yes - ], - [ dnl for UnixWare - AC_CHECK_LIB(gen, getspent, - [ LIBGEN="-lgen" - ac_use_shadow=yes - ], - [ AC_CHECK_FUNC(getspent, - [ ac_use_shadow=yes ], - [ ac_use_shadow=no ]) - ]) - ]) - AC_SUBST(LIBSHADOW) - AC_SUBST(LIBGEN) - - AC_MSG_CHECKING([for shadow passwords]) - - AC_ARG_WITH(shadow, - AC_HELP_STRING([--with-shadow],[If you want shadow password support]), - [ if test "x$withval" != "xno"; then - use_shadow=yes - else - use_shadow=no - fi - ], [ - use_shadow="$ac_use_shadow" - ]) - - if test "x$use_shadow" = xyes; then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) - else - AC_MSG_RESULT(no) - LIBSHADOW= - LIBGEN= - fi - - dnl finally make the relevant binaries setuid root, if we have shadow passwds. - dnl this still applies, if we could use it indirectly through pam. - if test "x$use_shadow" = xyes || - ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then - case $host in - *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) - SETUIDFLAGS="-m 4755 -o root";; - *) - SETUIDFLAGS="-m 4755";; - esac - fi - AC_SUBST(SETUIDFLAGS) - -]) - -AC_DEFUN([KDE_PASSWDLIBS], [ - AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT - AC_REQUIRE([KDE_PAM]) - AC_REQUIRE([KDE_SHADOWPASSWD]) - - if test "x$use_pam" = "xyes"; then - PASSWDLIBS="$PAMLIBS" - else - PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" - fi - - dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but - dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires - dnl root to read, so kcheckpass needs to be root (even when using pam, since pam - dnl may need to read /etc/master.passwd). - case $host in - *-*-freebsd*) - SETUIDFLAGS="-m 4755 -o root" - ;; - *) - ;; - esac - - AC_SUBST(PASSWDLIBS) -]) - -AC_DEFUN([KDE_CHECK_LIBDL], -[ -AC_CHECK_LIB(dl, dlopen, [ -LIBDL="-ldl" -ac_cv_have_dlfcn=yes -]) - -AC_CHECK_LIB(dld, shl_unload, [ -LIBDL="-ldld" -ac_cv_have_shload=yes -]) - -AC_SUBST(LIBDL) -]) - -AC_DEFUN([KDE_CHECK_DLOPEN], -[ -KDE_CHECK_LIBDL -AC_CHECK_HEADERS(dlfcn.h dl.h) -if test "$ac_cv_header_dlfcn_h" = "no"; then - ac_cv_have_dlfcn=no -fi - -if test "$ac_cv_header_dl_h" = "no"; then - ac_cv_have_shload=no -fi - -dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE -dnl (MM) -AC_ARG_ENABLE(dlopen, -AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]), -enable_dlopen=$enableval, -enable_dlopen=yes) - -# override the user's opinion, if we know it better ;) -if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then - enable_dlopen=no -fi - -if test "$ac_cv_have_dlfcn" = "yes"; then - AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) -fi - -if test "$ac_cv_have_shload" = "yes"; then - AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) -fi - -if test "$enable_dlopen" = no ; then - test -n "$1" && eval $1 -else - test -n "$2" && eval $2 -fi - -]) - -AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING], -[ -KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) -KDE_PROG_LIBTOOL -AC_MSG_CHECKING([dynamic loading]) -eval "`egrep '^build_libtool_libs=' libtool`" -if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then - dynamic_loading=yes - AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) -else - dynamic_loading=no -fi -AC_MSG_RESULT($dynamic_loading) -if test "$dynamic_loading" = "yes"; then - $1 -else - $2 -fi -]) - -AC_DEFUN([KDE_ADD_INCLUDES], -[ -if test -z "$1"; then - test_include="Pix.h" -else - test_include="$1" -fi - -AC_MSG_CHECKING([for libg++ ($test_include)]) - -AC_CACHE_VAL(kde_cv_libgpp_includes, -[ -kde_cv_libgpp_includes=no - - for ac_dir in \ - \ - /usr/include/g++ \ - /usr/include \ - /usr/unsupported/include \ - /opt/include \ - $extra_include \ - ; \ - do - if test -r "$ac_dir/$test_include"; then - kde_cv_libgpp_includes=$ac_dir - break - fi - done -]) - -AC_MSG_RESULT($kde_cv_libgpp_includes) -if test "$kde_cv_libgpp_includes" != "no"; then - all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" -fi -]) -]) - -AC_DEFUN([KDE_CHECK_LIBPTHREAD], -[ - dnl This code is here specifically to handle the - dnl various flavors of threading library on FreeBSD - dnl 4-, 5-, and 6-, and the (weird) rules around it. - dnl There may be an environment PTHREAD_LIBS that - dnl specifies what to use; otherwise, search for it. - dnl -pthread is special cased and unsets LIBPTHREAD - dnl below if found. - LIBPTHREAD="" - - if test -n "$PTHREAD_LIBS"; then - if test "x$PTHREAD_LIBS" = "x-pthread" ; then - LIBPTHREAD="PTHREAD" - else - PTHREAD_LIBS_save="$PTHREAD_LIBS" - PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'` - AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS]) - KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [ - LIBPTHREAD="$PTHREAD_LIBS_save"]) - PTHREAD_LIBS="$PTHREAD_LIBS_save" - fi - fi - - dnl Is this test really needed, in the face of the Tru64 test below? - if test -z "$LIBPTHREAD"; then - AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"]) - fi - - dnl This is a special Tru64 check, see BR 76171 issue #18. - if test -z "$LIBPTHREAD" ; then - AC_MSG_CHECKING([for pthread_create in -lpthread]) - kde_safe_libs=$LIBS - LIBS="$LIBS -lpthread" - AC_TRY_LINK([#include ],[(void)pthread_create(0,0,0,0);],[ - AC_MSG_RESULT(yes) - LIBPTHREAD="-lpthread"],[ - AC_MSG_RESULT(no)]) - LIBS=$kde_safe_libs - fi - - dnl Un-special-case for FreeBSD. - if test "x$LIBPTHREAD" = "xPTHREAD" ; then - LIBPTHREAD="" - fi - - AC_SUBST(LIBPTHREAD) -]) - -AC_DEFUN([KDE_CHECK_PTHREAD_OPTION], -[ - USE_THREADS="" - if test -z "$LIBPTHREAD"; then - KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"]) - fi - - AH_VERBATIM(__svr_define, [ -#if defined(__SVR4) && !defined(__svr4__) -#define __svr4__ 1 -#endif -]) - case $host_os in - solaris*) - KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) - CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" - ;; - freebsd*) - CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS" - ;; - aix*) - CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" - LIBPTHREAD="$LIBPTHREAD -lc_r" - ;; - linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" - if test "$CXX" = "KCC"; then - CXXFLAGS="$CXXFLAGS --thread_safe" - NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" - fi - ;; - *) - ;; - esac - AC_SUBST(USE_THREADS) - AC_SUBST(LIBPTHREAD) -]) - -AC_DEFUN([KDE_CHECK_THREADING], -[ - AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) - AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) - dnl default is yes if libpthread is found and no if no libpthread is available - if test -z "$LIBPTHREAD"; then - if test -z "$USE_THREADS"; then - kde_check_threading_default=no - else - kde_check_threading_default=yes - fi - else - kde_check_threading_default=yes - fi - AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]), - kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) - if test "x$kde_use_threading" = "xyes"; then - AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) - fi -]) - -AC_DEFUN([KDE_TRY_LINK_PYTHON], -[ -if test "$kde_python_link_found" = no; then - -if test "$1" = normal; then - AC_MSG_CHECKING(if a Python application links) -else - AC_MSG_CHECKING(if Python depends on $2) -fi - -AC_CACHE_VAL(kde_cv_try_link_python_$1, -[ -kde_save_cflags="$CFLAGS" -CFLAGS="$CFLAGS $PYTHONINC" -kde_save_libs="$LIBS" -LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" -kde_save_ldflags="$LDFLAGS" -LDFLAGS="$LDFLAGS $PYTHONLIB" - -AC_TRY_LINK( -[ -#include -],[ - PySys_SetArgv(1, 0); -], - [kde_cv_try_link_python_$1=yes], - [kde_cv_try_link_python_$1=no] -) -CFLAGS="$kde_save_cflags" -LIBS="$kde_save_libs" -LDFLAGS="$kde_save_ldflags" -]) - -if test "$kde_cv_try_link_python_$1" = "yes"; then - AC_MSG_RESULT(yes) - kde_python_link_found=yes - if test ! "$1" = normal; then - LIBPYTHON="$LIBPYTHON $2" - fi - $3 -else - AC_MSG_RESULT(no) - $4 -fi - -fi - -]) - -AC_DEFUN([KDE_CHECK_PYTHON_DIR], -[ -AC_MSG_CHECKING([for Python directory]) - -AC_CACHE_VAL(kde_cv_pythondir, -[ - if test -z "$PYTHONDIR"; then - kde_cv_pythondir=/usr/local - else - kde_cv_pythondir="$PYTHONDIR" - fi -]) - -AC_ARG_WITH(pythondir, -AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]), -[ - ac_python_dir=$withval -], ac_python_dir=$kde_cv_pythondir -) - -AC_MSG_RESULT($ac_python_dir) -]) - -AC_DEFUN([KDE_CHECK_PYTHON_INTERN], -[ -AC_REQUIRE([KDE_CHECK_LIBDL]) -AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) -AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) - -if test -z "$1"; then - version="1.5" -else - version="$1" -fi - -AC_MSG_CHECKING([for Python$version]) - -python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" -AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) -if test ! -r $python_incdir/Python.h; then - AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) - python_incdir=$python_incdir/python$version - if test ! -r $python_incdir/Python.h; then - python_incdir=no - fi -fi - -PYTHONINC=-I$python_incdir - -python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs" -AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir) -if test ! -r $python_libdir/libpython$version.so; then - AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) - if test ! -r $python_libdir/libpython$version.a; then - AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) - python_libdir=$python_libdir/python$version/config - if test ! -r $python_libdir/libpython$version.a; then - python_libdir=no - fi - fi -fi - -PYTHONLIB=-L$python_libdir -kde_orig_LIBPYTHON=$LIBPYTHON -if test -z "$LIBPYTHON"; then - LIBPYTHON=-lpython$version -fi - -AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) -python_moddir=$python_moddir/python$version -if test ! -r $python_moddir/copy.py; then - python_moddir=no -fi - -PYTHONMODDIR=$python_moddir - -AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) - -if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then - LIBPYTHON=$kde_orig_LIBPYTHON - test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" - test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" - $2 -else - dnl Note: this test is very weak - kde_python_link_found=no - KDE_TRY_LINK_PYTHON(normal) - KDE_TRY_LINK_PYTHON(m, -lm) - KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) - KDE_TRY_LINK_PYTHON(tcl, -ltcl) - KDE_TRY_LINK_PYTHON(db2, -ldb2) - KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) - KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) - KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) - KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], - [AC_MSG_WARN([it seems, Python depends on another library. - Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this - and contact the authors to let them know about this problem]) - ]) - - LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" - AC_SUBST(PYTHONINC) - AC_SUBST(PYTHONLIB) - AC_SUBST(LIBPYTHON) - AC_SUBST(PYTHONMODDIR) - AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) -fi - -]) - - -AC_DEFUN([KDE_CHECK_PYTHON], -[ - KDE_CHECK_PYTHON_INTERN("2.5", - [KDE_CHECK_PYTHON_INTERN("2.4", - [KDE_CHECK_PYTHON_INTERN("2.3", - [KDE_CHECK_PYTHON_INTERN("2.2", - [KDE_CHECK_PYTHON_INTERN("2.1", - [KDE_CHECK_PYTHON_INTERN("2.0", - [KDE_CHECK_PYTHON_INTERN($1, $2) ]) - ]) - ]) - ]) - ]) - ]) -]) - -AC_DEFUN([KDE_CHECK_STL], -[ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" - - AC_MSG_CHECKING([if C++ programs can be compiled]) - AC_CACHE_VAL(kde_cv_stl_works, - [ - AC_TRY_COMPILE([ -#include -using namespace std; -],[ - string astring="Hallo Welt."; - astring.erase(0, 6); // now astring is "Welt" - return 0; -], kde_cv_stl_works=yes, - kde_cv_stl_works=no) -]) - - AC_MSG_RESULT($kde_cv_stl_works) - - if test "$kde_cv_stl_works" = "yes"; then - # back compatible - AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) - else - AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs. -Check config.log for details - if you're using a Linux distribution you might miss -a package named similar to libstdc++-dev.]) - fi - - CXXFLAGS="$ac_save_CXXFLAGS" - AC_LANG_RESTORE -]) - -AC_DEFUN([AC_FIND_QIMGIO], - [AC_REQUIRE([AC_FIND_JPEG]) -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_MSG_CHECKING([for qimgio]) -AC_CACHE_VAL(ac_cv_lib_qimgio, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -ac_save_LIBS="$LIBS" -ac_save_CXXFLAGS="$CXXFLAGS" -LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" -CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" -AC_TRY_RUN(dnl -[ -#include -#include -int main() { - QString t = "hallo"; - t.fill('t'); - qInitImageIO(); -} -], - ac_cv_lib_qimgio=yes, - ac_cv_lib_qimgio=no, - ac_cv_lib_qimgio=no) -LIBS="$ac_save_LIBS" -CXXFLAGS="$ac_save_CXXFLAGS" -AC_LANG_RESTORE -])dnl -if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then - LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) - AC_SUBST(LIBQIMGIO) -else - AC_MSG_RESULT(not found) -fi -]) - -AC_DEFUN([AM_DISABLE_LIBRARIES], -[ - AC_PROVIDE([AM_ENABLE_STATIC]) - AC_PROVIDE([AM_ENABLE_SHARED]) - enable_static=no - enable_shared=yes -]) - - -AC_DEFUN([AC_CHECK_UTMP_FILE], -[ - AC_MSG_CHECKING([for utmp file]) - - AC_CACHE_VAL(kde_cv_utmp_file, - [ - kde_cv_utmp_file=no - - for ac_file in \ - \ - /var/run/utmp \ - /var/adm/utmp \ - /etc/utmp \ - ; \ - do - if test -r "$ac_file"; then - kde_cv_utmp_file=$ac_file - break - fi - done - ]) - - if test "$kde_cv_utmp_file" != "no"; then - AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) - $1 - AC_MSG_RESULT($kde_cv_utmp_file) - else - $2 - AC_MSG_RESULT([non found]) - fi -]) - - -AC_DEFUN([KDE_CREATE_SUBDIRSLIST], -[ - -DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" -TOPSUBDIRS="" - -if test ! -s $srcdir/subdirs; then - dnl Note: Makefile.common creates subdirs, so this is just a fallback - files=`cd $srcdir && ls -1` - dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` - for i in $dirs; do - echo $i >> $srcdir/subdirs - done -fi - -ac_topsubdirs= -if test -s $srcdir/inst-apps; then - ac_topsubdirs="`cat $srcdir/inst-apps`" -elif test -s $srcdir/subdirs; then - ac_topsubdirs="`cat $srcdir/subdirs`" -fi - -for i in $ac_topsubdirs; do - AC_MSG_CHECKING([if $i should be compiled]) - if test -d $srcdir/$i; then - install_it="yes" - for j in $DO_NOT_COMPILE; do - if test $i = $j; then - install_it="no" - fi - done - else - install_it="no" - fi - AC_MSG_RESULT($install_it) - vari=`echo $i | sed -e 's,[[-+.@]],_,g'` - if test $install_it = "yes"; then - TOPSUBDIRS="$TOPSUBDIRS $i" - eval "$vari""_SUBDIR_included=yes" - else - eval "$vari""_SUBDIR_included=no" - fi -done - -AC_SUBST(TOPSUBDIRS) -]) - -AC_DEFUN([KDE_CHECK_NAMESPACES], -[ -AC_MSG_CHECKING(whether C++ compiler supports namespaces) -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -AC_TRY_COMPILE([ -], -[ -namespace Foo { - extern int i; - namespace Bar { - extern int i; - } -} - -int Foo::i = 0; -int Foo::Bar::i = 1; -],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_NAMESPACES) -], [ -AC_MSG_RESULT(no) -]) -AC_LANG_RESTORE -]) - -dnl ------------------------------------------------------------------------ -dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_CHECK_S_ISSOCK], -[ -AC_MSG_CHECKING(for S_ISSOCK) -AC_CACHE_VAL(ac_cv_have_s_issock, -[ -AC_TRY_LINK( -[ -#include -], -[ -struct stat buff; -int b = S_ISSOCK( buff.st_mode ); -], -ac_cv_have_s_issock=yes, -ac_cv_have_s_issock=no) -]) -AC_MSG_RESULT($ac_cv_have_s_issock) -if test "$ac_cv_have_s_issock" = "yes"; then - AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) -fi - -AH_VERBATIM(_ISSOCK, -[ -#ifndef HAVE_S_ISSOCK -#define HAVE_S_ISSOCK -#define S_ISSOCK(mode) (1==0) -#endif -]) - -]) - -dnl ------------------------------------------------------------------------ -dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_CHECK_KDEMAXPATHLEN], -[ -AC_MSG_CHECKING(for MAXPATHLEN) -AC_CACHE_VAL(ac_cv_maxpathlen, -[ -cat > conftest.$ac_ext < -#endif -#include -#include -#ifndef MAXPATHLEN -#define MAXPATHLEN 1024 -#endif - -KDE_HELLO MAXPATHLEN - -EOF - -ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" - -if AC_TRY_EVAL(ac_try) && test -s conftest.out; then - ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` -else - ac_cv_maxpathlen=1024 -fi - -rm conftest.* - -]) -AC_MSG_RESULT($ac_cv_maxpathlen) -AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) -]) - -AC_DEFUN([KDE_CHECK_HEADER], -[ - kde_safe_cppflags=$CPPFLAGS - CPPFLAGS="$CPPFLAGS $all_includes" - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_CHECK_HEADER([$1], [$2], [$3], [$4]) - AC_LANG_RESTORE - CPPFLAGS=$kde_safe_cppflags -]) - -AC_DEFUN([KDE_CHECK_HEADERS], -[ - AH_CHECK_HEADERS([$1]) - AC_LANG_SAVE - kde_safe_cppflags=$CPPFLAGS - CPPFLAGS="$CPPFLAGS $all_includes" - AC_LANG_CPLUSPLUS - AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) - CPPFLAGS=$kde_safe_cppflags - AC_LANG_RESTORE -]) - -AC_DEFUN([KDE_FAST_CONFIGURE], -[ - dnl makes configure fast (needs perl) - AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]), - with_fast_perl=$enableval, with_fast_perl=yes) -]) - -AC_DEFUN([KDE_CONF_FILES], -[ - val= - if test -f $srcdir/configure.files ; then - val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` - fi - CONF_FILES= - if test -n "$val" ; then - for i in $val ; do - CONF_FILES="$CONF_FILES $i" - done - fi - AC_SUBST(CONF_FILES) -])dnl - -dnl This sets the prefix, for arts and kdelibs -dnl Do NOT use in any other module. -dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde -AC_DEFUN([KDE_SET_PREFIX_CORE], -[ - unset CDPATH - dnl make $KDEDIR the default for the installation - AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) - - if test "x$prefix" = "xNONE"; then - prefix=$ac_default_prefix - ac_configure_args="$ac_configure_args --prefix=$prefix" - fi - # And delete superfluous '/' to make compares easier - prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - kde_libs_htmldir=$prefix/share/doc/HTML/ - exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - - kde_libs_prefix='$(prefix)' - kde_libs_htmldir='$(kde_htmldir)' - AC_SUBST(kde_libs_prefix) - AC_SUBST(kde_libs_htmldir) - KDE_FAST_CONFIGURE - KDE_CONF_FILES -]) - - -AC_DEFUN([KDE_SET_PREFIX], -[ - unset CDPATH - dnl We can't give real code to that macro, only a value. - dnl It only matters for --help, since we set the prefix in this function anyway. - AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix}) - - KDE_SET_DEFAULT_BINDIRS - if test "x$prefix" = "xNONE"; then - dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it - KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) - else - dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH - kde_save_PATH="$PATH" - PATH="$exec_prefix/bin:$prefix/bin:$PATH" - KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) - PATH="$kde_save_PATH" - fi - - kde_libs_prefix=`$KDECONFIG --prefix` - if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then - AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. - This means it has been moved since you installed it. - This won't work. Please recompile kdelibs for the new prefix. - ]) - fi - kde_libs_htmldir=`$KDECONFIG --install html --expandvars` - - AC_MSG_CHECKING([where to install]) - if test "x$prefix" = "xNONE"; then - prefix=$kde_libs_prefix - AC_MSG_RESULT([$prefix (as returned by kde-config)]) - else - dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different - given_prefix=$prefix - AC_MSG_RESULT([$prefix (as requested)]) - fi - - # And delete superfluous '/' to make compares easier - prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - - AC_SUBST(KDECONFIG) - AC_SUBST(kde_libs_prefix) - AC_SUBST(kde_libs_htmldir) - - KDE_FAST_CONFIGURE - KDE_CONF_FILES -]) - -pushdef([AC_PROG_INSTALL], -[ - dnl our own version, testing for a -p flag - popdef([AC_PROG_INSTALL]) - dnl as AC_PROG_INSTALL works as it works we first have - dnl to save if the user didn't specify INSTALL, as the - dnl autoconf one overwrites INSTALL and we have no chance to find - dnl out afterwards - test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL - test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM - test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT - AC_PROG_INSTALL - - if test -z "$kde_save_INSTALL_given" ; then - # OK, user hasn't given any INSTALL, autoconf found one for us - # now we test, if it supports the -p flag - AC_MSG_CHECKING(for -p flag to install) - rm -f confinst.$$.* > /dev/null 2>&1 - echo "Testtest" > confinst.$$.orig - ac_res=no - if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then - if test -f confinst.$$.new ; then - # OK, -p seems to do no harm to install - INSTALL="${INSTALL} -p" - ac_res=yes - fi - fi - rm -f confinst.$$.* - AC_MSG_RESULT($ac_res) - fi - dnl the following tries to resolve some signs and wonders coming up - dnl with different autoconf/automake versions - dnl e.g.: - dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s - dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) - dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s - dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has - dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the - dnl install-@DIR@PROGRAMS targets to explicitly use that flag - dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as - dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 - dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure - dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from - dnl automake (due to broken Makefile.am or whatever) to install programs, - dnl and so does not see the -s flag in automake > 1.4 - dnl to clean up that mess we: - dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG - dnl which cleans KDE's program with automake > 1.4; - dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems - dnl with automake<=1.4 - dnl note that dues to this sometimes two '-s' flags are used (if KDE - dnl properly uses install-@DIR@PROGRAMS, but I don't care - dnl - dnl And to all this comes, that I even can't write in comments variable - dnl names used by automake, because it is so stupid to think I wanted to - dnl _use_ them, therefor I have written A_M_... instead of AM_ - dnl hmm, I wanted to say something ... ahh yes: Arghhh. - - if test -z "$kde_save_INSTALL_PROGRAM_given" ; then - INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' - fi - if test -z "$kde_save_INSTALL_SCRIPT_given" ; then - INSTALL_SCRIPT='${INSTALL}' - fi -])dnl - -AC_DEFUN([KDE_LANG_CPLUSPLUS], -[AC_LANG_CPLUSPLUS -ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' -pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) -]) - -pushdef([AC_LANG_CPLUSPLUS], -[popdef([AC_LANG_CPLUSPLUS]) -KDE_LANG_CPLUSPLUS -]) - -AC_DEFUN([KDE_CHECK_LONG_LONG], -[ -AC_MSG_CHECKING(for long long) -AC_CACHE_VAL(kde_cv_c_long_long, -[ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_LINK([], [ - long long foo = 0; - foo = foo+1; - ], - kde_cv_c_long_long=yes, kde_cv_c_long_long=no) - AC_LANG_RESTORE -]) -AC_MSG_RESULT($kde_cv_c_long_long) -if test "$kde_cv_c_long_long" = yes; then - AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) -fi -]) - -AC_DEFUN([KDE_CHECK_LIB], -[ - kde_save_LDFLAGS="$LDFLAGS" - dnl AC_CHECK_LIB modifies LIBS, so save it here - kde_save_LIBS="$LIBS" - LDFLAGS="$LDFLAGS $all_libraries" - case $host_os in - aix*) LDFLAGS="-brtl $LDFLAGS" - test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" - ;; - esac - AC_CHECK_LIB($1, $2, $3, $4, $5) - LDFLAGS="$kde_save_LDFLAGS" - LIBS="$kde_save_LIBS" -]) - -AC_DEFUN([KDE_JAVA_PREFIX], -[ - dir=`dirname "$1"` - base=`basename "$1"` - list=`ls -1 $dir 2> /dev/null` - for entry in $list; do - if test -d $dir/$entry/bin; then - case $entry in - $base) - javadirs="$javadirs $dir/$entry/bin" - ;; - esac - elif test -d $dir/$entry/jre/bin; then - case $entry in - $base) - javadirs="$javadirs $dir/$entry/jre/bin" - ;; - esac - fi - done -]) - -dnl KDE_CHEC_JAVA_DIR(onlyjre) -AC_DEFUN([KDE_CHECK_JAVA_DIR], -[ - -AC_ARG_WITH(java, -AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]), -[ ac_java_dir=$withval -], ac_java_dir="" -) - -AC_MSG_CHECKING([for Java]) - -dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH -if test "x$ac_java_dir" = "xno"; then - kde_java_bindir=no - kde_java_includedir=no - kde_java_libjvmdir=no - kde_java_libgcjdir=no - kde_java_libhpidir=no -else - if test "x$ac_java_dir" = "x"; then - - - dnl No option set -> collect list of candidate paths - if test -n "$JAVA_HOME"; then - KDE_JAVA_PREFIX($JAVA_HOME) - fi - KDE_JAVA_PREFIX(/usr/j2se) - KDE_JAVA_PREFIX(/usr/lib/j2se) - KDE_JAVA_PREFIX(/usr/j*dk*) - KDE_JAVA_PREFIX(/usr/lib/j*dk*) - KDE_JAVA_PREFIX(/opt/j*sdk*) - KDE_JAVA_PREFIX(/usr/lib/java*) - KDE_JAVA_PREFIX(/usr/java*) - KDE_JAVA_PREFIX(/usr/java/j*dk*) - KDE_JAVA_PREFIX(/usr/java/j*re*) - KDE_JAVA_PREFIX(/usr/lib/SunJava2*) - KDE_JAVA_PREFIX(/usr/lib/SunJava*) - KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) - KDE_JAVA_PREFIX(/usr/lib/IBMJava*) - KDE_JAVA_PREFIX(/opt/java*) - - kde_cv_path="NONE" - kde_save_IFS=$IFS - IFS=':' - for dir in $PATH; do - if test -d "$dir"; then - javadirs="$javadirs $dir" - fi - done - IFS=$kde_save_IFS - jredirs= - - dnl Now javadirs contains a list of paths that exist, all ending with bin/ - for dir in $javadirs; do - dnl Check for the java executable - if test -x "$dir/java"; then - sane_path=$(cd $dir; /bin/pwd) - dnl And also check for a libjvm.so somewhere under there - dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big. - if test "$sane_path" != "/usr/bin"; then - libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` - if test ! -f $libjvmdir/libjvm.so; then continue; fi - jredirs="$jredirs $dir" - fi - fi - done - - dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found - JAVAC= - JAVA= - kde_java_bindir=no - for dir in $jredirs; do - JAVA="$dir/java" - kde_java_bindir=$dir - if test -x "$dir/javac"; then - JAVAC="$dir/javac" - break - fi - done - - if test -n "$JAVAC"; then - dnl this substitution might not work - well, we test for jni.h below - kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` - else - kde_java_includedir=no - fi - else - dnl config option set - kde_java_bindir=$ac_java_dir/bin - if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then - kde_java_includedir=no - else - kde_java_includedir=$ac_java_dir/include - fi - fi -fi - -dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" -if test "x$kde_java_bindir" != "xno"; then - - dnl Look for libjvm.so - kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` - dnl Look for libgcj.so - kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1` - dnl Look for libhpi.so and avoid green threads - kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` - - dnl Now check everything's fine under there - dnl the include dir is our flag for having the JDK - if test -d "$kde_java_includedir"; then - if test ! -x "$kde_java_bindir/javac"; then - AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) - fi - if test ! -x "$kde_java_bindir/javah"; then - AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) - fi - if test ! -x "$kde_java_bindir/jar"; then - AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) - fi - if test ! -r "$kde_java_includedir/jni.h"; then - AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) - fi - - jni_includes="-I$kde_java_includedir" - dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. - dnl and under linux here.. - - dnl not needed for gcj - - if test "x$kde_java_libgcjdir" = "x"; then - test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" - test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" - test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" - fi - - else - JAVAC= - jni_includes= - fi - - if test "x$kde_java_libgcjdir" = "x"; then - if test ! -r "$kde_java_libjvmdir/libjvm.so"; then - AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) - fi - else - if test ! -r "$kde_java_libgcjdir/libgcj.so"; then - AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.]) - fi - fi - - if test ! -x "$kde_java_bindir/java"; then - AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) - fi - - dnl not needed for gcj compile - - if test "x$kde_java_libgcjdir" = "x"; then - if test ! -r "$kde_java_libhpidir/libhpi.so"; then - AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) - fi - fi - - if test -n "$jni_includes"; then - dnl Check for JNI version - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_cxxflags_safe="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" - - AC_TRY_COMPILE([ - #include - ], - [ - #ifndef JNI_VERSION_1_2 - Syntax Error - #endif - ],[ kde_jni_works=yes ], - [ kde_jni_works=no ]) - - if test $kde_jni_works = no; then - AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. - You need to have Java Development Kit (JDK) version 1.2. - - Use --with-java to specify another location. - Use --without-java to configure without java support. - Or download a newer JDK and try again. - See e.g. http://java.sun.com/products/jdk/1.2 ]) - fi - - CXXFLAGS="$ac_cxxflags_safe" - AC_LANG_RESTORE - - dnl All tests ok, inform and subst the variables - - JAVAC=$kde_java_bindir/javac - JAVAH=$kde_java_bindir/javah - JAR=$kde_java_bindir/jar - AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) - if test "x$kde_java_libgcjdir" = "x"; then - JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" - else - JVMLIBS="-L$kde_java_libgcjdir -lgcj" - fi - AC_MSG_RESULT([java JDK in $kde_java_bindir]) - - else - AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) - AC_MSG_RESULT([java JRE in $kde_java_bindir]) - fi -elif test -d "/Library/Java/Home"; then - kde_java_bindir="/Library/Java/Home/bin" - jni_includes="-I/Library/Java/Home/include" - - JAVAC=$kde_java_bindir/javac - JAVAH=$kde_java_bindir/javah - JAR=$kde_java_bindir/jar - JVMLIBS="-Wl,-framework,JavaVM" - - AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) - AC_MSG_RESULT([Apple Java Framework]) -else - AC_MSG_RESULT([none found]) -fi - -AC_SUBST(JAVAC) -AC_SUBST(JAVAH) -AC_SUBST(JAR) -AC_SUBST(JVMLIBS) -AC_SUBST(jni_includes) - -# for backward compat -kde_cv_java_includedir=$kde_java_includedir -kde_cv_java_bindir=$kde_java_bindir -]) - -dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. -dnl When the argument list becomes big, as in KDE for AC_OUTPUT in -dnl big packages, m4_foreach is dog-slow. So use our own version of -dnl it. (matz@kde.org) -m4_define([mm_foreach], -[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) -m4_define([mm_car], [[$1]]) -m4_define([mm_car2], [[$@]]) -m4_define([_mm_foreach], -[m4_if(m4_quote($2), [], [], - [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1], - mm_car2(m4_shift($2)), - [$3])])]) -m4_define([AC_FOREACH], -[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) - -AC_DEFUN([KDE_NEED_FLEX], -[ -kde_libs_safe=$LIBS -LIBS="$LIBS $USER_LDFLAGS" -AM_PROG_LEX -LIBS=$kde_libs_safe -if test -z "$LEXLIB"; then - AC_MSG_ERROR([You need to have flex installed.]) -fi -AC_SUBST(LEXLIB) -]) - -AC_DEFUN([AC_PATH_QTOPIA], -[ - dnl TODO: use AC_CACHE_VAL - - if test -z "$1"; then - qtopia_minver_maj=1 - qtopia_minver_min=5 - qtopia_minver_pat=0 - else - qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` - qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` - qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` - fi - - qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" - qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" - - AC_REQUIRE([AC_PATH_QT]) - - AC_MSG_CHECKING([for Qtopia]) - - LIB_QTOPIA="-lqpe" - AC_SUBST(LIB_QTOPIA) - - kde_qtopia_dirs="$QPEDIR /opt/Qtopia" - - ac_qtopia_incdir=NO - - AC_ARG_WITH(qtopia-dir, - AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]), - [ ac_qtopia_incdir="$withval"/include] ) - - qtopia_incdirs="" - for dir in $kde_qtopia_dirs; do - qtopia_incdirs="$qtopia_incdirs $dir/include" - done - - if test ! "$ac_qtopia_incdir" = "NO"; then - qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" - fi - - qtopia_incdir="" - AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) - ac_qtopia_incdir="$qtopia_incdir" - - if test -z "$qtopia_incdir"; then - AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) - fi - - qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; - qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; - qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; - - qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" - qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" - if test "$qtopia_ver" -lt "$qtopia_minver"; then - AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr -is required.]) - fi - - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - - ac_cxxflags_safe="$CXXFLAGS" - ac_ldflags_safe="$LDFLAGS" - ac_libs_safe="$LIBS" - - CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" - LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" - LIBS="$LIBS $LIB_QTOPIA $LIBQT" - - cat > conftest.$ac_ext < -#include - -int main( int argc, char **argv ) -{ - QPEApplication app( argc, argv ); - return 0; -} -EOF - - if AC_TRY_EVAL(ac_link) && test -s conftest; then - rm -f conftest* - else - rm -f conftest* - AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at -the end of config.log]) - fi - - CXXFLAGS="$ac_cxxflags_safe" - LDFLAGS="$ac_ldflags_safe" - LIBS="$ac_libs_safe" - - AC_LANG_RESTORE - - QTOPIA_INCLUDES="-I$qtopia_incdir" - AC_SUBST(QTOPIA_INCLUDES) - - AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) -]) - - -AC_DEFUN([KDE_INIT_DOXYGEN], -[ -AC_MSG_CHECKING([for Qt docs]) -kde_qtdir= -if test "${with_qt_dir+set}" = set; then - kde_qtdir="$with_qt_dir" -fi - -AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR) -AC_MSG_RESULT($QTDOCDIR) - -AC_SUBST(QTDOCDIR) - -KDE_FIND_PATH(dot, DOT, [], []) -if test -n "$DOT"; then - KDE_HAVE_DOT="YES" -else - KDE_HAVE_DOT="NO" -fi -AC_SUBST(KDE_HAVE_DOT) -KDE_FIND_PATH(doxygen, DOXYGEN, [], []) -AC_SUBST(DOXYGEN) - -DOXYGEN_PROJECT_NAME="$1" -DOXYGEN_PROJECT_NUMBER="$2" -AC_SUBST(DOXYGEN_PROJECT_NAME) -AC_SUBST(DOXYGEN_PROJECT_NUMBER) - -KDE_HAS_DOXYGEN=no -if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then - KDE_HAS_DOXYGEN=yes -fi -AC_SUBST(KDE_HAS_DOXYGEN) - -]) - - -AC_DEFUN([AC_FIND_BZIP2], -[ -AC_MSG_CHECKING([for bzDecompress in libbz2]) -AC_CACHE_VAL(ac_cv_lib_bzip2, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -kde_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" -kde_save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK(dnl -[ -#define BZ_NO_STDIO -#include -], - [ bz_stream s; (void) bzDecompress(&s); ], - eval "ac_cv_lib_bzip2='-lbz2'", - eval "ac_cv_lib_bzip2=no") -LIBS="$kde_save_LIBS" -CXXFLAGS="$kde_save_CXXFLAGS" -AC_LANG_RESTORE -])dnl -AC_MSG_RESULT($ac_cv_lib_bzip2) - -if test ! "$ac_cv_lib_bzip2" = no; then - BZIP2DIR=bzip2 - - LIBBZ2="$ac_cv_lib_bzip2" - AC_SUBST(LIBBZ2) - -else - - cxx_shared_flag= - ld_shared_flag= - KDE_CHECK_COMPILER_FLAG(shared, [ - ld_shared_flag="-shared" - ]) - KDE_CHECK_COMPILER_FLAG(fPIC, [ - cxx_shared_flag="-fPIC" - ]) - - AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) - AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - kde_save_LIBS="$LIBS" - LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET" - kde_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES" - - AC_TRY_LINK(dnl - [ - #define BZ_NO_STDIO - #include - ], - [ bz_stream s; (void) BZ2_bzDecompress(&s); ], - eval "ac_cv_lib_bzip2_prefix='-lbz2'", - eval "ac_cv_lib_bzip2_prefix=no") - LIBS="$kde_save_LIBS" - CXXFLAGS="$kde_save_CXXFLAGS" - AC_LANG_RESTORE - ])dnl - - AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) - - if test ! "$ac_cv_lib_bzip2_prefix" = no; then - BZIP2DIR=bzip2 - - LIBBZ2="$ac_cv_lib_bzip2_prefix" - AC_SUBST(LIBBZ2) - - AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) - dnl else, we just ignore this - fi - -fi -AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") -]) - -dnl ------------------------------------------------------------------------ -dnl Try to find the SSL headers and libraries. -dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) -dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([KDE_CHECK_SSL], -[ -LIBSSL="-lssl -lcrypto" -AC_REQUIRE([KDE_CHECK_LIB64]) - -ac_ssl_includes=NO ac_ssl_libraries=NO -ssl_libraries="" -ssl_includes="" -AC_ARG_WITH(ssl-dir, - AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]), - [ ac_ssl_includes="$withval"/include - ac_ssl_libraries="$withval"/lib$kdelibsuff - ]) - -want_ssl=yes -AC_ARG_WITH(ssl, - AC_HELP_STRING([--without-ssl],[disable SSL checks]), - [want_ssl=$withval]) - -if test $want_ssl = yes; then - -AC_MSG_CHECKING(for OpenSSL) - -AC_CACHE_VAL(ac_cv_have_ssl, -[#try to guess OpenSSL locations - - ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" - ssl_incdirs="$ac_ssl_includes $ssl_incdirs" - AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) - ac_ssl_includes="$ssl_incdir" - - ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" - if test ! "$ac_ssl_libraries" = "NO"; then - ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" - fi - - test=NONE - ssl_libdir=NONE - for dir in $ssl_libdirs; do - try="ls -1 $dir/libssl*" - if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi - done - - ac_ssl_libraries="$ssl_libdir" - - ac_ldflags_safe="$LDFLAGS" - ac_libs_safe="$LIBS" - - LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" - LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" - - AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, - ac_ssl_rsaref="yes" - , - ac_ssl_rsaref="no" - ) - - LDFLAGS="$ac_ldflags_safe" - LIBS="$ac_libs_safe" - - if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then - have_ssl=no - else - have_ssl=yes; - fi - - ]) - - eval "$ac_cv_have_ssl" - - AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) - - AC_MSG_CHECKING([whether OpenSSL uses rsaref]) - AC_MSG_RESULT($ac_ssl_rsaref) - - AC_MSG_CHECKING([for easter eggs]) - AC_MSG_RESULT([none found]) - -else - have_ssl=no -fi - -if test "$have_ssl" = yes; then - AC_MSG_CHECKING(for OpenSSL version) - dnl Check for SSL version - AC_CACHE_VAL(ac_cv_ssl_version, - [ - - cat >conftest.$ac_ext < -#include - int main() { - -#ifndef OPENSSL_VERSION_NUMBER - printf("ssl_version=\\"error\\"\n"); -#else - if (OPENSSL_VERSION_NUMBER < 0x00906000) - printf("ssl_version=\\"old\\"\n"); - else - printf("ssl_version=\\"ok\\"\n"); -#endif - return (0); - } -EOF - - ac_save_CPPFLAGS=$CPPFLAGS - if test "$ac_ssl_includes" != "/usr/include"; then - CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes" - fi - - if AC_TRY_EVAL(ac_link); then - - if eval `./conftest 2>&5`; then - if test $ssl_version = error; then - AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) - else - if test $ssl_version = old; then - AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) - have_ssl=no - fi - fi - ac_cv_ssl_version="ssl_version=$ssl_version" - else - AC_MSG_ERROR([Your system couldn't run a small SSL test program. - Check config.log, and if you can't figure it out, send a mail to - David Faure , attaching your config.log]) - fi - - else - AC_MSG_ERROR([Your system couldn't link a small SSL test program. - Check config.log, and if you can't figure it out, send a mail to - David Faure , attaching your config.log]) - fi - CPPFLAGS=$ac_save_CPPFLAGS - - ]) - - eval "$ac_cv_ssl_version" - AC_MSG_RESULT($ssl_version) -fi - -if test "$have_ssl" != yes; then - LIBSSL=""; -else - AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) - ac_cv_have_ssl="have_ssl=yes \ - ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" - - - ssl_libraries="$ac_ssl_libraries" - ssl_includes="$ac_ssl_includes" - - if test "$ac_ssl_rsaref" = yes; then - LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" - fi - - if test $ssl_version = "old"; then - AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) - fi -fi - -SSL_INCLUDES= - -if test "$ssl_includes" = "/usr/include"; then - if test -f /usr/kerberos/include/krb5.h; then - SSL_INCLUDES="-I/usr/kerberos/include" - fi -elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then - SSL_INCLUDES="-I$ssl_includes" -fi - -if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then - SSL_LDFLAGS="" -else - SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" -fi - -AC_SUBST(SSL_INCLUDES) -AC_SUBST(SSL_LDFLAGS) -AC_SUBST(LIBSSL) -]) - -AC_DEFUN([KDE_CHECK_STRLCPY], -[ - AC_REQUIRE([AC_CHECK_STRLCAT]) - AC_REQUIRE([AC_CHECK_STRLCPY]) - AC_CHECK_SIZEOF(size_t) - AC_CHECK_SIZEOF(unsigned long) - - AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long]) - AC_TRY_COMPILE(,[ - #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG - choke me - #endif - ],AC_MSG_RESULT([yes]),[ - AC_MSG_RESULT(no) - AC_MSG_ERROR([ - Apparently on your system our assumption sizeof size_t == sizeof unsigned long - does not apply. Please mail kde-devel@kde.org with a description of your system! - ]) - ]) -]) - -AC_DEFUN([KDE_CHECK_BINUTILS], -[ - AC_MSG_CHECKING([if ld supports unversioned version maps]) - - kde_save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" - echo "{ local: extern \"C++\" { foo }; };" > conftest.map - AC_TRY_LINK([int foo;], -[ -#ifdef __INTEL_COMPILER -icc apparently does not support libtools version-info and version-script -at the same time. Dunno where the bug is, but until somebody figured out, -better disable the optional version scripts. -#endif - - foo = 42; -], kde_supports_versionmaps=yes, kde_supports_versionmaps=no) - LDFLAGS="$kde_save_LDFLAGS" - rm -f conftest.map - AM_CONDITIONAL(include_VERSION_SCRIPT, - [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"]) - - AC_MSG_RESULT($kde_supports_versionmaps) -]) - -AC_DEFUN([AM_PROG_OBJC],[ -AC_CHECK_PROGS(OBJC, gcc, gcc) -test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH]) -if test "x${OBJCFLAGS-unset}" = xunset; then - OBJCFLAGS="-g -O2" -fi -AC_SUBST(OBJCFLAGS) -_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)]) -]) - -AC_DEFUN([KDE_CHECK_PERL], -[ - KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [ - AC_MSG_ERROR([No Perl found in your $PATH. -We need perl to generate some code.]) - ]) - AC_SUBST(PERL) -]) - -AC_DEFUN([KDE_CHECK_LARGEFILE], -[ -AC_SYS_LARGEFILE -if test "$ac_cv_sys_file_offset_bits" != no; then - CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" -fi - -if test "x$ac_cv_sys_large_files" != "xno"; then - CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1" -fi - -]) - -dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in) -dnl which allows to search for libs that get installed into the KDE prefix. -dnl -dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not) -dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page -dnl also defines KSTUFF_PKG_ERRORS on error -AC_DEFUN([KDE_PKG_CHECK_MODULES], [ - - PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" - if test "$prefix" != "$kde_libs_prefix"; then - PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" - fi - export PKG_CONFIG_PATH - PKG_CHECK_MODULES([$1],[$2],[$3],[$4]) -]) - - -dnl Check for PIE support in the compiler and linker -AC_DEFUN([KDE_CHECK_PIE_SUPPORT], -[ - AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - safe_CXXFLAGS=$CXXFLAGS - safe_LDFLAGS=$LDFLAGS - CXXFLAGS="$CXXFLAGS -fPIE" - LDFLAGS="$LDFLAGS -pie" - - AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no]) - - CXXFLAGS=$safe_CXXFLAGS - LDFLAGS=$safe_LDFLAGS - AC_LANG_RESTORE - ]) - - AC_MSG_CHECKING(if enabling -pie/fPIE support) - - AC_ARG_ENABLE(pie, - AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]), - [kde_has_pie_support=$enableval], - [kde_has_pie_support=detect]) - - if test "$kde_has_pie_support" = "detect"; then - kde_has_pie_support=$kde_cv_val_pie_support - fi - - AC_MSG_RESULT([$kde_has_pie_support]) - - KDE_USE_FPIE="" - KDE_USE_PIE="" - - AC_SUBST([KDE_USE_FPIE]) - AC_SUBST([KDE_USE_PIE]) - - if test "$kde_has_pie_support" = "yes"; then - KDE_USE_FPIE="-fPIE" - KDE_USE_PIE="-pie" - fi -]) -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -## Copyright 1996, 1997, 1998, 1999, 2000, 2001 -## Free Software Foundation, Inc. -## Originally by Gordon Matzigkeit , 1996 -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -## -## As a special exception to the GNU General Public License, if you -## distribute this file as part of a program that contains a -## configuration script generated by Autoconf, you may include it under -## the same distribution terms that you use for the rest of that program. - -# serial 47 AC_PROG_LIBTOOL - - -# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) -# ----------------------------------------------------------- -# If this macro is not defined by Autoconf, define it here. -m4_ifdef([AC_PROVIDE_IFELSE], - [], - [m4_define([AC_PROVIDE_IFELSE], - [m4_ifdef([AC_PROVIDE_$1], - [$2], [$3])])]) - - -# AC_PROG_LIBTOOL -# --------------- -AC_DEFUN([AC_PROG_LIBTOOL], -[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl -dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX -dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. - AC_PROVIDE_IFELSE([AC_PROG_CXX], - [AC_LIBTOOL_CXX], - [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX - ])]) -dnl And a similar setup for Fortran 77 support - AC_PROVIDE_IFELSE([AC_PROG_F77], - [AC_LIBTOOL_F77], - [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 -])]) - -dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. -dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run -dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. - AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [ifdef([AC_PROG_GCJ], - [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([A][M_PROG_GCJ], - [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([LT_AC_PROG_GCJ], - [define([LT_AC_PROG_GCJ], - defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) -])])# AC_PROG_LIBTOOL - - -# _AC_PROG_LIBTOOL -# ---------------- -AC_DEFUN([_AC_PROG_LIBTOOL], -[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl -AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl -AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl -AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool --silent' -AC_SUBST(LIBTOOL)dnl - -# Prevent multiple expansion -define([AC_PROG_LIBTOOL], []) -])# _AC_PROG_LIBTOOL - - -# AC_LIBTOOL_SETUP -# ---------------- -AC_DEFUN([AC_LIBTOOL_SETUP], -[AC_PREREQ(2.50)dnl -AC_REQUIRE([AC_ENABLE_SHARED])dnl -AC_REQUIRE([AC_ENABLE_STATIC])dnl -AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_LD])dnl -AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl -AC_REQUIRE([AC_PROG_NM])dnl - -AC_REQUIRE([AC_PROG_LN_S])dnl -AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl -# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! -AC_REQUIRE([AC_OBJEXT])dnl -AC_REQUIRE([AC_EXEEXT])dnl -dnl - -AC_LIBTOOL_SYS_MAX_CMD_LEN -AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -AC_LIBTOOL_OBJDIR - -AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -_LT_AC_PROG_ECHO_BACKSLASH - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] - -# Same as above, but do not quote variable references. -[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" - -AC_CHECK_TOOL(AR, ar, false) -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_CHECK_TOOL(STRIP, strip, :) - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -test -z "$AS" && AS=as -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$LD" && LD=ld -test -z "$LN_S" && LN_S="ln -s" -test -z "$MAGIC_CMD" && MAGIC_CMD=file -test -z "$NM" && NM=nm -test -z "$SED" && SED=sed -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$RANLIB" && RANLIB=: -test -z "$STRIP" && STRIP=: -test -z "$ac_objext" && ac_objext=o - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" - ;; - *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -# Only perform the check for file, if the check method requires it -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - AC_PATH_MAGIC - fi - ;; -esac - -AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -enable_win32_dll=yes, enable_win32_dll=no) - -AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -AC_ARG_WITH([pic], - [AC_HELP_STRING([--with-pic], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], - [pic_mode=default]) -test -z "$pic_mode" && pic_mode=default - -# Use C for the default configuration in the libtool script -tagname= -AC_LIBTOOL_LANG_C_CONFIG -_LT_AC_TAGCONFIG -])# AC_LIBTOOL_SETUP - - -# _LT_AC_SYS_COMPILER -# ------------------- -AC_DEFUN([_LT_AC_SYS_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_AC_SYS_COMPILER - - -# _LT_AC_SYS_LIBPATH_AIX -# ---------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], -[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi],[]) -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -])# _LT_AC_SYS_LIBPATH_AIX - - -# _LT_AC_SHELL_INIT(ARG) -# ---------------------- -AC_DEFUN([_LT_AC_SHELL_INIT], -[ifdef([AC_DIVERSION_NOTICE], - [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -$1 -AC_DIVERT_POP -])# _LT_AC_SHELL_INIT - - -# _LT_AC_PROG_ECHO_BACKSLASH -# -------------------------- -# Add some code to the start of the generated configure script which -# will find an echo command which doesn't interpret backslashes. -AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], -[_LT_AC_SHELL_INIT([ -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` - ;; -esac - -echo=${ECHO-echo} -if test "X[$]1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X[$]1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then - # Yippee, $echo works! - : -else - # Restart under the correct shell. - exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} -fi - -if test "X[$]1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null && - echo_test_string="`eval $cmd`" && - (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null - then - break - fi - done -fi - -if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : -else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$echo" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - echo='print -r' - elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} - else - # Try using printf. - echo='printf %s\n' - if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - echo="$CONFIG_SHELL [$]0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$CONFIG_SHELL [$]0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do - if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null - then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "[$]0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} - else - # Oops. We lost completely, so just stick with echo. - echo=echo - fi - fi - fi - fi -fi -fi - -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -ECHO=$echo -if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then - ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" -fi - -AC_SUBST(ECHO) -])])# _LT_AC_PROG_ECHO_BACKSLASH - - -# _LT_AC_LOCK -# ----------- -AC_DEFUN([_LT_AC_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LINUX_64_MODE="32" - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - LINUX_64_MODE="64" - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw* | *-*-pw32*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; - ]) -esac - -need_locks="$enable_libtool_lock" - -])# _LT_AC_LOCK - - -# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], -[AC_REQUIRE([LT_AC_PROG_SED]) -AC_CACHE_CHECK([$1], [$2], - [$2=no - ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - $2=yes - fi - fi - $rm conftest* -]) - -if test x"[$]$2" = xyes; then - ifelse([$5], , :, [$5]) -else - ifelse([$6], , :, [$6]) -fi -])# AC_LIBTOOL_COMPILER_OPTION - - -# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ------------------------------------------------------------ -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], -[AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - else - $2=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - ifelse([$4], , :, [$4]) -else - ifelse([$5], , :, [$5]) -fi -])# AC_LIBTOOL_LINKER_OPTION - - -# AC_LIBTOOL_SYS_MAX_CMD_LEN -# -------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], -[# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - testring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - *) - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ - = "XX$testring") >/dev/null 2>&1 && - new_result=`expr "X$testring" : ".*" 2>&1` && - lt_cv_sys_max_cmd_len=$new_result && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - testring=$testring$testring - done - testring= - # Add a significant safety factor because C++ compilers can tack on massive - # amounts of additional arguments before passing them to the linker. - # It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -])# AC_LIBTOOL_SYS_MAX_CMD_LEN - - -# _LT_AC_CHECK_DLFCN -# -------------------- -AC_DEFUN([_LT_AC_CHECK_DLFCN], -[AC_CHECK_HEADERS(dlfcn.h)dnl -])# _LT_AC_CHECK_DLFCN - - -# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ------------------------------------------------------------------ -AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], -[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl -if test "$cross_compiling" = yes; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -}] -EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_unknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_AC_TRY_DLOPEN_SELF - - -# AC_LIBTOOL_DLOPEN_SELF -# ------------------- -AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], -[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_AC_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_AC_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -])# AC_LIBTOOL_DLOPEN_SELF - - -# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) -# --------------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler -AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s out/conftest.err; then - _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . - $rm conftest* out/* - rmdir out - cd .. - rmdir conftest - $rm conftest* -]) -])# AC_LIBTOOL_PROG_CC_C_O - - -# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) -# ----------------------------------------- -# Check to see if we can do hard links to lock some files if needed -AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], -[AC_REQUIRE([_LT_AC_LOCK])dnl - -hard_links="nottested" -if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS - - -# AC_LIBTOOL_OBJDIR -# ----------------- -AC_DEFUN([AC_LIBTOOL_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -])# AC_LIBTOOL_OBJDIR - - -# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) -# ---------------------------------------------- -# Check hardcoding attributes. -AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_AC_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ - test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ - test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then - - # We can hardcode non-existant directories. - if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_AC_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_AC_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_AC_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH - - -# AC_LIBTOOL_SYS_LIB_STRIP -# ------------------------ -AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], -[striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) -fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -])# AC_LIBTOOL_SYS_LIB_STRIP - - -# AC_LIBTOOL_SYS_DYNAMIC_LINKER -# ----------------------------- -# PORTME Fill in your ld.so characteristics -AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], -[AC_MSG_CHECKING([dynamic linker characteristics]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case "$host_cpu" in - ia64*) - shrext='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - libsuff= - if test "x$LINUX_64_MODE" = x64; then - # Some platforms are per default 64-bit, so there's no /lib64 - if test -d /lib64 -a ! -h /lib64; then - libsuff=64 - fi - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" - sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no -])# AC_LIBTOOL_SYS_DYNAMIC_LINKER - - -# _LT_AC_TAGCONFIG -# ---------------- -AC_DEFUN([_LT_AC_TAGCONFIG], -[AC_ARG_WITH([tags], - [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], - [include additional configurations @<:@automatic@:>@])], - [tagnames="$withval"]) - -if test -f "$ltmain" && test -n "$tagnames"; then - if test ! -f "${ofile}"; then - AC_MSG_WARN([output file `$ofile' does not exist]) - fi - - if test -z "$LTCC"; then - eval "`$SHELL ${ofile} --config | grep '^LTCC='`" - if test -z "$LTCC"; then - AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) - else - AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) - fi - fi - - # Extract list of available tagged configurations in $ofile. - # Note that this assumes the entire list is on one line. - available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` - - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for tagname in $tagnames; do - IFS="$lt_save_ifs" - # Check whether tagname contains only valid characters - case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in - "") ;; - *) AC_MSG_ERROR([invalid tag name: $tagname]) - ;; - esac - - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null - then - AC_MSG_ERROR([tag name \"$tagname\" already exists]) - fi - - # Update the list of available tags. - if test -n "$tagname"; then - echo appending configuration tag \"$tagname\" to $ofile - - case $tagname in - CXX) - if test -n "$CXX" && test "X$CXX" != "Xno"; then - AC_LIBTOOL_LANG_CXX_CONFIG - else - tagname="" - fi - ;; - - F77) - if test -n "$F77" && test "X$F77" != "Xno"; then - AC_LIBTOOL_LANG_F77_CONFIG - else - tagname="" - fi - ;; - - GCJ) - if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - AC_LIBTOOL_LANG_GCJ_CONFIG - else - tagname="" - fi - ;; - - RC) - AC_LIBTOOL_LANG_RC_CONFIG - ;; - - *) - AC_MSG_ERROR([Unsupported tag name: $tagname]) - ;; - esac - - # Append the new tag name to the list of available tags. - if test -n "$tagname" ; then - available_tags="$available_tags $tagname" - fi - fi - done - IFS="$lt_save_ifs" - - # Now substitute the updated list of available tags. - if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then - mv "${ofile}T" "$ofile" - chmod +x "$ofile" - else - rm -f "${ofile}T" - AC_MSG_ERROR([unable to update list of available tagged configurations.]) - fi -fi -])# _LT_AC_TAGCONFIG - - -# AC_LIBTOOL_DLOPEN -# ----------------- -# enable checks for dlopen support -AC_DEFUN([AC_LIBTOOL_DLOPEN], - [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_DLOPEN - - -# AC_LIBTOOL_WIN32_DLL -# -------------------- -# declare package support for building win32 dll's -AC_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_WIN32_DLL - - -# AC_ENABLE_SHARED([DEFAULT]) -# --------------------------- -# implement the --enable-shared flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_SHARED], -[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([shared], - [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]AC_ENABLE_SHARED_DEFAULT) -])# AC_ENABLE_SHARED - - -# AC_DISABLE_SHARED -# ----------------- -#- set the default shared flag to --disable-shared -AC_DEFUN([AC_DISABLE_SHARED], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no) -])# AC_DISABLE_SHARED - - -# AC_ENABLE_STATIC([DEFAULT]) -# --------------------------- -# implement the --enable-static flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_STATIC], -[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([static], - [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]AC_ENABLE_STATIC_DEFAULT) -])# AC_ENABLE_STATIC - - -# AC_DISABLE_STATIC -# ----------------- -# set the default static flag to --disable-static -AC_DEFUN([AC_DISABLE_STATIC], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no) -])# AC_DISABLE_STATIC - - -# AC_ENABLE_FAST_INSTALL([DEFAULT]) -# --------------------------------- -# implement the --enable-fast-install flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_FAST_INSTALL], -[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([fast-install], - [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) -])# AC_ENABLE_FAST_INSTALL - - -# AC_DISABLE_FAST_INSTALL -# ----------------------- -# set the default to --disable-fast-install -AC_DEFUN([AC_DISABLE_FAST_INSTALL], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no) -])# AC_DISABLE_FAST_INSTALL - - -# AC_LIBTOOL_PICMODE([MODE]) -# -------------------------- -# implement the --with-pic flag -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -AC_DEFUN([AC_LIBTOOL_PICMODE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -pic_mode=ifelse($#,1,$1,default) -])# AC_LIBTOOL_PICMODE - - -# AC_PROG_EGREP -# ------------- -# This is predefined starting with Autoconf 2.54, so this conditional -# definition can be removed once we require Autoconf 2.54 or later. -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], -[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], - [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi]) - EGREP=$ac_cv_prog_egrep - AC_SUBST([EGREP]) -])]) - - -# AC_PATH_TOOL_PREFIX -# ------------------- -# find a file program which can recognise shared library -AC_DEFUN([AC_PATH_TOOL_PREFIX], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="ifelse([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -])# AC_PATH_TOOL_PREFIX - - -# AC_PATH_MAGIC -# ------------- -# find a file program which can recognise a shared library -AC_DEFUN([AC_PATH_MAGIC], -[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# AC_PATH_MAGIC - - -# AC_PROG_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([AC_PROG_LD], -[AC_ARG_WITH([gnu-ld], - [AC_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no]) -AC_REQUIRE([LT_AC_PROG_SED])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case "$host_cpu" in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - irix5* | nonstopux*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" - ;; - esac - lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux*) - case $host_cpu in - alpha* | hppa* | i*86 | ia64* | m68* | mips* | powerpc* | sparc* | s390* | sh* | x86_64* ) - lt_cv_deplibs_check_method=pass_all ;; - # the debian people say, arm and glibc 2.3.1 works for them with pass_all - arm* ) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; - esac - lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -nto-qnx*) - lt_cv_deplibs_check_method=unknown - ;; - -openbsd*) - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' - else - lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' - fi - ;; - -osf3* | osf4* | osf5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' - lt_cv_file_magic_test_file=/shlib/libc.so - lt_cv_deplibs_check_method=pass_all - ;; - -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - lt_cv_file_magic_test_file=/lib/libc.so - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown -])# AC_DEPLIBS_CHECK_METHOD - - -# AC_PROG_NM -# ---------- -# find the pathname to a BSD-compatible name lister -AC_DEFUN([AC_PROG_NM], -[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/${ac_tool_prefix}nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - esac - fi - done - IFS="$lt_save_ifs" - test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -fi]) -NM="$lt_cv_path_NM" -])# AC_PROG_NM - - -# AC_CHECK_LIBM -# ------------- -# check for math library -AC_DEFUN([AC_CHECK_LIBM], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -])# AC_CHECK_LIBM - - -# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl convenience library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will -# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with -# '${top_srcdir}/' (note the single quotes!). If your package is not -# flat and you're not using automake, define top_builddir and -# top_srcdir appropriately in the Makefiles. -AC_DEFUN([AC_LIBLTDL_CONVENIENCE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case $enable_ltdl_convenience in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_CONVENIENCE - - -# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl installable library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-install to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided and an installed libltdl is not found, it is -# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' -# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single -# quotes!). If your package is not flat and you're not using automake, -# define top_builddir and top_srcdir appropriately in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN([AC_LIBLTDL_INSTALLABLE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, lt_dlinit, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - LTDLINCL= - fi - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_INSTALLABLE - - -# AC_LIBTOOL_CXX -# -------------- -# enable support for C++ libraries -AC_DEFUN([AC_LIBTOOL_CXX], -[AC_REQUIRE([_LT_AC_LANG_CXX]) -])# AC_LIBTOOL_CXX - - -# _LT_AC_LANG_CXX -# --------------- -AC_DEFUN([_LT_AC_LANG_CXX], -[AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) -])# _LT_AC_LANG_CXX - - -# AC_LIBTOOL_F77 -# -------------- -# enable support for Fortran 77 libraries -AC_DEFUN([AC_LIBTOOL_F77], -[AC_REQUIRE([_LT_AC_LANG_F77]) -])# AC_LIBTOOL_F77 - - -# _LT_AC_LANG_F77 -# --------------- -AC_DEFUN([_LT_AC_LANG_F77], -[AC_REQUIRE([AC_PROG_F77]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) -])# _LT_AC_LANG_F77 - - -# AC_LIBTOOL_GCJ -# -------------- -# enable support for GCJ libraries -AC_DEFUN([AC_LIBTOOL_GCJ], -[AC_REQUIRE([_LT_AC_LANG_GCJ]) -])# AC_LIBTOOL_GCJ - - -# _LT_AC_LANG_GCJ -# --------------- -AC_DEFUN([_LT_AC_LANG_GCJ], -[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], - [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], - [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], - [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) -])# _LT_AC_LANG_GCJ - - -# AC_LIBTOOL_RC -# -------------- -# enable support for Windows resource files -AC_DEFUN([AC_LIBTOOL_RC], -[AC_REQUIRE([LT_AC_PROG_RC]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) -])# AC_LIBTOOL_RC - - -# AC_LIBTOOL_LANG_C_CONFIG -# ------------------------ -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) -AC_DEFUN([_LT_AC_LANG_C_CONFIG], -[lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' - -_LT_AC_SYS_COMPILER - -# -# Check for any special shared library compilation flags. -# -_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= -if test "$GCC" = no; then - case $host_os in - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' - ;; - esac -fi -if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then - AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) - if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : - else - AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) - _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no - fi -fi - - -# -# Check to make sure the static flag actually works. -# -AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), - $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), - [], - [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF($1) - -# Report which librarie types wil actually be built -AC_MSG_CHECKING([if libtool supports shared libraries]) -AC_MSG_RESULT([$can_build_shared]) - -AC_MSG_CHECKING([whether to build shared libraries]) -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - darwin* | rhapsody*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' - ;; - esac - fi - ;; - esac - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; -esac -AC_MSG_RESULT([$enable_shared]) - -AC_MSG_CHECKING([whether to build static libraries]) -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -AC_MSG_RESULT([$enable_static]) - -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC="$lt_save_CC" -])# AC_LIBTOOL_LANG_C_CONFIG - - -# AC_LIBTOOL_LANG_CXX_CONFIG -# -------------------------- -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) -AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], -[AC_LANG_PUSH(C++) -AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) - -_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_AC_TAGVAR(allow_undefined_flag, $1)= -_LT_AC_TAGVAR(always_export_symbols, $1)=no -_LT_AC_TAGVAR(archive_expsym_cmds, $1)= -_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_direct, $1)=no -_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= -_LT_AC_TAGVAR(hardcode_minus_L, $1)=no -_LT_AC_TAGVAR(hardcode_automatic, $1)=no -_LT_AC_TAGVAR(module_cmds, $1)= -_LT_AC_TAGVAR(module_expsym_cmds, $1)= -_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown -_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_AC_TAGVAR(no_undefined_flag, $1)= -_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= -_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Dependencies to place before and after the object being linked: -_LT_AC_TAGVAR(predep_objects, $1)= -_LT_AC_TAGVAR(postdep_objects, $1)= -_LT_AC_TAGVAR(predeps, $1)= -_LT_AC_TAGVAR(postdeps, $1)= -_LT_AC_TAGVAR(compiler_lib_search_path, $1)= - -# Source file extension for C++ test sources. -ac_ext=cc - -# Object file extension for compiled C++ test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_AC_SYS_COMPILER - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -_LT_AC_TAGVAR(compiler, $1)=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' -else - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -fi - -if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - AC_PROG_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= -fi - -# PORTME: fill in a description of your system's C++ link characteristics -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -_LT_AC_TAGVAR(ld_shlibs, $1)=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # KDE requires run time linking. Make it the default. - aix_use_runtimelinking=yes - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='-qmkshrobj ${wl}-G' - else - shared_flag='-qmkshrobj' - fi - fi - fi - - # Let the compiler handle the export list. - _LT_AC_TAGVAR(always_export_symbols, $1)=no - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=no - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - darwin* | rhapsody*) - if test "$GXX" = yes; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' - ;; - esac - fi - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' - - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - dgux*) - case $cc_basename in - ec++) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - freebsd[12]*) - # C++ shared libraries reported to be fairly broken before switch to ELF - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - freebsd-elf*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - freebsd* | kfreebsd*-gnu) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - ;; - gnu*) - ;; - hpux9*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - ;; - *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - *) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC) - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case "$host_cpu" in - ia64*|hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - irix5* | irix6*) - case $cc_basename in - CC) - # SGI C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - linux*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc) - # Intel C++ - with_gnu_ld=yes - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - cxx) - # Compaq C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - m88k*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - mvs*) - case $cc_basename in - cxx) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - osf3*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ - $rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - sco*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - lcc) - # Lucid - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; -esac -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_AC_TAGVAR(GCC, $1)="$GXX" -_LT_AC_TAGVAR(LD, $1)="$LD" - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -AC_LIBTOOL_POSTDEP_PREDEP($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF($1) - -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -])# AC_LIBTOOL_LANG_CXX_CONFIG - -# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) -# ------------------------ -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" -ifelse([$1], [], -[#! $SHELL - -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# -# This file is part of GNU Libtool: -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -# The names of the tagged configurations supported by this script. -available_tags= - -# ### BEGIN LIBTOOL CONFIG], -[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) - -# Is the compiler the GNU C compiler? -with_gcc=$_LT_AC_TAGVAR(GCC, $1) - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_[]_LT_AC_TAGVAR(LD, $1) - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext='$shrext' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) - -# Must we lock files when doing compilation ? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) - -# Commands used to build and install a shared archive. -archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) -archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) -module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" - -# Set to yes if exported symbols are required. -always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) - -# The commands to list exported symbols. -export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) - -# Symbols that must always be exported. -include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) - -ifelse([$1],[], -[# ### END LIBTOOL CONFIG], -[# ### END LIBTOOL TAG CONFIG: $tagname]) - -__EOF__ - -ifelse([$1],[], [ - case $host_os in - aix3*) - cat <<\EOF >> "$cfgfile" - -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -EOF - ;; - esac - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || \ - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -]) -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi -])# AC_LIBTOOL_CONFIG - - -# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl - -_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - - AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI - - -# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -# --------------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], -[AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_NM]) -AC_REQUIRE([AC_OBJEXT]) -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - -# Transform an extracted symbol line into a proper C declaration -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) # Its linker distinguishes data from code symbols - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris* | sysv5*) - symcode='[[BDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGISTW]]' ;; -esac - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if grep ' nm_test_var$' "$nlist" >/dev/null; then - if grep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' - - cat <> conftest.$ac_ext -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[[]] = -{ -EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext - cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -f conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi -]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE - - -# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) -# --------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], -[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= - -AC_MSG_CHECKING([for $compiler option to produce PIC]) - ifelse([$1],[CXX],[ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | kfreebsd*-gnu) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC) - # KAI C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - icpc) - # Intel C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - cxx) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC) - # Rational C++ 2.4.1 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx) - # Digital/Compaq C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - sco*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - *) - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc) - # Lucid - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - unixware*) - ;; - vxworks*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - newsos6) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - linux*) - case $CC in - icc* | ecc*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - ccc*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' - ;; - - solaris*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sunos4*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - uts4*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then - AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), - [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -case "$host_os" in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" - ;; -esac -]) - - -# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) -# ------------------------------------ -# See if the linker supports building shared libraries. -AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], -[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -ifelse([$1],[CXX],[ - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - *) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -],[ - runpath_var= - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)= - _LT_AC_TAGVAR(archive_expsym_cmds, $1)= - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= - _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown - _LT_AC_TAGVAR(hardcode_automatic, $1)=no - _LT_AC_TAGVAR(module_cmds, $1)= - _LT_AC_TAGVAR(module_expsym_cmds, $1)= - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_AC_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=no - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sunos4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - - # KDE requires run time linking. Make it the default. - aix_use_runtimelinking=yes - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='-qmkshrobj ${wl}-G' - else - shared_flag='-qmkshrobj' - fi - fi - fi - - # Let the compiler handle the export list. - _LT_AC_TAGVAR(always_export_symbols, $1)=no - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - # see comment about different semantics on the GNU ld section - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - bsdi4*) - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=no - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $compiler_flags $libobjs `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - - darwin* | rhapsody*) - if test "$GXX" = yes ; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' - ;; - esac - fi - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - dgux*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $compiler_flags $libobjs $deplibs' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $libobjs $deplibs~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $libobjs $deplibs' - ;; - esac - else - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; - *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $compiler_flags $libobjs $deplibs$output_objdir/$libname.def' - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - sco3.2v5*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs~$rm $lib.exp' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $compiler_flags $libobjs $deplibs' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4.2uw2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' - fi - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv5*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_AC_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_MSG_CHECKING([whether -lc should be explicitly linked in]) - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) - then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - else - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) - ;; - esac - fi - ;; -esac -])# AC_LIBTOOL_PROG_LD_SHLIBS - - -# _LT_AC_FILE_LTDLL_C -# ------------------- -# Be careful that the start marker always follows a newline. -AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ -# /* ltdll.c starts here */ -# #define WIN32_LEAN_AND_MEAN -# #include -# #undef WIN32_LEAN_AND_MEAN -# #include -# -# #ifndef __CYGWIN__ -# # ifdef __CYGWIN32__ -# # define __CYGWIN__ __CYGWIN32__ -# # endif -# #endif -# -# #ifdef __cplusplus -# extern "C" { -# #endif -# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -# #ifdef __cplusplus -# } -# #endif -# -# #ifdef __CYGWIN__ -# #include -# DECLARE_CYGWIN_DLL( DllMain ); -# #endif -# HINSTANCE __hDllInstance_base; -# -# BOOL APIENTRY -# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -# { -# __hDllInstance_base = hInst; -# return TRUE; -# } -# /* ltdll.c ends here */ -])# _LT_AC_FILE_LTDLL_C - - -# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) -# --------------------------------- -AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) - - -# old names -AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) -AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) -AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) - -# This is just to silence aclocal about the macro not being used -ifelse([AC_DISABLE_FAST_INSTALL]) - -AC_DEFUN([LT_AC_PROG_GCJ], -[AC_CHECK_TOOL(GCJ, gcj, no) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS) -]) - -AC_DEFUN([LT_AC_PROG_RC], -[AC_CHECK_TOOL(RC, windres, no) -]) - -############################################################ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -############################################################ -# LT_AC_PROG_SED -# -------------- -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -AC_DEFUN([LT_AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && break - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_MSG_RESULT([$SED]) -]) - -dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) -dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page -dnl also defines GSTUFF_PKG_ERRORS on error -AC_DEFUN([PKG_CHECK_MODULES], [ - succeeded=no - - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - if test "$PKG_CONFIG" = "no" ; then - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then - AC_MSG_CHECKING(for $2) - - if $PKG_CONFIG --exists "$2" ; then - AC_MSG_RESULT(yes) - succeeded=yes - - AC_MSG_CHECKING($1_CFLAGS) - $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` - AC_MSG_RESULT($$1_CFLAGS) - - AC_MSG_CHECKING($1_LIBS) - $1_LIBS=`$PKG_CONFIG --libs "$2"` - AC_MSG_RESULT($$1_LIBS) - else - $1_CFLAGS="" - $1_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. - $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - ifelse([$4], ,echo $$1_PKG_ERRORS,) - fi - - AC_SUBST($1_CFLAGS) - AC_SUBST($1_LIBS) - else - echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." - echo "*** See http://www.freedesktop.org/software/pkgconfig" - fi - fi - - if test $succeeded = yes; then - ifelse([$3], , :, [$3]) - else - ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) - fi -]) - - diff --git a/aclocal.m4 b/aclocal.m4 deleted file mode 100644 index 8c5cd1d..0000000 --- a/aclocal.m4 +++ /dev/null @@ -1,933 +0,0 @@ -# generated automatically by aclocal 1.8.5 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 -# Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -# -*- Autoconf -*- -# Copyright (C) 2002, 2003 Free Software Foundation, Inc. -# Generated from amversion.in; do not edit by hand. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.8"]) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.8.5])]) - -# AM_AUX_DIR_EXPAND - -# Copyright (C) 2001, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997, 2000, 2001, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 6 - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]) -fi])]) - -# serial 7 -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 -# Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -#serial 2 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue - # Extract the definition of DEP_FILES from the Makefile without - # running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" - # We invoke sed twice because it is the simplest approach to - # changing $(DEPDIR) to its actual value in the expansion. - for file in `sed -n ' - /^DEP_FILES = .*\\\\$/ { - s/^DEP_FILES = // - :loop - s/\\\\$// - p - n - /\\\\$/ b loop - p - } - /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 7 - -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) - -# Do all the work for Automake. -*- Autoconf -*- - -# This macro actually does too much some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 -# Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 11 - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_MISSING_PROG(AMTAR, tar) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl - -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -]) -]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $1 | $1:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. - -# Copyright (C) 2001, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} -AC_SUBST(install_sh)]) - -# -*- Autoconf -*- -# Copyright (C) 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 1 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 2 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo done -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# -*- Autoconf -*- - - -# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 3 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# AM_PROG_MKDIR_P -# --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. - -# Copyright (C) 2003, 2004 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) -AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # Keeping the `.' argument allows $(mkdir_p) to be used without - # argument. Indeed, we sometimes output rules like - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. - # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more - # expensive solution, as it forces Make to start a sub-shell.) - mkdir_p='mkdir -p -- .' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 2 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# -# Check to make sure that the build environment is sane. -# - -# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 3 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# AM_PROG_INSTALL_STRIP - -# Copyright (C) 2001, 2003 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -m4_include([acinclude.m4]) diff --git a/admin/Doxyfile.am b/admin/Doxyfile.am deleted file mode 100644 index 7ef5b5c..0000000 --- a/admin/Doxyfile.am +++ /dev/null @@ -1,102 +0,0 @@ -## generate API documentation with doxygen -apidox-am-yes: - @if test \! -d "$(top_srcdir)/doc/common/" && test -z "$$DOXDATA" ; then \ - export DOXDATA=$(kde_libs_htmldir)/en/common ; \ - fi ; \ - abs_top_srcdir=`cd $(top_srcdir) && pwd` ;\ - test -d $(top_builddir)/apidocs || \ - ( cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ - --no-modulename --installdir=$(kde_libs_htmldir)/en \ - --no-recurse $(abs_top_srcdir) . ) ; \ - cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ - --recurse --no-modulename --installdir=$(kde_libs_htmldir)/en \ - $$abs_top_srcdir $(subdir) - -apidox-am-toplevel-yes: - @if test \! -d "$(top_srcdir)/doc/common/" && test -z "$$ADMIN" ; then \ - export DOXDATA=$(kde_libs_htmldir)/en/common ; \ - fi ; \ - abs_top_srcdir=`cd $(top_srcdir) && pwd` ;\ - cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ - --no-modulename --installdir=$(kde_libs_htmldir)/en \ - $$abs_top_srcdir - -## Don't generate API documentation without doxygen -apidox-am-no: - -apidox-am-toplevel-no: - - -apidox: - @if test "$(subdir)" != "."; then \ - $(MAKE) apidox-am-@KDE_HAS_DOXYGEN@ ;\ - else \ - $(MAKE) apidox-am-toplevel-@KDE_HAS_DOXYGEN@ ;\ - fi - - - -install-data-local: install-apidox - -## install API documentation -install-apidox: - @if test "$(subdir)" != "."; then \ - $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir)/html ; \ - if test -f $(top_builddir)/apidocs/$(subdir)/$(subdir).tag; then \ - echo $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/$(subdir).tag $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ - $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/$(subdir).tag $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ - fi; \ - if test -d $(top_builddir)/apidocs/$(subdir)/html; then \ - list=`ls $(top_builddir)/apidocs/$(subdir)/html`; \ - echo "installing $(top_builddir)/apidocs/$(subdir)/html" ;\ - for file in $$list; do \ - $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/html/$$file $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir)/html; \ - done; \ - fi; \ - else\ - if test -d $(top_builddir)/apidocs; then \ - $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs ;\ - list=`cd $(top_builddir)/apidocs && ls -1`; \ - echo "installing $(top_builddir)/apidocs/$$file" ;\ - echo "target directory $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs" ; \ - for file in $$list; do \ - if test -f $(top_builddir)/apidocs/$$file; then \ - $(INSTALL_DATA) $(top_builddir)/apidocs/$$file $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; \ - fi; \ - done ; fi; \ - fi - -uninstall-local: uninstall-apidox - -## uninstall API documentation -uninstall-apidox: - @if test "$(subdir)" != "."; then \ - if test -d $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); then \ - rm -rfv $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ - fi \ - else \ - if test -d $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; then \ - rm -rfv $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; \ - fi \ - fi - -install-apidox-recurse: install-apidox - @set fnord $(MAKEFLAGS); amf=$$2; if test -n '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; \ - for subdir in $$list; do \ - if grep '^include .*Doxyfile.am' $(srcdir)/$$subdir/Makefile.am > /dev/null ; then \ - echo "Installing apidox from $$subdir"; \ - if test "$$subdir" != "."; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) GENERATE_FLAG=no install-apidox-recurse) || exit 1; \ - fi ; fi ;\ - done; \ - fi - - - -.PHONY: apidox-am-yes apidox-am-no install-data-local install-apidox install-apidox uninstall-local uninstall-apidox uninstall-apidox apidox apidox-am-toplevel-no apidox-am-toplevel-yes - - -# Local Variables: -# mode: makefile -# End: diff --git a/admin/Doxyfile.global b/admin/Doxyfile.global deleted file mode 100644 index 1b9f560..0000000 --- a/admin/Doxyfile.global +++ /dev/null @@ -1,192 +0,0 @@ -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -BRIEF_MEMBER_DESC = NO -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = -ALWAYS_DETAILED_SEC = YES -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = YES -MULTILINE_CPP_IS_BRIEF = NO -INHERIT_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO -TAB_SIZE = 4 -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -SUBGROUPING = YES -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = YES -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TESTLIST = NO -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -QUIET = YES -WARNINGS = NO -WARN_IF_UNDOCUMENTED = NO -WARN_IF_DOC_ERROR = YES -WARN_FORMAT = -WARN_LOGFILE = -INPUT = -FILE_PATTERNS = *.h \ - *.cpp \ - *.cc \ - *.hpp \ - *.dox \ - *.c++ \ - *.cxx \ - *.h++ \ - *.hh -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = *.moc.* \ - moc* \ - *.all_cpp.* \ - *unload.* \ - */test/* \ - */tests/* \ - *_p.h -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_SOURCE_FILES = NO -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = YES -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 3 -HTML_OUTPUT = -HTML_FILE_EXTENSION = .html -HTML_HEADER = ../apidocs/common/header.html -HTML_FOOTER = ../apidocs/common/footer.html -HTML_STYLESHEET = ../apidocs/common/doxygen.css -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = YES -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -GENERATE_LATEX = NO -LATEX_OUTPUT = -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = NO -USE_PDFLATEX = NO -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -GENERATE_RTF = NO -RTF_OUTPUT = -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -GENERATE_MAN = NO -MAN_OUTPUT = -MAN_EXTENSION = .kde3 -MAN_LINKS = YES -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = NO -GENERATE_AUTOGEN_DEF = NO -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -ENABLE_PREPROCESSING = YES -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = QT_VERSION=320 \ - __cplusplus \ - Q_WS_X11 -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = NO -PERL_PATH = -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = NO -HAVE_DOT = NO -UML_LOOK = NO -TEMPLATE_RELATIONS = YES -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 800 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 0 -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -SEARCHENGINE = NO - -### KDE Settings -ALIASES = \ - "intern=\parInternal use only." \ - "reimp=\parReimplemented from superclass." \ - "obsolete=@deprecated" \ - "feature=\xrefitem features \"Feature(s)\" \"Features\"" \ - "maintainer=\xrefitem maintainers \"Maintainer(s)\" \"Maintainers\"" \ - "unmaintained=\xrefitem unmaintained \"Unmaintained\" \"Unmaintained\"" \ - "requirement=\xrefitem requirements \"Requirement(s)\" \"Requirements\"" \ - "faq=\xrefitem FAQ \"F.A.Q.\" \"F.A.Q.\"" \ - "authors=\xrefitem authors \"Author(s)\" \"Authors\"" \ - "FIXME=\xrefitem fixme \"Fixme\" \"Fixme\"" - -HTML_ALIGN_MEMBERS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -VERBATIM_HEADERS = NO -GENERATE_HTML = YES -SOURCE_BROWSER = YES -GENERATE_AUTOGEN_DEF = NO -DETAILS_AT_TOP = YES -SORT_MEMBER_DOCS = YES -GENERATE_TODOLIST = YES -IGNORE_PREFIX = K -GENERATE_HTML = YES -CLASS_GRAPH = YES -COLLABORATION_GRAPH = NO - - -MACRO_EXPANSION = YES -EXPAND_ONLY_PREDEF = YES - diff --git a/admin/Makefile.common b/admin/Makefile.common deleted file mode 100644 index d07b404..0000000 --- a/admin/Makefile.common +++ /dev/null @@ -1,37 +0,0 @@ -### Makefile.common -### -### Copyright (C) 2002 by the KDE developers - -### All the real work is done by the shellscript cvs.sh - -SHELL=/bin/sh - -cvs dist configure configure.in configure.files subdirs package-messages package-merge Makefile.am acinclude.m4 extract-messages: - @admindir=$(admindir); \ - if test "x$$admindir" = x; then \ - admindir=.; until test -f $$admindir/admin/cvs.sh; do \ - admindir=$$admindir/..; \ - if test `cd $$admindir && pwd` = / ; then break; fi; \ - done; \ - admindir=$$admindir/admin; \ - if test -f $$admindir/cvs.sh; then :; else \ - echo "Can't find the admin/ directory in any parent of the"; \ - echo "current directory. Please set it with admindir=..."; \ - exit 1; \ - fi; \ - fi; \ - if test "$@" = "package-merge"; then \ - MAKE="$(MAKE)" POFILES="$(POFILES)" PACKAGE="$(PACKAGE)" \ - $(SHELL) $$admindir/cvs.sh package-merge ;\ - else \ - MAKE="$(MAKE)" $(SHELL) $$admindir/cvs.sh $@ ;\ - fi - -configure.in: configure.files subdirs -configure.files: subdirs - -svn: cvs - -.SILENT: - -.PHONY: svn cvs dist package-merge package-messages diff --git a/admin/acinclude.m4.in b/admin/acinclude.m4.in deleted file mode 100644 index 732e3ba..0000000 --- a/admin/acinclude.m4.in +++ /dev/null @@ -1,5973 +0,0 @@ -## -*- autoconf -*- - -dnl This file is part of the KDE libraries/packages -dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) -dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) - -dnl This file is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Library General Public -dnl License as published by the Free Software Foundation; either -dnl version 2 of the License, or (at your option) any later version. - -dnl This library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Library General Public License for more details. - -dnl You should have received a copy of the GNU Library General Public License -dnl along with this library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -dnl Boston, MA 02110-1301, USA. - -dnl IMPORTANT NOTE: -dnl Please do not modify this file unless you expect your modifications to be -dnl carried into every other module in the repository. -dnl -dnl Single-module modifications are best placed in configure.in for kdelibs -dnl and kdebase or configure.in.in if present. - -# KDE_PATH_X_DIRECT -dnl Internal subroutine of AC_PATH_X. -dnl Set ac_x_includes and/or ac_x_libraries. -AC_DEFUN([KDE_PATH_X_DIRECT], -[ -AC_REQUIRE([KDE_CHECK_LIB64]) - -if test "$ac_x_includes" = NO; then - # Guess where to find include files, by looking for this one X11 .h file. - test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h - - # First, try using that file with no special directory specified. -AC_TRY_CPP([#include <$x_direct_test_include>], -[# We can compile using X headers with no special include directory. -ac_x_includes=], -[# Look for the header file in a standard set of common directories. -# Check X11 before X11Rn because it is often a symlink to the current release. - for ac_dir in \ - /usr/X11/include \ - /usr/X11R6/include \ - /usr/X11R5/include \ - /usr/X11R4/include \ - \ - /usr/include/X11 \ - /usr/include/X11R6 \ - /usr/include/X11R5 \ - /usr/include/X11R4 \ - \ - /usr/local/X11/include \ - /usr/local/X11R6/include \ - /usr/local/X11R5/include \ - /usr/local/X11R4/include \ - \ - /usr/local/include/X11 \ - /usr/local/include/X11R6 \ - /usr/local/include/X11R5 \ - /usr/local/include/X11R4 \ - \ - /usr/X386/include \ - /usr/x386/include \ - /usr/XFree86/include/X11 \ - \ - /usr/include \ - /usr/local/include \ - /usr/unsupported/include \ - /usr/athena/include \ - /usr/local/x11r5/include \ - /usr/lpp/Xamples/include \ - \ - /usr/openwin/include \ - /usr/openwin/share/include \ - ; \ - do - if test -r "$ac_dir/$x_direct_test_include"; then - ac_x_includes=$ac_dir - break - fi - done]) -fi # $ac_x_includes = NO - -if test "$ac_x_libraries" = NO; then - # Check for the libraries. - - test -z "$x_direct_test_library" && x_direct_test_library=Xt - test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc - - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS="$LIBS" - LIBS="-l$x_direct_test_library $LIBS" -AC_TRY_LINK([#include ], [${x_direct_test_function}(1)], -[LIBS="$ac_save_LIBS" -# We can link X programs with no special library path. -ac_x_libraries=], -[LIBS="$ac_save_LIBS" -# First see if replacing the include by lib works. -# Check X11 before X11Rn because it is often a symlink to the current release. -for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ - /usr/X11/lib${kdelibsuff} \ - /usr/X11R6/lib${kdelibsuff} \ - /usr/X11R5/lib${kdelibsuff} \ - /usr/X11R4/lib${kdelibsuff} \ - \ - /usr/lib${kdelibsuff}/X11 \ - /usr/lib${kdelibsuff}/X11R6 \ - /usr/lib${kdelibsuff}/X11R5 \ - /usr/lib${kdelibsuff}/X11R4 \ - \ - /usr/local/X11/lib${kdelibsuff} \ - /usr/local/X11R6/lib${kdelibsuff} \ - /usr/local/X11R5/lib${kdelibsuff} \ - /usr/local/X11R4/lib${kdelibsuff} \ - \ - /usr/local/lib${kdelibsuff}/X11 \ - /usr/local/lib${kdelibsuff}/X11R6 \ - /usr/local/lib${kdelibsuff}/X11R5 \ - /usr/local/lib${kdelibsuff}/X11R4 \ - \ - /usr/X386/lib${kdelibsuff} \ - /usr/x386/lib${kdelibsuff} \ - /usr/XFree86/lib${kdelibsuff}/X11 \ - \ - /usr/lib${kdelibsuff} \ - /usr/local/lib${kdelibsuff} \ - /usr/unsupported/lib${kdelibsuff} \ - /usr/athena/lib${kdelibsuff} \ - /usr/local/x11r5/lib${kdelibsuff} \ - /usr/lpp/Xamples/lib${kdelibsuff} \ - /lib/usr/lib${kdelibsuff}/X11 \ - \ - /usr/openwin/lib${kdelibsuff} \ - /usr/openwin/share/lib${kdelibsuff} \ - ; \ -do -dnl Don't even attempt the hair of trying to link an X program! - for ac_extension in a so sl; do - if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done]) -fi # $ac_x_libraries = NO -]) - - -dnl ------------------------------------------------------------------------ -dnl Find a file (or one of more files in a list of dirs) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_FIND_FILE], -[ -$3=NO -for i in $2; -do - for j in $1; - do - echo "configure: __oline__: $i/$j" >&AC_FD_CC - if test -r "$i/$j"; then - echo "taking that" >&AC_FD_CC - $3=$i - break 2 - fi - done -done -]) - -dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs, -dnl if-not-found, test-parameter, prepend-path) -dnl -dnl Look for program-name in list-of-dirs+$PATH. -dnl If prepend-path is set, look in $PATH+list-of-dirs instead. -dnl If found, $variable-name is set. If not, if-not-found is evaluated. -dnl test-parameter: if set, the program is executed with this arg, -dnl and only a successful exit code is required. -AC_DEFUN([KDE_FIND_PATH], -[ - AC_MSG_CHECKING([for $1]) - if test -n "$$2"; then - kde_cv_path="$$2"; - else - kde_cache=`echo $1 | sed 'y%./+-%__p_%'` - - AC_CACHE_VAL(kde_cv_path_$kde_cache, - [ - kde_cv_path="NONE" - kde_save_IFS=$IFS - IFS=':' - dirs="" - for dir in $PATH; do - dirs="$dirs $dir" - done - if test -z "$6"; then dnl Append dirs in PATH (default) - dirs="$3 $dirs" - else dnl Prepend dirs in PATH (if 6th arg is set) - dirs="$dirs $3" - fi - IFS=$kde_save_IFS - - for dir in $dirs; do - if test -x "$dir/$1"; then - if test -n "$5" - then - evalstr="$dir/$1 $5 2>&1 " - if eval $evalstr; then - kde_cv_path="$dir/$1" - break - fi - else - kde_cv_path="$dir/$1" - break - fi - fi - done - - eval "kde_cv_path_$kde_cache=$kde_cv_path" - - ]) - - eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" - - fi - - if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then - AC_MSG_RESULT(not found) - $4 - else - AC_MSG_RESULT($kde_cv_path) - $2=$kde_cv_path - - fi -]) - -AC_DEFUN([KDE_MOC_ERROR_MESSAGE], -[ - AC_MSG_ERROR([No Qt meta object compiler (moc) found! -Please check whether you installed Qt correctly. -You need to have a running moc binary. -configure tried to run $ac_cv_path_moc and the test didn't -succeed. If configure shouldn't have tried this one, set -the environment variable MOC to the right one before running -configure. -]) -]) - -AC_DEFUN([KDE_UIC_ERROR_MESSAGE], -[ - AC_MSG_WARN([No Qt ui compiler (uic) found! -Please check whether you installed Qt correctly. -You need to have a running uic binary. -configure tried to run $ac_cv_path_uic and the test didn't -succeed. If configure shouldn't have tried this one, set -the environment variable UIC to the right one before running -configure. -]) -]) - - -AC_DEFUN([KDE_CHECK_UIC_FLAG], -[ - AC_MSG_CHECKING([whether uic supports -$1 ]) - kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` - AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, - [ - cat >conftest.ui < -EOT - ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" - if AC_TRY_EVAL(ac_uic_testrun); then - eval "kde_cv_prog_uic_$kde_cache=yes" - else - eval "kde_cv_prog_uic_$kde_cache=no" - fi - rm -f conftest* - ]) - - if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then - AC_MSG_RESULT([yes]) - : - $3 - else - AC_MSG_RESULT([no]) - : - $4 - fi -]) - - -dnl ------------------------------------------------------------------------ -dnl Find the meta object compiler and the ui compiler in the PATH, -dnl in $QTDIR/bin, and some more usual places -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_PATH_QT_MOC_UIC], -[ - AC_REQUIRE([KDE_CHECK_PERL]) - qt_bindirs="" - for dir in $kde_qt_dirs; do - qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" - done - qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" - if test ! "$ac_qt_bindir" = "NO"; then - qt_bindirs="$ac_qt_bindir $qt_bindirs" - fi - - KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) - if test -z "$UIC_NOT_NEEDED"; then - KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) - if test -z "$UIC_PATH" ; then - KDE_UIC_ERROR_MESSAGE - exit 1 - else - UIC=$UIC_PATH - - if test $kde_qtver = 3; then - KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) - KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) - - if test x$ac_uic_supports_libpath = xyes; then - UIC="$UIC -L \$(kde_widgetdir)" - fi - if test x$ac_uic_supports_nounload = xyes; then - UIC="$UIC -nounload" - fi - fi - fi - else - UIC="echo uic not available: " - fi - - AC_SUBST(MOC) - AC_SUBST(UIC) - - UIC_TR="i18n" - if test $kde_qtver = 3; then - UIC_TR="tr2i18n" - fi - - AC_SUBST(UIC_TR) -]) - -AC_DEFUN([KDE_1_CHECK_PATHS], -[ - KDE_1_CHECK_PATH_HEADERS - - KDE_TEST_RPATH= - - if test -n "$USE_RPATH"; then - - if test -n "$kde_libraries"; then - KDE_TEST_RPATH="-R $kde_libraries" - fi - - if test -n "$qt_libraries"; then - KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" - fi - - if test -n "$x_libraries"; then - KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" - fi - - KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" - fi - -AC_MSG_CHECKING([for KDE libraries installed]) -ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' - -if AC_TRY_EVAL(ac_link) && test -s conftest; then - AC_MSG_RESULT(yes) -else - AC_MSG_ERROR([your system fails at linking a small KDE application! -Check, if your compiler is installed correctly and if you have used the -same compiler to compile Qt and kdelibs as you did use now. -For more details about this problem, look at the end of config.log.]) -fi - -if eval `KDEDIR= ./conftest 2>&5`; then - kde_result=done -else - kde_result=problems -fi - -KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log -kde_have_all_paths=yes - -KDE_SET_PATHS($kde_result) - -]) - -AC_DEFUN([KDE_SET_PATHS], -[ - kde_cv_all_paths="kde_have_all_paths=\"yes\" \ - kde_htmldir=\"$kde_htmldir\" \ - kde_appsdir=\"$kde_appsdir\" \ - kde_icondir=\"$kde_icondir\" \ - kde_sounddir=\"$kde_sounddir\" \ - kde_datadir=\"$kde_datadir\" \ - kde_locale=\"$kde_locale\" \ - kde_cgidir=\"$kde_cgidir\" \ - kde_confdir=\"$kde_confdir\" \ - kde_kcfgdir=\"$kde_kcfgdir\" \ - kde_mimedir=\"$kde_mimedir\" \ - kde_toolbardir=\"$kde_toolbardir\" \ - kde_wallpaperdir=\"$kde_wallpaperdir\" \ - kde_templatesdir=\"$kde_templatesdir\" \ - kde_bindir=\"$kde_bindir\" \ - kde_servicesdir=\"$kde_servicesdir\" \ - kde_servicetypesdir=\"$kde_servicetypesdir\" \ - kde_moduledir=\"$kde_moduledir\" \ - kde_styledir=\"$kde_styledir\" \ - kde_widgetdir=\"$kde_widgetdir\" \ - xdg_appsdir=\"$xdg_appsdir\" \ - xdg_menudir=\"$xdg_menudir\" \ - xdg_directorydir=\"$xdg_directorydir\" \ - kde_result=$1" -]) - -AC_DEFUN([KDE_SET_DEFAULT_PATHS], -[ -if test "$1" = "default"; then - - if test -z "$kde_htmldir"; then - kde_htmldir='\${datadir}/doc/HTML' - fi - if test -z "$kde_appsdir"; then - kde_appsdir='\${datadir}/applnk' - fi - if test -z "$kde_icondir"; then - kde_icondir='\${datadir}/icons' - fi - if test -z "$kde_sounddir"; then - kde_sounddir='\${datadir}/sounds' - fi - if test -z "$kde_datadir"; then - kde_datadir='\${datadir}/apps' - fi - if test -z "$kde_locale"; then - kde_locale='\${datadir}/locale' - fi - if test -z "$kde_cgidir"; then - kde_cgidir='\${exec_prefix}/cgi-bin' - fi - if test -z "$kde_confdir"; then - kde_confdir='\${datadir}/config' - fi - if test -z "$kde_kcfgdir"; then - kde_kcfgdir='\${datadir}/config.kcfg' - fi - if test -z "$kde_mimedir"; then - kde_mimedir='\${datadir}/mimelnk' - fi - if test -z "$kde_toolbardir"; then - kde_toolbardir='\${datadir}/toolbar' - fi - if test -z "$kde_wallpaperdir"; then - kde_wallpaperdir='\${datadir}/wallpapers' - fi - if test -z "$kde_templatesdir"; then - kde_templatesdir='\${datadir}/templates' - fi - if test -z "$kde_bindir"; then - kde_bindir='\${exec_prefix}/bin' - fi - if test -z "$kde_servicesdir"; then - kde_servicesdir='\${datadir}/services' - fi - if test -z "$kde_servicetypesdir"; then - kde_servicetypesdir='\${datadir}/servicetypes' - fi - if test -z "$kde_moduledir"; then - if test "$kde_qtver" = "2"; then - kde_moduledir='\${libdir}/kde2' - else - kde_moduledir='\${libdir}/kde3' - fi - fi - if test -z "$kde_styledir"; then - kde_styledir='\${libdir}/kde3/plugins/styles' - fi - if test -z "$kde_widgetdir"; then - kde_widgetdir='\${libdir}/kde3/plugins/designer' - fi - if test -z "$xdg_appsdir"; then - xdg_appsdir='\${datadir}/applications/kde' - fi - if test -z "$xdg_menudir"; then - xdg_menudir='\${sysconfdir}/xdg/menus' - fi - if test -z "$xdg_directorydir"; then - xdg_directorydir='\${datadir}/desktop-directories' - fi - - KDE_SET_PATHS(defaults) - -else - - if test $kde_qtver = 1; then - AC_MSG_RESULT([compiling]) - KDE_1_CHECK_PATHS - else - AC_MSG_ERROR([path checking not yet supported for KDE 2]) - fi - -fi -]) - -AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS], -[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || - test -z "$kde_icondir" || test -z "$kde_sounddir" || - test -z "$kde_datadir" || test -z "$kde_locale" || - test -z "$kde_cgidir" || test -z "$kde_confdir" || - test -z "$kde_kcfgdir" || - test -z "$kde_mimedir" || test -z "$kde_toolbardir" || - test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || - test -z "$kde_bindir" || test -z "$kde_servicesdir" || - test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || - test -z "$kde_styledir" || test -z "kde_widgetdir" || - test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" || - test "x$kde_have_all_paths" != "xyes"; then - kde_have_all_paths=no - fi -]) - -AC_DEFUN([KDE_MISSING_PROG_ERROR], -[ - AC_MSG_ERROR([The important program $1 was not found! -Please check whether you installed KDE correctly. -]) -]) - -AC_DEFUN([KDE_MISSING_ARTS_ERROR], -[ - AC_MSG_ERROR([The important program $1 was not found! -Please check whether you installed aRts correctly or use ---without-arts to compile without aRts support (this will remove functionality). -]) -]) - -AC_DEFUN([KDE_SET_DEFAULT_BINDIRS], -[ - kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" - test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" - if test -n "$KDEDIRS"; then - kde_save_IFS=$IFS - IFS=: - for dir in $KDEDIRS; do - kde_default_bindirs="$dir/bin $kde_default_bindirs " - done - IFS=$kde_save_IFS - fi -]) - -AC_DEFUN([KDE_SUBST_PROGRAMS], -[ - AC_ARG_WITH(arts, - AC_HELP_STRING([--without-arts],[build without aRts [default=no]]), - [build_arts=$withval], - [build_arts=yes] - ) - AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no") - if test "$build_arts" = "no"; then - AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts]) - fi - - KDE_SET_DEFAULT_BINDIRS - kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs" - KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) - KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) - if test "$build_arts" '!=' "no"; then - KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) - KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) - fi - KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) - - kde32ornewer=1 - kde33ornewer=1 - if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then - kde32ornewer= - kde33ornewer= - else - if test "$kde_qtver" = "3"; then - if test "$kde_qtsubver" -le 1; then - kde32ornewer= - fi - if test "$kde_qtsubver" -le 2; then - kde33ornewer= - fi - if test "$KDECONFIG" != "compiled"; then - if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then - kde33ornewer= - fi - fi - fi - fi - - if test -n "$kde32ornewer"; then - KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)]) - KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) - fi - if test -n "$kde33ornewer"; then - KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) - AC_SUBST(MAKEKDEWIDGETS) - fi - KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) - - if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then - kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" - test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" - AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) - if test "$KDE_XSL_STYLESHEET" = "NO"; then - KDE_XSL_STYLESHEET="" - else - KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" - fi - fi - - DCOP_DEPENDENCIES='$(DCOPIDL)' - if test -n "$kde32ornewer"; then - KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)' - DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)' - AC_SUBST(KCONFIG_COMPILER) - AC_SUBST(KCFG_DEPENDENCIES) - AC_SUBST(DCOPIDLNG) - fi - AC_SUBST(DCOPIDL) - AC_SUBST(DCOPIDL2CPP) - AC_SUBST(DCOP_DEPENDENCIES) - AC_SUBST(MCOPIDL) - AC_SUBST(ARTSCCONFIG) - AC_SUBST(MEINPROC) - AC_SUBST(KDE_XSL_STYLESHEET) - AC_SUBST(XMLLINT) -])dnl - -AC_DEFUN([AC_CREATE_KFSSTND], -[ -AC_REQUIRE([AC_CHECK_RPATH]) - -AC_MSG_CHECKING([for KDE paths]) -kde_result="" -kde_cached_paths=yes -AC_CACHE_VAL(kde_cv_all_paths, -[ - KDE_SET_DEFAULT_PATHS($1) - kde_cached_paths=no -]) -eval "$kde_cv_all_paths" -KDE_CHECK_PATHS_FOR_COMPLETENESS -if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then - # wrong values were cached, may be, we can set better ones - kde_result= - kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= - kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir= - kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= - kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= - kde_have_all_paths= - kde_styledir= - kde_widgetdir= - xdg_appsdir = xdg_menudir= xdg_directorydir= - KDE_SET_DEFAULT_PATHS($1) - eval "$kde_cv_all_paths" - KDE_CHECK_PATHS_FOR_COMPLETENESS - kde_result="$kde_result (cache overridden)" -fi -if test "$kde_have_all_paths" = "no"; then - AC_MSG_ERROR([configure could not run a little KDE program to test the environment. -Since it had compiled and linked before, it must be a strange problem on your system. -Look at config.log for details. If you are not able to fix this, look at -http://www.kde.org/faq/installation.html or any www.kde.org mirror. -(If you're using an egcs version on Linux, you may update binutils!) -]) -else - rm -f conftest* - AC_MSG_RESULT($kde_result) -fi - -bindir=$kde_bindir - -KDE_SUBST_PROGRAMS - -]) - -AC_DEFUN([AC_SUBST_KFSSTND], -[ -AC_SUBST(kde_htmldir) -AC_SUBST(kde_appsdir) -AC_SUBST(kde_icondir) -AC_SUBST(kde_sounddir) -AC_SUBST(kde_datadir) -AC_SUBST(kde_locale) -AC_SUBST(kde_confdir) -AC_SUBST(kde_kcfgdir) -AC_SUBST(kde_mimedir) -AC_SUBST(kde_wallpaperdir) -AC_SUBST(kde_bindir) -dnl X Desktop Group standards -AC_SUBST(xdg_appsdir) -AC_SUBST(xdg_menudir) -AC_SUBST(xdg_directorydir) -dnl for KDE 2 -AC_SUBST(kde_templatesdir) -AC_SUBST(kde_servicesdir) -AC_SUBST(kde_servicetypesdir) -AC_SUBST(kde_moduledir) -AC_SUBST(kdeinitdir, '$(kde_moduledir)') -AC_SUBST(kde_styledir) -AC_SUBST(kde_widgetdir) -if test "$kde_qtver" = 1; then - kde_minidir="$kde_icondir/mini" -else -# for KDE 1 - this breaks KDE2 apps using minidir, but -# that's the plan ;-/ - kde_minidir="/dev/null" -fi -dnl AC_SUBST(kde_minidir) -dnl AC_SUBST(kde_cgidir) -dnl AC_SUBST(kde_toolbardir) -]) - -AC_DEFUN([KDE_MISC_TESTS], -[ - dnl Checks for libraries. - AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD - AC_SUBST(LIBUTIL) - AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD - AC_SUBST(LIBCOMPAT) - kde_have_crypt= - AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], - AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ - AC_MSG_WARN([you have no crypt in either libcrypt or libc. -You should install libcrypt from another source or configure with PAM -support]) - kde_have_crypt=no - ])) - AC_SUBST(LIBCRYPT) - if test $kde_have_crypt = yes; then - AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) - fi - AC_CHECK_SOCKLEN_T - AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) - if test $ac_cv_lib_dnet_dnet_ntoa = no; then - AC_CHECK_LIB(dnet_stub, dnet_ntoa, - [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) - fi - AC_CHECK_FUNC(inet_ntoa) - if test $ac_cv_func_inet_ntoa = no; then - AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") - fi - AC_CHECK_FUNC(connect) - if test $ac_cv_func_connect = no; then - AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , - $X_EXTRA_LIBS) - fi - - AC_CHECK_FUNC(remove) - if test $ac_cv_func_remove = no; then - AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") - fi - - # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. - AC_CHECK_FUNC(shmat, , - AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) - - # more headers that need to be explicitly included on darwin - AC_CHECK_HEADERS(sys/types.h stdint.h) - - # sys/bitypes.h is needed for uint32_t and friends on Tru64 - AC_CHECK_HEADERS(sys/bitypes.h) - - # darwin requires a poll emulation library - AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") - - # for some image handling on Mac OS X - AC_CHECK_HEADERS(Carbon/Carbon.h) - - # CoreAudio framework - AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ - AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) - FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio" - ]) - - AC_CHECK_RES_INIT - AC_SUBST(LIB_POLL) - AC_SUBST(FRAMEWORK_COREAUDIO) - LIBSOCKET="$X_EXTRA_LIBS" - AC_SUBST(LIBSOCKET) - AC_SUBST(X_EXTRA_LIBS) - AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 - AC_SUBST(LIBUCB) - - case $host in dnl this *is* LynxOS specific - *-*-lynxos* ) - AC_MSG_CHECKING([LynxOS header file wrappers]) - [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] - AC_MSG_RESULT(disabled) - AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS - ;; - esac - - KDE_CHECK_TYPES - KDE_CHECK_LIBDL - KDE_CHECK_STRLCPY - KDE_CHECK_PIE_SUPPORT - -# darwin needs this to initialize the environment -AC_CHECK_HEADERS(crt_externs.h) -AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) - -AH_VERBATIM(_DARWIN_ENVIRON, -[ -#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) -# include -# include -# define environ (*_NSGetEnviron()) -#endif -]) - -AH_VERBATIM(_AIX_STRINGS_H_BZERO, -[ -/* - * AIX defines FD_SET in terms of bzero, but fails to include - * that defines bzero. - */ - -#if defined(_AIX) -#include -#endif -]) - -AC_CHECK_FUNCS([vsnprintf snprintf]) - -AH_VERBATIM(_TRU64,[ -/* - * On HP-UX, the declaration of vsnprintf() is needed every time ! - */ - -#if !defined(HAVE_VSNPRINTF) || defined(hpux) -#if __STDC__ -#include -#include -#else -#include -#endif -#ifdef __cplusplus -extern "C" -#endif -int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); -#ifdef __cplusplus -extern "C" -#endif -int snprintf(char *str, size_t n, char const *fmt, ...); -#endif -]) - -]) - -dnl ------------------------------------------------------------------------ -dnl Find the header files and libraries for X-Windows. Extended the -dnl macro AC_PATH_X -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([K_PATH_X], -[ -AC_REQUIRE([KDE_MISC_TESTS])dnl -AC_REQUIRE([KDE_CHECK_LIB64]) - -AC_ARG_ENABLE( - embedded, - AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]), - kde_use_qt_emb=$enableval, - kde_use_qt_emb=no -) - -AC_ARG_ENABLE( - qtopia, - AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]), - kde_use_qt_emb_palm=$enableval, - kde_use_qt_emb_palm=no -) - -AC_ARG_ENABLE( - mac, - AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]), - kde_use_qt_mac=$enableval, - kde_use_qt_mac=no -) - -# used to disable x11-specific stuff on special platforms -AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no") - -if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then - -AC_MSG_CHECKING(for X) - -AC_CACHE_VAL(kde_cv_have_x, -[# One or both of the vars are not set, and there is no cached value. -if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then - kde_x_includes=NO -else - kde_x_includes=$x_includes -fi -if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then - kde_x_libraries=NO -else - kde_x_libraries=$x_libraries -fi - -# below we use the standard autoconf calls -ac_x_libraries=$kde_x_libraries -ac_x_includes=$kde_x_includes - -KDE_PATH_X_DIRECT -dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. -dnl Unfortunately, if compiling with the N32 ABI, this is not the correct -dnl location. The correct location is /usr/lib32 or an undefined value -dnl (the linker is smart enough to pick the correct default library). -dnl Things work just fine if you use just AC_PATH_X_DIRECT. -dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to -dnl /usr/openwin/include, which doesn't work. /usr/include does work, so -dnl x_includes should be left alone. -case "$host" in -mips-sgi-irix6*) - ;; -*-*-solaris*) - ;; -*) - _AC_PATH_X_XMKMF - if test -z "$ac_x_includes"; then - ac_x_includes="." - fi - if test -z "$ac_x_libraries"; then - ac_x_libraries="/usr/lib${kdelibsuff}" - fi -esac -#from now on we use our own again - -# when the user already gave --x-includes, we ignore -# what the standard autoconf macros told us. -if test "$kde_x_includes" = NO; then - kde_x_includes=$ac_x_includes -fi - -# for --x-libraries too -if test "$kde_x_libraries" = NO; then - kde_x_libraries=$ac_x_libraries -fi - -if test "$kde_x_includes" = NO; then - AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) -fi - -if test "$kde_x_libraries" = NO; then - AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) -fi - -# Record where we found X for the cache. -kde_cv_have_x="have_x=yes \ - kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" -])dnl - -eval "$kde_cv_have_x" - -if test "$have_x" != yes; then - AC_MSG_RESULT($have_x) - no_x=yes -else - AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) -fi - -if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then - X_INCLUDES="" - x_includes="."; dnl better than nothing :- - else - x_includes=$kde_x_includes - X_INCLUDES="-I$x_includes" -fi - -if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE || test "$kde_x_libraries" = "/usr/lib"; then - X_LDFLAGS="" - x_libraries="/usr/lib"; dnl better than nothing :- - else - x_libraries=$kde_x_libraries - X_LDFLAGS="-L$x_libraries" -fi -all_includes="$X_INCLUDES" -all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS" - -# Check for libraries that X11R6 Xt/Xaw programs need. -ac_save_LDFLAGS="$LDFLAGS" -LDFLAGS="$LDFLAGS $X_LDFLAGS" -# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to -# check for ICE first), but we must link in the order -lSM -lICE or -# we get undefined symbols. So assume we have SM if we have ICE. -# These have to be linked with before -lX11, unlike the other -# libraries we check for below, so use a different variable. -# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. -AC_CHECK_LIB(ICE, IceConnectionNumber, - [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) -LDFLAGS="$ac_save_LDFLAGS" - -LIB_X11='-lX11 $(LIBSOCKET)' - -AC_MSG_CHECKING(for libXext) -AC_CACHE_VAL(kde_cv_have_libXext, -[ -kde_ldflags_safe="$LDFLAGS" -kde_libs_safe="$LIBS" - -LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" -LIBS="-lXext -lX11 $LIBSOCKET" - -AC_TRY_LINK([ -#include -#ifdef STDC_HEADERS -# include -#endif -], -[ -printf("hello Xext\n"); -], -kde_cv_have_libXext=yes, -kde_cv_have_libXext=no -) - -LDFLAGS=$kde_ldflags_safe -LIBS=$kde_libs_safe -]) - -AC_MSG_RESULT($kde_cv_have_libXext) - -if test "$kde_cv_have_libXext" = "no"; then - AC_MSG_ERROR([We need a working libXext to proceed. Since configure -can't find it itself, we stop here assuming that make wouldn't find -them either.]) -fi - -LIB_XEXT="-lXext" -QTE_NORTTI="" - -elif test "$kde_use_qt_emb" = "yes"; then - dnl We're using QT Embedded - CPPFLAGS=-DQWS - CXXFLAGS="$CXXFLAGS -fno-rtti" - QTE_NORTTI="-fno-rtti -DQWS" - X_PRE_LIBS="" - LIB_X11="" - LIB_XEXT="" - LIB_XRENDER="" - LIBSM="" - X_INCLUDES="" - X_LDFLAGS="" - x_includes="" - x_libraries="" -elif test "$kde_use_qt_mac" = "yes"; then - dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to - dnl be included to get the information) --Sam - CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp" - CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp" - X_PRE_LIBS="" - LIB_X11="" - LIB_XEXT="" - LIB_XRENDER="" - LIBSM="" - X_INCLUDES="" - X_LDFLAGS="" - x_includes="" - x_libraries="" -fi -AC_SUBST(X_PRE_LIBS) -AC_SUBST(LIB_X11) -AC_SUBST(LIB_XRENDER) -AC_SUBST(LIBSM) -AC_SUBST(X_INCLUDES) -AC_SUBST(X_LDFLAGS) -AC_SUBST(x_includes) -AC_SUBST(x_libraries) -AC_SUBST(QTE_NORTTI) -AC_SUBST(LIB_XEXT) - -]) - -AC_DEFUN([KDE_PRINT_QT_PROGRAM], -[ -AC_REQUIRE([KDE_USE_QT]) -cat > conftest.$ac_ext < -#include -EOF -if test "$kde_qtver" = "2"; then -cat >> conftest.$ac_ext < -#include -#include -EOF - -if test $kde_qtsubver -gt 0; then -cat >> conftest.$ac_ext <> conftest.$ac_ext < -#include -#include -EOF -fi - -echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext -cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC -fi - -rm -f conftest* -CXXFLAGS="$ac_cxxflags_safe" -LDFLAGS="$ac_ldflags_safe" -LIBS="$ac_libs_safe" - -LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" -export LD_LIBRARY_PATH -LIBRARY_PATH="$ac_LIBRARY_PATH" -export LIBRARY_PATH -AC_LANG_RESTORE -]) - -if test "$kde_cv_qt_direct" = "yes"; then - AC_MSG_RESULT(yes) - $1 -else - AC_MSG_RESULT(no) - $2 -fi -]) - -dnl ------------------------------------------------------------------------ -dnl Try to find the Qt headers and libraries. -dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) -dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_PATH_QT_1_3], -[ -AC_REQUIRE([K_PATH_X]) -AC_REQUIRE([KDE_USE_QT]) -AC_REQUIRE([KDE_CHECK_LIB64]) - -dnl ------------------------------------------------------------------------ -dnl Add configure flag to enable linking to MT version of Qt library. -dnl ------------------------------------------------------------------------ - -AC_ARG_ENABLE( - mt, - AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]), - kde_use_qt_mt=$enableval, - [ - if test $kde_qtver = 3; then - kde_use_qt_mt=yes - else - kde_use_qt_mt=no - fi - ] -) - -USING_QT_MT="" - -dnl ------------------------------------------------------------------------ -dnl If we not get --disable-qt-mt then adjust some vars for the host. -dnl ------------------------------------------------------------------------ - -KDE_MT_LDFLAGS= -KDE_MT_LIBS= -if test "x$kde_use_qt_mt" = "xyes"; then - KDE_CHECK_THREADING - if test "x$kde_use_threading" = "xyes"; then - CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" - KDE_MT_LDFLAGS="$USE_THREADS" - KDE_MT_LIBS="$LIBPTHREAD" - else - kde_use_qt_mt=no - fi -fi -AC_SUBST(KDE_MT_LDFLAGS) -AC_SUBST(KDE_MT_LIBS) - -kde_qt_was_given=yes - -dnl ------------------------------------------------------------------------ -dnl If we haven't been told how to link to Qt, we work it out for ourselves. -dnl ------------------------------------------------------------------------ -if test -z "$LIBQT_GLOB"; then - if test "x$kde_use_qt_emb" = "xyes"; then - LIBQT_GLOB="libqte.*" - else - LIBQT_GLOB="libqt.*" - fi -fi - -dnl ------------------------------------------------------------ -dnl If we got --enable-embedded then adjust the Qt library name. -dnl ------------------------------------------------------------ -if test "x$kde_use_qt_emb" = "xyes"; then - qtlib="qte" -else - qtlib="qt" -fi - -kde_int_qt="-l$qtlib" - -if test -z "$LIBQPE"; then -dnl ------------------------------------------------------------ -dnl If we got --enable-palmtop then add -lqpe to the link line -dnl ------------------------------------------------------------ - if test "x$kde_use_qt_emb" = "xyes"; then - if test "x$kde_use_qt_emb_palm" = "xyes"; then - LIB_QPE="-lqpe" - else - LIB_QPE="" - fi - else - LIB_QPE="" - fi -fi - -dnl ------------------------------------------------------------------------ -dnl If we got --enable-qt-mt then adjust the Qt library name for the host. -dnl ------------------------------------------------------------------------ - -if test "x$kde_use_qt_mt" = "xyes"; then - LIBQT="-l$qtlib-mt" - kde_int_qt="-l$qtlib-mt" - LIBQT_GLOB="lib$qtlib-mt.*" - USING_QT_MT="using -mt" -else - LIBQT="-l$qtlib" -fi - -if test $kde_qtver != 1; then - - AC_REQUIRE([AC_FIND_PNG]) - AC_REQUIRE([AC_FIND_JPEG]) - LIBQT="$LIBQT $LIBPNG $LIBJPEG" -fi - -if test $kde_qtver = 3; then - AC_REQUIRE([KDE_CHECK_LIBDL]) - LIBQT="$LIBQT $LIBDL" -fi - -AC_MSG_CHECKING([for Qt]) - -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" -fi -ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO -qt_libraries="" -qt_includes="" -AC_ARG_WITH(qt-dir, - AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]), - [ ac_qt_includes="$withval"/include - ac_qt_libraries="$withval"/lib${kdelibsuff} - ac_qt_bindir="$withval"/bin - ]) - -AC_ARG_WITH(qt-includes, - AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]), - [ - ac_qt_includes="$withval" - ]) - -kde_qt_libs_given=no - -AC_ARG_WITH(qt-libraries, - AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]), - [ ac_qt_libraries="$withval" - kde_qt_libs_given=yes - ]) - -AC_CACHE_VAL(ac_cv_have_qt, -[#try to guess Qt locations - -qt_incdirs="" -for dir in $kde_qt_dirs; do - qt_incdirs="$qt_incdirs $dir/include $dir" -done -qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes" -if test ! "$ac_qt_includes" = "NO"; then - qt_incdirs="$ac_qt_includes $qt_incdirs" -fi - -if test "$kde_qtver" != "1"; then - kde_qt_header=qstyle.h -else - kde_qt_header=qglobal.h -fi - -AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) -ac_qt_includes="$qt_incdir" - -qt_libdirs="" -for dir in $kde_qt_dirs; do - qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" -done -qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" -if test ! "$ac_qt_libraries" = "NO"; then - qt_libdir=$ac_qt_libraries -else - qt_libdirs="$ac_qt_libraries $qt_libdirs" - # if the Qt was given, the chance is too big that libqt.* doesn't exist - qt_libdir=NONE - for dir in $qt_libdirs; do - try="ls -1 $dir/${LIBQT_GLOB}" - if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi - done -fi -for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do - if test -e "$a"; then - LIBQT="$LIBQT ${kde_int_qt}_incremental" - break - fi -done - -ac_qt_libraries="$qt_libdir" - -AC_LANG_SAVE -AC_LANG_CPLUSPLUS - -ac_cxxflags_safe="$CXXFLAGS" -ac_ldflags_safe="$LDFLAGS" -ac_libs_safe="$LIBS" - -CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" -LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" -LIBS="$LIBS $LIBQT $KDE_MT_LIBS" - -KDE_PRINT_QT_PROGRAM - -if AC_TRY_EVAL(ac_link) && test -s conftest; then - rm -f conftest* -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC - ac_qt_libraries="NO" -fi -rm -f conftest* -CXXFLAGS="$ac_cxxflags_safe" -LDFLAGS="$ac_ldflags_safe" -LIBS="$ac_libs_safe" - -AC_LANG_RESTORE -if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then - ac_cv_have_qt="have_qt=no" - ac_qt_notfound="" - missing_qt_mt="" - if test "$ac_qt_includes" = NO; then - if test "$ac_qt_libraries" = NO; then - ac_qt_notfound="(headers and libraries)"; - else - ac_qt_notfound="(headers)"; - fi - else - if test "x$kde_use_qt_mt" = "xyes"; then - missing_qt_mt=" -Make sure that you have compiled Qt with thread support!" - ac_qt_notfound="(library $qtlib-mt)"; - else - ac_qt_notfound="(library $qtlib)"; - fi - fi - - AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! -For more details about this problem, look at the end of config.log.$missing_qt_mt]) -else - have_qt="yes" -fi -]) - -eval "$ac_cv_have_qt" - -if test "$have_qt" != yes; then - AC_MSG_RESULT([$have_qt]); -else - ac_cv_have_qt="have_qt=yes \ - ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" - AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) - - qt_libraries="$ac_qt_libraries" - qt_includes="$ac_qt_includes" -fi - -if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then - KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) -fi - -AC_SUBST(qt_libraries) -AC_SUBST(qt_includes) - -if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then - QT_INCLUDES="" -else - QT_INCLUDES="-I$qt_includes" - all_includes="$QT_INCLUDES $all_includes" -fi - -if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then - QT_LDFLAGS="" -else - QT_LDFLAGS="-L$qt_libraries" - all_libraries="$QT_LDFLAGS $all_libraries" -fi -test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" - -AC_SUBST(QT_INCLUDES) -AC_SUBST(QT_LDFLAGS) -AC_PATH_QT_MOC_UIC - -KDE_CHECK_QT_JPEG - -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' -else -LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)' -fi -test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" -for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do - if test -e "$a"; then - LIB_QT="$LIB_QT ${kde_int_qt}_incremental" - break - fi -done - -AC_SUBST(LIB_QT) -AC_SUBST(LIB_QPE) - -AC_SUBST(kde_qtver) -]) - -AC_DEFUN([AC_PATH_QT], -[ -AC_PATH_QT_1_3 -]) - -AC_DEFUN([KDE_CHECK_UIC_PLUGINS], -[ -AC_REQUIRE([AC_PATH_QT_MOC_UIC]) - -if test x$ac_uic_supports_libpath = xyes; then - -AC_MSG_CHECKING([if UIC has KDE plugins available]) -AC_CACHE_VAL(kde_cv_uic_plugins, -[ -cat > actest.ui << EOF - -NewConnectionDialog - - - - testInput - - - - -EOF - - - -kde_cv_uic_plugins=no -kde_line="$UIC_PATH -L $kde_widgetdir" -if test x$ac_uic_supports_nounload = xyes; then - kde_line="$kde_line -nounload" -fi -kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" -if AC_TRY_EVAL(kde_line); then - # if you're trying to debug this check and think it's incorrect, - # better check your installation. The check _is_ correct - your - # installation is not. - if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then - kde_cv_uic_plugins=yes - fi -fi -rm -f actest.ui actest.cpp -]) - -AC_MSG_RESULT([$kde_cv_uic_plugins]) -if test "$kde_cv_uic_plugins" != yes; then - AC_MSG_ERROR([ -you need to install kdelibs first. - -If you did install kdelibs, then the Qt version that is picked up by -this configure is not the same version you used to compile kdelibs. -The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the -_same Qt version_, compiled with the _same compiler_ and the same Qt -configuration settings. -]) -fi -fi -]) - -AC_DEFUN([KDE_CHECK_FINAL], -[ - AC_ARG_ENABLE(final, - AC_HELP_STRING([--enable-final], - [build size optimized apps (experimental - needs lots of memory)]), - kde_use_final=$enableval, kde_use_final=no) - - if test "x$kde_use_final" = "xyes"; then - KDE_USE_FINAL_TRUE="" - KDE_USE_FINAL_FALSE="#" - else - KDE_USE_FINAL_TRUE="#" - KDE_USE_FINAL_FALSE="" - fi - AC_SUBST(KDE_USE_FINAL_TRUE) - AC_SUBST(KDE_USE_FINAL_FALSE) -]) - -AC_DEFUN([KDE_CHECK_CLOSURE], -[ - AC_ARG_ENABLE(closure, - AC_HELP_STRING([--enable-closure],[delay template instantiation]), - kde_use_closure=$enableval, kde_use_closure=no) - - KDE_NO_UNDEFINED="" - if test "x$kde_use_closure" = "xyes"; then - KDE_USE_CLOSURE_TRUE="" - KDE_USE_CLOSURE_FALSE="#" -# CXXFLAGS="$CXXFLAGS $REPO" - else - KDE_USE_CLOSURE_TRUE="#" - KDE_USE_CLOSURE_FALSE="" - KDE_NO_UNDEFINED="" - case $host in - *-*-linux-gnu) - KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined], - [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined], - [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"], - [KDE_NO_UNDEFINED=""])], - [KDE_NO_UNDEFINED=""]) - ;; - esac - fi - AC_SUBST(KDE_USE_CLOSURE_TRUE) - AC_SUBST(KDE_USE_CLOSURE_FALSE) - AC_SUBST(KDE_NO_UNDEFINED) -]) - -dnl Check if the linker supports --enable-new-dtags and --as-needed -AC_DEFUN([KDE_CHECK_NEW_LDFLAGS], -[ - AC_ARG_ENABLE(new_ldflags, - AC_HELP_STRING([--enable-new-ldflags], - [enable the new linker flags]), - kde_use_new_ldflags=$enableval, - kde_use_new_ldflags=no) - - LDFLAGS_AS_NEEDED="" - LDFLAGS_NEW_DTAGS="" - if test "x$kde_use_new_ldflags" = "xyes"; then - LDFLAGS_NEW_DTAGS="" - KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags], - [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],) - - KDE_CHECK_COMPILER_FLAG([Wl,--as-needed], - [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],) - fi - AC_SUBST(LDFLAGS_AS_NEEDED) - AC_SUBST(LDFLAGS_NEW_DTAGS) -]) - -AC_DEFUN([KDE_CHECK_NMCHECK], -[ - AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]), - kde_use_nmcheck=$enableval, kde_use_nmcheck=no) - - if test "$kde_use_nmcheck" = "yes"; then - KDE_USE_NMCHECK_TRUE="" - KDE_USE_NMCHECK_FALSE="#" - else - KDE_USE_NMCHECK_TRUE="#" - KDE_USE_NMCHECK_FALSE="" - fi - AC_SUBST(KDE_USE_NMCHECK_TRUE) - AC_SUBST(KDE_USE_NMCHECK_FALSE) -]) - -AC_DEFUN([KDE_EXPAND_MAKEVAR], [ -savex=$exec_prefix -test "x$exec_prefix" = xNONE && exec_prefix=$prefix -tmp=$$2 -while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done -exec_prefix=$savex -]) - -dnl ------------------------------------------------------------------------ -dnl Now, the same with KDE -dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) -dnl and $(kde_includes) will be the kdehdrlocation (if needed) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_BASE_PATH_KDE], -[ -AC_REQUIRE([KDE_CHECK_STL]) -AC_REQUIRE([AC_PATH_QT])dnl -AC_REQUIRE([KDE_CHECK_LIB64]) - -AC_CHECK_RPATH -AC_MSG_CHECKING([for KDE]) - -if test "${prefix}" != NONE; then - kde_includes=${includedir} - KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir) - - kde_libraries=${libdir} - KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir) - -else - ac_kde_includes= - ac_kde_libraries= - kde_libraries="" - kde_includes="" -fi - -AC_CACHE_VAL(ac_cv_have_kde, -[#try to guess kde locations - -if test "$kde_qtver" = 1; then - kde_check_header="ksock.h" - kde_check_lib="libkdecore.la" -else - kde_check_header="ksharedptr.h" - kde_check_lib="libkio.la" -fi - -if test -z "$1"; then - -kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" -test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" -kde_incdirs="$ac_kde_includes $kde_incdirs" -AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) -ac_kde_includes="$kde_incdir" - -if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then - AC_MSG_ERROR([ -in the prefix, you've chosen, are no KDE headers installed. This will fail. -So, check this please and use another prefix!]) -fi - -kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" -test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" -kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" -AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) -ac_kde_libraries="$kde_libdir" - -kde_widgetdir=NO -dnl this might be somewhere else -AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) - -if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then -AC_MSG_ERROR([ -in the prefix, you've chosen, are no KDE libraries installed. This will fail. -So, check this please and use another prefix!]) -fi - -if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then -AC_MSG_ERROR([ -I can't find the designer plugins. These are required and should have been installed -by kdelibs]) -fi - -if test -n "$kde_widgetdir"; then - kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" -fi - - -if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then - ac_cv_have_kde="have_kde=no" -else - ac_cv_have_kde="have_kde=yes \ - ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" -fi - -else dnl test -z $1, e.g. from kdelibs - - ac_cv_have_kde="have_kde=no" - -fi -])dnl - -eval "$ac_cv_have_kde" - -if test "$have_kde" != "yes"; then - if test "${prefix}" = NONE; then - ac_kde_prefix="$ac_default_prefix" - else - ac_kde_prefix="$prefix" - fi - if test "$exec_prefix" = NONE; then - ac_kde_exec_prefix="$ac_kde_prefix" - AC_MSG_RESULT([will be installed in $ac_kde_prefix]) - else - ac_kde_exec_prefix="$exec_prefix" - AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) - fi - - kde_libraries="${libdir}" - kde_includes="${includedir}" - -else - ac_cv_have_kde="have_kde=yes \ - ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" - AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) - - kde_libraries="$ac_kde_libraries" - kde_includes="$ac_kde_includes" -fi -AC_SUBST(kde_libraries) -AC_SUBST(kde_includes) - -if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then - KDE_INCLUDES="" -else - KDE_INCLUDES="-I$kde_includes" - all_includes="$KDE_INCLUDES $all_includes" -fi - -KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION" - -KDE_LDFLAGS="-L$kde_libraries" -if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then - all_libraries="$KDE_LDFLAGS $all_libraries" -fi - -AC_SUBST(KDE_LDFLAGS) -AC_SUBST(KDE_INCLUDES) - -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - -all_libraries="$all_libraries $USER_LDFLAGS" -all_includes="$all_includes $USER_INCLUDES" -AC_SUBST(all_includes) -AC_SUBST(all_libraries) - -if test -z "$1"; then -KDE_CHECK_UIC_PLUGINS -fi - -ac_kde_libraries="$kde_libdir" - -AC_SUBST(AUTODIRS) - - -]) - -AC_DEFUN([KDE_CHECK_EXTRA_LIBS], -[ -AC_MSG_CHECKING(for extra includes) -AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]), - kde_use_extra_includes="$withval", - kde_use_extra_includes=NONE -) -kde_extra_includes= -if test -n "$kde_use_extra_includes" && \ - test "$kde_use_extra_includes" != "NONE"; then - - ac_save_ifs=$IFS - IFS=':' - for dir in $kde_use_extra_includes; do - kde_extra_includes="$kde_extra_includes $dir" - USER_INCLUDES="$USER_INCLUDES -I$dir" - done - IFS=$ac_save_ifs - kde_use_extra_includes="added" -else - kde_use_extra_includes="no" -fi -AC_SUBST(USER_INCLUDES) - -AC_MSG_RESULT($kde_use_extra_includes) - -kde_extra_libs= -AC_MSG_CHECKING(for extra libs) -AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]), - kde_use_extra_libs=$withval, - kde_use_extra_libs=NONE -) -if test -n "$kde_use_extra_libs" && \ - test "$kde_use_extra_libs" != "NONE"; then - - ac_save_ifs=$IFS - IFS=':' - for dir in $kde_use_extra_libs; do - kde_extra_libs="$kde_extra_libs $dir" - KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" - USER_LDFLAGS="$USER_LDFLAGS -L$dir" - done - IFS=$ac_save_ifs - kde_use_extra_libs="added" -else - kde_use_extra_libs="no" -fi - -AC_SUBST(USER_LDFLAGS) - -AC_MSG_RESULT($kde_use_extra_libs) - -]) - -AC_DEFUN([KDE_1_CHECK_PATH_HEADERS], -[ - AC_MSG_CHECKING([for KDE headers installed]) - AC_LANG_SAVE - AC_LANG_CPLUSPLUS -cat > conftest.$ac_ext < -#endif -#include -#include "confdefs.h" -#include - -int main() { - printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); - printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); - printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); - printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); - printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); - printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); - printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); - printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); - printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); - printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); - printf("kde_wallpaperdir=\\"%s\\"\n", - KApplication::kde_wallpaperdir().data()); - printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); - printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); - printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); - printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); - printf("kde_moduledir=\\"/tmp/dummy\\"\n"); - printf("kde_styledir=\\"/tmp/dummy\\"\n"); - printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); - printf("xdg_appsdir=\\"/tmp/dummy\\"\n"); - printf("xdg_menudir=\\"/tmp/dummy\\"\n"); - printf("xdg_directorydir=\\"/tmp/dummy\\"\n"); - printf("kde_kcfgdir=\\"/tmp/dummy\\"\n"); - return 0; - } -EOF - - ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$all_includes $CPPFLAGS" - if AC_TRY_EVAL(ac_compile); then - AC_MSG_RESULT(yes) - else - AC_MSG_ERROR([your system is not able to compile a small KDE application! -Check, if you installed the KDE header files correctly. -For more details about this problem, look at the end of config.log.]) - fi - CPPFLAGS=$ac_save_CPPFLAGS - - AC_LANG_RESTORE -]) - -AC_DEFUN([KDE_CHECK_KDEQTADDON], -[ -AC_MSG_CHECKING(for kde-qt-addon) -AC_CACHE_VAL(kde_cv_have_kdeqtaddon, -[ - kde_ldflags_safe="$LDFLAGS" - kde_libs_safe="$LIBS" - kde_cxxflags_safe="$CXXFLAGS" - - LIBS="-lkde-qt-addon $LIBQT $LIBS" - CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" - LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" - - AC_TRY_LINK([ - #include - ], - [ - QDomDocument doc; - ], - kde_cv_have_kdeqtaddon=yes, - kde_cv_have_kdeqtaddon=no - ) - - LDFLAGS=$kde_ldflags_safe - LIBS=$kde_libs_safe - CXXFLAGS=$kde_cxxflags_safe -]) - -AC_MSG_RESULT($kde_cv_have_kdeqtaddon) - -if test "$kde_cv_have_kdeqtaddon" = "no"; then - AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. -It is a separate package (and CVS module) named kde-qt-addon.]) -fi -]) - -AC_DEFUN([KDE_CREATE_LIBS_ALIASES], -[ - AC_REQUIRE([KDE_MISC_TESTS]) - AC_REQUIRE([KDE_CHECK_LIBDL]) - AC_REQUIRE([K_PATH_X]) - -if test $kde_qtver = 3; then - case $host in - *cygwin*) lib_kded="-lkdeinit_kded" ;; - *) lib_kded="" ;; - esac - AC_SUBST(LIB_KDED, $lib_kded) - AC_SUBST(LIB_KDECORE, "-lkdecore") - AC_SUBST(LIB_KDEUI, "-lkdeui") - AC_SUBST(LIB_KIO, "-lkio") - AC_SUBST(LIB_KJS, "-lkjs") - AC_SUBST(LIB_SMB, "-lsmb") - AC_SUBST(LIB_KAB, "-lkab") - AC_SUBST(LIB_KABC, "-lkabc") - AC_SUBST(LIB_KHTML, "-lkhtml") - AC_SUBST(LIB_KSPELL, "-lkspell") - AC_SUBST(LIB_KPARTS, "-lkparts") - AC_SUBST(LIB_KDEPRINT, "-lkdeprint") - AC_SUBST(LIB_KUTILS, "-lkutils") - AC_SUBST(LIB_KDEPIM, "-lkdepim") - AC_SUBST(LIB_KIMPROXY, "-lkimproxy") - AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff") - AC_SUBST(LIB_KDNSSD, "-lkdnssd") - AC_SUBST(LIB_KUNITTEST, "-lkunittest") -# these are for backward compatibility - AC_SUBST(LIB_KSYCOCA, "-lkio") - AC_SUBST(LIB_KFILE, "-lkio") -elif test $kde_qtver = 2; then - AC_SUBST(LIB_KDECORE, "-lkdecore") - AC_SUBST(LIB_KDEUI, "-lkdeui") - AC_SUBST(LIB_KIO, "-lkio") - AC_SUBST(LIB_KSYCOCA, "-lksycoca") - AC_SUBST(LIB_SMB, "-lsmb") - AC_SUBST(LIB_KFILE, "-lkfile") - AC_SUBST(LIB_KAB, "-lkab") - AC_SUBST(LIB_KHTML, "-lkhtml") - AC_SUBST(LIB_KSPELL, "-lkspell") - AC_SUBST(LIB_KPARTS, "-lkparts") - AC_SUBST(LIB_KDEPRINT, "-lkdeprint") -else - AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") - AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") - AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") - AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") - AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") -fi -]) - -AC_DEFUN([AC_PATH_KDE], -[ - AC_BASE_PATH_KDE - AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]), - [ - if test "$enableval" = "no"; - then ac_use_path_checking="default" - else ac_use_path_checking="" - fi - ], - [ - if test "$kde_qtver" = 1; - then ac_use_path_checking="" - else ac_use_path_checking="default" - fi - ] - ) - - AC_CREATE_KFSSTND($ac_use_path_checking) - - AC_SUBST_KFSSTND - KDE_CREATE_LIBS_ALIASES -]) - -dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) -AC_DEFUN([KDE_CHECK_FUNC_EXT], -[ -AC_MSG_CHECKING(for $1) -AC_CACHE_VAL(kde_cv_func_$1, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -save_CXXFLAGS="$CXXFLAGS" -kde_safe_LIBS="$LIBS" -LIBS="$LIBS $X_EXTRA_LIBS" -if test "$GXX" = "yes"; then -CXXFLAGS="$CXXFLAGS -pedantic-errors" -fi -AC_TRY_COMPILE([ -$2 -], -[ -$3 -], -kde_cv_func_$1=yes, -kde_cv_func_$1=no) -CXXFLAGS="$save_CXXFLAGS" -LIBS="$kde_safe_LIBS" -AC_LANG_RESTORE -]) - -AC_MSG_RESULT($kde_cv_func_$1) - -AC_MSG_CHECKING([if $1 needs custom prototype]) -AC_CACHE_VAL(kde_cv_proto_$1, -[ -if test "x$kde_cv_func_$1" = xyes; then - kde_cv_proto_$1=no -else - case "$1" in - setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) - kde_cv_proto_$1="yes - in libkdefakes" - ;; - *) - kde_cv_proto_$1=unknown - ;; - esac -fi - -if test "x$kde_cv_proto_$1" = xunknown; then - -AC_LANG_SAVE -AC_LANG_CPLUSPLUS - kde_safe_libs=$LIBS - LIBS="$LIBS $X_EXTRA_LIBS" - AC_TRY_LINK([ -$2 - -extern "C" $4; -], -[ -$3 -], -[ kde_cv_func_$1=yes - kde_cv_proto_$1=yes ], - [kde_cv_proto_$1="$1 unavailable"] -) -LIBS=$kde_safe_libs -AC_LANG_RESTORE -fi -]) -AC_MSG_RESULT($kde_cv_proto_$1) - -if test "x$kde_cv_func_$1" = xyes; then - AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) - $6 -fi -if test "x$kde_cv_proto_$1" = xno; then - AC_DEFINE(HAVE_$5_PROTO, 1, - [Define if you have the $1 prototype]) -fi - -AH_VERBATIM([_HAVE_$5_PROTO], -[ -#if !defined(HAVE_$5_PROTO) -#ifdef __cplusplus -extern "C" { -#endif -$4; -#ifdef __cplusplus -} -#endif -#endif -]) -]) - -AC_DEFUN([AC_CHECK_SETENV], -[ - KDE_CHECK_FUNC_EXT(setenv, [ -#include -], - [setenv("VAR", "VALUE", 1);], - [int setenv (const char *, const char *, int)], - [SETENV]) -]) - -AC_DEFUN([AC_CHECK_UNSETENV], -[ - KDE_CHECK_FUNC_EXT(unsetenv, [ -#include -], - [unsetenv("VAR");], - [void unsetenv (const char *)], - [UNSETENV]) -]) - -AC_DEFUN([AC_CHECK_GETDOMAINNAME], -[ - KDE_CHECK_FUNC_EXT(getdomainname, [ -#include -#include -#include -], - [ -char buffer[200]; -getdomainname(buffer, 200); -], - [#include - int getdomainname (char *, size_t)], - [GETDOMAINNAME]) -]) - -AC_DEFUN([AC_CHECK_GETHOSTNAME], -[ - KDE_CHECK_FUNC_EXT(gethostname, [ -#include -#include -], - [ -char buffer[200]; -gethostname(buffer, 200); -], - [int gethostname (char *, unsigned int)], - [GETHOSTNAME]) -]) - -AC_DEFUN([AC_CHECK_USLEEP], -[ - KDE_CHECK_FUNC_EXT(usleep, [ -#include -], - [ -usleep(200); -], - [int usleep (unsigned int)], - [USLEEP]) -]) - - -AC_DEFUN([AC_CHECK_RANDOM], -[ - KDE_CHECK_FUNC_EXT(random, [ -#include -], - [ -random(); -], - [long int random(void)], - [RANDOM]) - - KDE_CHECK_FUNC_EXT(srandom, [ -#include -], - [ -srandom(27); -], - [void srandom(unsigned int)], - [SRANDOM]) - -]) - -AC_DEFUN([AC_CHECK_INITGROUPS], -[ - KDE_CHECK_FUNC_EXT(initgroups, [ -#include -#include -#include -], - [ -char buffer[200]; -initgroups(buffer, 27); -], - [int initgroups(const char *, gid_t)], - [INITGROUPS]) -]) - -AC_DEFUN([AC_CHECK_MKSTEMPS], -[ - KDE_CHECK_FUNC_EXT(mkstemps, [ -#include -#include -], - [ -mkstemps("/tmp/aaaXXXXXX", 6); -], - [int mkstemps(char *, int)], - [MKSTEMPS]) -]) - -AC_DEFUN([AC_CHECK_MKSTEMP], -[ - KDE_CHECK_FUNC_EXT(mkstemp, [ -#include -#include -], - [ -mkstemp("/tmp/aaaXXXXXX"); -], - [int mkstemp(char *)], - [MKSTEMP]) -]) - -AC_DEFUN([AC_CHECK_MKDTEMP], -[ - KDE_CHECK_FUNC_EXT(mkdtemp, [ -#include -#include -], - [ -mkdtemp("/tmp/aaaXXXXXX"); -], - [char *mkdtemp(char *)], - [MKDTEMP]) -]) - - -AC_DEFUN([AC_CHECK_RES_INIT], -[ - AC_MSG_CHECKING([if res_init needs -lresolv]) - kde_libs_safe="$LIBS" - LIBS="$LIBS $X_EXTRA_LIBS -lresolv" - AC_TRY_LINK( - [ -#include -#include -#include -#include - ], - [ - res_init(); - ], - [ - LIBRESOLV="-lresolv" - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) - ], - [ AC_MSG_RESULT(no) ] - ) - LIBS=$kde_libs_safe - AC_SUBST(LIBRESOLV) - - KDE_CHECK_FUNC_EXT(res_init, - [ -#include -#include -#include -#include - ], - [res_init()], - [int res_init(void)], - [RES_INIT]) -]) - -AC_DEFUN([AC_CHECK_STRLCPY], -[ - KDE_CHECK_FUNC_EXT(strlcpy, [ -#include -], -[ char buf[20]; - strlcpy(buf, "KDE function test", sizeof(buf)); -], - [unsigned long strlcpy(char*, const char*, unsigned long)], - [STRLCPY]) -]) - -AC_DEFUN([AC_CHECK_STRLCAT], -[ - KDE_CHECK_FUNC_EXT(strlcat, [ -#include -], -[ char buf[20]; - buf[0]='\0'; - strlcat(buf, "KDE function test", sizeof(buf)); -], - [unsigned long strlcat(char*, const char*, unsigned long)], - [STRLCAT]) -]) - -AC_DEFUN([AC_CHECK_RES_QUERY], -[ - KDE_CHECK_FUNC_EXT(res_query, [ -#include -#include -#include -#include -#include -], -[ -res_query(NULL, 0, 0, NULL, 0); -], - [int res_query(const char *, int, int, unsigned char *, int)], - [RES_QUERY]) -]) - -AC_DEFUN([AC_CHECK_DN_SKIPNAME], -[ - KDE_CHECK_FUNC_EXT(dn_skipname, [ -#include -#include -#include -#include -], -[ -dn_skipname (NULL, NULL); -], - [int dn_skipname (unsigned char *, unsigned char *)], - [DN_SKIPNAME]) -]) - - -AC_DEFUN([AC_FIND_GIF], - [AC_MSG_CHECKING([for giflib]) -AC_CACHE_VAL(ac_cv_lib_gif, -[ac_save_LIBS="$LIBS" -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" -else -LIBS="$all_libraries -lgif" -fi -AC_TRY_LINK(dnl -[ -#ifdef __cplusplus -extern "C" { -#endif -int GifLastError(void); -#ifdef __cplusplus -} -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -], - [return GifLastError();], - eval "ac_cv_lib_gif=yes", - eval "ac_cv_lib_gif=no") -LIBS="$ac_save_LIBS" -])dnl -if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) -else - AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) -fi -]) - -AC_DEFUN([KDE_FIND_JPEG_HELPER], -[ -AC_MSG_CHECKING([for libjpeg$2]) -AC_CACHE_VAL(ac_cv_lib_jpeg_$1, -[ -ac_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" -ac_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK( -[ -#ifdef __cplusplus -extern "C" { -#endif -void jpeg_CreateDecompress(); -#ifdef __cplusplus -} -#endif -], -[jpeg_CreateDecompress();], - eval "ac_cv_lib_jpeg_$1=-ljpeg$2", - eval "ac_cv_lib_jpeg_$1=no") -LIBS="$ac_save_LIBS" -CFLAGS="$ac_save_CFLAGS" -]) - -if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then - LIBJPEG="$ac_cv_lib_jpeg_$1" - AC_MSG_RESULT($ac_cv_lib_jpeg_$1) -else - AC_MSG_RESULT(no) - $3 -fi - -]) - -AC_DEFUN([AC_FIND_JPEG], -[ -dnl first look for libraries -KDE_FIND_JPEG_HELPER(6b, 6b, - KDE_FIND_JPEG_HELPER(normal, [], - [ - LIBJPEG= - ] - ) -) - -dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h -dnl requires system dependent includes loaded before it) -jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" -AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) -test "x$jpeg_incdir" = xNO && jpeg_incdir= - -dnl if headers _and_ libraries are missing, this is no error, and we -dnl continue with a warning (the user will get no jpeg support in khtml) -dnl if only one is missing, it means a configuration error, but we still -dnl only warn -if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then - AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) -else - if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then - AC_MSG_WARN([ -There is an installation error in jpeg support. You seem to have only one -of either the headers _or_ the libraries installed. You may need to either -provide correct --with-extra-... options, or the development package of -libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ -Disabling JPEG support. -]) - else - AC_MSG_WARN([libjpeg not found. disable JPEG support.]) - fi - jpeg_incdir= - LIBJPEG= -fi - -AC_SUBST(LIBJPEG) -AH_VERBATIM(_AC_CHECK_JPEG, -[/* - * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system - * headers and I'm too lazy to write a configure test as long as only - * unixware is related - */ -#ifdef _UNIXWARE -#define HAVE_BOOLEAN -#endif -]) -]) - -AC_DEFUN([KDE_CHECK_QT_JPEG], -[ -if test -n "$LIBJPEG"; then -AC_MSG_CHECKING([if Qt needs $LIBJPEG]) -AC_CACHE_VAL(kde_cv_qt_jpeg, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -ac_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS $LIBQT" -LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` -ac_save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK( -[#include ], - [ - int argc; - char** argv; - QApplication app(argc, argv);], - eval "kde_cv_qt_jpeg=no", - eval "kde_cv_qt_jpeg=yes") -LIBS="$ac_save_LIBS" -CXXFLAGS="$ac_save_CXXFLAGS" -AC_LANG_RESTORE -fi -]) - -if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then - AC_MSG_RESULT(yes) - LIBJPEG_QT='$(LIBJPEG)' -else - AC_MSG_RESULT(no) - LIBJPEG_QT= -fi - -]) - -AC_DEFUN([AC_FIND_ZLIB], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_MSG_CHECKING([for libz]) -AC_CACHE_VAL(ac_cv_lib_z, -[ -kde_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" -kde_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK(dnl -[ -#include -], -[ - char buf[42]; - gzFile f = (gzFile) 0; - /* this would segfault.. but we only link, don't run */ - (void) gzgets(f, buf, sizeof(buf)); - - return (zlibVersion() == ZLIB_VERSION); -], - eval "ac_cv_lib_z='-lz'", - eval "ac_cv_lib_z=no") -LIBS="$kde_save_LIBS" -CFLAGS="$kde_save_CFLAGS" -])dnl -if test ! "$ac_cv_lib_z" = no; then - AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) - LIBZ="$ac_cv_lib_z" - AC_MSG_RESULT($ac_cv_lib_z) -else - AC_MSG_ERROR(not found. - Possibly configure picks up an outdated version - installed by XFree86. Remove it from your system. - - Check your installation and look into config.log) - LIBZ="" -fi -AC_SUBST(LIBZ) -]) - -AC_DEFUN([KDE_TRY_TIFFLIB], -[ -AC_MSG_CHECKING([for libtiff $1]) - -AC_CACHE_VAL(kde_cv_libtiff_$1, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -kde_save_LIBS="$LIBS" -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" -else -LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" -fi -kde_save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" - -AC_TRY_LINK(dnl -[ -#include -], - [return (TIFFOpen( "", "r") == 0); ], -[ - kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" -], [ - kde_cv_libtiff_$1=no -]) - -LIBS="$kde_save_LIBS" -CXXFLAGS="$kde_save_CXXFLAGS" -AC_LANG_RESTORE -]) - -if test "$kde_cv_libtiff_$1" = "no"; then - AC_MSG_RESULT(no) - LIBTIFF="" - $3 -else - LIBTIFF="$kde_cv_libtiff_$1" - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) - $2 -fi - -]) - -AC_DEFUN([AC_FIND_TIFF], -[ -AC_REQUIRE([K_PATH_X]) -AC_REQUIRE([AC_FIND_ZLIB]) -AC_REQUIRE([AC_FIND_JPEG]) -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - -KDE_TRY_TIFFLIB(tiff, [], - KDE_TRY_TIFFLIB(tiff34)) - -AC_SUBST(LIBTIFF) -]) - -AC_DEFUN([KDE_FIND_LIBEXR], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_REQUIRE([AC_FIND_ZLIB]) -AC_CACHE_VAL(ac_cv_libexr, -[ - if test -z "$PKG_CONFIG"; then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - - AC_MSG_CHECKING([for OpenEXR libraries]) - - if test "$PKG_CONFIG" = "no" ; then - AC_MSG_RESULT(no) - echo "*** The pkg-config script could not be found. Make sure it is" - echo "*** in your path, or set the PKG_CONFIG environment variable" - echo "*** to the full path to pkg-config." - echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." - else - if !(`$PKG_CONFIG --exists OpenEXR`) ; then - AC_MSG_RESULT(no) - EXRSTATUS=no - else - if !(`$PKG_CONFIG --atleast-version="1.1.1" OpenEXR`) ; then - AC_MSG_RESULT(no) - EXRSTATUS=old - else - kde_save_LIBS="$LIBS" - LIBS="$LIBS $all_libraries $USER_LDFLAGS `pkg-config --libs OpenEXR` $LIBZ" - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - kde_save_CXXFLAGS="$CXXFLAGS" - EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR` - CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS" - - AC_TRY_LINK(dnl - [ - #include - ], - [ - using namespace Imf; - RgbaInputFile file ("dummy"); - return 0; - ], - eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'", - eval "ac_cv_libexr=no" - ) - LIBS="$kde_save_LIBS" - CXXFLAGS="$kde_save_CXXFLAGS" - AC_LANG_RESTORE - ])dnl - if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then - AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR]) - LIB_EXR="$ac_cv_libexr" - AC_MSG_RESULT($ac_cv_libexr) - else - AC_MSG_RESULT(no) - LIB_EXR="" - fi - fi - fi - fi - AC_SUBST(LIB_EXR) - AC_SUBST(EXR_FLAGS) -]) - - - -AC_DEFUN([AC_FIND_PNG], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_REQUIRE([AC_FIND_ZLIB]) -AC_MSG_CHECKING([for libpng]) -AC_CACHE_VAL(ac_cv_lib_png, -[ -kde_save_LIBS="$LIBS" -if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then -LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" -else -LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" -fi -kde_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" - -AC_TRY_LINK(dnl - [ - #include - ], - [ - png_structp png_ptr = png_create_read_struct( /* image ptr */ - PNG_LIBPNG_VER_STRING, 0, 0, 0 ); - return( png_ptr != 0 ); - ], - eval "ac_cv_lib_png='-lpng $LIBZ -lm'", - eval "ac_cv_lib_png=no" -) -LIBS="$kde_save_LIBS" -CFLAGS="$kde_save_CFLAGS" -])dnl -if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then - AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) - LIBPNG="$ac_cv_lib_png" - AC_SUBST(LIBPNG) - AC_MSG_RESULT($ac_cv_lib_png) -else - AC_MSG_RESULT(no) - LIBPNG="" - AC_SUBST(LIBPNG) -fi -]) - - -AC_DEFUN([AC_FIND_JASPER], -[ -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_REQUIRE([AC_FIND_JPEG]) -AC_MSG_CHECKING([for jasper]) -AC_CACHE_VAL(ac_cv_jasper, -[ -kde_save_LIBS="$LIBS" -LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm" -kde_save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" - -AC_TRY_LINK(dnl - [ - #include - ], - [ - return( jas_init() ); - ], - eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'", - eval "ac_cv_jasper=no" -) -LIBS="$kde_save_LIBS" -CFLAGS="$kde_save_CFLAGS" -])dnl -if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then - AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper]) - LIB_JASPER="$ac_cv_jasper" - AC_MSG_RESULT($ac_cv_jasper) -else - AC_MSG_RESULT(no) - LIB_JASPER="" -fi -AC_SUBST(LIB_JASPER) -]) - -AC_DEFUN([AC_CHECK_BOOL], -[ - AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) -]) - -AC_DEFUN([AC_CHECK_GNU_EXTENSIONS], -[ -AC_MSG_CHECKING(if you need GNU extensions) -AC_CACHE_VAL(ac_cv_gnu_extensions, -[ -cat > conftest.c << EOF -#include - -#ifdef __GNU_LIBRARY__ -yes -#endif -EOF - -if (eval "$ac_cpp conftest.c") 2>&5 | - egrep "yes" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_gnu_extensions=yes -else - ac_cv_gnu_extensions=no -fi -]) - -AC_MSG_RESULT($ac_cv_gnu_extensions) -if test "$ac_cv_gnu_extensions" = "yes"; then - AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) -fi -]) - -AC_DEFUN([KDE_CHECK_COMPILER_FLAG], -[ -AC_MSG_CHECKING([whether $CXX supports -$1]) -kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` -AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, -[ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS -$1" - AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) - CXXFLAGS="$save_CXXFLAGS" - AC_LANG_RESTORE -]) -if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then - AC_MSG_RESULT(yes) - : - $2 -else - AC_MSG_RESULT(no) - : - $3 -fi -]) - -AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG], -[ -AC_MSG_CHECKING([whether $CC supports -$1]) -kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` -AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache, -[ - AC_LANG_SAVE - AC_LANG_C - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -$1" - AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], []) - CFLAGS="$save_CFLAGS" - AC_LANG_RESTORE -]) -if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then - AC_MSG_RESULT(yes) - : - $2 -else - AC_MSG_RESULT(no) - : - $3 -fi -]) - - -dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables -dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) -dnl it's all white-space separated -AC_DEFUN([AC_REMOVE_FORBIDDEN], -[ __val=$$1 - __forbid=" $2 " - if test -n "$__val"; then - __new="" - ac_save_IFS=$IFS - IFS=" " - for i in $__val; do - case "$__forbid" in - *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; - *) # Careful to not add spaces, where there were none, because otherwise - # libtool gets confused, if we change e.g. CXX - if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; - esac - done - IFS=$ac_save_IFS - $1=$__new - fi -]) - - -AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER], -[ - AC_MSG_CHECKING([whether $CC is blacklisted]) - - dnl In theory we have tu run this test against $CC and $CXX - dnl in C and in C++ mode, because its perfectly legal for - dnl the user to mix compiler versions, since C has a defined - dnl ABI. - dnl - dnl For now, we assume the user is not on crack. - - AC_TRY_COMPILE([ -#ifdef __GNUC__ -#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0 -choke me -#endif -#endif -], , - kde_bad_compiler=no, - kde_bad_compiler=yes -) - - AC_MSG_RESULT($kde_bad_compiler) - -if test "$kde_bad_compiler" = "yes"; then - AC_MSG_ERROR([ - -This particular compiler version is blacklisted because it -is known to miscompile KDE. Please use a newer version, or -if that is not yet available, choose an older version. - -Please do not report a bug or bother us reporting this -configure error. We know about it, and we introduced -it by intention to avoid untraceable bugs or crashes in KDE. - -]) -fi - -]) - - -AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH], -[ - AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline], - kde_cv_opt_noinline_match, - [ - kde_cv_opt_noinline_match=irrelevant - dnl if we don't use both -O2 and -fno-inline, this check is moot - if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \ - && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then - - ac_cflags_save="$CFLAGS" - CFLAGS="$CFLAGS -D_USE_GNU" - - AC_TRY_LINK([ - #include -], [ const char *pt, *et; - et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ; -], - kde_cv_opt_noinline_match=yes, - kde_cv_opt_noinline_match=no - ) - - CFLAGS="$ac_cflags_save" - fi - ]) -]) - - -dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given -AC_DEFUN([AC_VALIDIFY_CXXFLAGS], -[dnl -if test "x$kde_use_qt_emb" != "xyes"; then - AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) - AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) -else - AC_REMOVE_FORBIDDEN(CXX, [-rpath]) - AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) -fi -]) - -AC_DEFUN([AC_CHECK_COMPILERS], -[ - AC_ARG_ENABLE(debug, - AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]), - [ - case $enableval in - yes) - kde_use_debug_code="yes" - kde_use_debug_define=no - ;; - full) - kde_use_debug_code="full" - kde_use_debug_define=no - ;; - *) - kde_use_debug_code="no" - kde_use_debug_define=yes - ;; - esac - ], - [kde_use_debug_code="no" - kde_use_debug_define=no - ]) - - dnl Just for configure --help - AC_ARG_ENABLE(dummyoption, - AC_HELP_STRING([--disable-debug], - [disables debug output and debug symbols [default=no]]), - [],[]) - - AC_ARG_ENABLE(strict, - AC_HELP_STRING([--enable-strict], - [compiles with strict compiler options (may not work!)]), - [ - if test $enableval = "no"; then - kde_use_strict_options="no" - else - kde_use_strict_options="yes" - fi - ], [kde_use_strict_options="no"]) - - AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]), - [ - if test $enableval = "no"; then - kde_use_warnings="no" - else - kde_use_warnings="yes" - fi - ], [kde_use_warnings="yes"]) - - dnl enable warnings for debug build - if test "$kde_use_debug_code" != "no"; then - kde_use_warnings=yes - fi - - AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]), - [kde_use_profiling=$enableval], - [kde_use_profiling="no"] - ) - - dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS - CFLAGS=" $CFLAGS" - - AC_PROG_CC - - AC_PROG_CPP - - if test "$GCC" = "yes"; then - if test "$kde_use_debug_code" != "no"; then - if test $kde_use_debug_code = "full"; then - CFLAGS="-g3 -fno-inline $CFLAGS" - else - CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS" - fi - else - CFLAGS="-O2 $CFLAGS" - fi - fi - - if test "$kde_use_debug_define" = "yes"; then - CFLAGS="-DNDEBUG $CFLAGS" - fi - - - case "$host" in - *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; - *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; - esac - - if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then - LDFLAGS="" - fi - - CXXFLAGS=" $CXXFLAGS" - - AC_PROG_CXX - - KDE_CHECK_FOR_BAD_COMPILER - - if test "$GXX" = "yes" || test "$CXX" = "KCC"; then - if test "$kde_use_debug_code" != "no"; then - if test "$CXX" = "KCC"; then - CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS" - else - if test "$kde_use_debug_code" = "full"; then - CXXFLAGS="-g3 -fno-inline $CXXFLAGS" - else - CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS" - fi - fi - KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) - - dnl convenience compiler flags - KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) - AC_SUBST(WOVERLOADED_VIRTUAL) - else - if test "$CXX" = "KCC"; then - CXXFLAGS="+K3 $CXXFLAGS" - else - CXXFLAGS="-O2 $CXXFLAGS" - fi - fi - fi - - if test "$kde_use_debug_define" = "yes"; then - CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" - fi - - if test "$kde_use_profiling" = "yes"; then - KDE_CHECK_COMPILER_FLAG(pg, - [ - CFLAGS="-pg $CFLAGS" - CXXFLAGS="-pg $CXXFLAGS" - ]) - fi - - if test "$kde_use_warnings" = "yes"; then - if test "$GCC" = "yes"; then - CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS" - case $host in - *-*-linux-gnu) - CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" - CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wchar-subscripts $CXXFLAGS" - KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"]) - KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"]) - ;; - esac - KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) - KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) - dnl ### FIXME: revert for KDE 4 - KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"]) - fi - fi - - if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then - CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" - fi - - AC_ARG_ENABLE(pch, - AC_HELP_STRING([--enable-pch], - [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]), - [ kde_use_pch=$enableval ],[ kde_use_pch=no ]) - - HAVE_GCC_VISIBILITY=0 - AC_SUBST([HAVE_GCC_VISIBILITY]) - - if test "$GXX" = "yes"; then - gcc_no_reorder_blocks=NO - KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES]) - if test $kde_use_debug_code != "no" && \ - test $kde_use_debug_code != "full" && \ - test "YES" = "$gcc_no_reorder_blocks" ; then - CXXFLAGS="$CXXFLAGS -fno-reorder-blocks" - CFLAGS="$CFLAGS -fno-reorder-blocks" - fi - KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) - KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) - KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"]) - KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) - ENABLE_PERMISSIVE_FLAG="-fpermissive" - - if test "$kde_use_pch" = "yes"; then - AC_MSG_CHECKING(whether gcc supports precompiling c header files) - echo >conftest.h - if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then - kde_gcc_supports_pch=yes - AC_MSG_RESULT(yes) - else - kde_gcc_supports_pch=no - AC_MSG_RESULT(no) - fi - if test "$kde_gcc_supports_pch" = "yes"; then - AC_MSG_CHECKING(whether gcc supports precompiling c++ header files) - if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then - kde_gcc_supports_pch=yes - AC_MSG_RESULT(yes) - else - kde_gcc_supports_pch=no - AC_MSG_RESULT(no) - fi - fi - rm -f conftest.h conftest.h.gch - fi - - KDE_CHECK_FOR_OPT_NOINLINE_MATCH - if test "x$kde_cv_opt_noinline_match" = "xno" ; then - CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`" - fi - fi - AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes") - if test "$CXX" = "KCC"; then - dnl unfortunately we currently cannot disable exception support in KCC - dnl because doing so is binary incompatible and Qt by default links with exceptions :-( - dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) - dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) - - if test "$kde_use_pch" = "yes"; then - dnl TODO: support --pch-dir! - KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) - dnl the below works (but the dir must exist), but it's - dnl useless for a whole package. - dnl The are precompiled headers for each source file, so when compiling - dnl from scratch, it doesn't make a difference, and they take up - dnl around ~5Mb _per_ sourcefile. - dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, - dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) - fi - dnl this flag controls inlining. by default KCC inlines in optimisation mode - dnl all implementations that are defined inside the class {} declaration. - dnl because of templates-compatibility with broken gcc compilers, this - dnl can cause excessive inlining. This flag limits it to a sane level - KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) - KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) - KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) - KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) - dnl Some source files are shared between multiple executables - dnl (or libraries) and some of those need template instantiations. - dnl In that case KCC needs to compile those sources with - dnl --one_instantiation_per_object. To make it easy for us we compile - dnl _all_ objects with that flag (--one_per is a shorthand). - KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) - fi - AC_SUBST(USE_EXCEPTIONS) - dnl obsolete macro - provided to keep things going - USE_RTTI= - AC_SUBST(USE_RTTI) - - case "$host" in - *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; - *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; - *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; - *-*-solaris*) - if test "$GXX" = yes; then - libstdcpp=`$CXX -print-file-name=libstdc++.so` - if test ! -f $libstdcpp; then - AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) - fi - fi - ;; - esac - - AC_VALIDIFY_CXXFLAGS - - AC_PROG_CXXCPP - - if test "$GCC" = yes; then - NOOPT_CFLAGS=-O0 - fi - KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0]) - - AC_ARG_ENABLE(coverage, - AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [ - if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then - ac_coverage_compiler="-fprofile-arcs -ftest-coverage" - ac_coverage_linker="-lgcc" - elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then - ac_coverage_compiler="-fprofile-arcs -ftest-coverage" - ac_coverage_linker="" - else - AC_MSG_ERROR([coverage with your compiler is not supported]) - fi - CFLAGS="$CFLAGS $ac_coverage_compiler" - CXXFLAGS="$CXXFLAGS $ac_coverage_compiler" - LDFLAGS="$LDFLAGS $ac_coverage_linker" - ]) - - AC_SUBST(NOOPT_CXXFLAGS) - AC_SUBST(NOOPT_CFLAGS) - AC_SUBST(ENABLE_PERMISSIVE_FLAG) - - KDE_CHECK_NEW_LDFLAGS - KDE_CHECK_FINAL - KDE_CHECK_CLOSURE - KDE_CHECK_NMCHECK - - ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) -]) - -AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG], - [ - AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - - safe_CXXFLAGS=$CXXFLAGS - safe_LDFLAGS=$LDFLAGS - CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0" - LDFLAGS="$LDFLAGS -shared -fPIC" - - AC_TRY_LINK( - [ - /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */ - #include - int some_function( void ) __attribute__ ((visibility("default"))); - int some_function( void ) - { - std::string s("blafasel"); - return 0; - } - ], [/* elvis is alive */], - kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes) - - CXXFLAGS=$safe_CXXFLAGS - LDFLAGS=$safe_LDFLAGS - AC_LANG_RESTORE - ] - ) - - if test x$kde_cv_val_gcc_visibility_bug = xno; then - CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden" - fi - ] -) - -AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY], -[ - AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY]) - - AC_MSG_CHECKING([grepping for visibility push/pop in headers]) - - if test "x$GXX" = "xyes"; then - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_EGREP_CPP( - [GCC visibility push], - [ #include - ], - [ - AC_MSG_RESULT(yes) - kde_stdc_visibility_patched=yes ], - [ - AC_MSG_RESULT(no) - AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for - visibility support. Disabling -fvisibility=hidden]) - - kde_stdc_visibility_patched=no ]) - - AC_LANG_RESTORE - - kde_have_gcc_visibility=no - KDE_CHECK_COMPILER_FLAG(fvisibility=hidden, - [ - kde_have_gcc_visibility=yes - dnl the whole toolchain is just a mess, gcc is just too buggy - dnl to handle STL with visibility enabled. Lets reconsider - dnl when gcc 4.2 is out or when things get fixed in the compiler. - dnl Contact mueller@kde.org for details. - AC_ARG_ENABLE(gcc-hidden-visibility, - AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]), - [kde_have_gcc_visibility=$enableval], - [kde_have_gcc_visibility=no]) - - AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - - safe_CXXFLAGS=$CXXFLAGS - CXXFLAGS="$CXXFLAGS $all_includes" - - AC_TRY_COMPILE( - [ -#include -#if Q_EXPORT - 0 != 0 -/* if this compiles, then Q_EXPORT is undefined */ -/* if Q_EXPORT is nonempty, this will break compilation */ -#endif - ], [/* elvis is alive */], - kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes) - - CXXFLAGS=$safe_CXXFLAGS - AC_LANG_RESTORE - ] - ) - - if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then - CXXFLAGS="$CXXFLAGS -fvisibility=hidden" - KDE_CHECK_VISIBILITY_GCC_BUG - HAVE_GCC_VISIBILITY=1 - AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported]) - fi - ]) - fi -]) - -AC_DEFUN([KDE_ADD_DEPENDENCIES], -[ - [A]M_DEPENDENCIES(CC) - [A]M_DEPENDENCIES(CXX) -]) - -dnl just a wrapper to clean up configure.in -AC_DEFUN([KDE_PROG_LIBTOOL], -[ -AC_REQUIRE([AC_CHECK_COMPILERS]) -AC_REQUIRE([AC_ENABLE_SHARED]) -AC_REQUIRE([AC_ENABLE_STATIC]) - -AC_REQUIRE([AC_LIBTOOL_DLOPEN]) -AC_REQUIRE([KDE_CHECK_LIB64]) - -AC_OBJEXT -AC_EXEEXT - -AM_PROG_LIBTOOL -AC_LIBTOOL_CXX - -LIBTOOL_SHELL="/bin/sh ./libtool" -# LIBTOOL="$LIBTOOL --silent" -KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" -AC_SUBST(KDE_PLUGIN) - -# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs. -KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)" -AC_SUBST(KDE_CHECK_PLUGIN) - -# we patch configure quite some so we better keep that consistent for incremental runs -AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure') -]) - -AC_DEFUN([KDE_CHECK_LIB64], -[ - AC_ARG_ENABLE(libsuffix, - AC_HELP_STRING([--enable-libsuffix], - [/lib directory suffix (64,32,none,auto[=default])]), - kdelibsuff=$enableval, kdelibsuff="auto") - - if test "$kdelibsuff" = "auto"; then - -cat > conftest.c << EOF -#include -int main() { - return 0; -} -EOF - kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{ - s,.*/lib\([[^\/]]*\)/.*,\1, - p -}'` - rm -rf conftest.* - fi - - if test "$kdelibsuff" = "no" || test "$kdelibsuff" = "none"; then - kdelibsuff= - fi - if test -z "$kdelibsuff"; then - AC_MSG_RESULT([not using lib directory suffix]) - AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) - else - if test "$libdir" = '${exec_prefix}/lib'; then - libdir="$libdir${kdelibsuff}" - AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms - fi - AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories) - AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) - fi -]) - -AC_DEFUN([KDE_CHECK_TYPES], -[ AC_CHECK_SIZEOF(int, 4)dnl - AC_CHECK_SIZEOF(short)dnl - AC_CHECK_SIZEOF(long, 4)dnl - AC_CHECK_SIZEOF(char *, 4)dnl -])dnl - -dnl Not used - kept for compat only? -AC_DEFUN([KDE_DO_IT_ALL], -[ -AC_CANONICAL_SYSTEM -AC_ARG_PROGRAM -AM_INIT_AUTOMAKE($1, $2) -AM_DISABLE_LIBRARIES -AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) -AC_CHECK_COMPILERS -KDE_PROG_LIBTOOL -AM_KDE_WITH_NLS -AC_PATH_KDE -]) - -AC_DEFUN([AC_CHECK_RPATH], -[ -AC_MSG_CHECKING(for rpath) -AC_ARG_ENABLE(rpath, - AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]), - USE_RPATH=$enableval, USE_RPATH=yes) - -if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then - - KDE_RPATH="-R \$(libdir)" - - if test "$kde_libraries" != "$libdir"; then - KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)" - fi - - if test -n "$qt_libraries"; then - KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" - fi - dnl $x_libraries is set to /usr/lib in case - if test -n "$X_LDFLAGS"; then - X_RPATH="-R \$(x_libraries)" - KDE_RPATH="$KDE_RPATH $X_RPATH" - fi - if test -n "$KDE_EXTRA_RPATH"; then - KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" - fi -fi -AC_SUBST(KDE_EXTRA_RPATH) -AC_SUBST(KDE_RPATH) -AC_SUBST(X_RPATH) -AC_MSG_RESULT($USE_RPATH) -]) - -dnl Check for the type of the third argument of getsockname -AC_DEFUN([AC_CHECK_SOCKLEN_T], -[ - AC_MSG_CHECKING(for socklen_t) - AC_CACHE_VAL(kde_cv_socklen_t, - [ - AC_LANG_PUSH(C++) - kde_cv_socklen_t=no - AC_TRY_COMPILE([ - #include - #include - ], - [ - socklen_t len; - getpeername(0,0,&len); - ], - [ - kde_cv_socklen_t=yes - kde_cv_socklen_t_equiv=socklen_t - ]) - AC_LANG_POP(C++) - ]) - AC_MSG_RESULT($kde_cv_socklen_t) - if test $kde_cv_socklen_t = no; then - AC_MSG_CHECKING([for socklen_t equivalent for socket functions]) - AC_CACHE_VAL(kde_cv_socklen_t_equiv, - [ - kde_cv_socklen_t_equiv=int - AC_LANG_PUSH(C++) - for t in int size_t unsigned long "unsigned long"; do - AC_TRY_COMPILE([ - #include - #include - ], - [ - $t len; - getpeername(0,0,&len); - ], - [ - kde_cv_socklen_t_equiv="$t" - break - ]) - done - AC_LANG_POP(C++) - ]) - AC_MSG_RESULT($kde_cv_socklen_t_equiv) - fi - AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv, - [type to use in place of socklen_t if not defined]) - AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv, - [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)]) -]) - -dnl This is a merge of some macros out of the gettext aclocal.m4 -dnl since we don't need anything, I took the things we need -dnl the copyright for them is: -dnl > -dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. -dnl This Makefile.in is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. -dnl > -dnl for this file it is relicensed under LGPL - -AC_DEFUN([AM_KDE_WITH_NLS], - [ - dnl If we use NLS figure out what method - - AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, - [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - - if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then - AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) - GMSGFMT=":" - fi - MSGFMT=$GMSGFMT - AC_SUBST(GMSGFMT) - AC_SUBST(MSGFMT) - - AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - - dnl Test whether we really found GNU xgettext. - if test "$XGETTEXT" != ":"; then - dnl If it is no GNU xgettext we define it as : so that the - dnl Makefiles still can work. - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - AC_MSG_RESULT( - [found xgettext programs is not GNU xgettext; ignore it]) - XGETTEXT=":" - fi - fi - AC_SUBST(XGETTEXT) - - ]) - -# Search path for a program which passes the given test. -# Ulrich Drepper , 1996. - -# serial 1 -# Stephan Kulow: I appended a _KDE against name conflicts - -dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE], -[# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL(ac_cv_path_$1, -[case "[$]$1" in - /*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in ifelse([$5], , $PATH, [$5]); do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test -n "[$]$1"; then - AC_MSG_RESULT([$]$1) -else - AC_MSG_RESULT(no) -fi -AC_SUBST($1)dnl -]) - - -# Check whether LC_MESSAGES is available in . -# Ulrich Drepper , 1995. - -# serial 1 - -AC_DEFUN([AM_LC_MESSAGES], - [if test $ac_cv_header_locale_h = yes; then - AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, - [AC_TRY_LINK([#include ], [return LC_MESSAGES], - am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) - if test $am_cv_val_LC_MESSAGES = yes; then - AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) - fi - fi]) - -dnl From Jim Meyering. -dnl FIXME: migrate into libit. - -AC_DEFUN([AM_FUNC_OBSTACK], -[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, - [AC_TRY_LINK([#include "obstack.h"], - [struct obstack *mem;obstack_free(mem,(char *) 0)], - am_cv_func_obstack=yes, - am_cv_func_obstack=no)]) - if test $am_cv_func_obstack = yes; then - AC_DEFINE(HAVE_OBSTACK) - else - LIBOBJS="$LIBOBJS obstack.o" - fi -]) - -dnl From Jim Meyering. Use this if you use the GNU error.[ch]. -dnl FIXME: Migrate into libit - -AC_DEFUN([AM_FUNC_ERROR_AT_LINE], -[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, - [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], - am_cv_lib_error_at_line=yes, - am_cv_lib_error_at_line=no)]) - if test $am_cv_lib_error_at_line = no; then - LIBOBJS="$LIBOBJS error.o" - fi - AC_SUBST(LIBOBJS)dnl -]) - -# Macro to add for using GNU gettext. -# Ulrich Drepper , 1995. - -# serial 1 -# Stephan Kulow: I put a KDE in it to avoid name conflicts - -AC_DEFUN([AM_KDE_GNU_GETTEXT], - [AC_REQUIRE([AC_PROG_MAKE_SET])dnl - AC_REQUIRE([AC_PROG_RANLIB])dnl - AC_REQUIRE([AC_HEADER_STDC])dnl - AC_REQUIRE([AC_TYPE_OFF_T])dnl - AC_REQUIRE([AC_TYPE_SIZE_T])dnl - AC_REQUIRE([AC_FUNC_ALLOCA])dnl - AC_REQUIRE([AC_FUNC_MMAP])dnl - AC_REQUIRE([AM_KDE_WITH_NLS])dnl - AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) - AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ -__argz_count __argz_stringify __argz_next]) - - AC_MSG_CHECKING(for stpcpy) - AC_CACHE_VAL(kde_cv_func_stpcpy, - [ - kde_safe_cxxflags=$CXXFLAGS - CXXFLAGS="-Werror" - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_COMPILE([ - #include - ], - [ - char buffer[200]; - stpcpy(buffer, buffer); - ], - kde_cv_func_stpcpy=yes, - kde_cv_func_stpcpy=no) - AC_LANG_RESTORE - CXXFLAGS=$kde_safe_cxxflags - ]) - AC_MSG_RESULT($kde_cv_func_stpcpy) - if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then - AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) - fi - - AM_LC_MESSAGES - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - AC_MSG_CHECKING(for catalogs to be installed) - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - AC_MSG_RESULT($LINGUAS) - fi - - dnl Construct list of names of catalog files to be constructed. - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - ]) - -AC_DEFUN([AC_HAVE_XPM], - [AC_REQUIRE_CPP()dnl - AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - - test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= - test -z "$XPM_INCLUDE" && XPM_INCLUDE= - - AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]), - xpm_test=$withval, xpm_test="yes") - if test "x$xpm_test" = xno; then - ac_cv_have_xpm=no - else - AC_MSG_CHECKING(for XPM) - AC_CACHE_VAL(ac_cv_have_xpm, - [ - ac_save_ldflags="$LDFLAGS" - ac_save_cflags="$CFLAGS" - if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then - LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" - else - LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" - fi - CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" - test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" - AC_TRY_LINK([#include ],[], - ac_cv_have_xpm="yes",ac_cv_have_xpm="no") - LDFLAGS="$ac_save_ldflags" - CFLAGS="$ac_save_cflags" - ])dnl - - if test "$ac_cv_have_xpm" = no; then - AC_MSG_RESULT(no) - XPM_LDFLAGS="" - XPMINC="" - $2 - else - AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) - if test "$XPM_LDFLAGS" = ""; then - XPMLIB='-lXpm $(LIB_X11)' - else - XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' - fi - if test "$XPM_INCLUDE" = ""; then - XPMINC="" - else - XPMINC="-I$XPM_INCLUDE" - fi - AC_MSG_RESULT(yes) - $1 - fi - fi - AC_SUBST(XPMINC) - AC_SUBST(XPMLIB) -]) - -AC_DEFUN([AC_HAVE_DPMS], - [AC_REQUIRE_CPP()dnl - AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - - test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= - test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= - DPMS_LIB= - - AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]), - dpms_test=$withval, dpms_test="yes") - if test "x$dpms_test" = xno; then - ac_cv_have_dpms=no - else - AC_MSG_CHECKING(for DPMS) - dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. - dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". - AC_CACHE_VAL(ac_cv_have_dpms, - [ - if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then - AC_MSG_RESULT(no) - ac_cv_have_dpms="no" - else - ac_save_ldflags="$LDFLAGS" - ac_save_cflags="$CFLAGS" - ac_save_libs="$LIBS" - LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries" - LIBS="-lX11 -lXext $LIBSOCKET" - CFLAGS="$CFLAGS $X_INCLUDES" - test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" - AC_TRY_LINK([ - #include - #include - #include - #include - int foo_test_dpms() - { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], - ac_cv_have_dpms="yes", [ - LIBS="-lXdpms $LIBS" - AC_TRY_LINK([ - #include - #include - #include - #include - int foo_test_dpms() - { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], - [ - ac_cv_have_dpms="-lXdpms" - ],ac_cv_have_dpms="no") - ]) - LDFLAGS="$ac_save_ldflags" - CFLAGS="$ac_save_cflags" - LIBS="$ac_save_libs" - fi - ])dnl - - if test "$ac_cv_have_dpms" = no; then - AC_MSG_RESULT(no) - DPMS_LDFLAGS="" - DPMSINC="" - $2 - else - AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) - if test "$ac_cv_have_dpms" = "-lXdpms"; then - DPMS_LIB="-lXdpms" - fi - if test "$DPMS_LDFLAGS" = ""; then - DPMSLIB="$DPMS_LIB "'$(LIB_X11)' - else - DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' - fi - if test "$DPMS_INCLUDE" = ""; then - DPMSINC="" - else - DPMSINC="-I$DPMS_INCLUDE" - fi - AC_MSG_RESULT(yes) - $1 - fi - fi - ac_save_cflags="$CFLAGS" - CFLAGS="$CFLAGS $X_INCLUDES" - test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" - AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO, - [Define if you have the DPMSCapable prototype in ]) - AC_CHECK_DECL(DPMSCapable, - AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),, - [#include - #include ]) - AH_TEMPLATE(HAVE_DPMSINFO_PROTO, - [Define if you have the DPMSInfo prototype in ]) - AC_CHECK_DECL(DPMSInfo, - AC_DEFINE(HAVE_DPMSINFO_PROTO),, - [#include - #include ]) - CFLAGS="$ac_save_cflags" - AC_SUBST(DPMSINC) - AC_SUBST(DPMSLIB) -]) - -AC_DEFUN([AC_HAVE_GL], - [AC_REQUIRE_CPP()dnl - AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) - - test -z "$GL_LDFLAGS" && GL_LDFLAGS= - test -z "$GL_INCLUDE" && GL_INCLUDE= - - AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]), - gl_test=$withval, gl_test="yes") - if test "x$kde_use_qt_emb" = "xyes"; then - # GL and Qt Embedded is a no-go for now. - ac_cv_have_gl=no - elif test "x$gl_test" = xno; then - ac_cv_have_gl=no - else - AC_MSG_CHECKING(for GL) - AC_CACHE_VAL(ac_cv_have_gl, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_save_ldflags=$LDFLAGS - ac_save_cxxflags=$CXXFLAGS - ac_save_libs=$LIBS - LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries" - LIBS="$LIBS -lGL -lGLU" - test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11" - LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET" - CXXFLAGS="$CFLAGS $X_INCLUDES" - test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" - AC_TRY_LINK([#include -#include -], [], - ac_cv_have_gl="yes", ac_cv_have_gl="no") - AC_LANG_RESTORE - LDFLAGS=$ac_save_ldflags - CXXFLAGS=$ac_save_cxxflags - LIBS=$ac_save_libs - ])dnl - - if test "$ac_cv_have_gl" = "no"; then - AC_MSG_RESULT(no) - GL_LDFLAGS="" - GLINC="" - $2 - else - AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) - if test "$GL_LDFLAGS" = ""; then - GLLIB='-lGLU -lGL $(LIB_X11)' - else - GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' - fi - if test "$GL_INCLUDE" = ""; then - GLINC="" - else - GLINC="-I$GL_INCLUDE" - fi - AC_MSG_RESULT($ac_cv_have_gl) - $1 - fi - fi - AC_SUBST(GLINC) - AC_SUBST(GLLIB) -]) - - - dnl shadow password and PAM magic - maintained by ossi@kde.org - -AC_DEFUN([KDE_PAM], [ - AC_REQUIRE([KDE_CHECK_LIBDL]) - - want_pam= - AC_ARG_WITH(pam, - AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]), - [ if test "x$withval" = "xyes"; then - want_pam=yes - pam_service=kde - elif test "x$withval" = "xno"; then - want_pam=no - else - want_pam=yes - pam_service=$withval - fi - ], [ pam_service=kde ]) - - use_pam= - PAMLIBS= - if test "x$want_pam" != xno; then - AC_CHECK_LIB(pam, pam_start, [ - AC_CHECK_HEADER(security/pam_appl.h, - [ pam_header=security/pam_appl.h ], - [ AC_CHECK_HEADER(pam/pam_appl.h, - [ pam_header=pam/pam_appl.h ], - [ - AC_MSG_WARN([PAM detected, but no headers found! -Make sure you have the necessary development packages installed.]) - ] - ) - ] - ) - ], , $LIBDL) - if test -z "$pam_header"; then - if test "x$want_pam" = xyes; then - AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!]) - fi - else - AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) - PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" - use_pam=yes - - dnl darwin claims to be something special - if test "$pam_header" = "pam/pam_appl.h"; then - AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/]) - fi - - dnl test whether struct pam_message is const (Linux) or not (Sun) - AC_MSG_CHECKING(for const pam_message) - AC_EGREP_HEADER([struct pam_message], $pam_header, - [ AC_EGREP_HEADER([const struct pam_message], $pam_header, - [AC_MSG_RESULT([const: Linux-type PAM])], - [AC_MSG_RESULT([nonconst: Sun-type PAM]) - AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] - )], - [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) - fi - fi - - AC_SUBST(PAMLIBS) -]) - -dnl DEF_PAM_SERVICE(arg name, full name, define name) -AC_DEFUN([DEF_PAM_SERVICE], [ - AC_ARG_WITH($1-pam, - AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]), - [ if test "x$use_pam" = xyes; then - $3_PAM_SERVICE=$withval - else - AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. -You may want to enforce it by using --with-pam.]) - fi - ], - [ if test "x$use_pam" = xyes; then - $3_PAM_SERVICE="$pam_service" - fi - ]) - if test -n "$$3_PAM_SERVICE"; then - AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) - AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) - fi - AC_SUBST($3_PAM_SERVICE) -]) - -AC_DEFUN([KDE_SHADOWPASSWD], [ - AC_REQUIRE([KDE_PAM]) - - AC_CHECK_LIB(shadow, getspent, - [ LIBSHADOW="-lshadow" - ac_use_shadow=yes - ], - [ dnl for UnixWare - AC_CHECK_LIB(gen, getspent, - [ LIBGEN="-lgen" - ac_use_shadow=yes - ], - [ AC_CHECK_FUNC(getspent, - [ ac_use_shadow=yes ], - [ ac_use_shadow=no ]) - ]) - ]) - AC_SUBST(LIBSHADOW) - AC_SUBST(LIBGEN) - - AC_MSG_CHECKING([for shadow passwords]) - - AC_ARG_WITH(shadow, - AC_HELP_STRING([--with-shadow],[If you want shadow password support]), - [ if test "x$withval" != "xno"; then - use_shadow=yes - else - use_shadow=no - fi - ], [ - use_shadow="$ac_use_shadow" - ]) - - if test "x$use_shadow" = xyes; then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) - else - AC_MSG_RESULT(no) - LIBSHADOW= - LIBGEN= - fi - - dnl finally make the relevant binaries setuid root, if we have shadow passwds. - dnl this still applies, if we could use it indirectly through pam. - if test "x$use_shadow" = xyes || - ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then - case $host in - *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) - SETUIDFLAGS="-m 4755 -o root";; - *) - SETUIDFLAGS="-m 4755";; - esac - fi - AC_SUBST(SETUIDFLAGS) - -]) - -AC_DEFUN([KDE_PASSWDLIBS], [ - AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT - AC_REQUIRE([KDE_PAM]) - AC_REQUIRE([KDE_SHADOWPASSWD]) - - if test "x$use_pam" = "xyes"; then - PASSWDLIBS="$PAMLIBS" - else - PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" - fi - - dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but - dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires - dnl root to read, so kcheckpass needs to be root (even when using pam, since pam - dnl may need to read /etc/master.passwd). - case $host in - *-*-freebsd*) - SETUIDFLAGS="-m 4755 -o root" - ;; - *) - ;; - esac - - AC_SUBST(PASSWDLIBS) -]) - -AC_DEFUN([KDE_CHECK_LIBDL], -[ -AC_CHECK_LIB(dl, dlopen, [ -LIBDL="-ldl" -ac_cv_have_dlfcn=yes -]) - -AC_CHECK_LIB(dld, shl_unload, [ -LIBDL="-ldld" -ac_cv_have_shload=yes -]) - -AC_SUBST(LIBDL) -]) - -AC_DEFUN([KDE_CHECK_DLOPEN], -[ -KDE_CHECK_LIBDL -AC_CHECK_HEADERS(dlfcn.h dl.h) -if test "$ac_cv_header_dlfcn_h" = "no"; then - ac_cv_have_dlfcn=no -fi - -if test "$ac_cv_header_dl_h" = "no"; then - ac_cv_have_shload=no -fi - -dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE -dnl (MM) -AC_ARG_ENABLE(dlopen, -AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]), -enable_dlopen=$enableval, -enable_dlopen=yes) - -# override the user's opinion, if we know it better ;) -if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then - enable_dlopen=no -fi - -if test "$ac_cv_have_dlfcn" = "yes"; then - AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) -fi - -if test "$ac_cv_have_shload" = "yes"; then - AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) -fi - -if test "$enable_dlopen" = no ; then - test -n "$1" && eval $1 -else - test -n "$2" && eval $2 -fi - -]) - -AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING], -[ -KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) -KDE_PROG_LIBTOOL -AC_MSG_CHECKING([dynamic loading]) -eval "`egrep '^build_libtool_libs=' libtool`" -if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then - dynamic_loading=yes - AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) -else - dynamic_loading=no -fi -AC_MSG_RESULT($dynamic_loading) -if test "$dynamic_loading" = "yes"; then - $1 -else - $2 -fi -]) - -AC_DEFUN([KDE_ADD_INCLUDES], -[ -if test -z "$1"; then - test_include="Pix.h" -else - test_include="$1" -fi - -AC_MSG_CHECKING([for libg++ ($test_include)]) - -AC_CACHE_VAL(kde_cv_libgpp_includes, -[ -kde_cv_libgpp_includes=no - - for ac_dir in \ - \ - /usr/include/g++ \ - /usr/include \ - /usr/unsupported/include \ - /opt/include \ - $extra_include \ - ; \ - do - if test -r "$ac_dir/$test_include"; then - kde_cv_libgpp_includes=$ac_dir - break - fi - done -]) - -AC_MSG_RESULT($kde_cv_libgpp_includes) -if test "$kde_cv_libgpp_includes" != "no"; then - all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" -fi -]) -]) - -AC_DEFUN([KDE_CHECK_LIBPTHREAD], -[ - dnl This code is here specifically to handle the - dnl various flavors of threading library on FreeBSD - dnl 4-, 5-, and 6-, and the (weird) rules around it. - dnl There may be an environment PTHREAD_LIBS that - dnl specifies what to use; otherwise, search for it. - dnl -pthread is special cased and unsets LIBPTHREAD - dnl below if found. - LIBPTHREAD="" - - if test -n "$PTHREAD_LIBS"; then - if test "x$PTHREAD_LIBS" = "x-pthread" ; then - LIBPTHREAD="PTHREAD" - else - PTHREAD_LIBS_save="$PTHREAD_LIBS" - PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'` - AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS]) - KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [ - LIBPTHREAD="$PTHREAD_LIBS_save"]) - PTHREAD_LIBS="$PTHREAD_LIBS_save" - fi - fi - - dnl Is this test really needed, in the face of the Tru64 test below? - if test -z "$LIBPTHREAD"; then - AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"]) - fi - - dnl This is a special Tru64 check, see BR 76171 issue #18. - if test -z "$LIBPTHREAD" ; then - AC_MSG_CHECKING([for pthread_create in -lpthread]) - kde_safe_libs=$LIBS - LIBS="$LIBS -lpthread" - AC_TRY_LINK([#include ],[(void)pthread_create(0,0,0,0);],[ - AC_MSG_RESULT(yes) - LIBPTHREAD="-lpthread"],[ - AC_MSG_RESULT(no)]) - LIBS=$kde_safe_libs - fi - - dnl Un-special-case for FreeBSD. - if test "x$LIBPTHREAD" = "xPTHREAD" ; then - LIBPTHREAD="" - fi - - AC_SUBST(LIBPTHREAD) -]) - -AC_DEFUN([KDE_CHECK_PTHREAD_OPTION], -[ - USE_THREADS="" - if test -z "$LIBPTHREAD"; then - KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"]) - fi - - AH_VERBATIM(__svr_define, [ -#if defined(__SVR4) && !defined(__svr4__) -#define __svr4__ 1 -#endif -]) - case $host_os in - solaris*) - KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) - CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" - ;; - freebsd*) - CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS" - ;; - aix*) - CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" - LIBPTHREAD="$LIBPTHREAD -lc_r" - ;; - linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" - if test "$CXX" = "KCC"; then - CXXFLAGS="$CXXFLAGS --thread_safe" - NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" - fi - ;; - *) - ;; - esac - AC_SUBST(USE_THREADS) - AC_SUBST(LIBPTHREAD) -]) - -AC_DEFUN([KDE_CHECK_THREADING], -[ - AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) - AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) - dnl default is yes if libpthread is found and no if no libpthread is available - if test -z "$LIBPTHREAD"; then - if test -z "$USE_THREADS"; then - kde_check_threading_default=no - else - kde_check_threading_default=yes - fi - else - kde_check_threading_default=yes - fi - AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]), - kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) - if test "x$kde_use_threading" = "xyes"; then - AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) - fi -]) - -AC_DEFUN([KDE_TRY_LINK_PYTHON], -[ -if test "$kde_python_link_found" = no; then - -if test "$1" = normal; then - AC_MSG_CHECKING(if a Python application links) -else - AC_MSG_CHECKING(if Python depends on $2) -fi - -AC_CACHE_VAL(kde_cv_try_link_python_$1, -[ -kde_save_cflags="$CFLAGS" -CFLAGS="$CFLAGS $PYTHONINC" -kde_save_libs="$LIBS" -LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" -kde_save_ldflags="$LDFLAGS" -LDFLAGS="$LDFLAGS $PYTHONLIB" - -AC_TRY_LINK( -[ -#include -],[ - PySys_SetArgv(1, 0); -], - [kde_cv_try_link_python_$1=yes], - [kde_cv_try_link_python_$1=no] -) -CFLAGS="$kde_save_cflags" -LIBS="$kde_save_libs" -LDFLAGS="$kde_save_ldflags" -]) - -if test "$kde_cv_try_link_python_$1" = "yes"; then - AC_MSG_RESULT(yes) - kde_python_link_found=yes - if test ! "$1" = normal; then - LIBPYTHON="$LIBPYTHON $2" - fi - $3 -else - AC_MSG_RESULT(no) - $4 -fi - -fi - -]) - -AC_DEFUN([KDE_CHECK_PYTHON_DIR], -[ -AC_MSG_CHECKING([for Python directory]) - -AC_CACHE_VAL(kde_cv_pythondir, -[ - if test -z "$PYTHONDIR"; then - kde_cv_pythondir=/usr/local - else - kde_cv_pythondir="$PYTHONDIR" - fi -]) - -AC_ARG_WITH(pythondir, -AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]), -[ - ac_python_dir=$withval -], ac_python_dir=$kde_cv_pythondir -) - -AC_MSG_RESULT($ac_python_dir) -]) - -AC_DEFUN([KDE_CHECK_PYTHON_INTERN], -[ -AC_REQUIRE([KDE_CHECK_LIBDL]) -AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) -AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) - -if test -z "$1"; then - version="1.5" -else - version="$1" -fi - -AC_MSG_CHECKING([for Python$version]) - -python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" -AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) -if test ! -r $python_incdir/Python.h; then - AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) - python_incdir=$python_incdir/python$version - if test ! -r $python_incdir/Python.h; then - python_incdir=no - fi -fi - -PYTHONINC=-I$python_incdir - -python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs" -AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir) -if test ! -r $python_libdir/libpython$version.so; then - AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) - if test ! -r $python_libdir/libpython$version.a; then - AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) - python_libdir=$python_libdir/python$version/config - if test ! -r $python_libdir/libpython$version.a; then - python_libdir=no - fi - fi -fi - -PYTHONLIB=-L$python_libdir -kde_orig_LIBPYTHON=$LIBPYTHON -if test -z "$LIBPYTHON"; then - LIBPYTHON=-lpython$version -fi - -AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) -python_moddir=$python_moddir/python$version -if test ! -r $python_moddir/copy.py; then - python_moddir=no -fi - -PYTHONMODDIR=$python_moddir - -AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) - -if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then - LIBPYTHON=$kde_orig_LIBPYTHON - test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" - test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" - $2 -else - dnl Note: this test is very weak - kde_python_link_found=no - KDE_TRY_LINK_PYTHON(normal) - KDE_TRY_LINK_PYTHON(m, -lm) - KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) - KDE_TRY_LINK_PYTHON(tcl, -ltcl) - KDE_TRY_LINK_PYTHON(db2, -ldb2) - KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) - KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) - KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) - KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses]) - KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], - [AC_MSG_WARN([it seems, Python depends on another library. - Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this - and contact the authors to let them know about this problem]) - ]) - - LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" - AC_SUBST(PYTHONINC) - AC_SUBST(PYTHONLIB) - AC_SUBST(LIBPYTHON) - AC_SUBST(PYTHONMODDIR) - AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) -fi - -]) - - -AC_DEFUN([KDE_CHECK_PYTHON], -[ - KDE_CHECK_PYTHON_INTERN("2.5", - [KDE_CHECK_PYTHON_INTERN("2.4", - [KDE_CHECK_PYTHON_INTERN("2.3", - [KDE_CHECK_PYTHON_INTERN("2.2", - [KDE_CHECK_PYTHON_INTERN("2.1", - [KDE_CHECK_PYTHON_INTERN("2.0", - [KDE_CHECK_PYTHON_INTERN($1, $2) ]) - ]) - ]) - ]) - ]) - ]) -]) - -AC_DEFUN([KDE_CHECK_STL], -[ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" - - AC_MSG_CHECKING([if C++ programs can be compiled]) - AC_CACHE_VAL(kde_cv_stl_works, - [ - AC_TRY_COMPILE([ -#include -using namespace std; -],[ - string astring="Hallo Welt."; - astring.erase(0, 6); // now astring is "Welt" - return 0; -], kde_cv_stl_works=yes, - kde_cv_stl_works=no) -]) - - AC_MSG_RESULT($kde_cv_stl_works) - - if test "$kde_cv_stl_works" = "yes"; then - # back compatible - AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) - else - AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs. -Check config.log for details - if you're using a Linux distribution you might miss -a package named similar to libstdc++-dev.]) - fi - - CXXFLAGS="$ac_save_CXXFLAGS" - AC_LANG_RESTORE -]) - -AC_DEFUN([AC_FIND_QIMGIO], - [AC_REQUIRE([AC_FIND_JPEG]) -AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) -AC_MSG_CHECKING([for qimgio]) -AC_CACHE_VAL(ac_cv_lib_qimgio, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -ac_save_LIBS="$LIBS" -ac_save_CXXFLAGS="$CXXFLAGS" -LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" -CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" -AC_TRY_RUN(dnl -[ -#include -#include -int main() { - QString t = "hallo"; - t.fill('t'); - qInitImageIO(); -} -], - ac_cv_lib_qimgio=yes, - ac_cv_lib_qimgio=no, - ac_cv_lib_qimgio=no) -LIBS="$ac_save_LIBS" -CXXFLAGS="$ac_save_CXXFLAGS" -AC_LANG_RESTORE -])dnl -if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then - LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) - AC_SUBST(LIBQIMGIO) -else - AC_MSG_RESULT(not found) -fi -]) - -AC_DEFUN([AM_DISABLE_LIBRARIES], -[ - AC_PROVIDE([AM_ENABLE_STATIC]) - AC_PROVIDE([AM_ENABLE_SHARED]) - enable_static=no - enable_shared=yes -]) - - -AC_DEFUN([AC_CHECK_UTMP_FILE], -[ - AC_MSG_CHECKING([for utmp file]) - - AC_CACHE_VAL(kde_cv_utmp_file, - [ - kde_cv_utmp_file=no - - for ac_file in \ - \ - /var/run/utmp \ - /var/adm/utmp \ - /etc/utmp \ - ; \ - do - if test -r "$ac_file"; then - kde_cv_utmp_file=$ac_file - break - fi - done - ]) - - if test "$kde_cv_utmp_file" != "no"; then - AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) - $1 - AC_MSG_RESULT($kde_cv_utmp_file) - else - $2 - AC_MSG_RESULT([non found]) - fi -]) - - -AC_DEFUN([KDE_CREATE_SUBDIRSLIST], -[ - -DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" -TOPSUBDIRS="" - -if test ! -s $srcdir/subdirs; then - dnl Note: Makefile.common creates subdirs, so this is just a fallback - files=`cd $srcdir && ls -1` - dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` - for i in $dirs; do - echo $i >> $srcdir/subdirs - done -fi - -ac_topsubdirs= -if test -s $srcdir/inst-apps; then - ac_topsubdirs="`cat $srcdir/inst-apps`" -elif test -s $srcdir/subdirs; then - ac_topsubdirs="`cat $srcdir/subdirs`" -fi - -for i in $ac_topsubdirs; do - AC_MSG_CHECKING([if $i should be compiled]) - if test -d $srcdir/$i; then - install_it="yes" - for j in $DO_NOT_COMPILE; do - if test $i = $j; then - install_it="no" - fi - done - else - install_it="no" - fi - AC_MSG_RESULT($install_it) - vari=`echo $i | sed -e 's,[[-+.@]],_,g'` - if test $install_it = "yes"; then - TOPSUBDIRS="$TOPSUBDIRS $i" - eval "$vari""_SUBDIR_included=yes" - else - eval "$vari""_SUBDIR_included=no" - fi -done - -AC_SUBST(TOPSUBDIRS) -]) - -AC_DEFUN([KDE_CHECK_NAMESPACES], -[ -AC_MSG_CHECKING(whether C++ compiler supports namespaces) -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -AC_TRY_COMPILE([ -], -[ -namespace Foo { - extern int i; - namespace Bar { - extern int i; - } -} - -int Foo::i = 0; -int Foo::Bar::i = 1; -],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_NAMESPACES) -], [ -AC_MSG_RESULT(no) -]) -AC_LANG_RESTORE -]) - -dnl ------------------------------------------------------------------------ -dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_CHECK_S_ISSOCK], -[ -AC_MSG_CHECKING(for S_ISSOCK) -AC_CACHE_VAL(ac_cv_have_s_issock, -[ -AC_TRY_LINK( -[ -#include -], -[ -struct stat buff; -int b = S_ISSOCK( buff.st_mode ); -], -ac_cv_have_s_issock=yes, -ac_cv_have_s_issock=no) -]) -AC_MSG_RESULT($ac_cv_have_s_issock) -if test "$ac_cv_have_s_issock" = "yes"; then - AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) -fi - -AH_VERBATIM(_ISSOCK, -[ -#ifndef HAVE_S_ISSOCK -#define HAVE_S_ISSOCK -#define S_ISSOCK(mode) (1==0) -#endif -]) - -]) - -dnl ------------------------------------------------------------------------ -dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([AC_CHECK_KDEMAXPATHLEN], -[ -AC_MSG_CHECKING(for MAXPATHLEN) -AC_CACHE_VAL(ac_cv_maxpathlen, -[ -cat > conftest.$ac_ext < -#endif -#include -#include -#ifndef MAXPATHLEN -#define MAXPATHLEN 1024 -#endif - -KDE_HELLO MAXPATHLEN - -EOF - -ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" - -if AC_TRY_EVAL(ac_try) && test -s conftest.out; then - ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` -else - ac_cv_maxpathlen=1024 -fi - -rm conftest.* - -]) -AC_MSG_RESULT($ac_cv_maxpathlen) -AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) -]) - -AC_DEFUN([KDE_CHECK_HEADER], -[ - kde_safe_cppflags=$CPPFLAGS - CPPFLAGS="$CPPFLAGS $all_includes" - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_CHECK_HEADER([$1], [$2], [$3], [$4]) - AC_LANG_RESTORE - CPPFLAGS=$kde_safe_cppflags -]) - -AC_DEFUN([KDE_CHECK_HEADERS], -[ - AH_CHECK_HEADERS([$1]) - AC_LANG_SAVE - kde_safe_cppflags=$CPPFLAGS - CPPFLAGS="$CPPFLAGS $all_includes" - AC_LANG_CPLUSPLUS - AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) - CPPFLAGS=$kde_safe_cppflags - AC_LANG_RESTORE -]) - -AC_DEFUN([KDE_FAST_CONFIGURE], -[ - dnl makes configure fast (needs perl) - AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]), - with_fast_perl=$enableval, with_fast_perl=yes) -]) - -AC_DEFUN([KDE_CONF_FILES], -[ - val= - if test -f $srcdir/configure.files ; then - val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` - fi - CONF_FILES= - if test -n "$val" ; then - for i in $val ; do - CONF_FILES="$CONF_FILES $i" - done - fi - AC_SUBST(CONF_FILES) -])dnl - -dnl This sets the prefix, for arts and kdelibs -dnl Do NOT use in any other module. -dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde -AC_DEFUN([KDE_SET_PREFIX_CORE], -[ - unset CDPATH - dnl make $KDEDIR the default for the installation - AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) - - if test "x$prefix" = "xNONE"; then - prefix=$ac_default_prefix - ac_configure_args="$ac_configure_args --prefix=$prefix" - fi - # And delete superfluous '/' to make compares easier - prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - kde_libs_htmldir=$prefix/share/doc/HTML/ - exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - - kde_libs_prefix='$(prefix)' - kde_libs_htmldir='$(kde_htmldir)' - AC_SUBST(kde_libs_prefix) - AC_SUBST(kde_libs_htmldir) - KDE_FAST_CONFIGURE - KDE_CONF_FILES -]) - - -AC_DEFUN([KDE_SET_PREFIX], -[ - unset CDPATH - dnl We can't give real code to that macro, only a value. - dnl It only matters for --help, since we set the prefix in this function anyway. - AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix}) - - KDE_SET_DEFAULT_BINDIRS - if test "x$prefix" = "xNONE"; then - dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it - KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) - else - dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH - kde_save_PATH="$PATH" - PATH="$exec_prefix/bin:$prefix/bin:$PATH" - KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) - PATH="$kde_save_PATH" - fi - - kde_libs_prefix=`$KDECONFIG --prefix` - if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then - AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. - This means it has been moved since you installed it. - This won't work. Please recompile kdelibs for the new prefix. - ]) - fi - kde_libs_htmldir=`$KDECONFIG --install html --expandvars` - - AC_MSG_CHECKING([where to install]) - if test "x$prefix" = "xNONE"; then - prefix=$kde_libs_prefix - AC_MSG_RESULT([$prefix (as returned by kde-config)]) - else - dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different - given_prefix=$prefix - AC_MSG_RESULT([$prefix (as requested)]) - fi - - # And delete superfluous '/' to make compares easier - prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` - - AC_SUBST(KDECONFIG) - AC_SUBST(kde_libs_prefix) - AC_SUBST(kde_libs_htmldir) - - KDE_FAST_CONFIGURE - KDE_CONF_FILES -]) - -pushdef([AC_PROG_INSTALL], -[ - dnl our own version, testing for a -p flag - popdef([AC_PROG_INSTALL]) - dnl as AC_PROG_INSTALL works as it works we first have - dnl to save if the user didn't specify INSTALL, as the - dnl autoconf one overwrites INSTALL and we have no chance to find - dnl out afterwards - test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL - test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM - test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT - AC_PROG_INSTALL - - if test -z "$kde_save_INSTALL_given" ; then - # OK, user hasn't given any INSTALL, autoconf found one for us - # now we test, if it supports the -p flag - AC_MSG_CHECKING(for -p flag to install) - rm -f confinst.$$.* > /dev/null 2>&1 - echo "Testtest" > confinst.$$.orig - ac_res=no - if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then - if test -f confinst.$$.new ; then - # OK, -p seems to do no harm to install - INSTALL="${INSTALL} -p" - ac_res=yes - fi - fi - rm -f confinst.$$.* - AC_MSG_RESULT($ac_res) - fi - dnl the following tries to resolve some signs and wonders coming up - dnl with different autoconf/automake versions - dnl e.g.: - dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s - dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) - dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s - dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has - dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the - dnl install-@DIR@PROGRAMS targets to explicitly use that flag - dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as - dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 - dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure - dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from - dnl automake (due to broken Makefile.am or whatever) to install programs, - dnl and so does not see the -s flag in automake > 1.4 - dnl to clean up that mess we: - dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG - dnl which cleans KDE's program with automake > 1.4; - dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems - dnl with automake<=1.4 - dnl note that dues to this sometimes two '-s' flags are used (if KDE - dnl properly uses install-@DIR@PROGRAMS, but I don't care - dnl - dnl And to all this comes, that I even can't write in comments variable - dnl names used by automake, because it is so stupid to think I wanted to - dnl _use_ them, therefor I have written A_M_... instead of AM_ - dnl hmm, I wanted to say something ... ahh yes: Arghhh. - - if test -z "$kde_save_INSTALL_PROGRAM_given" ; then - INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' - fi - if test -z "$kde_save_INSTALL_SCRIPT_given" ; then - INSTALL_SCRIPT='${INSTALL}' - fi -])dnl - -AC_DEFUN([KDE_LANG_CPLUSPLUS], -[AC_LANG_CPLUSPLUS -ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' -pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) -]) - -pushdef([AC_LANG_CPLUSPLUS], -[popdef([AC_LANG_CPLUSPLUS]) -KDE_LANG_CPLUSPLUS -]) - -AC_DEFUN([KDE_CHECK_LONG_LONG], -[ -AC_MSG_CHECKING(for long long) -AC_CACHE_VAL(kde_cv_c_long_long, -[ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_LINK([], [ - long long foo = 0; - foo = foo+1; - ], - kde_cv_c_long_long=yes, kde_cv_c_long_long=no) - AC_LANG_RESTORE -]) -AC_MSG_RESULT($kde_cv_c_long_long) -if test "$kde_cv_c_long_long" = yes; then - AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) -fi -]) - -AC_DEFUN([KDE_CHECK_LIB], -[ - kde_save_LDFLAGS="$LDFLAGS" - dnl AC_CHECK_LIB modifies LIBS, so save it here - kde_save_LIBS="$LIBS" - LDFLAGS="$LDFLAGS $all_libraries" - case $host_os in - aix*) LDFLAGS="-brtl $LDFLAGS" - test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" - ;; - esac - AC_CHECK_LIB($1, $2, $3, $4, $5) - LDFLAGS="$kde_save_LDFLAGS" - LIBS="$kde_save_LIBS" -]) - -AC_DEFUN([KDE_JAVA_PREFIX], -[ - dir=`dirname "$1"` - base=`basename "$1"` - list=`ls -1 $dir 2> /dev/null` - for entry in $list; do - if test -d $dir/$entry/bin; then - case $entry in - $base) - javadirs="$javadirs $dir/$entry/bin" - ;; - esac - elif test -d $dir/$entry/jre/bin; then - case $entry in - $base) - javadirs="$javadirs $dir/$entry/jre/bin" - ;; - esac - fi - done -]) - -dnl KDE_CHEC_JAVA_DIR(onlyjre) -AC_DEFUN([KDE_CHECK_JAVA_DIR], -[ - -AC_ARG_WITH(java, -AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]), -[ ac_java_dir=$withval -], ac_java_dir="" -) - -AC_MSG_CHECKING([for Java]) - -dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH -if test "x$ac_java_dir" = "xno"; then - kde_java_bindir=no - kde_java_includedir=no - kde_java_libjvmdir=no - kde_java_libgcjdir=no - kde_java_libhpidir=no -else - if test "x$ac_java_dir" = "x"; then - - - dnl No option set -> collect list of candidate paths - if test -n "$JAVA_HOME"; then - KDE_JAVA_PREFIX($JAVA_HOME) - fi - KDE_JAVA_PREFIX(/usr/j2se) - KDE_JAVA_PREFIX(/usr/lib/j2se) - KDE_JAVA_PREFIX(/usr/j*dk*) - KDE_JAVA_PREFIX(/usr/lib/j*dk*) - KDE_JAVA_PREFIX(/opt/j*sdk*) - KDE_JAVA_PREFIX(/usr/lib/java*) - KDE_JAVA_PREFIX(/usr/java*) - KDE_JAVA_PREFIX(/usr/java/j*dk*) - KDE_JAVA_PREFIX(/usr/java/j*re*) - KDE_JAVA_PREFIX(/usr/lib/SunJava2*) - KDE_JAVA_PREFIX(/usr/lib/SunJava*) - KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) - KDE_JAVA_PREFIX(/usr/lib/IBMJava*) - KDE_JAVA_PREFIX(/opt/java*) - - kde_cv_path="NONE" - kde_save_IFS=$IFS - IFS=':' - for dir in $PATH; do - if test -d "$dir"; then - javadirs="$javadirs $dir" - fi - done - IFS=$kde_save_IFS - jredirs= - - dnl Now javadirs contains a list of paths that exist, all ending with bin/ - for dir in $javadirs; do - dnl Check for the java executable - if test -x "$dir/java"; then - sane_path=$(cd $dir; /bin/pwd) - dnl And also check for a libjvm.so somewhere under there - dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big. - if test "$sane_path" != "/usr/bin"; then - libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` - if test ! -f $libjvmdir/libjvm.so; then continue; fi - jredirs="$jredirs $dir" - fi - fi - done - - dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found - JAVAC= - JAVA= - kde_java_bindir=no - for dir in $jredirs; do - JAVA="$dir/java" - kde_java_bindir=$dir - if test -x "$dir/javac"; then - JAVAC="$dir/javac" - break - fi - done - - if test -n "$JAVAC"; then - dnl this substitution might not work - well, we test for jni.h below - kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` - else - kde_java_includedir=no - fi - else - dnl config option set - kde_java_bindir=$ac_java_dir/bin - if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then - kde_java_includedir=no - else - kde_java_includedir=$ac_java_dir/include - fi - fi -fi - -dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" -if test "x$kde_java_bindir" != "xno"; then - - dnl Look for libjvm.so - kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` - dnl Look for libgcj.so - kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1` - dnl Look for libhpi.so and avoid green threads - kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` - - dnl Now check everything's fine under there - dnl the include dir is our flag for having the JDK - if test -d "$kde_java_includedir"; then - if test ! -x "$kde_java_bindir/javac"; then - AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) - fi - if test ! -x "$kde_java_bindir/javah"; then - AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) - fi - if test ! -x "$kde_java_bindir/jar"; then - AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) - fi - if test ! -r "$kde_java_includedir/jni.h"; then - AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) - fi - - jni_includes="-I$kde_java_includedir" - dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. - dnl and under linux here.. - - dnl not needed for gcj - - if test "x$kde_java_libgcjdir" = "x"; then - test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" - test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" - test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" - fi - - else - JAVAC= - jni_includes= - fi - - if test "x$kde_java_libgcjdir" = "x"; then - if test ! -r "$kde_java_libjvmdir/libjvm.so"; then - AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) - fi - else - if test ! -r "$kde_java_libgcjdir/libgcj.so"; then - AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.]) - fi - fi - - if test ! -x "$kde_java_bindir/java"; then - AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) - fi - - dnl not needed for gcj compile - - if test "x$kde_java_libgcjdir" = "x"; then - if test ! -r "$kde_java_libhpidir/libhpi.so"; then - AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) - fi - fi - - if test -n "$jni_includes"; then - dnl Check for JNI version - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_cxxflags_safe="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" - - AC_TRY_COMPILE([ - #include - ], - [ - #ifndef JNI_VERSION_1_2 - Syntax Error - #endif - ],[ kde_jni_works=yes ], - [ kde_jni_works=no ]) - - if test $kde_jni_works = no; then - AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. - You need to have Java Development Kit (JDK) version 1.2. - - Use --with-java to specify another location. - Use --without-java to configure without java support. - Or download a newer JDK and try again. - See e.g. http://java.sun.com/products/jdk/1.2 ]) - fi - - CXXFLAGS="$ac_cxxflags_safe" - AC_LANG_RESTORE - - dnl All tests ok, inform and subst the variables - - JAVAC=$kde_java_bindir/javac - JAVAH=$kde_java_bindir/javah - JAR=$kde_java_bindir/jar - AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) - if test "x$kde_java_libgcjdir" = "x"; then - JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" - else - JVMLIBS="-L$kde_java_libgcjdir -lgcj" - fi - AC_MSG_RESULT([java JDK in $kde_java_bindir]) - - else - AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) - AC_MSG_RESULT([java JRE in $kde_java_bindir]) - fi -elif test -d "/Library/Java/Home"; then - kde_java_bindir="/Library/Java/Home/bin" - jni_includes="-I/Library/Java/Home/include" - - JAVAC=$kde_java_bindir/javac - JAVAH=$kde_java_bindir/javah - JAR=$kde_java_bindir/jar - JVMLIBS="-Wl,-framework,JavaVM" - - AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) - AC_MSG_RESULT([Apple Java Framework]) -else - AC_MSG_RESULT([none found]) -fi - -AC_SUBST(JAVAC) -AC_SUBST(JAVAH) -AC_SUBST(JAR) -AC_SUBST(JVMLIBS) -AC_SUBST(jni_includes) - -# for backward compat -kde_cv_java_includedir=$kde_java_includedir -kde_cv_java_bindir=$kde_java_bindir -]) - -dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. -dnl When the argument list becomes big, as in KDE for AC_OUTPUT in -dnl big packages, m4_foreach is dog-slow. So use our own version of -dnl it. (matz@kde.org) -m4_define([mm_foreach], -[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) -m4_define([mm_car], [[$1]]) -m4_define([mm_car2], [[$@]]) -m4_define([_mm_foreach], -[m4_if(m4_quote($2), [], [], - [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1], - mm_car2(m4_shift($2)), - [$3])])]) -m4_define([AC_FOREACH], -[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) - -AC_DEFUN([KDE_NEED_FLEX], -[ -kde_libs_safe=$LIBS -LIBS="$LIBS $USER_LDFLAGS" -AM_PROG_LEX -LIBS=$kde_libs_safe -if test -z "$LEXLIB"; then - AC_MSG_ERROR([You need to have flex installed.]) -fi -AC_SUBST(LEXLIB) -]) - -AC_DEFUN([AC_PATH_QTOPIA], -[ - dnl TODO: use AC_CACHE_VAL - - if test -z "$1"; then - qtopia_minver_maj=1 - qtopia_minver_min=5 - qtopia_minver_pat=0 - else - qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` - qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` - qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` - fi - - qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" - qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" - - AC_REQUIRE([AC_PATH_QT]) - - AC_MSG_CHECKING([for Qtopia]) - - LIB_QTOPIA="-lqpe" - AC_SUBST(LIB_QTOPIA) - - kde_qtopia_dirs="$QPEDIR /opt/Qtopia" - - ac_qtopia_incdir=NO - - AC_ARG_WITH(qtopia-dir, - AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]), - [ ac_qtopia_incdir="$withval"/include] ) - - qtopia_incdirs="" - for dir in $kde_qtopia_dirs; do - qtopia_incdirs="$qtopia_incdirs $dir/include" - done - - if test ! "$ac_qtopia_incdir" = "NO"; then - qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" - fi - - qtopia_incdir="" - AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) - ac_qtopia_incdir="$qtopia_incdir" - - if test -z "$qtopia_incdir"; then - AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) - fi - - qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; - qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; - qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; - - qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" - qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" - if test "$qtopia_ver" -lt "$qtopia_minver"; then - AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr -is required.]) - fi - - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - - ac_cxxflags_safe="$CXXFLAGS" - ac_ldflags_safe="$LDFLAGS" - ac_libs_safe="$LIBS" - - CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" - LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" - LIBS="$LIBS $LIB_QTOPIA $LIBQT" - - cat > conftest.$ac_ext < -#include - -int main( int argc, char **argv ) -{ - QPEApplication app( argc, argv ); - return 0; -} -EOF - - if AC_TRY_EVAL(ac_link) && test -s conftest; then - rm -f conftest* - else - rm -f conftest* - AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at -the end of config.log]) - fi - - CXXFLAGS="$ac_cxxflags_safe" - LDFLAGS="$ac_ldflags_safe" - LIBS="$ac_libs_safe" - - AC_LANG_RESTORE - - QTOPIA_INCLUDES="-I$qtopia_incdir" - AC_SUBST(QTOPIA_INCLUDES) - - AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) -]) - - -AC_DEFUN([KDE_INIT_DOXYGEN], -[ -AC_MSG_CHECKING([for Qt docs]) -kde_qtdir= -if test "${with_qt_dir+set}" = set; then - kde_qtdir="$with_qt_dir" -fi - -AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR) -AC_MSG_RESULT($QTDOCDIR) - -AC_SUBST(QTDOCDIR) - -KDE_FIND_PATH(dot, DOT, [], []) -if test -n "$DOT"; then - KDE_HAVE_DOT="YES" -else - KDE_HAVE_DOT="NO" -fi -AC_SUBST(KDE_HAVE_DOT) -KDE_FIND_PATH(doxygen, DOXYGEN, [], []) -AC_SUBST(DOXYGEN) - -DOXYGEN_PROJECT_NAME="$1" -DOXYGEN_PROJECT_NUMBER="$2" -AC_SUBST(DOXYGEN_PROJECT_NAME) -AC_SUBST(DOXYGEN_PROJECT_NUMBER) - -KDE_HAS_DOXYGEN=no -if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then - KDE_HAS_DOXYGEN=yes -fi -AC_SUBST(KDE_HAS_DOXYGEN) - -]) - - -AC_DEFUN([AC_FIND_BZIP2], -[ -AC_MSG_CHECKING([for bzDecompress in libbz2]) -AC_CACHE_VAL(ac_cv_lib_bzip2, -[ -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -kde_save_LIBS="$LIBS" -LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" -kde_save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" -AC_TRY_LINK(dnl -[ -#define BZ_NO_STDIO -#include -], - [ bz_stream s; (void) bzDecompress(&s); ], - eval "ac_cv_lib_bzip2='-lbz2'", - eval "ac_cv_lib_bzip2=no") -LIBS="$kde_save_LIBS" -CXXFLAGS="$kde_save_CXXFLAGS" -AC_LANG_RESTORE -])dnl -AC_MSG_RESULT($ac_cv_lib_bzip2) - -if test ! "$ac_cv_lib_bzip2" = no; then - BZIP2DIR=bzip2 - - LIBBZ2="$ac_cv_lib_bzip2" - AC_SUBST(LIBBZ2) - -else - - cxx_shared_flag= - ld_shared_flag= - KDE_CHECK_COMPILER_FLAG(shared, [ - ld_shared_flag="-shared" - ]) - KDE_CHECK_COMPILER_FLAG(fPIC, [ - cxx_shared_flag="-fPIC" - ]) - - AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) - AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - kde_save_LIBS="$LIBS" - LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET" - kde_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES" - - AC_TRY_LINK(dnl - [ - #define BZ_NO_STDIO - #include - ], - [ bz_stream s; (void) BZ2_bzDecompress(&s); ], - eval "ac_cv_lib_bzip2_prefix='-lbz2'", - eval "ac_cv_lib_bzip2_prefix=no") - LIBS="$kde_save_LIBS" - CXXFLAGS="$kde_save_CXXFLAGS" - AC_LANG_RESTORE - ])dnl - - AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) - - if test ! "$ac_cv_lib_bzip2_prefix" = no; then - BZIP2DIR=bzip2 - - LIBBZ2="$ac_cv_lib_bzip2_prefix" - AC_SUBST(LIBBZ2) - - AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) - dnl else, we just ignore this - fi - -fi -AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") -]) - -dnl ------------------------------------------------------------------------ -dnl Try to find the SSL headers and libraries. -dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) -dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) -dnl ------------------------------------------------------------------------ -dnl -AC_DEFUN([KDE_CHECK_SSL], -[ -LIBSSL="-lssl -lcrypto" -AC_REQUIRE([KDE_CHECK_LIB64]) - -ac_ssl_includes=NO ac_ssl_libraries=NO -ssl_libraries="" -ssl_includes="" -AC_ARG_WITH(ssl-dir, - AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]), - [ ac_ssl_includes="$withval"/include - ac_ssl_libraries="$withval"/lib$kdelibsuff - ]) - -want_ssl=yes -AC_ARG_WITH(ssl, - AC_HELP_STRING([--without-ssl],[disable SSL checks]), - [want_ssl=$withval]) - -if test $want_ssl = yes; then - -AC_MSG_CHECKING(for OpenSSL) - -AC_CACHE_VAL(ac_cv_have_ssl, -[#try to guess OpenSSL locations - - ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" - ssl_incdirs="$ac_ssl_includes $ssl_incdirs" - AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) - ac_ssl_includes="$ssl_incdir" - - ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" - if test ! "$ac_ssl_libraries" = "NO"; then - ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" - fi - - test=NONE - ssl_libdir=NONE - for dir in $ssl_libdirs; do - try="ls -1 $dir/libssl*" - if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi - done - - ac_ssl_libraries="$ssl_libdir" - - ac_ldflags_safe="$LDFLAGS" - ac_libs_safe="$LIBS" - - LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" - LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" - - AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, - ac_ssl_rsaref="yes" - , - ac_ssl_rsaref="no" - ) - - LDFLAGS="$ac_ldflags_safe" - LIBS="$ac_libs_safe" - - if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then - have_ssl=no - else - have_ssl=yes; - fi - - ]) - - eval "$ac_cv_have_ssl" - - AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) - - AC_MSG_CHECKING([whether OpenSSL uses rsaref]) - AC_MSG_RESULT($ac_ssl_rsaref) - - AC_MSG_CHECKING([for easter eggs]) - AC_MSG_RESULT([none found]) - -else - have_ssl=no -fi - -if test "$have_ssl" = yes; then - AC_MSG_CHECKING(for OpenSSL version) - dnl Check for SSL version - AC_CACHE_VAL(ac_cv_ssl_version, - [ - - cat >conftest.$ac_ext < -#include - int main() { - -#ifndef OPENSSL_VERSION_NUMBER - printf("ssl_version=\\"error\\"\n"); -#else - if (OPENSSL_VERSION_NUMBER < 0x00906000) - printf("ssl_version=\\"old\\"\n"); - else - printf("ssl_version=\\"ok\\"\n"); -#endif - return (0); - } -EOF - - ac_save_CPPFLAGS=$CPPFLAGS - if test "$ac_ssl_includes" != "/usr/include"; then - CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes" - fi - - if AC_TRY_EVAL(ac_link); then - - if eval `./conftest 2>&5`; then - if test $ssl_version = error; then - AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) - else - if test $ssl_version = old; then - AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) - have_ssl=no - fi - fi - ac_cv_ssl_version="ssl_version=$ssl_version" - else - AC_MSG_ERROR([Your system couldn't run a small SSL test program. - Check config.log, and if you can't figure it out, send a mail to - David Faure , attaching your config.log]) - fi - - else - AC_MSG_ERROR([Your system couldn't link a small SSL test program. - Check config.log, and if you can't figure it out, send a mail to - David Faure , attaching your config.log]) - fi - CPPFLAGS=$ac_save_CPPFLAGS - - ]) - - eval "$ac_cv_ssl_version" - AC_MSG_RESULT($ssl_version) -fi - -if test "$have_ssl" != yes; then - LIBSSL=""; -else - AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) - ac_cv_have_ssl="have_ssl=yes \ - ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" - - - ssl_libraries="$ac_ssl_libraries" - ssl_includes="$ac_ssl_includes" - - if test "$ac_ssl_rsaref" = yes; then - LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" - fi - - if test $ssl_version = "old"; then - AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) - fi -fi - -SSL_INCLUDES= - -if test "$ssl_includes" = "/usr/include"; then - if test -f /usr/kerberos/include/krb5.h; then - SSL_INCLUDES="-I/usr/kerberos/include" - fi -elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then - SSL_INCLUDES="-I$ssl_includes" -fi - -if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then - SSL_LDFLAGS="" -else - SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" -fi - -AC_SUBST(SSL_INCLUDES) -AC_SUBST(SSL_LDFLAGS) -AC_SUBST(LIBSSL) -]) - -AC_DEFUN([KDE_CHECK_STRLCPY], -[ - AC_REQUIRE([AC_CHECK_STRLCAT]) - AC_REQUIRE([AC_CHECK_STRLCPY]) - AC_CHECK_SIZEOF(size_t) - AC_CHECK_SIZEOF(unsigned long) - - AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long]) - AC_TRY_COMPILE(,[ - #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG - choke me - #endif - ],AC_MSG_RESULT([yes]),[ - AC_MSG_RESULT(no) - AC_MSG_ERROR([ - Apparently on your system our assumption sizeof size_t == sizeof unsigned long - does not apply. Please mail kde-devel@kde.org with a description of your system! - ]) - ]) -]) - -AC_DEFUN([KDE_CHECK_BINUTILS], -[ - AC_MSG_CHECKING([if ld supports unversioned version maps]) - - kde_save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" - echo "{ local: extern \"C++\" { foo }; };" > conftest.map - AC_TRY_LINK([int foo;], -[ -#ifdef __INTEL_COMPILER -icc apparently does not support libtools version-info and version-script -at the same time. Dunno where the bug is, but until somebody figured out, -better disable the optional version scripts. -#endif - - foo = 42; -], kde_supports_versionmaps=yes, kde_supports_versionmaps=no) - LDFLAGS="$kde_save_LDFLAGS" - rm -f conftest.map - AM_CONDITIONAL(include_VERSION_SCRIPT, - [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"]) - - AC_MSG_RESULT($kde_supports_versionmaps) -]) - -AC_DEFUN([AM_PROG_OBJC],[ -AC_CHECK_PROGS(OBJC, gcc, gcc) -test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH]) -if test "x${OBJCFLAGS-unset}" = xunset; then - OBJCFLAGS="-g -O2" -fi -AC_SUBST(OBJCFLAGS) -_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)]) -]) - -AC_DEFUN([KDE_CHECK_PERL], -[ - KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [ - AC_MSG_ERROR([No Perl found in your $PATH. -We need perl to generate some code.]) - ]) - AC_SUBST(PERL) -]) - -AC_DEFUN([KDE_CHECK_LARGEFILE], -[ -AC_SYS_LARGEFILE -if test "$ac_cv_sys_file_offset_bits" != no; then - CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" -fi - -if test "x$ac_cv_sys_large_files" != "xno"; then - CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1" -fi - -]) - -dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in) -dnl which allows to search for libs that get installed into the KDE prefix. -dnl -dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not) -dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page -dnl also defines KSTUFF_PKG_ERRORS on error -AC_DEFUN([KDE_PKG_CHECK_MODULES], [ - - PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" - if test "$prefix" != "$kde_libs_prefix"; then - PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" - fi - export PKG_CONFIG_PATH - PKG_CHECK_MODULES([$1],[$2],[$3],[$4]) -]) - - -dnl Check for PIE support in the compiler and linker -AC_DEFUN([KDE_CHECK_PIE_SUPPORT], -[ - AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support, - [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - safe_CXXFLAGS=$CXXFLAGS - safe_LDFLAGS=$LDFLAGS - CXXFLAGS="$CXXFLAGS -fPIE" - LDFLAGS="$LDFLAGS -pie" - - AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no]) - - CXXFLAGS=$safe_CXXFLAGS - LDFLAGS=$safe_LDFLAGS - AC_LANG_RESTORE - ]) - - AC_MSG_CHECKING(if enabling -pie/fPIE support) - - AC_ARG_ENABLE(pie, - AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]), - [kde_has_pie_support=$enableval], - [kde_has_pie_support=detect]) - - if test "$kde_has_pie_support" = "detect"; then - kde_has_pie_support=$kde_cv_val_pie_support - fi - - AC_MSG_RESULT([$kde_has_pie_support]) - - KDE_USE_FPIE="" - KDE_USE_PIE="" - - AC_SUBST([KDE_USE_FPIE]) - AC_SUBST([KDE_USE_PIE]) - - if test "$kde_has_pie_support" = "yes"; then - KDE_USE_FPIE="-fPIE" - KDE_USE_PIE="-pie" - fi -]) diff --git a/admin/am_edit b/admin/am_edit deleted file mode 100644 index 108eb67..0000000 --- a/admin/am_edit +++ /dev/null @@ -1,2445 +0,0 @@ -#!/usr/bin/perl -w - -# Expands the specialised KDE tags in Makefile.in to (hopefully) valid -# make syntax. -# When called without file parameters, we work recursively on all Makefile.in -# in and below the current subdirectory. When called with file parameters, -# only those Makefile.in are changed. -# The currently supported tags are -# -# {program}_METASOURCES -# where you have a choice of two styles -# {program}_METASOURCES = name1.moc name2.moc ... [\] -# {program}_METASOURCES = AUTO -# The second style requires other tags as well. -# -# To install icons : -# KDE_ICON = iconname iconname2 ... -# KDE_ICON = AUTO -# -# For documentation : -# http://developer.kde.org/documentation/other/developer-faq.html -# -# and more new tags TBD! -# -# The concept (and base code) for this program came from automoc, -# supplied by the following -# -# Matthias Ettrich (The originator) -# Kalle Dalheimer (The original implementator) -# Harri Porten -# Alex Zepeda -# David Faure -# Stephan Kulow -# Dirk Mueller - -use Cwd; -use File::Find; -use File::Basename; - -# Prototype the functions -sub initialise (); -sub processMakefile ($); -sub updateMakefile (); -sub restoreMakefile (); - -sub removeLine ($$); -sub appendLines ($); -sub substituteLine ($$); - -sub findMocCandidates (); -sub pruneMocCandidates ($); -sub checkMocCandidates (); -sub addMocRules (); -sub findKcfgFile($); - -sub tag_AUTOMAKE (); -sub tag_META_INCLUDES (); -sub tag_METASOURCES (); -sub tag_POFILES (); -sub tag_DOCFILES (); -sub tag_LOCALINSTALL(); -sub tag_IDLFILES(); -sub tag_UIFILES(); -sub tag_KCFGFILES(); -sub tag_SUBDIRS(); -sub tag_ICON(); -sub tag_CLOSURE(); -sub tag_NO_UNDEFINED(); -sub tag_NMCHECK(); -sub tag_DIST(); -sub tag_KDEINIT(); - -# Some global globals... -$verbose = 0; # a debug flag -$thisProg = "$0"; # This programs name -$topdir = cwd(); # The current directory -@makefiles = (); # Contains all the files we'll process -@foreignfiles = (); -$start = (times)[0]; # some stats for testing - comment out for release -$version = "v0.2"; -$errorflag = 0; -$cppExt = "(cpp|cc|cxx|C|c\\+\\+)"; -$hExt = "(h|H|hh|hxx|hpp|h\\+\\+)"; -$progId = "KDE tags expanded automatically by " . basename($thisProg); -$automkCall = "\n"; -$printname = ""; # used to display the directory the Makefile is in -$use_final = 1; # create code for --enable-final -$cleantarget = "clean"; -$dryrun = 0; -$pathoption = 0; -$foreign_libtool = 0; - -while (defined ($ARGV[0])) -{ - $_ = shift; - if (/^--version$/) - { - print STDOUT "\n"; - print STDOUT basename($thisProg), " $version\n", - "This is really free software, unencumbered by the GPL.\n", - "You can do anything you like with it except sueing me.\n", - "Copyright 1998 Kalle Dalheimer \n", - "Concept, design and unnecessary questions about perl\n", - " by Matthias Ettrich \n\n", - "Making it useful by Stephan Kulow and\n", - "Harri Porten \n", - "Updated (Feb-1999), John Birch \n", - "Fixes and Improvements by Dirk Mueller \n", - "Current Maintainer Stephan Kulow\n\n"; - exit 0; - } - elsif (/^--verbose$|^-v$/) - { - $verbose = 1; # Oh is there a problem...? - } - elsif (/^(?:-p|--path=)(.+)$/) - { - my $p = $1; - $thisProg = $p . "/". basename($thisProg); - warn ("$thisProg doesn't exist\n") if (!(-f $thisProg)); - $thisProg .= " -p".$p; - $pathoption=1; - } - elsif (/^--help$|^-h$/) - { - print STDOUT "Usage $thisProg [OPTION] ... [dir/Makefile.in]...\n", - "\n", - "Patches dir/Makefile.in generated by automake\n", - "(where dir can be an absolute or relative directory name)\n", - "\n", - " -v, --verbose verbosely list files processed\n", - " -h, --help print this help, then exit\n", - " --version print version number, then exit\n", - " -p, --path= use the path to am_edit if the path\n", - " called from is not the one to be used\n", - " --no-final don't patch for --enable-final\n"; - - exit 0; - } - elsif (/^--no-final$/) - { - $use_final = 0; - $thisProg .= " --no-final"; - } - elsif (/^--foreign-libtool$/) - { - $foreign_libtool = 1; - $thisProg .= " --foreign-libtool"; - } - elsif (/^-n$/) - { - $dryrun = 1; - } - else - { - # user selects what input files to check - # add full path if relative path is given - $_ = cwd()."/".$_ if (! /^\//); - print "User wants $_\n" if ($verbose); - push (@makefiles, $_); - } -} - -if ($thisProg =~ /^\// && !$pathoption ) -{ - print STDERR "Illegal full pathname call performed...\n", - "The call to \"$thisProg\"\nwould be inserted in some Makefile.in.\n", - "Please use option --path.\n"; - exit 1; -} - -# Only scan for files when the user hasn't entered data -if (!@makefiles) -{ - print STDOUT "Scanning for Makefile.in\n" if ($verbose); - find (\&add_makefile, cwd()); - #chdir('$topdir'); -} else { - print STDOUT "Using input files specified by user\n" if ($verbose); -} - -foreach $makefile (sort(@makefiles)) -{ - processMakefile ($makefile); - last if ($errorflag); -} - -# Just some debug statistics - comment out for release as it uses printf. -printf STDOUT "Time %.2f CPU sec\n", (times)[0] - $start if ($verbose); - -exit $errorflag; # causes make to fail if erroflag is set - -#----------------------------------------------------------------------------- - -# In conjunction with the "find" call, this builds the list of input files -sub add_makefile () -{ - push (@makefiles, $File::Find::name) if (/Makefile.in$/); -} - -#----------------------------------------------------------------------------- - -# Processes a single make file -# The parameter contains the full path name of the Makefile.in to use -sub processMakefile ($) -{ - # some useful globals for the subroutines called here - local ($makefile) = @_; - local @headerdirs = ('.'); - local $haveAutomocTag = 0; - local $MakefileData = ""; - - local $cxxsuffix = "KKK"; - - local @programs = (); # lists the names of programs and libraries - local $program = ""; - - local @kdeinits = (); # lists the kdeinit targets - - local %realObjs = (); # lists the objects compiled into $program - local %sources = (); # lists the sources used for $program - local %finalObjs = (); # lists the objects compiled when final - local %realname = (); # the binary name of program variable - local %idlfiles = (); # lists the idl files used for $program - local %globalmocs = ();# list of all mocfiles (in %mocFiles format) - local %important = (); # list of files to be generated asap - local %uiFiles = (); - local %kcfgFiles = (); - - local $allidls = ""; - local $idl_output = "";# lists all idl generated files for cleantarget - local $ui_output = "";# lists all uic generated files for cleantarget - local $kcfg_output = "";# lists all kcfg generated files for cleantarget - - local %dependmocs = (); - - local $metasourceTags = 0; - local $dep_files = ""; - local $dep_finals = ""; - local %target_adds = (); # the targets to add - local %rule_adds = (); - local $kdelang = ""; - local @cleanfiles = (); - local $cleanMoc = ""; - local $closure_output = ""; - - local %varcontent = (); - - $makefileDir = dirname($makefile); - chdir ($makefileDir); - $printname = $makefile; - $printname =~ s/^\Q$topdir\E\///; - $makefile = basename($makefile); - - print STDOUT "Processing makefile $printname\n" if ($verbose); - - # Setup and see if we need to do this. - return if (!initialise()); - - tag_AUTOMAKE (); # Allows a "make" to redo the Makefile.in - tag_META_INCLUDES (); # Supplies directories for src locations - - foreach $program (@programs) { - $sources_changed{$program} = 0; - $dependmocs{$program} = ""; - $important{$program} = ""; - tag_IDLFILES(); # Sorts out idl rules - tag_NO_UNDEFINED(); - tag_CLOSURE(); - tag_NMCHECK(); - tag_UIFILES(); # Sorts out ui rules - tag_KCFGFILES(); # Sorts out kcfg rules - tag_METASOURCES (); # Sorts out the moc rules - if ($sources_changed{$program}) { - my $lookup = $program . '_SOURCES\s*=[ \t]*(.*)'; - - if($program =~ /libkdeinit_(.*)/) { - my $prog = $1; - substituteLine($prog . '_SOURCES\s*=[ \t]*(.*)', - "${prog}_SOURCES = ${prog}_dummy.$cxxsuffix\n" . - "libkdeinit_${prog}_SOURCES = " . $sources{$program}); - $sources{$prog} = "${prog}_dummy.$cxxsuffix"; - } - else { - substituteLine($lookup, "$program\_SOURCES=" . $sources{$program}); - } - } - if ($important{$program}) { - local %source_dict = (); - for $source (split(/[\034\s]+/, $sources{$program})) { - $source_dict{$source} = 1; - } - for $source (@cleanfiles) { - $source_dict{$source} = 0; - } - for $source (keys %source_dict) { - next if (!$source); - if ($source_dict{$source}) { - # sanity check - if (! -f $source) { - print STDERR "Error: $source is listed in a _SOURCE line in $printname, but doesn't exist yet. Put it in DISTCLEANFILES!\n"; - } else { - $target_adds{"\$(srcdir)/$source"} .= $important{$program}; - } - } - } - } - } - if ($cleanMoc) { - # Always add dist clean tag - # Add extra *.moc.cpp files created for USE_AUTOMOC because they - # aren't included in the normal *.moc clean rules. - appendLines ("$cleantarget-metasources:\n\t-rm -f $cleanMoc\n"); - $target_adds{"$cleantarget-am"} .= "$cleantarget-metasources "; - } - - tag_DIST() unless ($kdeopts{"noautodist"}); - - if ($idl_output) { - appendLines ("$cleantarget-idl:\n\t-rm -f $idl_output\n"); - $target_adds{"$cleantarget-am"} .= "$cleantarget-idl "; - } - - if ($ui_output) { - appendLines ("$cleantarget-ui:\n\t-rm -f $ui_output\n"); - $target_adds{"$cleantarget-am"} .= "$cleantarget-ui "; - } - - if ($kcfg_output) { - appendLines ("$cleantarget-kcfg:\n\t-rm -f $kcfg_output\n"); - $target_adds{"$cleantarget-am"} .= "$cleantarget-kcfg "; - } - - if ($closure_output) { - appendLines ("$cleantarget-closures:\n\t-rm -f $closure_output\n"); - $target_adds{"$cleantarget-am"} .= "$cleantarget-closures "; - } - - if ($MakefileData =~ /\nKDE_LANG\s*=\s*(\S*)\s*\n/) { - $kdelang = '$(KDE_LANG)' - } else { - $kdelang = ''; - } - - tag_POFILES (); # language rules for po directory - tag_DOCFILES (); # language rules for doc directories - tag_LOCALINSTALL(); # add $(DESTDIR) before all kde_ dirs - tag_ICON(); - tag_SUBDIRS(); - - my $tmp = "force-reedit:\n"; - $tmp .= "\t$automkCall\n\tcd \$(top_srcdir) && perl $thisProg $printname\n\n"; - appendLines($tmp); - - make_bcheck_target(); - make_meta_classes(); - tag_COMPILE_FIRST(); - tag_FINAL() if (!$kdeopts{"nofinal"}); - - my $final_lines = "final:\n\t\$(MAKE) "; - my $final_install_lines = "final-install:\n\t\$(MAKE) "; - my $nofinal_lines = "no-final:\n\t\$(MAKE) "; - my $nofinal_install_lines = "no-final-install:\n\t\$(MAKE) "; - - foreach $program (@programs) { - my $lookup = $program . '_OBJECTS\s*=[ \t]*.*'; - my $new = ""; - my @list = split(/[\034\s]+/, $realObjs{$program}); - if (!$kdeopts{"nofinal"} && @list > 1 && $finalObjs{$program}) { - $new .= "$program\_final\_OBJECTS = " . $finalObjs{$program}; - $new .= "\n$program\_nofinal\_OBJECTS = " . $realObjs{$program}; - $new .= "\n\@KDE_USE_FINAL_FALSE\@$program\_OBJECTS = \$($program\_nofinal\_OBJECTS)"; - $new .= "\n\@KDE_USE_FINAL_TRUE\@$program\_OBJECTS = \$($program\_final\_OBJECTS)"; - - $final_lines .= "$program\_OBJECTS=\"\$($program\_final_OBJECTS)\" "; - $final_install_lines .= "$program\_OBJECTS=\"\$($program\_final_OBJECTS)\" "; - $nofinal_lines .= "$program\_OBJECTS=\"\$($program\_nofinal\_OBJECTS)\" "; - $nofinal_install_lines .= "$program\_OBJECTS=\"\$($program\_nofinal_OBJECTS)\" "; - } else { - $new = "$program\_OBJECTS = " . $realObjs{$program}; - } - if($MakefileData =~ m/\n$lookup/) { - substituteLine ($lookup, $new); - } - else { - appendLines("$new\n"); - } - } - appendLines($final_lines . "all-am\n"); - appendLines($final_install_lines . "install-am\n"); - appendLines($nofinal_lines . "all-am\n"); - appendLines($nofinal_install_lines . "install-am\n"); - - my $lookup = '(\@\S+\@)?DEP_FILES\s*=[ \t]*(.*)'; - if ($MakefileData =~ /\n$lookup/) { - my $condition = $1; - my $depfiles = $2; - my $workfiles; - - if ($dep_finals) { - # Add the conditions on every line, since - # there may be line continuations in the list. - $workfiles = "$dep_files $dep_finals $depfiles"; - $workfiles =~ s/\034/\034$condition\@KDE_USE_FINAL_TRUE\@\t/g; - $lines = "$condition\@KDE_USE_FINAL_TRUE\@DEP_FILES = $workfiles\n"; - $workfiles = "$dep_files $depfiles"; - $workfiles =~ s/\034/\034$condition\@KDE_USE_FINAL_FALSE\@\t/g; - $lines .= "$condition\@KDE_USE_FINAL_FALSE\@DEP_FILES = $workfiles"; - } else { - $workfiles = "$dep_files $depfiles"; - $workfiles =~ s/\034/\034$condition\t/g; - $lines = $condition . "DEP_FILES = $workfiles"; - } - substituteLine($lookup, $lines); - } - - # new recursive targets - $target_adds{ "nmcheck" } .= ""; # always create nmcheck target - $target_adds{ "nmcheck-am" } .= "nmcheck"; - $lookup = 'RECURSIVE_TARGETS\s*=[ \t]*(.*)'; - if ($MakefileData =~ /\n$lookup/) { - substituteLine($lookup, "RECURSIVE_TARGETS = $1 nmcheck-recursive bcheck-recursive"); - } - - $cvs_lines = "kde-rpo-clean:\n"; - $cvs_lines .= "\t-rm -f *.rpo\n"; - appendLines($cvs_lines); - $target_adds{"clean"} .= "kde-rpo-clean "; - - my %target_dels = ("install-data-am" => ""); - - # some strange people like to do a install-exec, and expect that also - # all modules are installed. automake doesn't know this, so we need to move - # this here from install-data to install-exec. - if ($MakefileData =~ m/\nkde_module_LTLIBRARIES\s*=/) { -# $target_adds{"install-exec-am"} .= "install-kde_moduleLTLIBRARIES "; -# don't use $target_adds here because we need to append the dependency, not -# prepend it. Fixes #44342 , when a module depends on a lib in the same dir -# and libtool needs it during relinking upon install (Simon) - my $lookup = "install-exec-am:([^\n]*)"; - if($MakefileData =~ /\n$lookup\n/) { - substituteLine("$lookup", "install-exec-am: $1 install-kde_moduleLTLIBRARIES"); - } - $target_dels{"install-data-am"} .= "install-kde_moduleLTLIBRARIES "; - $target_adds{"install-data-am"} .= " "; - } - - my $lines = ""; - - foreach $add (keys %target_adds) { - my $lookup = quotemeta($add) . ':([^\n]*)'; - if ($MakefileData =~ /\n$lookup\n/) { - my $newlines = $1; - my $oldlines = $lookup; - if (defined $target_dels{$add}) { - foreach $del (split(' ', $target_dels{$add})) { - $newlines =~ s/\s*$del\s*/ /g; - } - } - substituteLine($oldlines, "$add: " . $target_adds{$add} . $newlines); - } else { - $lines .= "$add: " . $target_adds{$add} . "\n"; - } - } - - appendLines($lines) if ($lines); - - $lines = join("\n", values %rule_adds); - appendLines($lines) if ($lines); - - my $found = 1; - - while ($found) { - if ($MakefileData =~ m/\n(.*)\$\(CXXFLAGS\)(.*)\n/) { - my $stuff_before = $1; - my $stuff_after = $2; - my $lookup = quotemeta("$1\$(CXXFLAGS)$2"); - my $replacement = "$1\$(KCXXFLAGS)$2"; - $MakefileData =~ s/$lookup/$replacement/; - $lookup =~ s/\\\$\\\(CXXFLAGS\\\)/\\\$\\\(KCXXFLAGS\\\)/; - $replacement = "$stuff_before\$(KCXXFLAGS) \$(KDE_CXXFLAGS)$stuff_after"; - next if ($stuff_before =~ /\$\(KDE_CXXFLAGS\)/ or $stuff_after =~ /\$\(KDE_CXXFLAGS\)/); - substituteLine($lookup, $replacement); - } else { - $found = 0; - } - } - - if($foreign_libtool == 0) { - $lookup = '(\n[^#].*\$\(LIBTOOL\) --mode=link) (\$\(CXXLD\).*\$\(KCXXFLAGS\))'; - - if ($MakefileData =~ m/$lookup/ ) { - $MakefileData =~ s/$lookup/$1 --tag=CXX $2/; - } - - $lookup = '(\n[^#].*\$\(LIBTOOL\) --mode=compile)\s+(\$\(CXX\)\s+)'; - if ($MakefileData =~ m/$lookup/ ) { - $MakefileData =~ s/$lookup/$1 --tag=CXX $2/; - } - } - - $MakefileData =~ s/\$\(KCXXFLAGS\)/\$\(CXXFLAGS\)/g; - - $lookup = '(.*)cp -pr \$\$/\$\$file \$\(distdir\)/\$\$file(.*)'; - if ($MakefileData =~ m/\n$lookup\n/) { - substituteLine($lookup, "$1cp -pr \$\$d/\$\$file \$(distdir)/\$\$file$2"); - } - - # Always update the Makefile.in - updateMakefile (); - return; -} - -#----------------------------------------------------------------------------- - -# Beware: This procedure is not complete. E.g. it also parses lines -# containing a '=' in rules (for instance setting shell vars). For our -# usage this us enough, though. -sub read_variables () -{ - while ($MakefileData =~ /\n\s*(\S+)\s*=([^\n]*)/g) { - $varcontent{$1} = $2; - } -} - -# Check to see whether we should process this make file. -# This is where we look for tags that we need to process. -# A small amount of initialising on the tags is also done here. -# And of course we open and/or create the needed make files. -sub initialise () -{ - if (! -r "Makefile.am") { - print STDOUT "found Makefile.in without Makefile.am\n" if ($verbose); - return 0; - } - - # Checking for files to process... - - open (FILEIN, $makefile) || die "Can't open $makefileDir/$makefile: $!\n"; - # perl bug in 5.8.0: in utf8 mode it badly screws up - binmode(FILEIN, ":bytes") if ($] >= 5.008); - # Read the file - # stat(FILEIN)[7] might look more elegant, but is slower as it - # requires stat'ing the file - seek(FILEIN, 0, 2); - my $fsize = tell(FILEIN); - seek(FILEIN, 0, 0); - read FILEIN, $MakefileData, $fsize; - close FILEIN; - print "DOS CRLF within $makefileDir/$makefile!\n" if($MakefileData =~ y/\r//d); - - # Remove the line continuations, but keep them marked - # Note: we lose the trailing spaces but that's ok. - # Don't mangle line-leading spaces (usually tabs) - # since they're important. - $MakefileData =~ s/\\\s*\n/\034/g; - - # If we've processed the file before... - restoreMakefile () if ($MakefileData =~ /$progId/); - - foreach $dir (@foreignfiles) { - if (substr($makefileDir,0,length($dir)) eq $dir) { - return 0; - } - } - - %kdeopts = (); - $kdeopts{"foreign"} = 0; - $kdeopts{"qtonly"} = 0; - $kdeopts{"noautodist"} = 0; - $kdeopts{"foreign-libtool"} = $foreign_libtool; - $kdeopts{"nofinal"} = !$use_final; # default - - read_variables(); - - if ($MakefileData =~ /\nKDE_OPTIONS\s*=[ \t]*([^\n]*)\n/) { - my $kde_options_str = $1; - local @kde_options = split(/[\034\s]+/, $kde_options_str); - if (grep(/^foreign$/, @kde_options)) { - push(@foreignfiles, $makefileDir . "/"); - return 0; # don't touch me - } - for $opt (@kde_options) { - if (!defined $kdeopts{$opt}) { - print STDERR "Warning: unknown option $opt in $printname\n"; - } else { - $kdeopts{$opt} = 1; - } - } - } - - # Look for the tags that mean we should process this file. - $metasourceTags = 0; - $metasourceTags++ while ($MakefileData =~ /\n[^=\#]*METASOURCES\s*=/g); - - my $pofileTag = 0; - $pofileTag++ while ($MakefileData =~ /\nPOFILES\s*=/g); - if ($pofileTag > 1) - { - print STDERR "Error: Only one POFILES tag allowed\n"; - $errorflag = 1; - } - - while ($MakefileData =~ /\n\.SUFFIXES:([^\n]+)\n/g) { - my $suffixes_str = $1; - my @list=split(' ', $suffixes_str); - foreach $ext (@list) { - if ($ext =~ /^\.$cppExt$/) { - $cxxsuffix = $ext; - $cxxsuffix =~ s/\.//g; - print STDOUT "will use suffix $cxxsuffix\n" if ($verbose); - last; - } - } - } - - tag_KDEINIT(); - - while ($MakefileData =~ /\n(\S*)_OBJECTS\s*=[\034 \t]*([^\n]*)\n/g) { - - my $program = $1; - my $objs = $2; # safe them - - my $ocv = 0; - - my @objlist = split(/[\034\s]+/, $objs); - foreach $obj (@objlist) { - if ($obj =~ /(\S*)\$\((\S+)\)/ ) { - my $pre = $1; - my $variable = $2; - if ($pre eq '' && exists($varcontent{$variable})) { - my @addlist = split(/[\034\s]+/, $varcontent{$variable}); - push(@objlist, @addlist); - } elsif ($variable !~ 'OBJEXT' && $variable !~ /am__objects_\d+/ ) { - $ocv = 1; - } - } - } - - next if ($ocv); - next if ($program =~ /^am_libkdeinit_/); - - $program =~ s/^am_// if ($program =~ /^am_/); - - my $sourceprogram = $program; - $sourceprogram =~ s/\@am_/\@/ if($sourceprogram =~ /^.*\@am_.+/); - - print STDOUT "found program $program\n" if ($verbose); - push(@programs, $program); - - $realObjs{$program} = $objs; - - if ($MakefileData =~ /\n$sourceprogram\_SOURCES\s*=[ \t]*(.*)\n/) { - $sources{$program} = $1; - } - else { - $sources{$program} = ""; - print STDERR "found program with no _SOURCES: $program\n"; - } - - my $realprogram = $program; - $realprogram =~ s/_/./g; # unmask to regexp - if ($MakefileData =~ /\n($realprogram)(\$\(EXEEXT\)?)?:.*\$\($program\_OBJECTS\)/) { - $realname{$program} = $1; - } else { - # not standard Makefile - nothing to worry about - $realname{$program} = ""; - } - } - - my $lookup = 'DEPDIR\s*=.*'; - if ($MakefileData !~ /\n$lookup/) { - $lookup = 'bindir\s*=[ \t]*.*'; - substituteLine($lookup, "DEPDIR = .deps\n$1") if ($MakefileData =~ /\n($lookup)/); - } - - my @marks = ('MAINTAINERCLEANFILES', 'CLEANFILES', 'DISTCLEANFILES'); - foreach $mark (@marks) { - while ($MakefileData =~ /\n($mark)\s*=[ \t]*([^\n]*)/g) { - my $clean_str = $2; - foreach $file (split('[\034\s]+', $clean_str)) { - $file =~ s/\.\///; - push(@cleanfiles, $file); - } - } - } - - my $localTag = 0; - $localTag++ if ($MakefileData =~ /\ninstall-\S+-local:/); - - return (!$errorflag); -} - -#----------------------------------------------------------------------------- - -# Gets the list of user defined directories - relative to $srcdir - where -# header files could be located. -sub tag_META_INCLUDES () -{ - my $lookup = '[^=\n]*META_INCLUDES\s*=[ \t]*(.*)'; - return 1 if ($MakefileData !~ /($lookup)\n/); - print STDOUT "META_INCLUDE processing <$1>\n" if ($verbose); - - my $headerStr = $2; - removeLine ($lookup, $1); - - my @headerlist = split(/[\034\s]+/, $headerStr); - - foreach $dir (@headerlist) - { - $dir =~ s#\$\(srcdir\)#.#; - if (! -d $dir) - { - print STDERR "Warning: $dir can't be found. ", - "Must be a relative path to \$(srcdir)\n"; - } - else - { - push (@headerdirs, $dir); - } - } - - return 0; -} - -#----------------------------------------------------------------------------- - -sub tag_FINAL() -{ - my @final_names = (); - - foreach $program (@programs) { - - if ($sources{$program} =~ /\(/) { - print STDOUT "found ( in $program\_SOURCES. skipping\n" if ($verbose); - next; - } - - my $mocs = ""; # Moc files (in this program) - my $moc_cpp_added = 0; # If we added some .moc.cpp files, due to - # no other .cpp file including the .moc one. - - my @progsources = split(/[\034\s]+/, $sources{$program}); - my %shash = (); - @shash{@progsources} = 1; # we are only interested in the existence - my %sourcelist = (); - my %extradeps = (); - - foreach $source (@progsources) { - my $suffix = $source; - $suffix =~ s/^.*\.([^\.]+)$/$1/; - - $sourcelist{$suffix} .= "$source "; - } - foreach my $mocFile (keys (%globalmocs)) - { - my ($dir, $hFile, $cppFile) = split ("\035", $globalmocs{$mocFile}, 3); - if (defined ($cppFile)) { - $mocs .= " $mocFile.moc" if exists $shash{$cppFile}; - } else { - $sourcelist{$cxxsuffix} .= "$mocFile.moc.$cxxsuffix "; - $moc_cpp_added = 1; - } - } - - # scan for extra given dependencies and add them to our target - while ($MakefileData =~ /\n\s*(\S+)\.(?:lo|o)\s*:([^\n]*)/g) { - $extradeps{$1} = $2; - } - - foreach $suffix (keys %sourcelist) { - # See if this file contains c++ code. (i.e., just check the file's suffix against c++ extensions) - my $suffix_is_cxx = 0; - if($suffix =~ /($cppExt)$/) { - $cxxsuffix = $1; - $suffix_is_cxx = 1; - } - - my $mocfiles_in = ($suffix eq $cxxsuffix) && $moc_cpp_added; - - my @sourcelist = split(/[\034\s]+/, $sourcelist{$suffix}); - - if ((@sourcelist == 1 && !$mocfiles_in) || $suffix_is_cxx != 1 ) { - - # we support IDL on our own - if ($suffix eq "skel" || $suffix =~ /^stub/ - || $suffix =~ /^signals/ # obsolete, remove in KDE-4 - || $suffix eq "h" || $suffix eq "ui" - || $suffix eq "kcfgc" ) { - next; - } - - foreach $file (@sourcelist) { - $file =~ s/\Q$suffix\E$//; - - $finalObjs{$program} .= $file; - if ($program =~ /_la$/) { - $finalObjs{$program} .= "lo "; - } else { - $finalObjs{$program} .= "o "; - } - } - next; # suffix - } - - my $source_deps = ""; - foreach $source (@sourcelist) { - if (-f $source) { - $source_deps .= " \$(srcdir)/$source"; - } else { - $source_deps .= " $source"; - } - my $plainsource = $source; - $plainsource =~ s/\.$cppExt$//; - $source_deps .= " " . $extradeps{$plainsource} if (exists($extradeps{$plainsource})); - } - - $handling = "$program.all_$suffix.$suffix: \$(srcdir)/Makefile.in" . $source_deps . " " . join(' ', $mocs) . "\n"; - $handling .= "\t\@echo 'creating $program.all_$suffix.$suffix ...'; \\\n"; - $handling .= "\trm -f $program.all_$suffix.files $program.all_$suffix.final; \\\n"; - $handling .= "\techo \"#define KDE_USE_FINAL 1\" >> $program.all_$suffix.final; \\\n"; - $handling .= "\tfor file in " . $sourcelist{$suffix} . "; do \\\n"; - $handling .= "\t echo \"#include \\\"\$\$file\\\"\" >> $program.all_$suffix.files; \\\n"; - $handling .= "\t test ! -f \$\(srcdir\)/\$\$file || egrep '^#pragma +implementation' \$\(srcdir\)/\$\$file >> $program.all_$suffix.final; \\\n"; - $handling .= "\tdone; \\\n"; - $handling .= "\tcat $program.all_$suffix.final $program.all_$suffix.files > $program.all_$suffix.$suffix; \\\n"; - $handling .= "\trm -f $program.all_$suffix.final $program.all_$suffix.files\n"; - - appendLines($handling); - - push(@final_names, "$program.all_$suffix.$suffix"); - my $finalObj = "$program.all_$suffix."; - if ($program =~ /_la$/) { - $finalObj .= "lo"; - } else { - $finalObj .= "o"; - } - $finalObjs{$program} .= $finalObj . " "; - } - } - - if (!$kdeopts{"nofinal"} && @final_names >= 1) { - # add clean-final target - my $lines = "$cleantarget-final:\n"; - $lines .= "\t-rm -f " . join(' ', @final_names) . "\n" if (@final_names); - appendLines($lines); - $target_adds{"$cleantarget-am"} .= "$cleantarget-final "; - - foreach $finalfile (@final_names) { - $finalfile =~ s/\.[^.]*$/.P/; - $dep_finals .= " \$(DEPDIR)/$finalfile"; - } - } -} - -sub tag_KDEINIT() -{ - my @progs = (); - my $ltlibs = ""; - my $lookup = 'kdeinit_LTLIBRARIES\s*=[ \t]*(.*)'; - - if ($MakefileData =~ m/\n$lookup/) { - @kdeinits = split(/[\034\s]+/, $1); - my $lines = ""; - foreach my $kdeinit (@kdeinits) { - if ($kdeinit =~ m/\.la$/) { - $kdeinit =~ s/\.la$//; - push(@progs, $kdeinit); - - $lines .= "\n${kdeinit}.la.$cxxsuffix:\n"; - $lines .= "\techo 'extern \"C\" int kdemain(int argc, char* argv[]);' > ${kdeinit}.la.$cxxsuffix; \\\n"; - $lines .= "\techo 'int main(int argc, char* argv[]) { return kdemain(argc,argv); }' >> ${kdeinit}.la.$cxxsuffix\n"; - - $lines .= "\n${kdeinit}_dummy.$cxxsuffix:\n"; - $lines .= "\techo '#include ' > ${kdeinit}_dummy.$cxxsuffix; \\\n"; - $lines .= "\techo 'extern \"C\" int kdemain(int argc, char* argv[]);' >> ${kdeinit}_dummy.$cxxsuffix; \\\n"; - $lines .= "\techo 'extern \"C\" KDE_EXPORT int kdeinitmain(int argc, char* argv[]) { return kdemain(argc,argv); }' >> ${kdeinit}_dummy.$cxxsuffix\n"; - - push(@cleanfiles, "${kdeinit}.la.$cxxsuffix"); - push(@cleanfiles, "${kdeinit}_dummy.$cxxsuffix"); - - # add dependency - $dep_files .= " \$(DEPDIR)/${kdeinit}.la.Po" if($dep_files !~/${kdeinit}.la.Po/ ); - $dep_files .= " \$(DEPDIR)/${kdeinit}_dummy.Plo" if($dep_files !~/${kdeinit}_dummy.Plo/ ); - - # make library - $lookup = $kdeinit . '_la_LIBADD\s*=[ \t]*(.*)'; - if($MakefileData =~ m/\n$lookup/) { - my $libadd = $1; - substituteLine($lookup, "${kdeinit}_la_LIBADD = libkdeinit_${kdeinit}.la"); - appendLines("libkdeinit_${kdeinit}_la_LIBADD = $libadd\n"); - } - appendLines("libkdeinit_${kdeinit}_la_LDFLAGS = -no-undefined -avoid-version \$(all_libraries)\n"); - - # add library dependencies - $lookup = $kdeinit . '_la_DEPENDENCIES\s*=[ \t]*(.*)'; - if($MakefileData =~ m/\n$lookup/) { - my $libdeps = $1; - substituteLine($lookup, "${kdeinit}_la_DEPENDENCIES = libkdeinit_${kdeinit}.la"); - appendLines("libkdeinit_${kdeinit}_la_DEPENDENCIES = $libdeps\n"); - } - - # make library objects - $lookup = "am_${kdeinit}_la_OBJECTS" . '\s*=[ \t]*(.*)'; - if($MakefileData =~ m/\n$lookup/) { - my $libobjects = $1; - substituteLine($lookup, "am_${kdeinit}_la_OBJECTS = ${kdeinit}_dummy.lo"); - appendLines("am_libkdeinit_${kdeinit}_la_OBJECTS = $libobjects\n"); - my $prog = "libkdeinit_${kdeinit}_la"; - push(@programs, $prog); - $realObjs{$prog} = $libobjects; - $realname{$prog} = "libkdeinit_${kdeinit}.la"; - } - $target_adds{"libkdeinit_${kdeinit}.la"} = "\$(libkdeinit_${kdeinit}_la_OBJECTS) \$(libkdeinit_${kdeinit}_la_DEPENDENCIES)\n" . - "\t\$(CXXLINK) -rpath \$(libdir) \$(libkdeinit_${kdeinit}_la_LDFLAGS) ". - "\$(libkdeinit_${kdeinit}_la_OBJECTS) " . - "\$(libkdeinit_${kdeinit}_la_LIBADD) " . - "\$(LIBS)\n"; - - # make libkdeinit sources - $lookup = $kdeinit . '_la_SOURCES\s*=[ \t]*(.*)'; - if($MakefileData =~ m/\n$lookup/) { - my $srces = $1; - $sources_changed{"libkdeinit_${kdeinit}_la"} = 1; - $sources{"libkdeinit_${kdeinit}_la"} = $srces; - } - - # make libkdeinit metasources - $lookup = $kdeinit . '_la_METASOURCES\s*=[ \t]*(.*)'; - substituteLine($lookup, "libkdeinit_${kdeinit}_la_METASOURCES = $1") - if($MakefileData =~ m/\n$lookup/); - -=cut - # make binary sources - $lookup = $kdeinit. '_SOURCES\s*=[ \t]*(.*)'; - if($MakefileData =~ m/\n$lookup/) { - substituteLine($lookup, "${kdeinit}_SOURCES = ${kdeinit}.la.$cxxsuffix"); - $lookup = 'SOURCES\s*=[ \t]*(.*)'; - if($MakefileData =~ m/\n$lookup/) { - my $srces = $1; - $srces =~ s/\b$kdeinit\.c\b/\$(${kdeinit}_SOURCES)/; - $srces =~ s/\$\(${kdeinit}_la_SOURCES\)/\$(libkdeinit_${kdeinit}_la_SOURCES)/; - substituteLine($lookup, "SOURCES = $srces"); - } - $lookup = 'DIST_SOURCES\s*=[ \t](.*)'; - if($MakefileData =~ m/\n$lookup/) { - my $srces = $1; - $srces =~ s/\b$kdeinit\.c\b/\$(${kdeinit}_SOURCES)/; - $srces =~ s/\$\(${kdeinit}_la_SOURCES\)/\$(libkdeinit_${kdeinit}_la_SOURCES)/; - substituteLine($lookup, "DIST_SOURCES = $srces"); - } - } - - # make binary objects / libs - $lookup = $kdeinit . '_OBJECTS\s*=[ \t]*.*'; - if($MakefileData =~ m/\n$lookup/) { - $realObjs{$kdeinit} = "${kdeinit}.la.\$(OBJEXT)"; - substituteLine("${kdeinit}_LDFLAGS\\s*=.*", "${kdeinit}_LDFLAGS = \$(all_libraries)"); - substituteLine("${kdeinit}_LDADD\\s*=.*", "${kdeinit}_LDADD = libkdeinit_${kdeinit}.la"); - substituteLine("${kdeinit}_DEPENDENCIES\\s*=.*", "${kdeinit}_DEPENDENCIES = libkdeinit_${kdeinit}.la"); - } -=cut - # add binary - push(@programs, $kdeinit); - $realObjs{$kdeinit} = "${kdeinit}.la.\$(OBJEXT)"; - $realname{$kdeinit} = $kdeinit; - $sources{$kdeinit} = "${kdeinit}.la.$cxxsuffix"; - - $lines .= "${kdeinit}_LDFLAGS = \$(KDE_RPATH) -no-undefined \$(all_libraries)\n"; - $lines .= "${kdeinit}_LDADD = libkdeinit_${kdeinit}.la\n"; - $lines .= "${kdeinit}_DEPENDENCIES = libkdeinit_${kdeinit}.la\n"; - - $target_adds{"${kdeinit}\$(EXEEXT)"} = - "\$(${kdeinit}_OBJECTS) \$(${kdeinit}_DEPENDENCIES)\n" . - "\t\@rm -f ${kdeinit}\$(EXEEXT)\n" . - "\t\$(CXXLINK) \$(${kdeinit}_LDFLAGS) \$(${kdeinit}_OBJECTS) \$(${kdeinit}_LDADD) \$(LIBS)\n"; - - $ltlibs .= " libkdeinit_${kdeinit}.la"; - } - } - appendLines($lines); - - # add libkdeinit target - $lookup = 'lib_LTLIBRARIES\s*=[ \t]*(.*)'; - if($MakefileData =~ m/\n$lookup/) { - substituteLine($lookup, "lib_LTLIBRARIES = $1 $ltlibs"); - } - else { - print STDERR - "Error: lib_LTLIBRARIES missing in $printname (required for kdeinit_LTLIBRARIES).\n"; - $errorflag = 1; - } - } - - if($#progs >= 0) { - if($MakefileData !~ m/\nbin_PROGRAMS\s*=/) { - print STDERR "Error: bin_PROGRAMS missing in $printname (required for kdeinit_LTLIBRARIES).\n"; - $errorflag = 1; - } - else { - # add our new progs to SOURCES, DIST_SOURCES and bin_PROGRAMS - my $progsources = ""; - my $progexes = ""; - foreach my $p (@progs) { - $progsources .= "\$(${p}_SOURCES) "; - $progexes .= "${p}\$(EXEEXT) "; - } - $lookup = 'SOURCES\s*=[ \t]*(.*)'; - if($MakefileData =~ /\n$lookup/) { - substituteLine($lookup, "SOURCES = $1 $progsources"); - } - $lookup = 'DIST_SOURCES\s*=[ \t]*(.*)'; - if($MakefileData =~ /\n$lookup/) { - substituteLine($lookup, "DIST_SOURCES = $1 $progsources"); - } - # bin_PROGRAMS is complicated, as it exists twice, so we do a little - # magic trick here - $lookup = 'PROGRAMS\s*=[ \t]*(.*)'; - if ($MakefileData =~ /\n$lookup/) { - substituteLine($lookup, "bin_PROGRAMS += $progexes\nPROGRAMS = $1"); - } - } - } -} - -#----------------------------------------------------------------------------- - -sub tag_COMPILE_FIRST() -{ - foreach $program (@programs) { - my $lookup = "$program" . '_COMPILE_FIRST\s*=[ \t]*(.*)'; - if ($MakefileData =~ m/\n$lookup\n/) { - my $compilefirst_str = $1; - my @compilefirst = split(/[\034\s]+/, $compilefirst_str); - my @progsources = split(/[\034\s]+/, $sources{$program}); - my %donesources = (); - foreach $source (@progsources) { - my @deps = (); - my $sdeps = ""; - if (-f $source) { - $sdeps = "\$(srcdir)/$source"; - } else { - $sdeps = "$source"; - } - foreach $depend (@compilefirst) { - next if ($source eq $depend); - # avoid cyclic dependencies - next if defined($donesources{$depend}); - push @deps, $depend; - } - $target_adds{$sdeps} .= join(' ', @deps) . ' ' if (@deps); - $donesources{$source} = 1; - } - } - } -} - -#----------------------------------------------------------------------------- - - -# Organises the list of headers that we'll use to produce moc files -# from. -sub tag_METASOURCES () -{ - local @newObs = (); # here we add to create object files - local @depend = (); # here we add to create moc files - local $mocExt = ".moc"; - local %mocFiles = (); - - my $line = ""; - my $postEqual = ""; - - my $lookup; - my $found = ""; - if ($metasourceTags > 1) { - $lookup = $program . '_METASOURCES\s*=\s*(.*)'; - return 1 if ($MakefileData !~ /\n($lookup)\n/); - $found = $1; - } else { - $lookup = $program . '_METASOURCES\s*=\s*(.*)'; - if ($MakefileData !~ /\n($lookup)\n/) { - $lookup = 'METASOURCES\s*=\s*(.*)'; - return 1 if ($MakefileData !~ /\n($lookup)\n/); - $found = $1; - $metasourceTags = 0; # we can use the general target only once - } else { - $found = $1; - } - } - print STDOUT "METASOURCE processing <$found>)\n" if ($verbose); - - $postEqual = $found; - $postEqual =~ s/[^=]*=//; - - removeLine ($lookup, $found); - - # Always find the header files that could be used to "moc" - return 1 if (findMocCandidates ()); - - if ($postEqual =~ /AUTO\s*(\S*)|USE_AUTOMOC\s*(\S*)/) - { - print STDERR "$printname: the argument for AUTO|USE_AUTOMOC is obsolete" if ($+); - $mocExt = ".moc.$cxxsuffix"; - $haveAutomocTag = 1; - } - else - { - # Not automoc so read the list of files supplied which - # should be .moc files. - - $postEqual =~ tr/\034/ /; - - # prune out extra headers - This also checks to make sure that - # the list is valid. - pruneMocCandidates ($postEqual); - } - - checkMocCandidates (); - - if (@newObs) { - my $ext = ($program =~ /_la$/) ? ".moc.lo " : ".moc.o "; - $realObjs{$program} .= "\034" . join ($ext, @newObs) . $ext; - $dependmocs{$program} = join (".moc.$cxxsuffix " , @newObs) . ".moc.$cxxsuffix"; - foreach $file (@newObs) { - $dep_files .= " \$(DEPDIR)/$file.moc.P" if($dep_files !~/$file.moc.P/); - } - } - if (@depend) { - $dependmocs{$program} .= " "; - $dependmocs{$program} .= join('.moc ', @depend) . ".moc"; - $dependmocs{$program} .= " "; - } - addMocRules (); - @globalmocs{keys %mocFiles}=values %mocFiles; -} - -#----------------------------------------------------------------------------- - -# Returns 0 if the line was processed - 1 otherwise. -# Errors are logged in the global $errorflags -sub tag_AUTOMAKE () -{ - my $lookup = '.*cd \$\(top_srcdir\)\s+&&[\034\s]+\$\(AUTOMAKE\)(.*)'; - return 1 if ($MakefileData !~ /\n($lookup)\n/); - print STDOUT "AUTOMAKE processing <$1>\n" if ($verbose); - - my $newLine = $1."\n\tcd \$(top_srcdir) && perl $thisProg $printname"; - - # automake 1.8.x adds another automake call. *sigh* - $newLine =~ s/;([\034\s]+cd\s+\$\(srcdir\)\s+&&[\034\s]+\$\(AUTOMAKE\).*)[\034\s]+\&\&[\034\s]+exit[\034\s]+0;([\034\s]+exit\s+1)/; \034 ( $1 ) || exit 1; echo \' cd \$(top_srcdir) && perl $thisProg \'; cd \$(top_srcdir) && perl $thisProg && exit 0; $2/; - substituteLine ($lookup, $newLine); - $automkCall = $1; - - $lookup = '.*cd \$\(srcdir\)\s+&&[\034\s]+\$\(AUTOCONF\)(.*)'; - if ($MakefileData =~ /\n($lookup)\n/) { - $newLine = "\tcd \$(srcdir) && rm -f configure\n"; - $newLine .= "\tcd \$(top_srcdir) && \$(MAKE) -f admin/Makefile.common configure"; - substituteLine ($lookup, $newLine); - } - - return 0; -} - -#----------------------------------------------------------------------------- - -sub handle_TOPLEVEL() -{ - my $pofiles = ""; - my @restfiles = (); - opendir (THISDIR, "."); - foreach $entry (readdir(THISDIR)) { - next if (-d $entry); - - next if ($entry eq "CVS" || $entry =~ /^\./ || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^\#.*\#$/ || $entry =~ /.gmo$/); - - if ($entry =~ /\.po$/) { - next; - } - push(@restfiles, $entry); - } - closedir (THISDIR); - - if (@restfiles) { - $target_adds{"install-data-am"} .= "install-nls-files "; - $lines = "install-nls-files:\n"; - $lines .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_locale)/$kdelang\n"; - for $file (@restfiles) { - $lines .= "\t\$(INSTALL_DATA) \$\(srcdir\)/$file \$(DESTDIR)\$(kde_locale)/$kdelang/$file\n"; - } - $target_adds{"uninstall"} .= "uninstall-nls-files "; - $lines .= "uninstall-nls-files:\n"; - for $file (@restfiles) { - $lines .= "\t-rm -f \$(DESTDIR)\$(kde_locale)/$kdelang/$file\n"; - } - appendLines($lines); - } - - return 0; -} - -#----------------------------------------------------------------------------- - -sub tag_SUBDIRS () -{ - if ($MakefileData !~ /\nSUBDIRS\s*=\s*\$\(AUTODIRS\)\s*\n/) { - return 1; - } - - my $subdirs = "."; - - opendir (THISDIR, "."); - foreach $entry (readdir(THISDIR)) { - next if ($entry eq "CVS" || $entry =~ /^\./); - if (-d $entry && -f $entry . "/Makefile.am") { - $subdirs .= " $entry"; - next; - } - } - closedir (THISDIR); - - substituteLine('SUBDIRS\s*=.*', "SUBDIRS =$subdirs"); - return 0; -} - -sub tag_IDLFILES () -{ - my @psources = split(/[\034\s]+/, $sources{$program}); - my $dep_lines = ""; - my @cppFiles = (); - - foreach $source (@psources) { - my $skel = ($source =~ m/\.skel$/); - my $stub = ($source =~ m/\.stub$/); - my $signals = ($source =~ m/\.signals$/); # obsolete, remove in KDE-4 - - if ($stub || $skel || $signals) { - - my $qs = quotemeta($source); - $sources{$program} =~ s/$qs//; - $sources_changed{$program} = 1; - - $source =~ s/\.(stub|skel|signals)$//; - my $sourcename; - - if ($skel) { - $sourcename = "$source\_skel"; - } elsif ($stub) { - $sourcename = "$source\_stub"; - } else { - $sourcename = "$source\_signals"; - } - - my $sourcedir = ''; - if (-f "$makefileDir/$source.h") { - $sourcedir = '$(srcdir)/'; - } else { - if ($MakefileData =~ /\n$source\_DIR\s*=\s*(\S+)\n/) { - $sourcedir = $1; - $sourcedir .= "/" if ($sourcedir !~ /\/$/); - } - } - - if ($allidls !~ /$source\_kidl/) { - - $use_ng = ($MakefileData =~ /\n$source\_DCOPIDLNG\s*=\s*(\S+)\n/); - $dcopidl = $use_ng ? "KDECONFIG=\"\$(KDECONFIG)\" \$(DCOPIDLNG)" : "\$(DCOPIDL)"; - - $dep_lines .= "$source.kidl: $sourcedir$source.h \$(DCOP_DEPENDENCIES)\n"; - $dep_lines .= "\t$dcopidl $sourcedir$source.h > $source.kidl || ( rm -f $source.kidl ; false )\n"; - - $allidls .= $source . "_kidl "; - } - - if ($allidls !~ /$sourcename/) { - - $dep_lines_tmp = ""; - - if ($skel) { - $dep_lines .= "$sourcename.$cxxsuffix: $source.kidl\n"; - $dep_lines .= "\t\$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-signals --no-stub $source.kidl\n"; - } elsif ($stub) { - $dep_lines_tmp = "\t\$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-signals --no-skel $source.kidl\n"; - } else { # signals - obsolete, remove in KDE 4 - $dep_lines_tmp = "\t\$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-stub --no-skel $source.kidl\n"; - } - - if ($stub || $signals) { - $target_adds{"$sourcename.$cxxsuffix"} .= "$sourcename.h "; - $dep_lines .= "$sourcename.h: $source.kidl\n"; - $dep_lines .= $dep_lines_tmp; - } - - $allidls .= $sourcename . " "; - } - - $idlfiles{$program} .= $sourcename . " "; - - if ($program =~ /_la$/) { - $realObjs{$program} .= " $sourcename.lo"; - } else { - $realObjs{$program} .= " $sourcename.\$(OBJEXT)"; - } - $sources{$program} .= " $sourcename.$cxxsuffix"; - $sources_changed{$program} = 1; - $important{$program} .= "$sourcename.h " if (!$skel); - $idl_output .= "\\\n\t$sourcename.$cxxsuffix $sourcename.h $source.kidl "; - push(@cleanfiles, "$sourcename.$cxxsuffix"); - push(@cleanfiles, "$sourcename.h"); - push(@cleanfiles, "$sourcename.kidl"); - $dep_files .= " \$(DEPDIR)/$sourcename.P" if ($dep_files !~/$sourcename.P/); - } - } - if ($dep_lines) { - appendLines($dep_lines); - } - - if (0) { - my $lookup = "($program)"; - $lookup .= '(|\$\(EXEEXT\))'; - $lookup =~ s/\_/./g; - $lookup .= ":(.*..$program\_OBJECTS..*)"; - # $lookup = quotemeta($lookup); - if ($MakefileData =~ /\n$lookup\n/) { - - my $line = "$1$2: "; - foreach $file (split(' ', $idlfiles{$program})) { - $line .= "$file.$cxxsuffix "; - } - $line .= $3; - substituteLine($lookup, $line); - } else { - print STDERR "no built dependency found $lookup\n"; - } - } -} - -sub tag_UIFILES () -{ - my @psources = split(/[\034\s]+/, $sources{$program}); - my @depFiles = (); - - foreach $source (@psources) { - - if ($source =~ m/\.ui$/) { - - print STDERR "adding UI file $source\n" if ($verbose); - - my $qs = quotemeta($source); - $sources{$program} =~ s/$qs//; - $sources_changed{$program} = 1; - - $source =~ s/\.ui$//; - - my $sourcedir = ''; - if (-f "$makefileDir/$source.ui") { - $sourcedir = '$(srcdir)/'; - } - - if (!$uiFiles{$source}) { - - my $dep_lines = "$source.$cxxsuffix: $sourcedir$source.ui $source.h $source.moc\n"; - $dep_lines .= "\trm -f $source.$cxxsuffix\n"; - if (!$kdeopts{"qtonly"}) { - $dep_lines .= "\techo '#include ' > $source.$cxxsuffix\n"; - $dep_lines .= "\techo '#include ' >> $source.$cxxsuffix\n"; - my ($mangled_source) = $source; - $mangled_source =~ s/[^A-Za-z0-9]/_/g; # get rid of garbage - $dep_lines .= "\t\$(UIC) -tr \${UIC_TR} -i $source.h $sourcedir$source.ui > $source.$cxxsuffix.temp ; ret=\$\$?; \\\n"; - $dep_lines .= "\t\$(PERL) -pe \"s,\${UIC_TR}( \\\"\\\" ),QString::null,g\" $source.$cxxsuffix.temp | \$(PERL) -pe \"s,\${UIC_TR}( \\\"\\\"\\, \\\"\\\" ),QString::null,g\" | \$(PERL) -pe \"s,image([0-9][0-9]*)_data,img\\\$\$1_" . $mangled_source . ",g\" | \$(PERL) -pe \"s,: QWizard\\(,: KWizard(,g\" >> $source.$cxxsuffix ;\\\n"; - $dep_lines .= "\trm -f $source.$cxxsuffix.temp ;\\\n"; - } else { - $dep_lines .= "\t\$(UIC) -i $source.h $sourcedir$source.ui > $source.$cxxsuffix; ret=\$\$?; \\\n"; - } - $dep_lines .= "\tif test \"\$\$ret\" = 0; then echo '#include \"$source.moc\"' >> $source.$cxxsuffix; else rm -f $source.$cxxsuffix ; exit \$\$ret ; fi\n\n"; - $dep_lines .= "$source.h: $sourcedir$source.ui\n"; - $dep_lines .= "\trm -rf $source.h;\n"; - if (!$kdeopts{"qtonly"}) { - $dep_lines .= "\t\$(UIC) $sourcedir$source.ui | \$(PERL) -pi -e \"s,public QWizard,public KWizard,g; s,#include ,#include ,g\" >> $source.h ;\n"; - } else { - $dep_lines .= "\t\$(UIC) -o $source.h $sourcedir$source.ui\n"; - } - $dep_lines .= "$source.moc: $source.h\n"; - $dep_lines .= "\t\$(MOC) $source.h -o $source.moc\n"; - - $rule_adds{"$source.$cxxsuffix"} = $dep_lines; - - $uiFiles{$source} = 1; - $dependmocs{$program} .= " $source.moc"; - $globalmocs{$source} = "\035$source.h\035$source.cpp"; - } - - if ($program =~ /_la$/) { - $realObjs{$program} .= " $source.lo"; - } else { - $realObjs{$program} .= " $source.\$(OBJEXT)"; - } - $sources{$program} .= " $source.$cxxsuffix"; - $sources_changed{$program} = 1; - $important{$program} .= "$source.h "; - $ui_output .= "\\\n\t$source.$cxxsuffix $source.h $source.moc "; - push(@cleanfiles, "$source.$cxxsuffix"); - push(@cleanfiles, "$source.h"); - push(@cleanfiles, "$source.moc"); - $dep_files .= " \$(DEPDIR)/$source.P" if($dep_files !~/$source.P/ ); - } - } -} - -sub tag_KCFGFILES () -{ - my @psources = split(/[\034\s]+/, $sources{$program}); - my @depFiles = (); - - foreach $source (@psources) { - - if ($source =~ m/\.kcfgc$/) { - - print STDERR "adding KCFG file $source\n" if ($verbose); - - my $qs = quotemeta($source); - $sources{$program} =~ s/$qs//; - $sources_changed{$program} = 1; - - $source =~ s/\.kcfgc$//; - - my $sourcedir = ''; - if (-f "$makefileDir/$source.kcfgc") { - $sourcedir = '$(srcdir)/'; - } - - if (!$kcfgFiles{$source}) { - $kcfg = "$program.kcfg"; - findKcfgFile("$source.kcfgc"); - - my $fixsuffix = ""; - $fixsuffix = "else mv $source.cpp $source.$cxxsuffix ; " - unless "cpp" eq $cxxsuffix; - - my $dep_lines = "$source.$cxxsuffix: $source.h\n"; - $dep_lines .= "$source.h: $sourcedir$kcfg $sourcedir$source.kcfgc \$(KCFG_DEPENDENCIES)\n"; - $dep_lines .= "\t\$(KCONFIG_COMPILER) $sourcedir$kcfg $sourcedir$source.kcfgc; ret=\$\$?; \\\n"; - $dep_lines .= "\tif test \"\$\$ret\" != 0; then rm -f $source.h ; exit \$\$ret ; $fixsuffix fi\n\n"; - - $rule_adds{"$source.$cxxsuffix"} = $dep_lines; - - $kcfgFiles{$source} = 1; - } - - if ($program =~ /_la$/) { - $realObjs{$program} .= " $source.lo"; - } else { - $realObjs{$program} .= " $source.\$(OBJEXT)"; - } - $sources{$program} .= " $source.$cxxsuffix"; - $sources_changed{$program} = 1; - $important{$program} .= "$source.h "; - $kcfg_output .= "\\\n\t$source.$cxxsuffix $source.h "; - push(@cleanfiles, "$source.$cxxsuffix"); - push(@cleanfiles, "$source.h"); - $dep_files .= " \$(DEPDIR)/$source.P" if($dep_files !~/$source.P/ ); - } - } -} - -sub tag_ICON() -{ - my $lookup = '([^\s]*)_ICON\s*=[ \t]*(.*)'; - my $install = ""; - my $uninstall = ""; - - while ($MakefileData =~ /\n$lookup/g) { - my $destdir; - if ($1 eq "KDE") { - $destdir = "kde_icondir"; - } else { - $destdir = $1 . "dir"; - } - my $iconauto = ($2 =~ /AUTO\s*$/); - my @appnames = (); - if ( ! $iconauto ) { - my $appicon_str = $2; - my @_appnames = split(" ", $appicon_str); - print STDOUT "KDE_ICON processing <@_appnames>\n" if ($verbose); - foreach $appname (@_appnames) { - push(@appnames, quotemeta($appname)); - } - } else { - print STDOUT "KDE_ICON processing \n" if ($verbose); - } - - my @files = (); - opendir (THISDIR, "."); - foreach $entry (readdir(THISDIR)) { - next if ($entry eq "CVS" || $entry =~ /^\./ || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^\#.*\#$/); - next if (! -f $entry); - if ( $iconauto ) - { - push(@files, $entry) - if ($entry =~ /\.xpm/ || $entry =~ /\.png/ || $entry =~ /\.mng/ || $entry =~ /\.svg/); - } else { - foreach $appname (@appnames) { - push(@files, $entry) - if ($entry =~ /-$appname\.xpm/ || $entry =~ /-$appname\.png/ || $entry =~ /-$appname\.mng/ || $entry =~ /-$appname\.svg/); - } - } - } - closedir (THISDIR); - - my %directories = (); - - foreach $file (@files) { - my $newfile = $file; - my $prefix = $file; - $prefix =~ s/\.(png|xpm|mng|svg|svgz)$//; - my $appname = $prefix; - $appname =~ s/^[^-]+-// if ($appname =~ /-/) ; - $appname =~ s/^[^-]+-// if ($appname =~ /-/) ; - $appname = quotemeta($appname); - $prefix =~ s/$appname$//; - $prefix =~ s/-$//; - - $prefix = 'lo16-app' if ($prefix eq 'mini'); - $prefix = 'lo32-app' if ($prefix eq 'lo'); - $prefix = 'hi48-app' if ($prefix eq 'large'); - $prefix .= '-app' if ($prefix =~ m/^...$/); - - my $type = $prefix; - $type =~ s/^.*-([^-]+)$/$1/; - $prefix =~ s/^(.*)-[^-]+$/$1/; - - my %type_hash = - ( - 'action' => 'actions', - 'app' => 'apps', - 'device' => 'devices', - 'filesys' => 'filesystems', - 'mime' => 'mimetypes' - ); - - if (! defined $type_hash{$type} ) { - print STDERR "unknown icon type $type in $printname ($file)\n"; - next; - } - - my %dir_hash = - ( - 'los' => 'locolor/16x16', - 'lom' => 'locolor/32x32', - 'him' => 'hicolor/32x32', - 'hil' => 'hicolor/48x48', - 'lo16' => 'locolor/16x16', - 'lo22' => 'locolor/22x22', - 'lo32' => 'locolor/32x32', - 'hi16' => 'hicolor/16x16', - 'hi22' => 'hicolor/22x22', - 'hi32' => 'hicolor/32x32', - 'hi48' => 'hicolor/48x48', - 'hi64' => 'hicolor/64x64', - 'hi128' => 'hicolor/128x128', - 'hisc' => 'hicolor/scalable', - 'cr16' => 'crystalsvg/16x16', - 'cr22' => 'crystalsvg/22x22', - 'cr32' => 'crystalsvg/32x32', - 'cr48' => 'crystalsvg/48x48', - 'cr64' => 'crystalsvg/64x64', - 'cr128' => 'crystalsvg/128x128', - 'crsc' => 'crystalsvg/scalable' - ); - - $newfile =~ s@.*-($appname\.(png|xpm|mng|svgz|svg?))@$1@; - - if (! defined $dir_hash{$prefix}) { - print STDERR "unknown icon prefix $prefix in $printname\n"; - next; - } - - my $dir = $dir_hash{$prefix} . "/" . $type_hash{$type}; - if ($newfile =~ /-[^\.]/) { - my $tmp = $newfile; - $tmp =~ s/^([^-]+)-.*$/$1/; - $dir = $dir . "/" . $tmp; - $newfile =~ s/^[^-]+-//; - } - - if (!defined $directories{$dir}) { - $install .= "\t\$(mkinstalldirs) \$(DESTDIR)\$($destdir)/$dir\n"; - $directories{$dir} = 1; - } - - $install .= "\t\$(INSTALL_DATA) \$(srcdir)/$file \$(DESTDIR)\$($destdir)/$dir/$newfile\n"; - $uninstall .= "\t-rm -f \$(DESTDIR)\$($destdir)/$dir/$newfile\n"; - - } - } - - if (length($install)) { - $target_adds{"install-data-am"} .= "install-kde-icons "; - $target_adds{"uninstall-am"} .= "uninstall-kde-icons "; - appendLines("install-kde-icons:\n" . $install . "\nuninstall-kde-icons:\n" . $uninstall); - } -} - -sub handle_POFILES($$) -{ - my @pofiles = split(" ", $_[0]); - my $lang = $_[1]; - - # Build rules for creating the gmo files - my $tmp = ""; - my $allgmofiles = ""; - my $pofileLine = "POFILES ="; - foreach $pofile (@pofiles) - { - $pofile =~ /(.*)\.[^\.]*$/; # Find name minus extension - $tmp .= "$1.gmo: $pofile\n"; - $tmp .= "\trm -f $1.gmo; \$(GMSGFMT) -o $1.gmo \$(srcdir)/$pofile\n"; - $tmp .= "\ttest ! -f $1.gmo || touch $1.gmo\n"; - $allgmofiles .= " $1.gmo"; - $pofileLine .= " $1.po"; - } - appendLines ($tmp); - my $lookup = 'POFILES\s*=([^\n]*)'; - if ($MakefileData !~ /\n$lookup/) { - appendLines("$pofileLine\nGMOFILES =$allgmofiles"); - } else { - substituteLine ($lookup, "$pofileLine\nGMOFILES =$allgmofiles"); - } - - if ($allgmofiles) { - - # Add the "clean" rule so that the maintainer-clean does something - appendLines ("clean-nls:\n\t-rm -f $allgmofiles\n"); - - $target_adds{"maintainer-clean"} .= "clean-nls "; - - $lookup = 'DISTFILES\s*=[ \t]*(.*)'; - if ($MakefileData =~ /\n$lookup/) { - $tmp = "DISTFILES = \$(GMOFILES) \$(POFILES) $1"; - substituteLine ($lookup, $tmp); - } - } - - $target_adds{"install-data-am"} .= "install-nls "; - - $tmp = "install-nls:\n"; - if ($lang) { - $tmp .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES\n"; - } - $tmp .= "\t\@for base in "; - foreach $pofile (@pofiles) - { - $pofile =~ /(.*)\.[^\.]*$/; # Find name minus extension - $tmp .= "$1 "; - } - - $tmp .= "; do \\\n"; - if ($lang) { - $tmp .= "\t echo \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/\$\$base.mo ;\\\n"; - $tmp .= "\t if test -f \$\$base.gmo; then \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/\$\$base.mo ;\\\n"; - $tmp .= "\t elif test -f \$(srcdir)/\$\$base.gmo; then \$(INSTALL_DATA) \$(srcdir)/\$\$base.gmo \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/\$\$base.mo ;\\\n"; - $tmp .= "\t fi ;\\\n"; - } else { - $tmp .= "\t echo \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES/\$(PACKAGE).mo ;\\\n"; - $tmp .= "\t \$(mkinstalldirs) \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES ; \\\n"; - $tmp .= "\t if test -f \$\$base.gmo; then \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES/\$(PACKAGE).mo ;\\\n"; - $tmp .= "\t elif test -f \$(srcdir)/\$\$base.gmo; then \$(INSTALL_DATA) \$(srcdir)/\$\$base.gmo \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES/\$(PACKAGE).mo ;\\\n"; - $tmp .= "\t fi ;\\\n"; - } - $tmp .= "\tdone\n\n"; - appendLines ($tmp); - - $target_adds{"uninstall"} .= "uninstall-nls "; - - $tmp = "uninstall-nls:\n"; - foreach $pofile (@pofiles) - { - $pofile =~ /(.*)\.[^\.]*$/; # Find name minus extension - if ($lang) { - $tmp .= "\trm -f \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/$1.mo\n"; - } else { - $tmp .= "\trm -f \$(DESTDIR)\$(kde_locale)/$1/LC_MESSAGES/\$(PACKAGE).mo\n"; - } - } - appendLines($tmp); - - $target_adds{"all"} .= "all-nls "; - - $tmp = "all-nls: \$(GMOFILES)\n"; - - appendLines($tmp); - - $target_adds{"distdir"} .= "distdir-nls "; - - $tmp = "distdir-nls:\$(GMOFILES)\n"; - $tmp .= "\tfor file in \$(POFILES); do \\\n"; - $tmp .= "\t cp \$(srcdir)/\$\$file \$(distdir); \\\n"; - $tmp .= "\tdone\n"; - $tmp .= "\tfor file in \$(GMOFILES); do \\\n"; - $tmp .= "\t cp \$(srcdir)/\$\$file \$(distdir); \\\n"; - $tmp .= "\tdone\n"; - - appendLines ($tmp); - - if (!$lang) { - appendLines("merge:\n\t\$(MAKE) -f \$(top_srcdir)/admin/Makefile.common package-merge POFILES=\"\${POFILES}\" PACKAGE=\${PACKAGE}\n\n"); - } - -} - -#----------------------------------------------------------------------------- - -# Returns 0 if the line was processed - 1 otherwise. -# Errors are logged in the global $errorflags -sub tag_POFILES () -{ - my $lookup = 'POFILES\s*=([^\n]*)'; - return 1 if ($MakefileData !~ /\n$lookup/); - print STDOUT "POFILES processing <$1>\n" if ($verbose); - - my $tmp = $1; - - # make sure these are all gone. - if ($MakefileData =~ /\n\.po\.gmo:\n/) - { - print STDERR "Warning: Found old .po.gmo rules in $printname. New po rules not added\n"; - return 1; - } - - # Either find the pofiles in the directory (AUTO) or use - # only the specified po files. - my $pofiles = ""; - if ($tmp =~ /^\s*AUTO\s*$/) - { - opendir (THISDIR, "."); - $pofiles = join(" ", grep(/\.po$/, readdir(THISDIR))); - closedir (THISDIR); - print STDOUT "pofiles found = $pofiles\n" if ($verbose); - if (-f "charset" && -f "kdelibs/kdelibs.po") { - handle_TOPLEVEL(); - } - } - else - { - $tmp =~ s/\034/ /g; - $pofiles = $tmp; - } - return 1 if (!$pofiles); # Nothing to do - - handle_POFILES($pofiles, $kdelang); - - return 0; -} - -sub helper_LOCALINSTALL($) -{ - my $lookup = "\035" . $_[0] . " *:[^\035]*\035\t"; - my $copy = $MakefileData; - $copy =~ s/\n/\035/g; - if ($copy =~ /($lookup.*)$/) { - - $install = $1; - $install =~ s/\035$_[0] *:[^\035]*\035//; - my $emptyline = 0; - while (! $emptyline ) { - if ($install =~ /([^\035]*)\035(.*)/) { - local $line = $1; - $install = $2; - if ($line !~ /^\s*$/ && $line !~ /^(\@.*\@)*\t/) { - $emptyline = 1; - } else { - replaceDestDir($line); - } - } else { - $emptyline = 1; - } - } - } - -} - -sub tag_LOCALINSTALL () -{ - helper_LOCALINSTALL('install-exec-local'); - helper_LOCALINSTALL('install-data-local'); - helper_LOCALINSTALL('uninstall-local'); - - return 0; -} - -sub replaceDestDir($) { - local $line = $_[0]; - - if ( $line =~ /^\s*(\@.*\@)*\s*\$\(mkinstalldirs\)/ - || $line =~ /^\s*(\@.*\@)*\s*\$\(INSTALL\S*\)/ - || $line =~ /^\s*(\@.*\@)*\s*(-?rm.*) \S*$/) - { - $line =~ s/^(.*) ([^\s]+)\s*$/$1 \$(DESTDIR)$2/ if ($line !~ /\$\(DESTDIR\)/); - } - - if ($line ne $_[0]) { - $_[0] = quotemeta $_[0]; - substituteLine($_[0], $line); - } -} - -#--------------------------------------------------------------------------- -# libtool is very hard to persuade it could use -Wl,--no-undefined for making -# -no-undefined actually work -# append $(KDE_NO_UNFINED) after every -no-undefined in LDFLAGS -# this may go away if libtool ever does this on its own -sub tag_NO_UNDEFINED () { - return if ($program !~ /_la$/); - - my $lookup = quotemeta($realname{$program}) . ":.*?\n\t.*?\\((.*?)\\) .*\n"; - $MakefileData =~ m/$lookup/; - return if (!defined($1)); - return if ($1 !~ /CXXLINK/); - - if ($MakefileData !~ /\n$program\_LDFLAGS\s*=.*-no-undefined/ ) { - return; - } - - $lookup = $program . '\_LDFLAGS(\s*)=(.*)-no-undefined(.*)'; - if ($MakefileData =~ /\n$lookup\n/) { - my $replace = $program . "\_LDFLAGS$1=$2-no-undefined \$(KDE_NO_UNDEFINED)$3"; - substituteLine($lookup, $replace); - } -} - -sub tag_CLOSURE () { - return if ($program !~ /_la$/); - - my $lookup = quotemeta($realname{$program}) . ":.*?\n\t.*?\\((.*?)\\) .*\n"; - $MakefileData =~ m/$lookup/; - return if (!defined($1)); - return if ($1 !~ /CXXLINK/); - - if ($MakefileData !~ /\n$program\_LDFLAGS\s*=.*-no-undefined/ && - $MakefileData !~ /\n$program\_LDFLAGS\s*=.*KDE_PLUGIN/ ) { - print STDERR "Report: $program contains undefined in $printname\n" if ($program =~ /^lib/ && $dryrun); - return; - } - - my $closure = $realname{$program} . ".closure"; - my $lines = "$closure: \$($program\_OBJECTS) \$($program\_DEPENDENCIES)\n"; - $lines .= "\t\@echo \"int main() {return 0;}\" > $program\_closure.$cxxsuffix\n"; - $lines .= "\t\@\$\(LTCXXCOMPILE\) -c $program\_closure.$cxxsuffix\n"; - $lines .= "\t\$\(CXXLINK\) $program\_closure.lo \$($program\_LDFLAGS) \$($program\_OBJECTS) \$($program\_LIBADD) \$(LIBS)\n"; - $lines .= "\t\@rm -f $program\_closure.* $closure\n"; - $lines .= "\t\@echo \"timestamp\" > $closure\n"; - $lines .= "\n"; - appendLines($lines); - $lookup = $realname{$program} . ": (.*)"; - if ($MakefileData =~ /\n$lookup\n/) { - $lines = "\@KDE_USE_CLOSURE_TRUE@". $realname{$program} . ": $closure $1"; - $lines .= "\n\@KDE_USE_CLOSURE_FALSE@" . $realname{$program} . ": $1"; - substituteLine($lookup, $lines); - } - $closure_output .= " $closure"; -} - -sub tag_NMCHECK () { - return if ($program !~ /_la$/); - my $lookup = quotemeta($realname{$program}) . ":.*?\n\t.*?\\((.*?)\\) .*\n"; - $MakefileData =~ m/$lookup/; - my $linkcmd = $1; - return if (!defined($1)); - return if ($linkcmd !~ /CXXLINK/ && $linkcmd !~ /LINK/); - - $lookup = $program . '_NMCHECK\s*=([^\n]*)'; - if( $MakefileData !~ m/\n$lookup\n/ ) { - return; - } - my $allowed = $1; - $allowed =~ s/^ *//; - $lookup = $program . '_NMCHECKWEAK\s*=([^\n]*)'; - my $weak = ""; - my $is_weak = 0; - if( $MakefileData =~ m/\n$lookup\n/ ) { - $weak = $1; - $is_weak = 1; - } - $weak =~ s/^ *//; - - if( $is_weak ) - { - $weak = '--allowweak=\'' . $weak . '\' '; - } - my $nmline = "\@KDE_USE_NMCHECK_TRUE@\t\@\$(MAKE) \$(AM_MAKEFLAGS) nmcheck_$realname{$program} || ( rm -f $realname{$program}; exit 1 )"; - $lookup = '(\t\$\(CXXLINK\)[^\n]*' . $program . '_OBJECTS[^\n]*)'; - if( $MakefileData =~ /\n$lookup\n/ ) { - my $oldstuff = $1; - substituteLine( $lookup, $oldstuff . "\n" . $nmline ); - } - $lookup = '(\t\$\(LINK\)[^\n]*' . $program . '_OBJECTS[^\n]*)'; - if( $MakefileData =~ /\n$lookup\n/ ) { - my $oldstuff = $1; - substituteLine( $lookup, $oldstuff . "\n" . $nmline ); - } - $nmline = "\@\$(top_srcdir)/admin/nmcheck $realname{$program} \'$allowed\' $weak"; - appendLines( "\nnmcheck_$realname{$program}: $realname{$program} \n\t$nmline\n" ); - $target_adds{ "nmcheck" } .= "nmcheck_$realname{$program} "; -} - -sub tag_DIST () { - my %foundfiles = (); - opendir (THISDIR, "."); - foreach $entry (readdir(THISDIR)) { - next if ($entry eq "CVS" || $entry =~ /^\./ || $entry eq "Makefile" || $entry =~ /~$/ || $entry =~ /^\#.*\#$/); - next if (! -f $entry); - next if ($entry =~ /\.moc/ || $entry =~ /\.moc.$cppExt$/ || $entry =~ /\.lo$/ || $entry =~ /\.la$/ || $entry =~ /\.o/); - next if ($entry =~ /\.all_$cppExt\.$cppExt$/); - $foundfiles{$entry} = 1; - } - closedir (THISDIR); - - # doing this for MAINTAINERCLEANFILES would be wrong - my @marks = ("EXTRA_DIST", "DIST_COMMON", '\S*_SOURCES', '\S*_HEADERS', 'CLEANFILES', 'DISTCLEANFILES', '\S*_OBJECTS'); - foreach $mark (@marks) { - while ($MakefileData =~ /\n($mark)\s*=[ \t]*([^\n]*)/g) { - my $cleanfiles_str = $2; - foreach $file (split('[\034\s]+', $cleanfiles_str)) { - $file =~ s/\.\///; - $foundfiles{$file} = 0 if (defined $foundfiles{$file}); - } - } - } - my @files = ("Makefile", "config.cache", "config.log", "stamp-h", - "stamp-h1", "stamp-h1", "config.h", "Makefile", - "config.status", "config.h", "libtool", "core" ); - foreach $file (@files) { - $foundfiles{$file} = 0 if (defined $foundfiles{$file}); - } - - my $KDE_DIST = ""; - foreach $file (keys %foundfiles) { - if ($foundfiles{$file} == 1) { - $KDE_DIST .= "$file "; - } - } - if ($KDE_DIST) { - print "KDE_DIST $printname $KDE_DIST\n" if ($verbose); - - my $lookup = 'DISTFILES\s*=[ \t]*(.*)'; - if ($MakefileData =~ /\n$lookup/) { - substituteLine($lookup, "DISTFILES = $1 \$(KDE_DIST)"); - appendLines("KDE_DIST=$KDE_DIST\n"); - } - } -} - -#----------------------------------------------------------------------------- -# Returns 0 if the line was processed - 1 otherwise. -# Errors are logged in the global $errorflags -sub tag_DOCFILES () -{ - $target_adds{"all"} .= "docs-am "; - - my $lookup = 'KDE_DOCS\s*=[ \t]*([^\n]*)'; - goto nodocs if ($MakefileData !~ /\n$lookup/); - print STDOUT "KDE_DOCS processing <$1>\n" if ($verbose); - - my $tmp = $1; - - # Either find the files in the directory (AUTO) or use - # only the specified po files. - my $files = ""; - my $appname = $tmp; - $appname =~ s/^(\S*)\s*.*$/$1/; - if ($appname =~ /AUTO/) { - $appname = basename($makefileDir); - if ("$appname" eq "en") { - print STDERR "Error: KDE_DOCS = AUTO relies on the directory name. Yours is 'en' - you most likely want something else, e.g. KDE_DOCS = myapp\n"; - exit(1); - } - } - - if ($tmp !~ / - /) - { - opendir (THISDIR, "."); - foreach $entry (readdir(THISDIR)) { - next if ($entry eq "CVS" || $entry =~ /^\./ || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^\#.*\#$/ || $entry eq "core" || $entry eq "index.cache.bz2"); - next if (! -f $entry); - $files .= "$entry "; - } - closedir (THISDIR); - print STDOUT "docfiles found = $files\n" if ($verbose); - } - else - { - $tmp =~ s/\034/ /g; - $tmp =~ s/^\S*\s*-\s*//; - $files = $tmp; - } - goto nodocs if (!$files); # Nothing to do - - if ($files =~ /(^| )index\.docbook($| )/) { - - my $lines = ""; - my $lookup = 'MEINPROC\s*='; - if ($MakefileData !~ /\n($lookup)/) { - $lines = "MEINPROC=/\$(kde_bindir)/meinproc\n"; - } - $lookup = 'KDE_XSL_STYLESHEET\s*='; - if ($MakefileData !~ /\n($lookup)/) { - $lines .= "KDE_XSL_STYLESHEET=/\$(kde_datadir)/ksgmltools2/customization/kde-chunk.xsl\n"; - } - $lookup = '\nindex.cache.bz2:'; - if ($MakefileData !~ /\n($lookup)/) { - $lines .= "index.cache.bz2: \$(srcdir)/index.docbook \$(KDE_XSL_STYLESHEET) $files\n"; - $lines .= "\t\@if test -n \"\$(MEINPROC)\"; then echo \$(MEINPROC) --check --cache index.cache.bz2 \$(srcdir)/index.docbook; \$(MEINPROC) --check --cache index.cache.bz2 \$(srcdir)/index.docbook; fi\n"; - $lines .= "\n"; - } - - $lines .= "docs-am: index.cache.bz2\n"; - $lines .= "\n"; - $lines .= "install-docs: docs-am install-nls\n"; - $lines .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; - $lines .= "\t\@if test -f index.cache.bz2; then \\\n"; - $lines .= "\techo \$(INSTALL_DATA) index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; - $lines .= "\t\$(INSTALL_DATA) index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; - $lines .= "\telif test -f \$(srcdir)/index.cache.bz2; then \\\n"; - $lines .= "\techo \$(INSTALL_DATA) \$(srcdir)/index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; - $lines .= "\t\$(INSTALL_DATA) \$(srcdir)/index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; - $lines .= "\tfi\n"; - $lines .= "\t-rm -f \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/common\n"; - $lines .= "\t\$(LN_S) \$(kde_libs_htmldir)/$kdelang/common \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/common\n"; - - $lines .= "\n"; - $lines .= "uninstall-docs:\n"; - $lines .= "\t-rm -rf \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; - $lines .= "\n"; - $lines .= "clean-docs:\n"; - $lines .= "\t-rm -f index.cache.bz2\n"; - $lines .= "\n"; - $target_adds{"install-data-am"} .= "install-docs "; - $target_adds{"uninstall"} .= "uninstall-docs "; - $target_adds{"clean-am"} .= "clean-docs "; - appendLines ($lines); - } else { - appendLines("docs-am: $files\n"); - } - - $target_adds{"install-data-am"} .= "install-nls "; - $target_adds{"uninstall"} .= "uninstall-nls "; - - $tmp = "install-nls:\n"; - $tmp .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; - $tmp .= "\t\@for base in $files; do \\\n"; - $tmp .= "\t echo \$(INSTALL_DATA) \$\$base \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; - $tmp .= "\t \$(INSTALL_DATA) \$(srcdir)/\$\$base \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; - $tmp .= "\tdone\n"; - if ($appname eq 'common') { - $tmp .= "\t\@echo \"merging common and language specific dir\" ;\\\n"; - $tmp .= "\tif test ! -f \$(kde_htmldir)/en/common/kde-common.css; then echo 'no english docs found in \$(kde_htmldir)/en/common/'; exit 1; fi \n"; - $tmp .= "\t\@com_files=`cd \$(kde_htmldir)/en/common && echo *` ;\\\n"; - $tmp .= "\tcd \$(DESTDIR)\$(kde_htmldir)/$kdelang/common ;\\\n"; - $tmp .= "\tif test -n \"\$\$com_files\"; then for p in \$\$com_files ; do \\\n"; - $tmp .= "\t case \" $files \" in \\\n"; - $tmp .= "\t *\" \$\$p \"*) ;; \\\n"; - $tmp .= "\t *) test ! -f \$\$p && echo \$(LN_S) ../../en/common/\$\$p \$(DESTDIR)\$(kde_htmldir)/$kdelang/common/\$\$p && \$(LN_S) ../../en/common/\$\$p \$\$p ;; \\\n"; - $tmp .= "\t esac ; \\\n"; - $tmp .= "\tdone ; fi ; true\n"; - } - $tmp .= "\n"; - $tmp .= "uninstall-nls:\n"; - $tmp .= "\tfor base in $files; do \\\n"; - $tmp .= "\t rm -f \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; - $tmp .= "\tdone\n\n"; - appendLines ($tmp); - - $target_adds{"distdir"} .= "distdir-nls "; - - $tmp = "distdir-nls:\n"; - $tmp .= "\tfor file in $files; do \\\n"; - $tmp .= "\t cp \$(srcdir)/\$\$file \$(distdir); \\\n"; - $tmp .= "\tdone\n"; - - appendLines ($tmp); - - return 0; - - nodocs: - appendLines("docs-am:\n"); - return 1; -} - -#----------------------------------------------------------------------------- -# Find headers in any of the source directories specified previously, that -# are candidates for "moc-ing". -sub findMocCandidates () -{ - foreach $dir (@headerdirs) - { - my @list = (); - opendir (SRCDIR, "$dir"); - @hFiles = grep { /.+\.$hExt$/o && !/^\./ } readdir(SRCDIR); - closedir SRCDIR; - foreach $hf (@hFiles) - { - next if ($hf =~ /^\.\#/); - $hf =~ /(.*)\.[^\.]*$/; # Find name minus extension - next if ($uiFiles{$1}); - open (HFIN, "$dir/$hf") || die "Could not open $dir/$hf: $!\n"; - my $hfsize = 0; - seek(HFIN, 0, 2); - $hfsize = tell(HFIN); - seek(HFIN, 0, 0); - read HFIN, $hfData, $hfsize; - close HFIN; - # push (@list, $hf) if(index($hfData, "Q_OBJECT") >= 0); ### fast but doesn't handle //Q_OBJECT - # handle " { friend class blah; Q_OBJECT ", but don't match antlarr_Q_OBJECT (\b). - if ( $hfData =~ /{([^}]*)\bQ_OBJECT/s ) { - push (@list, $hf) unless $1 =~ m://[^\n]*Q_OBJECT[^\n]*$:s; ## reject "// Q_OBJECT" - } - } - # The assoc array of root of headerfile and header filename - foreach $hFile (@list) - { - $hFile =~ /(.*)\.[^\.]*$/; # Find name minus extension - if ($mocFiles{$1}) - { - print STDERR "Warning: Multiple header files found for $1\n"; - next; # Use the first one - } - $mocFiles{$1} = "$dir\035$hFile"; # Add relative dir - } - } - - return 0; -} - -#----------------------------------------------------------------------------- - -# The programmer has specified a moc list. Prune out the moc candidates -# list that we found based on looking at the header files. This generates -# a warning if the programmer gets the list wrong, but this doesn't have -# to be fatal here. -sub pruneMocCandidates ($) -{ - my %prunedMoc = (); - local @mocList = split(' ', $_[0]); - - foreach $mocname (@mocList) - { - $mocname =~ s/\.moc$//; - if ($mocFiles{$mocname}) - { - $prunedMoc{$mocname} = $mocFiles{$mocname}; - } - else - { - my $print = $makefileDir; - $print =~ s/^\Q$topdir\E\\//; - # They specified a moc file but we can't find a header that - # will generate this moc file. That's possible fatal! - print STDERR "Warning: No moc-able header file for $print/$mocname\n"; - } - } - - undef %mocFiles; - %mocFiles = %prunedMoc; -} - -#----------------------------------------------------------------------------- - -# Finds the cpp files (If they exist). -# The cpp files get appended to the header file separated by \035 -sub checkMocCandidates () -{ - my @cppFiles; - my $cpp2moc; # which c++ file includes which .moc files - my $moc2cpp; # which moc file is included by which c++ files - - return unless (keys %mocFiles); - opendir(THISDIR, ".") || return; - @cppFiles = grep { /.+\.$cppExt$/o && !/.+\.moc\.$cppExt$/o - && !/.+\.all_$cppExt\.$cppExt$/o - && !/^\./ } readdir(THISDIR); - closedir THISDIR; - return unless (@cppFiles); - my $files = join (" ", @cppFiles); - $cpp2moc = {}; - $moc2cpp = {}; - foreach $cxxf (@cppFiles) - { - open (CXXFIN, $cxxf) || die "Could not open $cxxf: $!\n"; - seek(CXXFIN, 0, 2); - my $cxxfsize = tell(CXXFIN); - seek(CXXFIN, 0, 0); - read CXXFIN, $cxxfData, $cxxfsize; - close CXXFIN; - while(($cxxfData =~ m/^[ \t]*\#include\s*[<\"](.*\.moc)[>\"]/gm)) { - $cpp2moc->{$cxxf}->{$1} = 1; - $moc2cpp->{$1}->{$cxxf} = 1; - } - } - foreach my $mocFile (keys (%mocFiles)) - { - @cppFiles = keys %{$moc2cpp->{"$mocFile.moc"}}; - if (@cppFiles == 1) { - $mocFiles{$mocFile} .= "\035" . $cppFiles[0]; - push(@depend, $mocFile); - } elsif (@cppFiles == 0) { - push (@newObs, $mocFile); # Produce new object file - next if ($haveAutomocTag); # This is expected... - # But this is an error we can deal with - let them know - print STDERR - "Warning: No c++ file that includes $mocFile.moc\n"; - } else { - # We can't decide which file to use, so it's fatal. Although as a - # guess we could use the mocFile.cpp file if it's in the list??? - print STDERR - "Error: Multiple c++ files that include $mocFile.moc\n"; - print STDERR "\t",join ("\t", @cppFiles),"\n"; - $errorflag = 1; - delete $mocFiles{$mocFile}; - # Let's continue and see what happens - They have been told! - } - } -} - -#----------------------------------------------------------------------------- - -# Add the rules for generating moc source from header files -# For Automoc output *.moc.cpp but normally we'll output *.moc -# (We must compile *.moc.cpp separately. *.moc files are included -# in the appropriate *.cpp file by the programmer) -sub addMocRules () -{ - my $cppFile; - my $hFile; - - foreach $mocFile (keys (%mocFiles)) - { - undef $cppFile; - ($dir, $hFile, $cppFile) = split ("\035", $mocFiles{$mocFile}, 3); - $dir =~ s#^\.#\$(srcdir)#; - if (defined ($cppFile)) - { - $cppFile =~ s,\.[^.]*$,,; - $target_adds{"$cppFile.o"} .= "$mocFile.moc "; - $target_adds{"$cppFile.lo"} .= "$mocFile.moc "; - appendLines ("$mocFile.moc: $dir/$hFile\n\t\$(MOC) $dir/$hFile -o $mocFile.moc\n"); - $cleanMoc .= " $mocFile.moc"; - appendLines ("mocs: $mocFile.moc\n"); - } - else - { - appendLines ("$mocFile$mocExt: $dir/$hFile\n\t\$(MOC) $dir/$hFile -o $mocFile$mocExt\n"); - $cleanMoc .= " $mocFile$mocExt"; - appendLines ("mocs: $mocFile$mocExt\n"); - } - } -} - -sub make_bcheck_target() -{ - my $lookup = 'RECURSIVE_TARGETS\s*=[ \t]*(.*)'; - my $bcheckdep = "bcheck-am"; - $bcheckdep = "bcheck-recursive" if ($MakefileData =~ /\n$lookup/); - - my $headers= ""; - $headers = $1 if($MakefileData =~ /\nHEADERS\s*=[ \t]*(.+)/); - $headers =~ s/\$\((?:noinst|EXTRA)_HEADERS\)//g; - - $target_adds{"clean-am"} .= "clean-bcheck "; - - my $t = "clean-bcheck: \n" . - "\trm -f *.bchecktest.cc *.bchecktest.cc.class a.out\n\n" . - "bcheck: $bcheckdep\n\n" . - "bcheck-am:\n" . - "\t\@for i in $headers; do \\\n" . - "\t if test \$(srcdir)/\$\$i -nt \$\$i.bchecktest.cc; then \\\n" . - "\t echo \"int main() {return 0;}\" > \$\$i.bchecktest.cc ; \\\n" . - "\t echo \"#include \\\"\$\$i\\\"\" >> \$\$i.bchecktest.cc ; \\\n" . - "\t echo \"\$\$i\"; \\\n" . - "\t if ! "; - $t .= $cxxsuffix eq "KKK" ? - "\$(CXX) \$(DEFS) -I. -I\$(srcdir) -I\$(top_builddir) \$(INCLUDES) \$(AM_CPPFLAGS) \$(CPPFLAGS) \$(CXXFLAGS) \$(KDE_CXXFLAGS) " : - "\$(CXXCOMPILE) "; - $t .= " --dump-class-hierarchy -c \$\$i.bchecktest.cc; then \\\n" . - "\t rm -f \$\$i.bchecktest.cc; exit 1; \\\n" . - "\t fi ; \\\n" . - "\t echo \"\" >> \$\$i.bchecktest.cc.class; \\\n" . - "\t perl \$(top_srcdir)/admin/bcheck.pl \$\$i.bchecktest.cc.class || { rm -f \$\$i.bchecktest.cc; exit 1; }; \\\n" . - "\t rm -f a.out; \\\n" . - "\t fi ; \\\n" . - "\tdone\n"; - appendLines("$t\n"); -} - -sub make_meta_classes () -{ - return if ($kdeopts{"qtonly"}); - - my $cppFile; - my $hFile; - my $moc_class_headers = ""; - foreach $program (@programs) { - my $mocs = ""; - my @progsources = split(/[\034\s]+/, $sources{$program}); - my @depmocs = split(' ', $dependmocs{$program}); - my %shash = (), %mhash = (); - @shash{@progsources} = 1; # we are only interested in the existence - @mhash{@depmocs} = 1; - - print STDOUT "program=$program\n" if ($verbose); - print STDOUT "psources=[".join(' ', keys %shash)."]\n" if ($verbose); - print STDOUT "depmocs=[".join(' ', keys %mhash)."]\n" if ($verbose); - print STDOUT "globalmocs=[".join(' ', keys(%globalmocs))."]\n" if ($verbose); - foreach my $mocFile (keys (%globalmocs)) - { - my ($dir, $hFile, $cppFile) = split ("\035", $globalmocs{$mocFile}, 3); - if (defined ($cppFile)) - { - $mocs .= " $mocFile.moc" if exists $shash{$cppFile}; - } - else - { - # Bah. This is the case, if no C++ file includes the .moc - # file. We make a .moc.cpp file for that. Unfortunately this - # is not included in the %sources hash, but rather is mentioned - # in %dependmocs. If the user wants to use AUTO he can't just - # use an unspecific METAINCLUDES. Instead he must use - # program_METAINCLUDES. Anyway, it's not working real nicely. - # E.g. Its not clear what happens if user specifies two - # METAINCLUDES=AUTO in the same Makefile.am. - $mocs .= " $mocFile.moc.$cxxsuffix" - if exists $mhash{$mocFile.".moc.$cxxsuffix"}; - } - } - if ($mocs) { - print STDOUT "==> mocs=[".$mocs."]\n" if ($verbose); - } - print STDOUT "\n" if $verbose; - } - if ($moc_class_headers) { - appendLines ("$cleantarget-moc-classes:\n\t-rm -f $moc_class_headers\n"); - $target_adds{"$cleantarget-am"} .= "$cleantarget-moc-classes "; - } -} - -#----------------------------------------------------------------------------- - -sub updateMakefile () -{ - return if ($dryrun); - - open (FILEOUT, "> $makefile") - || die "Could not create $makefile: $!\n"; - - $MakefileData =~ s/\034/\\\n/g; # Restore continuation lines - # Append our $progId line, _below_ the "generated by automake" line - # because automake-1.6 relies on the first line to be his own. - my $progIdLine = "\# $progId - " . '$Revision: 483858 $ '."\n"; - if ( !( $MakefileData =~ s/^(.*generated .*by automake.*\n)/$1$progIdLine/ ) ) { - warn "automake line not found in $makefile\n"; - # Fallback: first line - print FILEOUT $progIdLine; - }; - print FILEOUT $MakefileData; - close FILEOUT; -} - -#----------------------------------------------------------------------------- - -# The given line needs to be removed from the makefile -# Do this by adding the special "removed line" comment at the line start. -sub removeLine ($$) -{ - my ($lookup, $old) = @_; - - $old =~ s/\034/\\\n#>- /g; # Fix continuation lines - $MakefileData =~ s/\n$lookup/\n#>\- $old/; -} - -#----------------------------------------------------------------------------- - -# Replaces the old line with the new line -# old line(s) are retained but tagged as removed. The new line(s) have the -# "added" tag placed before it. -sub substituteLine ($$) -{ - my ($lookup, $new) = @_; - - if ($MakefileData =~ /\n($lookup)/) { - $old = $1; - $old =~ s/\034/\\\n#>\- /g; # Fix continuation lines - my $newCount = ($new =~ tr/\034//) + ($new =~ tr/\n//) + 1; - $new =~ s/\\\n/\034/g; - $MakefileData =~ s/\n$lookup/\n#>- $old\n#>\+ $newCount\n$new/; - } else { - warn "Warning: substitution of \"$lookup\" in $printname failed\n"; - } -} - -#----------------------------------------------------------------------------- - -# Slap new lines on the back of the file. -sub appendLines ($) -{ - my ($new) = @_; - my $copynew = $new; - my $newCount = ($new =~ tr/\034//) + ($new =~ tr/\n//) + 1; - $new =~ s/\\\n/\034/g; # Fix continuation lines - $MakefileData .= "\n#>\+ $newCount\n$new"; -} - -#----------------------------------------------------------------------------- - -# Restore the Makefile.in to the state it was before we fiddled with it -sub restoreMakefile () -{ - $MakefileData =~ s/# $progId[^\n\034]*[\n\034]*//g; - # Restore removed lines - $MakefileData =~ s/([\n\034])#>\- /$1/g; - # Remove added lines - while ($MakefileData =~ /[\n\034]#>\+ ([^\n\034]*)/) - { - my $newCount = $1; - my $removeLines = ""; - while ($newCount--) { - $removeLines .= "[^\n\034]*([\n\034]|)"; - } - $MakefileData =~ s/[\n\034]#>\+.*[\n\034]$removeLines/\n/; - } -} - -#----------------------------------------------------------------------------- - -# find the .kcfg file listed in the .kcfgc file -sub findKcfgFile($) -{ - my ($kcfgf) = @_; - open (KCFGFIN, $kcfgf) || die "Could not open $kcfgf: $!\n"; - seek(KCFGFIN, 0, 2); - my $kcfgfsize = tell(KCFGFIN); - seek(KCFGFIN, 0, 0); - read KCFGFIN, $kcfgfData, $kcfgfsize; - close KCFGFIN; - if(($kcfgfData =~ m/^File=(.*\.kcfg)/gm)) { - $kcfg = $1; - } -} diff --git a/admin/bcheck.pl b/admin/bcheck.pl deleted file mode 100644 index cca973e..0000000 --- a/admin/bcheck.pl +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/perl -w - -use DB_File; -use Fcntl ':flock'; - -if (!defined($ARGV[0])) { - print "usage: requires .class dump as parameter!\n"; - exit; -} - -sub bailout -{ - untie %bcheckdb if(defined(%bcheckdb)); - - if(defined(MYLOCK)) { - flock MYLOCK, LOCK_UN; - close(MYLOCK); - } - - print @_; - exit 5; -} - -sub ask_user -{ - my ($dbkey, $dbchunk) = @_; - - if (defined($ENV{"BCHECK_UPDATE"})) { - $bcheckdb{$dbkey} = $dbchunk; - return; - } - - &bailout("BC problem detected") if (! -t STDIN); - - print "(I)gnore / (Q)uit / (U)pdate: "; - - my $key; - while(defined(read STDIN, $key, 1)) { - $key = lc($key); - - print "got: >$key<\n"; - - return if ($key eq 'i'); - - &bailout("BC problem. aborted") if ($key eq 'q'); - - if ($key eq 'u') { - $bcheckdb{$dbkey} = $dbchunk; - return; - } - print "\n(I)gnore / (Q)uit / (U)pdate: "; - } -} - -sub diff_chunk($$) -{ - my ($oldl, $newl) = @_; - my @old = split /^/m, $oldl; - my @new = split /^/m, $newl; - my $haschanges = 0; - my $max = $#old > $#new ? $#old : $#new; - - die "whoops. key different" if ($old[0] ne $new[0]); - - if ($#old != $#new) { - warn ("Structural difference.\n"); - print @old; - print "-----------------------------------------------\n"; - print @new; - $haschanges = 1; - return $haschanges; - } - - print $old[0]; - - my ($class) = ($old[0] =~ /^(?:Class |Vtable for )(\S+)/); - - my $c = 1; - while ($c < $max) { - my ($o, $n) = ($old[$c], $new[$c]); - chomp $o; - chomp $n; - $c++; - next if ($o eq $n); - - if(defined($class) and $n =~ /^(\d+\s+)\w+(::\S+\s*.*)$/) { - next if ($n eq "$1$class$2"); - } - - $haschanges = 1; - - print "-$o\n+$n\n\n"; - } - - return $haschanges; -} - -local $dblock = $ENV{"HOME"} . "/bcheck.lock"; -my $dbfile = $ENV{"HOME"} . "/bcheck.db"; -my $cdump = $ARGV[0]; - -die "file $cdump is not readable: $!" if (! -f $cdump); - -# make sure the advisory lock exists -open(MYLOCK, ">$dblock"); -print MYLOCK ""; - -flock MYLOCK, LOCK_EX; - -tie %bcheckdb, 'DB_File', $dbfile; - -my $chunk = ""; - -open (IN, "<$cdump") or die "cannot open $cdump: $!"; -while () { - - chop; - - s/0x[0-9a-fA-F]+/0x......../g; - s/base size=/size=/g; - s/\(\)\s*$//g; - s/base align=/align=/g; - - $chunk .= $_ . "\n"; - - if(/^\s*$/) { - my @lines = split /^/m, $chunk; - my $key = $lines[0]; - chomp $key; - - if($key !~ // && - $key !~ //) { - if(defined($bcheckdb{$key})) { - my $dbversion = $bcheckdb{$key}; - - if($dbversion ne $chunk) { - &ask_user($key, $chunk) if(&diff_chunk($dbversion, $chunk)); - } - } - else { - $bcheckdb{$key} = $chunk; - print "NEW: $key\n"; - } - } - - $chunk = ""; - next; - } - -} -close(IN); - -untie %bcheckdb; -flock MYLOCK, LOCK_UN; -close(MYLOCK); - -exit 0; diff --git a/admin/compile b/admin/compile deleted file mode 100755 index 1b1d232..0000000 --- a/admin/compile +++ /dev/null @@ -1,142 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand `-c -o'. - -scriptversion=2005-05-14.22 - -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. -# Written by Tom Tromey . -# -# 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, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand `-c -o'. -Remove `-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file `INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; -esac - -ofile= -cfile= -eat= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as `compile cc -o foo foo.c'. - # So we strip `-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no `-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # `.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` - -# Create the lock directory. -# Note: use `[/.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/admin/conf.change.pl b/admin/conf.change.pl deleted file mode 100644 index 129d759..0000000 --- a/admin/conf.change.pl +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env perl - -# this script patches a config.status file, to use our own perl script -# in the main loop -# we do it this way to circumvent hacking (and thereby including) -# autoconf function (which are GPL) into our LGPL acinclude.m4.in -# written by Michael Matz -# adapted by Dirk Mueller -# -# This file 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 library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. - -# You should have received a copy of the GNU Library General Public License -# along with this library; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. - -# we have to change two places -# 1. the splitting of the substitutions into chunks of 90 (or even 48 in -# later autoconf's -# 2. the big main loop which patches all Makefile.in's - -use strict; -use File::Basename; - -my $ac_aux_dir = dirname($0); -my ($flag); -my $ac_version = 0; -my $vpath_seen = 0; -$flag = 0; - -while (<>) { -# usage of $flag: 0 -- we have seen nothing yet -# 1 -- we are in (1) -# 2 -- we have ended (1) -# 3 -- we are in (2) -# 4 -- we ended (2) - - if ($flag == 4) { - print; - } elsif ($flag == 0) { -# 1. begins with (including): "ac_max_sed_\S+\s*=\s*[0-9]+..." -# ends with (excluding) "CONFIG_FILE=..." -# in later autoconf (2.14.1) there is no CONFIG_FILES= line, -# but instead the (2) directly follow (1) - if (/^\s*ac_max_sed_([a-z]+).*=\s*([0-9]+)/ ) { - $flag = 1; - if ($1 eq 'lines') { - # lets hope its different with 2141, - # wasn't able to verify that - if ($2 eq '48') { - $ac_version = 250; - } - else { - $ac_version = 2141; - } - } elsif ($1 eq 'cmds') { - $ac_version = 213; - } - # hmm, we don't know the autoconf version, but we try anyway - } else { - print; - } - } elsif ($flag == 1) { - if (/^\s*CONFIG_FILES=/ && ($ac_version != 250)) { - print; - $flag = 2; - } elsif (/^\s*for\s+ac_file\s+in\s+.*CONFIG_FILES/ ) { - $flag = 3; - } - } elsif ($flag == 2) { -# 2. begins with: "for ac_file in.*CONFIG_FILES" (the next 'for' after (1)) -# end with: "rm -f conftest.s\*" -# on autoconf 250, it ends with '# CONFIG_HEADER section' -# -# gg: if a post-processing commands section is found first, -# stop there and insert a new loop to honor the case/esac. -# (pattern: /^\s+#\sRun the commands associated with the file./) - - if (/^\s*for\s+ac_file\s+in\s+.*CONFIG_FILES/ ) { - $flag = 3; - } else { - print; - } - } elsif ($flag == 3) { - if (/^\s*rm\s+-f\s+conftest/ ) { - $flag = 4; - &insert_main_loop(); - } elsif (/^\s*rm\s+-f\s+.*ac_cs_root/ ) { - $flag = 4; - &insert_main_loop(); - #die "hhhhhhh"; - if ($ac_version != 2141) { - print STDERR "hmm, don't know autoconf version\n"; - } - } elsif (/^\#\s*CONFIG_(HEADER|COMMANDS) section.*|^\s+#\s(Run) the commands associated/) { - $flag = 4; - my $commands = defined $2; - &insert_main_loop(); - $commands && insert_command_loop(); - if($ac_version != 250) { - print STDERR "hmm, something went wrong :-(\n"; - } - } elsif (/VPATH/ ) { - $vpath_seen = 1; - } - } -} - -die "wrong input (flag != 4)" unless $flag == 4; -print STDERR "hmm, don't know autoconf version\n" unless $ac_version; - -sub insert_main_loop { - - if ($ac_version == 250) { - &insert_main_loop_250(); - } - else { - &insert_main_loop_213(); - } -} - -sub insert_main_loop_250 { - - print <>\$tmp/subs.sed -EOF - } - print <> \$tmp/subs.files - fi - done - if test -f \$tmp/subs.files ; then - perl $ac_aux_dir/config.pl "\$tmp/subs.sed" "\$tmp/subs.files" "\$srcdir" "\$INSTALL" - fi - rm -f \$tmp/subs.files - -fi -EOF - return; -} - -sub insert_main_loop_213 { - print <> \$ac_cs_root.subs -EOF - } - print <> \$ac_cs_root.sacfiles - fi -done -if test -f \$ac_cs_root.sacfiles ; then - perl $ac_aux_dir/config.pl "\$ac_cs_root.subs" "\$ac_cs_root.sacfiles" "\$ac_given_srcdir" "\$ac_given_INSTALL" -fi -rm -f \$ac_cs_root.s* - -EOF - return; -} - -sub insert_command_loop { - print <. -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerppc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[45]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - # avoid double evaluation of $set_cc_for_build - test -n "$CC_FOR_BUILD" || eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - x86:Interix*:[34]*) - echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' - exit ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips - #undef mipsel - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips64 - #undef mips64el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #ifdef __INTEL_COMPILER - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - *86) UNAME_PROCESSOR=i686 ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/admin/config.pl b/admin/config.pl deleted file mode 100644 index c2b0517..0000000 --- a/admin/config.pl +++ /dev/null @@ -1,238 +0,0 @@ -#!/usr/bin/env perl -# a script for use by autoconf to make the Makefiles -# from the Makefile.in's -# -# the original autoconf mechanism first splits all substitutions into groups -# of ca. 90, and than invokes sed for _every_ Makefile.in and every group -# (so around 2-3 times per Makefile.in). So this takes forever, as sed -# has to recompile the regexps every time. -# -# this script does better. It changes all Makefile.ins in one process. -# in kdelibs the time for building Makefile went down from 2:59 min to 13 sec! -# -# written by Michael Matz -# adapted by Dirk Mueller - -# This file 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 library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. - -# You should have received a copy of the GNU Library General Public License -# along with this library; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. - -use strict; - -use File::Path; - -my $ac_subs=$ARGV[0]; -my $ac_sacfiles = $ARGV[1]; -my $ac_given_srcdir=$ARGV[2]; -my $ac_given_INSTALL=$ARGV[3]; - -my @comp_match; -my @comp_subs; - -#print "ac_subs=$ac_subs\n"; -#print "ac_sacfiles=$ac_sacfiles\n"; -#print "ac_given_srcdir=$ac_given_srcdir\n"; -#print "ac_given_INSTALL=$ac_given_INSTALL\n"; - -my $configure_input; -my ($srcdir, $top_srcdir); -my $INSTALL; -my $bad_perl = ($] < 5.005); -my $created_file_count = 0; - -open(CF, "< $ac_subs") || die "can't open $ac_subs: $!"; -my @subs = ; -my $pat; -close(CF); -chomp @subs; -@comp_match=(); -@comp_subs=(); - -if ($bad_perl) { - print "Using perl older than version 5.005\n"; - foreach $pat (@subs) { - if ( ($pat =~ m/s%([^%]*)%([^%]*)%g/ ) - || ($pat =~ m/s%([^%]*)%([^%]*)%;t/ ) - || ($pat =~ m/s,([^,]*),(.*),;t/) - || ($pat =~ m%s/([^/]*)/([^/]*)/g% ) - || ($pat =~ m%s/([^/]*)/([^/]*)/;t% ) - ) { - # form : s%bla%blubb%g - # or s%bla%blubb%;t t (autoconf > 2.13 and < 2.52 ?) - # or s,bla,blubb,;t t (autoconf 2.52) - my $srch = $1; - my $repl = $2; - $repl =~ s/\\(.)/$1/g; - push @comp_subs, make_closure($srch, $repl); - - } elsif ( ($pat =~ /%([^%]*)%d/ ) - || ($pat =~ m%/([^/]*)/d% ) - ) { - push @comp_subs, make_closure($1, ""); - } else { - die "Uhh. Malformed pattern in $ac_subs ($pat)" - unless ( $pat =~ /^\s*$/ ); # ignore white lines - } - } -} else { - foreach $pat (@subs) { - if ( ($pat =~ /s%([^%]*)%([^%]*)%g/ ) || - ($pat =~ /s%([^%]*)%([^%]*)%;t/ ) || - ($pat =~ /s,([^,]*),(.*),;t/) ) { - # form : s%bla%blubb%g - # or s%bla%blubb%;t t (autoconf > 2.13 and < 2.52 ?) - # or s,bla,blubb,;t t (autoconf 2.52) - my $srch = $1; - my $repl = $2; - push @comp_match, eval "qr/\Q$srch\E/"; # compile match pattern - $repl =~ s/\\(.)/$1/g; - push @comp_subs, $repl; - } elsif ( ($pat =~ /%([^%]*)%d/ ) - || ($pat =~ m%/([^/]*)/d% ) - ) { - push @comp_match, eval "qr/\Q$1\E/"; - push @comp_subs, ""; - } else { - die "Uhh. Malformed pattern in $ac_subs ($pat)" - unless ( $pat =~ /^\s*$/ ); # ignore white lines - } - } -} -undef @subs; - -# read the list of files to be patched, form: -# ./Makefile arts/Makefile arts/examples/Makefile arts/flow/Makefile - -open(CF, "< $ac_sacfiles") || die "can't open $ac_sacfiles: $!"; -my @ac_files = ; -close(CF); -chomp @ac_files; - - -my $ac_file; -foreach $ac_file (@ac_files) { - next if $ac_file =~ /\.\./; - next if $ac_file =~ /^\s*$/; - my $ac_file_in; - my ($ac_dir, $ac_dots, $ac_dir_suffix); - - if ($ac_file =~ /.*:.*/ ) { - ($ac_file_in = $ac_file) =~ s%[^:]*:%%; - $ac_file =~ s%:.*%%; - } else { - $ac_file_in = $ac_file.".in"; - } - -# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - -# Remove last slash and all that follows it. Not all systems have dirname. - ($ac_dir = $ac_file) =~ s%/[^/][^/]*$%%; - if ( ($ac_dir ne $ac_file) && ($ac_dir ne ".")) { -# The file is in a subdirectory. - if (! -d "$ac_dir") { mkpath "$ac_dir", 0, 0777; } - ($ac_dir_suffix = $ac_dir) =~ s%^./%%; - $ac_dir_suffix="/".$ac_dir_suffix; -# A "../" for each directory in $ac_dir_suffix. - ($ac_dots = $ac_dir_suffix) =~ s%/[^/]*%../%g; - } else { - $ac_dir_suffix=""; - $ac_dots=""; - } - - if ($ac_given_srcdir eq ".") { - $srcdir="."; - if ($ac_dots) { - ( $top_srcdir = $ac_dots) =~ s%/$%%; - } else { $top_srcdir="."; } - } elsif ($ac_given_srcdir =~ m%^/%) { - $srcdir=$ac_given_srcdir.$ac_dir_suffix; - $top_srcdir = $ac_given_srcdir; - } else { - $srcdir = $ac_dots.$ac_given_srcdir.$ac_dir_suffix; - $top_srcdir = $ac_dots.$ac_given_srcdir; - } - - if ($ac_given_INSTALL) { - if ($ac_given_INSTALL =~ m%^/% ) { - $INSTALL = $ac_given_INSTALL; - } else { - $INSTALL = $ac_dots.$ac_given_INSTALL; - } - } - - print "fast creating $ac_file\n"; - unlink $ac_file; - my $ac_comsub=""; - my $fname=$ac_file_in; - $fname =~ s%.*/%%; - $configure_input="$ac_file. Generated from $fname by config.pl."; - - my $ac_file_inputs; - ($ac_file_inputs = $ac_file_in) =~ s%^%$ac_given_srcdir/%; - $ac_file_inputs =~ s%:% $ac_given_srcdir/%g; - - patch_file($ac_file, $ac_file_inputs); - ++$created_file_count; -} - -print "config.pl: fast created $created_file_count file(s).\n"; - -sub patch_file { - my ($outf, $infiles) = @_; - my $filedata; - my @infiles=split(' ', $infiles); - my $i=0; - my $name; - - foreach $name (@infiles) { - if (open(CF, "< $name")) { - while () { - $filedata .= $_; - } - close(CF); - } else { - print STDERR "can't open $name: $!"."\n"; - } - } - - $filedata =~ s%\@configure_input\@%$configure_input%g; - $filedata =~ s%\@srcdir\@%$srcdir%g; - $filedata =~ s%\@top_srcdir\@%$top_srcdir%g; - $filedata =~ s%\@INSTALL\@%$INSTALL%g; - - if ($bad_perl) { - while ($i <= $#comp_subs) { - my $ref = $comp_subs[$i]; - &$ref(\$filedata); - $i++; - } - } else { - while ($i <= $#comp_match) { - $filedata =~ s/$comp_match[$i]/$comp_subs[$i]/g; - $i++; - } - } - open(CF, "> $outf") || die "can't create $outf: $!"; - print CF $filedata; - close(CF); -} - -sub make_closure { - my ($pat, $sub) = @_; - my $ret = eval "return sub { my \$ref=shift; \$\$ref =~ s%\Q$pat\E%\Q$sub\E%g; }"; - if ($@) { - print "can't create CODE: $@\n"; - } - return $ret; -} diff --git a/admin/config.sub b/admin/config.sub deleted file mode 100755 index 2ef2842..0000000 --- a/admin/config.sub +++ /dev/null @@ -1,1575 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. - -timestamp='2005-07-01' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ - kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64vr | mips64vrel \ - | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | ms1 \ - | msp430 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b \ - | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k) - basic_machine=$basic_machine-unknown - ;; - m32c) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | ms1-* \ - | msp430-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ - | ymp-* \ - | z8k-*) - ;; - m32c-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16c) - basic_machine=cr16c-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* | -skyos*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/admin/configure.in.bot.end b/admin/configure.in.bot.end deleted file mode 100644 index 1bc030b..0000000 --- a/admin/configure.in.bot.end +++ /dev/null @@ -1,45 +0,0 @@ -# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure -if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then - # And if so, warn when they don't match - if test "$kde_libs_prefix" != "$given_prefix"; then - # And if kde doesn't know about the prefix yet - echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null - if test $? -ne 0; then - echo "" - echo "Warning: you chose to install this package in $given_prefix," - echo "but KDE was found in $kde_libs_prefix." - echo "For this to work, you will need to tell KDE about the new prefix, by ensuring" - echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix" - echo "Then restart KDE." - echo "" - fi - fi -fi - -if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then - echo "" - echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility" - echo "was not included. Therefore, GCC symbol visibility support remains disabled." - echo "" - echo "For better performance, consider including the Qt visibility supporting patch" - echo "located at:" - echo "" - echo "http://bugs.kde.org/show_bug.cgi?id=109386" - echo "" - echo "and recompile all of Qt and KDE. Note, this is entirely optional and" - echo "everything will continue to work just fine without it." - echo "" -fi - -if test "$all_tests" = "bad"; then - if test ! "$cache_file" = "/dev/null"; then - echo "" - echo "Please remove the file $cache_file after changing your setup" - echo "so that configure will find the changes next time." - echo "" - fi -else - echo "" - echo "Good - your configure finished. Start make now" - echo "" -fi diff --git a/admin/configure.in.min b/admin/configure.in.min deleted file mode 100644 index 0dfe378..0000000 --- a/admin/configure.in.min +++ /dev/null @@ -1,57 +0,0 @@ -dnl This file is part of the KDE libraries/packages -dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org) - -dnl This file is free software; you can redistribute it and/or -dnl modify it under the terms of the GNU Library General Public -dnl License as published by the Free Software Foundation; either -dnl version 2 of the License, or (at your option) any later version. - -dnl This library is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl Library General Public License for more details. - -dnl You should have received a copy of the GNU Library General Public License -dnl along with this library; see the file COPYING.LIB. If not, write to -dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -dnl Boston, MA 02110-1301, USA. - -# Original Author was Kalle@kde.org -# I lifted it in some mater. (Stephan Kulow) -# I used much code from Janos Farkas - -dnl Process this file with autoconf to produce a configure script. - -AC_INIT(acinclude.m4) dnl a source file from your sub dir - -dnl This is so we can use kde-common -AC_CONFIG_AUX_DIR(admin) - -dnl This ksh/zsh feature conflicts with `cd blah ; pwd` -unset CDPATH - -dnl Checking host/target/build systems, for make, install etc. -AC_CANONICAL_SYSTEM -dnl Perform program name transformation -AC_ARG_PROGRAM - -dnl Automake doc recommends to do this only here. (Janos) -AM_INIT_AUTOMAKE(@MODULENAME@, @VERSION@) dnl searches for some needed programs - -KDE_SET_PREFIX - -dnl generate the config header -AM_CONFIG_HEADER(config.h) dnl at the distribution this done - -dnl Checks for programs. -AC_CHECK_COMPILERS -AC_ENABLE_SHARED(yes) -AC_ENABLE_STATIC(no) -KDE_PROG_LIBTOOL - -dnl for NLS support. Call them in this order! -dnl WITH_NLS is for the po files -AM_KDE_WITH_NLS - -dnl KDE_USE_QT -AC_PATH_KDE diff --git a/admin/cvs.sh b/admin/cvs.sh deleted file mode 100644 index 6bb1e60..0000000 --- a/admin/cvs.sh +++ /dev/null @@ -1,661 +0,0 @@ -#! /bin/sh -# -# cvs.sh -# -# This file contains support code from Makefile.common -# It defines a shell function for each known target -# and then does a case to call the correct function. - -unset MAKEFLAGS - -call_and_fix_autoconf() -{ - $AUTOCONF || exit 1 - if test -r configure.in.in ; then - perl -pi -e "print \"if test \\\"x\\\$with_fast_perl\\\" = \\\"xyes\\\"; then\ - \\n perl -i.bak \\\$ac_aux_dir/conf.change.pl \\\$CONFIG_STATUS\ - \\\\\\n || mv \\\$CONFIG_STATUS.bak \\\$CONFIG_STATUS\ - \\n rm -f \\\$CONFIG_STATUS.bak\\nfi\ - \\n\" if /^\\s*chmod\\s+.*\\+x\\s+.*CONFIG_STATUS/; s,^#line.*LINENO.*\$,/* \$& */, ;" configure - fi -} - -strip_makefile() -{ - if test ! -f $makefile_wo; then - perl -e '$in=0; while ( <> ) { $in = 1 if ($_ =~ m/^if / ); print $_ unless ($in || $_ =~ m/^include /); $in = 0 if ($_ =~ m/^endif/); }' < $makefile_am > $makefile_wo - fi -} - -check_autotool_versions() -{ -required_autoconf_version="2.53 or newer" -AUTOCONF_VERSION=`$AUTOCONF --version | head -n 1` -case $AUTOCONF_VERSION in - Autoconf*2.5* | autoconf*2.5* | autoconf*2.6* ) : ;; - "" ) - echo "*** AUTOCONF NOT FOUND!." - echo "*** KDE requires autoconf $required_autoconf_version" - exit 1 - ;; - * ) - echo "*** YOU'RE USING $AUTOCONF_VERSION." - echo "*** KDE requires autoconf $required_autoconf_version" - exit 1 - ;; -esac - -AUTOHEADER_VERSION=`$AUTOHEADER --version | head -n 1` -case $AUTOHEADER_VERSION in - Autoconf*2.5* | autoheader*2.5* | autoheader*2.6* ) : ;; - "" ) - echo "*** AUTOHEADER NOT FOUND!." - echo "*** KDE requires autoheader $required_autoconf_version" - exit 1 - ;; - * ) - echo "*** YOU'RE USING $AUTOHEADER_VERSION." - echo "*** KDE requires autoheader $required_autoconf_version" - exit 1 - ;; -esac - -AUTOMAKE_STRING=`$AUTOMAKE --version | head -n 1` -required_automake_version="1.6.1 or newer" -case $AUTOMAKE_STRING in - automake*1.5d* | automake*1.5* | automake*1.5-* ) - echo "*** YOU'RE USING $AUTOMAKE_STRING." - echo "*** KDE requires automake $required_automake_version" - exit 1 - ;; - automake*1.6.* | automake*1.7* | automake*1.8* | automake*1.9* | automake*1.10*) - echo "*** $AUTOMAKE_STRING found." - UNSERMAKE=no - ;; - "" ) - echo "*** AUTOMAKE NOT FOUND!." - echo "*** KDE requires automake $required_automake_version" - exit 1 - ;; - *unsermake* ) : - echo "*** YOU'RE USING UNSERMAKE." - echo "*** GOOD LUCK!! :)" - UNSERMAKE=unsermake - ;; - * ) - echo "*** YOU'RE USING $AUTOMAKE_STRING." - echo "*** KDE requires automake $required_automake_version" - exit 1 - ;; -esac -unset required_automake_version -} - -cvs() -{ -check_autotool_versions -acinclude_m4 - -### Make new subdirs and configure.in. -### The make calls could be optimized away here, -### with a little thought. -if test -r configure.in.in; then - rm -f configure.in - echo "*** Creating list of subdirectories" - create_subdirs - - if test -r Makefile.am.in; then - echo "*** Creating Makefile.am" - if grep '\$(top_srcdir)/Makefile.am:' $makefile_am >/dev/null; then - strip_makefile - $MAKE -f $makefile_wo top_srcdir=. ./Makefile.am || exit 1 - else - Makefile_am - fi - fi - configure_files - echo "*** Creating configure.in" - if grep '\$(top_srcdir)/configure.in:' $makefile_am >/dev/null; then - strip_makefile - $MAKE -f $makefile_wo top_srcdir=. ./configure.in || exit 1 - else - configure_in - fi -fi - -echo "*** Creating aclocal.m4" -$ACLOCAL $ACLOCALFLAGS || exit 1 -echo "*** Creating configure" -call_and_fix_autoconf - -if egrep "^AM_CONFIG_HEADER" configure.in >/dev/null 2>&1; then - echo "*** Creating config.h template" - $AUTOHEADER || exit 1 - touch config.h.in -fi - -echo "*** Creating Makefile templates" -$AUTOMAKE || exit 1 - -if test "$UNSERMAKE" = no; then - echo "*** Postprocessing Makefile templates" - perl -w admin/am_edit || exit 1 -fi - -if egrep "^cvs-local:" $makefile_am >/dev/null; then \ - strip_makefile - $MAKE -f $makefile_wo cvs-local top_srcdir=. || exit 1 -fi - -echo "*** Creating date/time stamp" -touch stamp-h.in - -echo "*** Finished" -echo " Don't forget to run ./configure" -echo " If you haven't done so in a while, run ./configure --help" -} - -dist() -{ -check_autotool_versions - -### -### First build all of the files necessary to do just "make" -### -acinclude_m4 -if test -r configure.in.in; then - rm -f configure.in - create_subdirs - - if test -r Makefile.am.in; then - if grep '\$(top_srcdir)/Makefile.am:' $makefile_am >/dev/null; then - strip_makefile - $MAKE -f $makefile_wo top_srcdir=. ./Makefile.am || exit 1 - else - Makefile_am - fi - fi - configure_files - if grep '\$(top_srcdir)/configure.in:' $makefile_am >/dev/null; then - strip_makefile - $MAKE -f $makefile_wo top_srcdir=. ./configure.in || exit 1 - else - configure_in - fi -fi -$ACLOCAL $ACLOCALFLAGS -if egrep "^AM_CONFIG_HEADER" configure.in >/dev/null 2>&1; then - echo "*** Creating config.h template" - $AUTOHEADER || exit 1 - touch config.h.in -fi -$AUTOMAKE --foreign || exit 1 -if test "$UNSERMAKE" = no; then - echo "*** Postprocessing Makefile templates" - perl -w admin/am_edit || exit 1 -fi -call_and_fix_autoconf -touch stamp-h.in -if grep "^cvs-local:" $makefile_am >/dev/null; then - strip_makefile - $MAKE -f $makefile_wo cvs-local top_srcdir=. -fi - -### -### Then make messages -### -if test -d po; then - LIST=`find ./po -name "*.po"` - for i in $LIST; do - file2=`echo $i | sed -e "s#\.po#\.gmo#"` - msgfmt -o $file2 $i || touch $file2 - done -fi -if grep "^cvs-dist-local:" $makefile_am >/dev/null; then - strip_makefile - $MAKE -f $makefile_wo cvs-dist-local top_srcdir=. -fi -} - -subdir_dist() -{ -$ACLOCAL $ACLOCALFLAGS -$AUTOHEADER -touch config.h.in -$AUTOMAKE -AUTOMAKE_STRING=`$AUTOMAKE --version | head -n 1` -case $AUTOMAKE_STRING in - *unsermake* ) : - ;; - *) - perl -w ../admin/am_edit --path=../admin -esac -call_and_fix_autoconf -touch stamp-h.in -} - -configure_in() -{ -rm -f configure.in configure.in.new -kde_use_qt_param= -test -f configure.files || { echo "need configure.files for configure.in"; exit 1; } -list=`fgrep -v "configure.in.bot" < configure.files | fgrep -v "configure.in.mid"` -: > configure.in.new -for file in $list; do - echo "dnl =======================================================" >> configure.in.new - echo "dnl FILE: $file" >> configure.in.new - echo "dnl =======================================================" >> configure.in.new - echo "" >> configure.in.new - cat $file >> configure.in.new -done -echo "KDE_CREATE_SUBDIRSLIST" >> configure.in.new -if test -f Makefile.am.in; then - subdirs=`cat subdirs` - for dir in $subdirs; do - vdir=`echo $dir | sed -e 's,[-+.@],_,g'` - echo "AM_CONDITIONAL($vdir""_SUBDIR_included, test \"x\$$vdir""_SUBDIR_included\" = xyes)" >> configure.in.new - if test -f "$dir/configure.in"; then - echo "if test \"x\$$vdir""_SUBDIR_included\" = xyes; then " >> configure.in.new - echo " AC_CONFIG_SUBDIRS($dir)" >> configure.in.new - echo "fi" >> configure.in.new - fi - done -fi - -echo "AC_CONFIG_FILES([ Makefile ])" >> configure.in.new - -if test -f inst-apps; then - topleveldirs=`cat inst-apps` -else - topleveldirs= - for dir in `ls -1d * | sort`; do - if test "$dir" != "debian" && test -d $dir; then - topleveldirs="$topleveldirs $dir" - fi - done -fi - -for topleveldir in $topleveldirs; do - if test -f $topleveldir/configure.in; then - continue - fi - if test -f $topleveldir/Makefile.am; then :; else - continue - fi - - mfs=`find $topleveldir -follow -name Makefile.am -print | fgrep -v "/." | \ - sed -e 's#\./##; s#/Makefile.am$##' | sort | sed -e 's#$#/Makefile#'` - for i in $mfs; do - echo "AC_CONFIG_FILES([ $i ])" >> configure.in.new - done -done - -files=`cat configure.files` -list=`egrep '^dnl AC_OUTPUT\(.*\)' $files | sed -e "s#^.*dnl AC_OUTPUT(\(.*\))#\1#"` -for file in $list; do - echo "AC_CONFIG_FILES([ $file ])" >> configure.in.new -done - -midfiles=`cat configure.files | fgrep "configure.in.mid"` -test -n "$midfiles" && cat $midfiles >> configure.in.new - -echo "AC_OUTPUT" >> configure.in.new -modulename= -if test -f configure.in.in; then - if head -n 2 configure.in.in | egrep "^#MIN_CONFIG\(.*\)$" > /dev/null; then - kde_use_qt_param=`cat configure.in.in | sed -n -e "s/#MIN_CONFIG(\(.*\))/\1/p"` - fi - if head -n 2 configure.in.in | egrep "^#MIN_CONFIG" > /dev/null; then - line=`grep "^AM_INIT_AUTOMAKE(" configure.in.in` - if test -n "$line"; then - modulename=`echo $line | sed -e "s#AM_INIT_AUTOMAKE(\([^,]*\),.*#\1#"` - VERSION=`echo $line | sed -e "s#AM_INIT_AUTOMAKE([^,]*, *\([^)]*\)).*#\1#"` - fi - sed -e "s#AM_INIT_AUTOMAKE([^@].*#dnl PACKAGE set before#" \ - configure.in.new > configure.in && mv configure.in configure.in.new - fi -fi -if test -z "$VERSION" || test "$VERSION" = "@VERSION@"; then - VERSION="\"3.5.7\"" -fi -if test -z "$modulename" || test "$modulename" = "@MODULENAME@"; then - modulename=`pwd`; - modulename=`basename $modulename` - esc_VERSION=`echo $VERSION | sed -e "s#[^.0-9a-zA-Z]##g"` - modulename=`echo $modulename | sed -e "s#-$esc_VERSION##"` - -fi -if test -n "$kde_use_qt_param"; then - sed -e "s#^dnl KDE_USE_QT#KDE_USE_QT($kde_use_qt_param)#" \ - configure.in.new > configure.in && mv configure.in configure.in.new -fi -sed -e "s#@MODULENAME@#$modulename#" configure.in.new | - sed -e "s#@VERSION@#$VERSION#" > configure.in -botfiles=`cat configure.files | egrep "configure.in.bot"` -test -n "$botfiles" && cat $botfiles >> configure.in -cat $admindir/configure.in.bot.end >> configure.in -rm -f configure.in.new -} - -configure_files() -{ -echo "*** Creating configure.files" -admindir=NO -for i in . .. ../.. ../../..; do - if test -x $i/admin; then admindir=$i/admin; break; fi -done -rm -f configure.files -touch configure.files -if test -f configure.in.in && head -n 2 configure.in.in | grep "^#MIN_CONFIG" > /dev/null; then - echo $admindir/configure.in.min >> configure.files -fi -test -f configure.in.in && echo configure.in.in >> configure.files -# we collect files in the subdirs and do some sorting tricks, so subsubdirs come after subdirs -if test -f inst-apps; then - inst=`cat inst-apps` - list="" - for i in $inst; do - list="$list `find $i/ -follow -name "configure.in.in" -o -name "configure.in.bot" -o -name "configure.in.mid" | \ - sed -e "s,/configure,/aaaconfigure," | sort | sed -e "s,/aaaconfigure,/configure,"`" - done -else - list=`find . -follow -name "configure.in.in" -o -name "configure.in.bot" -o -name "configure.in.mid" | \ - sed -e "s,/configure,/aaaconfigure," | sort | sed -e "s,/aaaconfigure,/configure,"` -fi -for i in $list; do if test -f $i && test `dirname $i` != "." ; then - echo $i >> configure.files -fi; done -test -f configure.in.mid && echo configure.in.mid >> configure.files -test -f configure.in.bot && echo configure.in.bot >> configure.files -if test ! -s configure.files; then - echo "There are no files to build a configure. Please check your checkout." - exit 1 -fi -} - -create_subdirs() -{ -if grep '\$(top_srcdir)/subdirs:' $makefile_am >/dev/null; then - # as many modules contain rules to create subdirs without any - # dependencies make won't create it unless there is no file. - # so we check if that's a dummy rule or one that works - rm -f subdirs.cvs.sh.$$ - if test -f subdirs; then - mv subdirs subdirs.cvs.sh.$$ - fi - strip_makefile - $MAKE -f $makefile_wo top_srcdir=. ./subdirs || exit 1 - if test -f subdirs.cvs.sh.$$; then - if test -s subdirs; then - rm subdirs.cvs.sh.$$ - else - mv subdirs.cvs.sh.$$ subdirs - fi - fi -else - subdirs -fi -} - -subdirs() -{ -dirs= -idirs= -if test -f inst-apps; then - idirs=`cat inst-apps` -else - idirs=`ls -1 | sort` -fi - -compilefirst=`sed -ne 's#^COMPILE_FIRST[ ]*=[ ]*##p' $makefile_am | head -n 1` -compilelast=`sed -ne 's#^COMPILE_LAST[ ]*=[ ]*##p' $makefile_am | head -n 1` -for i in $idirs; do - if test -f $i/Makefile.am; then - case " $compilefirst $compilelast " in - *" $i "*) ;; - *) dirs="$dirs $i" - esac - fi -done - -: > ./_SUBDIRS - -for d in $compilefirst; do - echo $d >> ./_SUBDIRS -done - -(for d in $dirs; do - list=`sed -ne "s#^COMPILE_BEFORE_$d""[ ]*=[ ]*##p" $makefile_am | head -n 1` - for s in $list; do - echo $s $d - done - list=`sed -ne "s#^COMPILE_AFTER_$d""[ ]*=[ ]*##p" $makefile_am | head -n 1` - for s in $list; do - echo $d $s - done - echo $d $d -done ) | tsort >> ./_SUBDIRS - -for d in $compilelast; do - echo $d >> ./_SUBDIRS -done - -if test -r subdirs && cmp -s subdirs _SUBDIRS; then - rm -f _SUBDIRS -fi -test -r _SUBDIRS && mv _SUBDIRS subdirs || true -} - -Makefile_am() -{ -if test -f Makefile.am.in; then - compilefirst=`sed -ne 's#^COMPILE_FIRST[ ]*=[ ]*##p' $makefile_am | head -n 1` - compilelast=`sed -ne 's#^COMPILE_LAST[ ]*=[ ]*##p' $makefile_am | head -n 1` - - idirs= - dirs= - if test -f inst-apps; then - idirs=`cat inst-apps` - else - idirs=`cat subdirs` - fi - for i in $idirs; do - case " $compilefirst $compilelast " in - *" $i "*) ;; - *) dirs="$dirs $i" - esac - done - - adds=`fgrep '$(top_srcdir)/acinclude.m4:' Makefile.am.in | sed -e 's,^[^:]*: *,,; s,\$(top_srcdir)/,,g'` - if echo "$adds" | fgrep "*" >/dev/null ; then - adds=`ls -d -1 $adds 2>/dev/null` - fgrep -v '$(top_srcdir)/acinclude.m4:' Makefile.am.in > Makefile.am.in.adds - str='$(top_srcdir)/acinclude.m4:' - for add in $adds; do - str="$str \$(top_srcdir)/$add" - done - echo $str >> Makefile.am.in.adds - else - cat Makefile.am.in > Makefile.am.in.adds - fi - - cat Makefile.am.in.adds | \ - sed -e 's,^\s*\(COMPILE_BEFORE.*\),# \1,' | \ - sed -e 's,^\s*\(COMPILE_AFTER.*\),# \1,' > Makefile.am - echo "SUBDIRS="'$(TOPSUBDIRS)' >> Makefile.am - rm Makefile.am.in.adds -fi -} - -acinclude_m4() -{ - echo "*** Creating acinclude.m4" - adds= - if grep '\$(top_srcdir)/acinclude.m4:' $makefile_am >/dev/null; then - strip_makefile - rm -f acinclude.m4 - adds=`grep '\$(top_srcdir)/acinclude.m4:' $makefile_wo | sed -e 's,^[^:]*: *,,; s,\$(top_srcdir),.,g'` - if echo $adds | fgrep "*" >/dev/null ; then - adds=`ls -d -1 $adds 2>/dev/null` - else - $MAKE -f $makefile_wo top_srcdir=. ./acinclude.m4 || exit 1 - fi - else - rm -f acinclude.m4 - fi - # if it wasn't created up to now, then we do it better - if test ! -f acinclude.m4; then - cat admin/acinclude.m4.in admin/libtool.m4.in admin/pkg.m4.in $adds > acinclude.m4 - fi -} - -package_merge() -{ -catalogs=$POFILES -for cat in $catalogs; do - msgmerge -o $cat.new $cat $PACKAGE.pot - if test -s $cat.new; then - grep -v "\"POT-Creation" $cat.new > $cat.new.2 - grep -v "\"POT-Creation" $cat >> $cat.new.1 - if diff $cat.new.1 $cat.new.2; then - rm $cat.new - else - mv $cat.new $cat - fi - rm -f $cat.new.1 $cat.new.2 - fi -done -} - -extract_messages() -{ -podir=${podir:-$PWD/po} -files=`find . -name Makefile.am | xargs egrep -l '^messages:' ` -dirs=`for i in $files; do echo \`dirname $i\`; done` -tmpname="$PWD/messages.log" -if test -z "$EXTRACTRC"; then EXTRACTRC=extractrc ; fi -if test -z "$PREPARETIPS"; then PREPARETIPS=preparetips ; fi -export EXTRACTRC PREPARETIPS - -for subdir in $dirs; do - test -z "$VERBOSE" || echo "Making messages in $subdir" - (cd $subdir - if test -n "`grep -e '^messages:.*rc.cpp' Makefile.am`"; then - $EXTRACTRC *.rc *.ui *.kcfg > rc.cpp - else - candidates=`ls -1 *.rc *.ui *.kcfg 2>/dev/null` - if test -n "$candidates"; then - echo "$subdir has *.rc, *.ui or *.kcfg files, but not correct messages line" - fi - fi - if find . -name \*.c\* -o -name \*.h\* | fgrep -v ".svn" | xargs fgrep -s -q KAboutData ; then - echo -e 'i18n("_: NAME OF TRANSLATORS\\n"\n"Your names")\ni18n("_: EMAIL OF TRANSLATORS\\n"\n"Your emails")' > _translatorinfo.cpp - else echo " " > _translatorinfo.cpp - fi - perl -e '$mes=0; while () { next if (/^(if\s|else\s|endif)/); if (/^messages:/) { $mes=1; print $_; next; } if ($mes) { if (/$\\(XGETTEXT\)/ && / -o/) { s/ -o \$\(podir\)/ _translatorinfo.cpp -o \$\(podir\)/ } print $_; } else { print $_; } }' < Makefile.am | egrep -v '^include ' > _transMakefile - - kdepotpath=${includedir:-`kde-config --expandvars --install include`}/kde.pot - if ! test -f $kdepotpath; then - kdepotpath=`kde-config --expandvars --prefix`/include/kde.pot - fi - - $MAKE -s -f _transMakefile podir=$podir EXTRACTRC="$EXTRACTRC" PREPARETIPS="$PREPARETIPS" srcdir=. \ - XGETTEXT="${XGETTEXT:-xgettext} --foreign-user -C -ci18n -ki18n -ktr2i18n -kI18N_NOOP -kI18N_NOOP2 -kaliasLocale -x $kdepotpath" messages - exit_code=$? - if test "$exit_code" != 0; then - echo "make exit code: $exit_code" - fi - ) 2>&1 | grep -v '^make\[1\]' > $tmpname - test -s $tmpname && { echo $subdir ; cat "$tmpname"; } - test -f $subdir/rc.cpp && rm -f $subdir/rc.cpp - rm -f $subdir/_translatorinfo.cpp - rm -f $subdir/_transMakefile -done -rm -f $tmpname -} - -package_messages() -{ -rm -rf po.backup -mkdir po.backup - -for i in `ls -1 po/*.pot 2>/dev/null | sed -e "s#po/##"`; do - egrep -v '^#[^,]' po/$i | egrep '^.*[^ ]+.*$' | grep -v "\"POT-Creation" > po.backup/$i - cat po/$i > po.backup/backup_$i - touch -r po/$i po.backup/backup_$i - rm po/$i -done - -extract_messages - -for i in `ls -1 po.backup/*.pot 2>/dev/null | sed -e "s#po.backup/##" | egrep -v '^backup_'`; do - test -f po/$i || echo "disappeared: $i" -done -for i in `ls -1 po/*.pot 2>/dev/null | sed -e "s#po/##"`; do - sed -e 's,^"Content-Type: text/plain; charset=CHARSET\\n"$,"Content-Type: text/plain; charset=UTF-8\\n",' po/$i > po/$i.new && mv po/$i.new po/$i - #msgmerge -q -o po/$i po/$i po/$i - egrep -v '^#[^,]' po/$i | egrep '^.*[^ ]+.*$' | grep -v "\"POT-Creation" > temp.pot - if test -f po.backup/$i && ! cmp -s temp.pot po.backup/$i; then - echo "will update $i" - else - if test -f po.backup/backup_$i; then - test -z "$VERBOSE" || echo "I'm restoring $i" - mv po.backup/backup_$i po/$i - rm po.backup/$i - else - echo "will add $i" - fi - fi -done -rm -f temp.pot -rm -rf po.backup -} - -# Make sure that sorting is always done the same way -LC_ALL=C -export LC_ALL -unset LANG || : -unset LC_CTYPE || : -unset LANGUAGE || : - -unset CDPATH || : -admindir=`echo "$0" | sed 's%[\\/][^\\/][^\\/]*$%%'` -test "x$admindir" = "x$0" && admindir=. - -test "x$MAKE" = x && MAKE=make -makefile_am=Makefile.am -makefile_wo=Makefile.am.wo -if test -f Makefile.am.in; then - makefile_am=Makefile.am.in - makefile_wo=Makefile.am.in.wo - rm -f $makefile_wo -fi - -# Call script to find autoconf and friends. Uses eval since the script outputs -# sh-compatible code. -eval `$admindir/detect-autoconf.pl` - -### -### Main -### - -arg=`echo $1 | tr .- __` -case $arg in - cvs | dist | subdir_dist | configure_in | configure_files | subdirs | \ - cvs_clean | package_merge | package_messages | Makefile_am | acinclude_m4 | extract_messages ) $arg ;; - configure ) call_and_fix_autoconf ;; - * ) echo "Usage: cvs.sh " - echo "Target can be one of:" - echo " cvs svn dist" - echo " configure.in configure.files" - echo " package-merge package-messages" - echo "" - echo "Usage: anything but $1" - exit 1 ;; -esac - -if test -f $makefile_wo; then - rm $makefile_wo -fi - -exit 0 diff --git a/admin/debianrules b/admin/debianrules deleted file mode 100755 index 25897f2..0000000 --- a/admin/debianrules +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/perl -w - -use Shell qw(mv cp mkdir rm) ; -use File::Find; -use Cwd; - -$origPwd = `pwd`; -chomp $origPwd; - -$kde_prefix = "/usr"; -$sysconfdir = "/etc"; -$kde_includedir = "$kde_prefix/include/kde"; -$infodir = "$kde_prefix/share/info"; -$mandir = "$kde_prefix/share/man"; -$qtdir = "/usr/share/qt3"; - -$kde_cgidir = "$kde_prefix/lib/cgi-bin"; -$kde_confdir = "$sysconfdir/kde3"; -$kde_htmldir = "$kde_prefix/share/doc/kde/HTML"; - -if (defined $ENV{DEB_BUILD_OPTIONS} && - $ENV{DEB_BUILD_OPTIONS} =~ /\bnostrip\b/) { - $enable_debug="--enable-debug=full"; -} else { - $enable_debug="--disable-debug"; -} - -if (@ARGV && $ARGV[0] eq 'echodirs') { - print STDOUT "export kde_prefix=$kde_prefix\n"; - print STDOUT "export sysconfdir=$sysconfdir\n"; - print STDOUT "export kde_includedir=$kde_includedir\n"; - print STDOUT "export infodir=$infodir\n"; - print STDOUT "export mandir=$mandir\n"; - print STDOUT "export qtdir=$qtdir\n"; - - print STDOUT "export kde_cgidir=$kde_cgidir\n"; - print STDOUT "export kde_confdir=$kde_confdir\n"; - print STDOUT "export kde_htmldir=$kde_htmldir\n"; - - print STDOUT "configkde=$enable_debug --disable-rpath --prefix=\$(kde_prefix) --sysconfdir=\$(sysconfdir) --includedir=\$(kde_includedir) --infodir=\$(infodir) --mandir=\$(mandir) --with-qt-dir=\$(qtdir)\n"; - - exit -} diff --git a/admin/depcomp b/admin/depcomp deleted file mode 100755 index 04701da..0000000 --- a/admin/depcomp +++ /dev/null @@ -1,530 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2005-07-09.11 - -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. - -# 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, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. - "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the - # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> $depfile - echo >> $depfile - - # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> $depfile - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` - tmpdepfile="$stripped.u" - if test "$libtool" = yes; then - "$@" -Wc,-M - else - "$@" -M - fi - stat=$? - - if test -f "$tmpdepfile"; then : - else - stripped=`echo "$stripped" | sed 's,^.*/,,'` - tmpdepfile="$stripped.u" - fi - - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - - if test -f "$tmpdepfile"; then - outname="$stripped.o" - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" - sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mecanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. - "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no - for arg in "$@"; do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix="`echo $object | sed 's/^.*\././'`" - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - "$@" || exit $? - IFS=" " - for arg - do - case "$arg" in - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/admin/deps.am b/admin/deps.am deleted file mode 100644 index e8f5015..0000000 --- a/admin/deps.am +++ /dev/null @@ -1,19 +0,0 @@ -$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in $(top_srcdir)/admin/cvs.sh $(top_srcdir)/admin/pkg.m4.in - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh acinclude_m4 - -$(top_srcdir)/configure.in: $(top_srcdir)/subdirs $(top_srcdir)/configure.files $(top_srcdir)/admin/cvs.sh - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh configure_in - -$(top_srcdir)/configure.files: $(top_srcdir)/subdirs $(CONF_FILES) - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh configure.files $(top_srcdir)/admin/cvs.sh - -$(top_srcdir)/Makefile.am: $(top_srcdir)/Makefile.am.in $(top_srcdir)/subdirs $(top_srcdir)/admin/cvs.sh - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh Makefile_am - -$(top_srcdir)/subdirs: $(top_srcdir)/Makefile.am.in $(top_srcdir)/admin/cvs.sh - @cd $(top_srcdir) && $(SHELL) admin/cvs.sh subdirs - -# defining default rules for files that may not be present -$(top_srcdir)/Makefile.am.in: -$(CONF_FILES): - diff --git a/admin/detect-autoconf.pl b/admin/detect-autoconf.pl deleted file mode 100755 index 4e4269e..0000000 --- a/admin/detect-autoconf.pl +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env perl - -# Try to locate best version of auto* -# By Michael Pyne -# -# Copyright (c) 2005. -# This code is public domain. You may use it however you like (including -# relicensing). - -# Emulate the 'which' program. -sub which -{ - my $prog = shift; - my @paths = split(/:/, $ENV{'PATH'}); - - for $path (@paths) - { - return "$path/$prog" if -x "$path/$prog"; - } - - return ""; -} - -# Subroutine to determine the highest installed version of the given program, -# searching from the given paths. -sub findBest -{ - my ($program, @paths) = @_; - my $best_version_found = '0'; # Deliberately a string. - my %versions; - my %minimumVersions = ( - 'autoconf' => '2.5', - 'automake' => '1.6', - ); - - # Allow user to use environment variable to override search. - return $ENV{uc $program} if $ENV{uc $program}; - - for $prefix (@paths) - { - @files = glob "$prefix/$program*"; - for $file (@files) - { - # Don't check non-executable scripts. - next unless -x $file; - - ($version) = $file =~ /$prefix\/$program-?(.*)$/; - $version =~ s/-|\.//g; - - # Special case some programs to make sure it has a minimum version. - if (not $version and exists $minimumVersions{$program}) - { - my $min_version = $minimumVersions{$program}; - my $versionOutput = `$program --version 2>/dev/null | head -n 1`; - - # If we can't run the script to get the version it likely won't work later. - next unless $versionOutput; - - # Use number.number for version (we don't need the excess in general). - ($versionOutput) = ($versionOutput =~ /(\d\.\d)/); - - # Use lt to do lexicographical comparison of strings (which should be - # equivalent and doesn't involve issues with floating point conversions). - if (not $versionOutput or $versionOutput lt $min_version) - { - next; - } - } - - # If no version suffix then use it in favor of a versioned autotool - # since the ever-popular WANT_AUTOFOO should then work (in theory). - return $file unless $version; - - # Emulate 'which', and abort if we've already seen this version. - next if exists $versions{$version}; - - # Save filename of program. - $versions{$version} = $file; - - # Use string comparison so that e.g. 253a will be > 253 but < 254. - if ($version gt $best_version_found) - { - $best_version_found = $version; - } - } - } - - return $versions{$best_version_found}; -} - -# Find an appropriate "which" program for later use by the shell script calling -# us. -sub findWhich -{ - for $candidate ('type -p', 'which', 'type') - { - $test = `$candidate sh 2>/dev/null`; - chomp $test; - - return $candidate if -x $test; - } -} - -# Uses which() to find a program unless the user provided its path in the -# environment (the upper case program name is searched). -sub findProgram -{ - $suffix = ""; # For use if @_ has only one param. - my ($program, $suffix) = @_; - - return $ENV{uc $program} if $ENV{uc $program}; - return which("$program$suffix"); -} - -# SCRIPT STARTS. - -# Search in path. -@paths = split(/:/, $ENV{'PATH'}); - -# Make sure at least /usr/bin and /usr/local/bin are in this search. -unshift @paths, '/usr/local/bin' unless grep $_ eq '/usr/local/bin', @paths; -unshift @paths, '/usr/bin' unless grep $_ eq '/usr/bin', @paths; - -$autoconf = findBest('autoconf', @paths); -($autoconf_suffix) = $autoconf =~ /.*autoconf(.*)$/; - -# Find matching autoconf companions. -$autoheader = findProgram('autoheader', $autoconf_suffix); -$autom4te = findProgram('autom4te', $autoconf_suffix); - -# Get best automake, and look for unsermake to possibly override it. -$automake = findBest('automake', @paths); -$unsermake = ""; -# backward compatible: if $UNSERMAKE points to a path, use it -$unsermake = findProgram('unsermake') if (defined($ENV{'UNSERMAKE'}) and $ENV{'UNSERMAKE'} =~ /\//); -# new compatible: if it says 'yes', use the one from path -$unsermake = which('unsermake') if ($ENV{'UNSERMAKE'} eq 'yes'); - -($automake_suffix) = $automake =~ /.*automake(.*)$/; - -# Use unsermake if we found it. -$automake = "$unsermake -c" if $unsermake; - -# Find matching automake companions. -$aclocal = findProgram('aclocal', $automake_suffix); - -$which = findWhich(); - -# Make sure we have all of the needed programs. -for $i (qw'autoconf autoheader autom4te automake aclocal') -{ - unless(${$i}) - { - print "# Unable to find $i!!\n"; - exit 1; - } -} - -# Print results in eval-able form. -print </dev/null; then - MAKE=`type -p unsermake` - if test ! -x "$MAKE"; then - echo 'Makefile was created with unsermake, but there' - echo 'is no unsermake in $PATH' - exit 1 - fi - MAKE="$MAKE --no-real-compare VERBOSE=1" - if test -n "$jobs"; then args=("${args[@]}" --compile-jobs=$jobs); fi - else - MAKE=/usr/bin/make - if test -n "$jobs"; then args=("${args[@]}" -j $jobs); fi - fi -fi - -echo "Calling $MAKE ${args[@]}" -LANGUAGE=C $MAKE "${args[@]}" -retval=$? -echo "makeobj[0]: Leaving directory \`$PWD'" -exit $retval - diff --git a/admin/doxygen.sh b/admin/doxygen.sh deleted file mode 100644 index 3e233d7..0000000 --- a/admin/doxygen.sh +++ /dev/null @@ -1,883 +0,0 @@ -#! /bin/sh -# -# doxygen.sh Copyright (C) 2005 by Adriaan de Groot -# Based on some code from Doxyfile.am, among other things. -# License: GPL version 2. -# See file COPYING in kdelibs for details. - -echo "*** doxygen.sh" - -# Recurse handling is a little complicated, since normally -# subdir (given on the command-line) processing doesn't recurse -# but you can force it to do so. -recurse=1 -recurse_given=NO -use_modulename=1 -cleanup=YES - -while test -n "$1" ; do -case "x$1" in -"x--no-cleanup" ) - cleanup=NO - ;; -"x--no-recurse" ) - recurse=0 - recurse_given=YES - ;; -"x--recurse" ) - recurse=1 - recurse_given=YES - ;; -"x--no-modulename" ) - use_modulename=0 - ;; -"x--modulename" ) - use_modulename=1 - ;; -"x--help" ) - echo "doxygen.sh usage:" - echo "doxygen.sh [--no-recurse] [--no-modulename] []" - exit 2 - ;; -x--doxdatadir=* ) - DOXDATA=`echo $1 | sed -e 's+--doxdatadir=++'` - ;; -x--installdir=*) - PREFIX=`echo $1 | sed -e 's+--installdir=++'` - ;; -x--* ) - echo "Unknown option: $1" - exit 1 - ;; -* ) - top_srcdir="$1" - break - ;; -esac -shift -done - - -### Sanity check the mandatory "top srcdir" argument. -if test -z "$top_srcdir" ; then - echo "Usage: doxygen.sh " - exit 1 -fi -if test ! -d "$top_srcdir" ; then - echo "top_srcdir ($top_srcdir) is not a directory." - exit 1 -fi - -### Normalize top_srcdir so it is an absolute path. -if expr "x$top_srcdir" : "x/" > /dev/null ; then - # top_srcdir is absolute already - : -else - top_srcdir=`cd "$top_srcdir" 2> /dev/null && pwd` - if test ! -d "$top_srcdir" ; then - echo "top_srcdir ($top_srcdir) is not a directory." - exit 1 - fi -fi - - - -### Sanity check and guess QTDOCDIR. -if test -z "$QTDOCDIR" ; then - if test -z "$QTDIR" ; then - for i in /usr/X11R6/share/doc/qt/html - do - QTDOCDIR="$i" - test -d "$QTDOCDIR" && break - done - else - for i in share/doc/qt/html doc/html - do - QTDOCDIR="$QTDIR/$i" - test -d "$QTDOCDIR" && break - done - fi -fi -if test -z "$QTDOCDIR" || test ! -d "$QTDOCDIR" ; then - if test -z "$QTDOCDIR" ; then - echo "* QTDOCDIR could not be guessed." - else - echo "* QTDOCDIR does not name a directory." - fi - if test -z "$QTDOCTAG" ; then - echo "* QTDOCDIR set to \"\"" - QTDOCDIR="" - else - echo "* But I'll use $QTDOCDIR anyway because of QTDOCTAG." - fi -fi - -### Get the "top srcdir", also its name, and handle the case that subdir "." -### is given (which would be top_srcdir then, so it's equal to none-given -### but no recursion either). -### -# top_srcdir="$1" # Already set by options processing -module_name=`basename "$top_srcdir"` -subdir="$2" -if test "x." = "x$subdir" ; then - subdir="" - if test "x$recurse_given" = "xNO" ; then - recurse=0 - fi -fi -if test "x" != "x$subdir" ; then - # If no recurse option given explicitly, default to - # no recurse when processing subdirs given on the command-line. - if test "x$recurse_given" = "xNO" ; then - recurse=0 - fi -fi - -if test -z "$DOXDATA" || test ! -d "$DOXDATA" ; then - if test -n "$DOXDATA" ; then - echo "* \$DOXDATA is '$DOXDATA' which does not name a directory" - fi - DOXDATA="$top_srcdir/doc/common" -fi - -if test ! -d "$DOXDATA" ; then - echo "* \$DOXDATA does not name a directory ( or is unset ), tried \"$DOXDATA\"" - exit 1 -fi - -if test -n "$PREFIX" && test ! -d "$PREFIX" ; then - echo "* \$PREFIX does not name a directory, tried \"$PREFIX\"" - echo "* \$PREFIX is disabled." - PREFIX="" -fi - -### We need some values from top-level files, which -### are not preserved between invocations of this -### script, so factor it out for easy use. -create_doxyfile_in() -{ - eval `grep 'VERSION="' "$top_srcdir/admin/cvs.sh"` - echo "PROJECT_NUMBER = $VERSION" > Doxyfile.in - grep '^KDE_INIT_DOXYGEN' "$top_srcdir/configure.in.in" | \ - sed -e 's+[^[]*\[\([^]]*\)+PROJECT_NAME = "\1"+' \ - -e 's+].*++' >> Doxyfile.in -} - -apidoxdir="$module_name"-apidocs -test "x$use_modulename" = "x0" && apidoxdir="apidocs" - -### If we're making the top subdir, create the structure -### for the apidox and initialize it. Otherwise, just use the -### structure assumed to be there. -if test -z "$subdir" ; then - if test ! -d "$apidoxdir" ; then - mkdir "$apidoxdir" > /dev/null 2>&1 - fi - cd "$apidoxdir" > /dev/null 2>&1 || { - echo "Cannot create and cd into $apidoxdir" - exit 1 - } - - test -f "Doxyfile.in" || create_doxyfile_in - - # Copy in logos and the like - for i in "favicon.ico" "kde_gear_64.png" - do - cp "$DOXDATA/$i" . > /dev/null 2> /dev/null - done - for i in "$top_srcdir/doc/api/Dox-"*.png - do - T=`basename "$i" | sed -e 's+Dox-++'` - test -f "$i" && cp "$i" "./$T" > /dev/null 2> /dev/null - done - - top_builddir="." - srcdir="$1" - subdir="." -else - cd "$apidoxdir" > /dev/null 2>&1 || { - echo "Cannot cd into $apidoxdir -- maybe you need to" - echo "build the top-level dox first." - exit 1 - } - - if test "x1" = "x$recurse" ; then - # OK, so --recurse was requested - if test ! -f "subdirs.top" ; then - echo "* No subdirs.top available in the $apidoxdir." - echo "* The --recurse option will be ignored." - recurse=0 - fi - fi -fi - -### Read a single line (TODO: support \ continuations) from the Makefile.am. -### Used to extract variable assignments from it. -extract_line() -{ - file="$2" ; test -z "$file" && file="$srcdir/Makefile.am" - pattern=`echo "$1" | tr + .` - grep "^$1" "$file" | \ - sed -e "s+$pattern.*=\s*++" -} - -### Handle the COMPILE_{FIRST,LAST,BEFORE,AFTER} part of Makefile.am -### in the toplevel. Copied from admin/cvs.sh. Licence presumed LGPL). -create_subdirs() -{ -echo "* Sorting top-level subdirs" -dirs= -idirs= -if test -f "$top_srcdir/inst-apps"; then - idirs=`cat "$top_srcdir/"inst-apps` -else - idirs=`cd "$top_srcdir" && ls -1 | sort` -fi - -compilefirst="" -compilelast="" -if test -f "$top_srcdir/"Makefile.am.in ; then - compilefirst=`sed -ne 's#^COMPILE_FIRST[ ]*=[ ]*##p' "$top_srcdir/"Makefile.am.in | head -n 1` - compilelast=`sed -ne 's#^COMPILE_LAST[ ]*=[ ]*##p' "$top_srcdir/"Makefile.am.in | head -n 1` -fi -for i in $idirs; do - if test -f "$top_srcdir/$i"/Makefile.am; then - case " $compilefirst $compilelast " in - *" $i "*) ;; - *) dirs="$dirs $i" - esac - fi -done - -: > ./_SUBDIRS - -for d in $compilefirst; do - echo $d >> ./_SUBDIRS -done - -(for d in $dirs; do - list="" - if test -f "$top_srcdir/"Makefile.am.in ; then - list=`sed -ne "s#^COMPILE_BEFORE_$d""[ ]*=[ ]*##p" "$top_srcdir/"Makefile.am.in | head -n 1` - fi - for s in $list; do - echo $s $d - done - list="" - if test -f "$top_srcdir/"Makefile.am.in ; then - list=`sed -ne "s#^COMPILE_AFTER_$d""[ ]*=[ ]*##p" "$top_srcdir/"Makefile.am.in | head -n 1` - fi - for s in $list; do - echo $d $s - done - echo $d $d -done ) | tsort >> ./_SUBDIRS - -for d in $compilelast; do - echo $d >> ./_SUBDIRS -done - -test -r _SUBDIRS && mv _SUBDIRS subdirs.top || true -} - - -### Add HTML header, footer, CSS tags to Doxyfile. -### Assumes $subdir is set. Argument is a string -### to stick in front of the file if needed. -apidox_htmlfiles() -{ - dox_header="$top_srcdir/doc/api/$1header.html" - dox_footer="$top_srcdir/doc/api/$1footer.html" - dox_css="$top_srcdir/doc/api/doxygen.css" - test -f "$dox_header" || dox_header="$DOXDATA/$1header.html" - test -f "$dox_footer" || dox_footer="$DOXDATA/$1footer.html" - test -f "$dox_css" || dox_css="$DOXDATA/doxygen.css" - - echo "HTML_HEADER = $dox_header" >> "$subdir/Doxyfile" ; \ - echo "HTML_FOOTER = $dox_footer" >> "$subdir/Doxyfile" ; \ - echo "HTML_STYLESHEET = $dox_css" >> "$subdir/Doxyfile" -} - -apidox_specials() -{ - line=`extract_line DOXYGEN_PROJECTNAME "$1"` - test -n "$line" && echo "PROJECT_NAME = \"$line\"" >> "$2" -} - -apidox_local() -{ - for i in "$top_srcdir/doc/api/Doxyfile.local" - do - if test -f "$i" ; then - cat "$i" >> "$subdir/Doxyfile" - break - fi - done -} - -### Post-process HTML files by substituting in the menu files -# -# In non-top directories, both and -# are calculated and replaced. Top directories get an empty -# if any. -doxyndex() -{ - # Special case top-level to have an empty MENU. - if test "x$subdir" = "x." ; then - MENU="" - htmldir="." - htmltop="$top_builddir" # Just ., presumably - echo "* Post-processing top-level files" - else - MENU="" - fi - - - # Get the list of global Menu entries. - GMENU=`cat subdirs | tr -d '\n'` - - PMENU=`grep '++' | awk '{ c=split($0,a,"/"); for (j=1; j<=c; j++) { printf " / %s\n" , a[j]; } }' | tr -d '\n'` - - # Map the PHP file into HTML options so that - # it can be substituted in for the quick-class-picker. - CMENU="" - # For now, leave the CMENU disabled - CMENUBEGIN="" - - if test "x$subdir" = "x." ; then - # Disable CMENU on toplevel anyway - CMENUBEGIN="" - else - test -f "$subdir/classmap.inc" && \ - CMENU=`grep '=>' "$subdir/classmap.inc" | sed -e 's+"\([^"]*\)" => "'"$subdir/html/"'\([^"]*\)"+
diff --git a/data/chatstyles/Classic/CMakeLists.txt b/data/chatstyles/Classic/CMakeLists.txt new file mode 100644 index 0000000..6757a8f --- /dev/null +++ b/data/chatstyles/Classic/CMakeLists.txt @@ -0,0 +1,8 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + +install( FILES Classic.xsl Classic.css DESTINATION ${DATA_INSTALL_DIR}/kmess/styles/Classic/ ) + diff --git a/kmess/styles/Classic/Classic.css b/data/chatstyles/Classic/Classic.css similarity index 87% rename from kmess/styles/Classic/Classic.css rename to data/chatstyles/Classic/Classic.css index 3763d96..02228b9 100644 --- a/kmess/styles/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/kmess/styles/Classic/Classic.xsl b/data/chatstyles/Classic/Classic.xsl similarity index 94% rename from kmess/styles/Classic/Classic.xsl rename to data/chatstyles/Classic/Classic.xsl index 33af7a3..6e173be 100644 --- a/kmess/styles/Classic/Classic.xsl +++ b/data/chatstyles/Classic/Classic.xsl @@ -86,6 +86,16 @@ + + +
+ + + +
+
+ +
diff --git a/data/chatstyles/Colourful-Enclosed/CMakeLists.txt b/data/chatstyles/Colourful-Enclosed/CMakeLists.txt new file mode 100644 index 0000000..9788af5 --- /dev/null +++ b/data/chatstyles/Colourful-Enclosed/CMakeLists.txt @@ -0,0 +1,8 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + +install( FILES Colourful-Enclosed.xsl Colourful-Enclosed.css DESTINATION ${DATA_INSTALL_DIR}/kmess/styles/Colourful-Enclosed/ ) + diff --git a/kmess/styles/Colourful-Enclosed/Colourful-Enclosed.css b/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.css similarity index 93% rename from kmess/styles/Colourful-Enclosed/Colourful-Enclosed.css rename to data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.css index fccdb5b..113625f 100644 --- a/kmess/styles/Colourful-Enclosed/Colourful-Enclosed.css +++ b/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.css @@ -141,6 +141,7 @@ dd */ div.application, div.notification, +div.presence, div.system { margin: 10px 0 10px; /* top and bottom margin */ @@ -151,6 +152,11 @@ div.application color: blue; } +div.presence +{ + color: gray; +} + div.notification { color: purple; @@ -195,3 +201,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/kmess/styles/Colourful-Enclosed/Colourful-Enclosed.xsl b/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.xsl similarity index 97% rename from kmess/styles/Colourful-Enclosed/Colourful-Enclosed.xsl rename to data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.xsl index 1945aa6..745b2f4 100644 --- a/kmess/styles/Colourful-Enclosed/Colourful-Enclosed.xsl +++ b/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.xsl @@ -119,12 +119,12 @@ - +
diff --git a/data/chatstyles/Dim/CMakeLists.txt b/data/chatstyles/Dim/CMakeLists.txt new file mode 100644 index 0000000..584e93e --- /dev/null +++ b/data/chatstyles/Dim/CMakeLists.txt @@ -0,0 +1,8 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + +install( FILES Dim.xsl Dim.css DESTINATION ${DATA_INSTALL_DIR}/kmess/styles/Dim/ ) + diff --git a/kmess/styles/Dim/Dim.css b/data/chatstyles/Dim/Dim.css similarity index 94% rename from kmess/styles/Dim/Dim.css rename to data/chatstyles/Dim/Dim.css index 58bcf07..4984083 100644 --- a/kmess/styles/Dim/Dim.css +++ b/data/chatstyles/Dim/Dim.css @@ -129,6 +129,7 @@ dt span.time */ div.application, div.notification, +div.presence, div.system { margin: 10px 0 10px; /* top and bottom margin */ @@ -139,6 +140,11 @@ div.application color: #6172b2; } +div.presence +{ + color: #c4c4c4; +} + div.notification { color: #c034c9; @@ -183,3 +189,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/kmess/styles/Dim/Dim.xsl b/data/chatstyles/Dim/Dim.xsl similarity index 97% rename from kmess/styles/Dim/Dim.xsl rename to data/chatstyles/Dim/Dim.xsl index c2b67b5..825747d 100644 --- a/kmess/styles/Dim/Dim.xsl +++ b/data/chatstyles/Dim/Dim.xsl @@ -118,12 +118,12 @@ - +
diff --git a/data/chatstyles/Efficient/CMakeLists.txt b/data/chatstyles/Efficient/CMakeLists.txt new file mode 100644 index 0000000..6959469 --- /dev/null +++ b/data/chatstyles/Efficient/CMakeLists.txt @@ -0,0 +1,8 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + +install( FILES Efficient.xsl Efficient.css DESTINATION ${DATA_INSTALL_DIR}/kmess/styles/Efficient/ ) + diff --git a/kmess/styles/Efficient/Efficient.css b/data/chatstyles/Efficient/Efficient.css similarity index 94% rename from kmess/styles/Efficient/Efficient.css rename to data/chatstyles/Efficient/Efficient.css index 3df2e08..9241d46 100644 --- a/kmess/styles/Efficient/Efficient.css +++ b/data/chatstyles/Efficient/Efficient.css @@ -144,6 +144,7 @@ dl div.application, div.notification, +div.presence, div.system { margin-left: 7em; @@ -210,6 +211,11 @@ div.application color: blue; } +div.presence +{ + color: gray; +} + div.notification { color: purple; @@ -251,3 +257,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/kmess/styles/Efficient/Efficient.xsl b/data/chatstyles/Efficient/Efficient.xsl similarity index 97% rename from kmess/styles/Efficient/Efficient.xsl rename to data/chatstyles/Efficient/Efficient.xsl index 64572f3..ae32030 100644 --- a/kmess/styles/Efficient/Efficient.xsl +++ b/data/chatstyles/Efficient/Efficient.xsl @@ -118,12 +118,12 @@ - +
diff --git a/data/chatstyles/Fresh-dark/CMakeLists.txt b/data/chatstyles/Fresh-dark/CMakeLists.txt new file mode 100644 index 0000000..f31fd80 --- /dev/null +++ b/data/chatstyles/Fresh-dark/CMakeLists.txt @@ -0,0 +1,8 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + +install( FILES Fresh-dark.xsl Fresh-dark.css bg_gravatar.gif bg_gravatar_rtl.gif buddy_icon.png DESTINATION ${DATA_INSTALL_DIR}/kmess/styles/Fresh-dark/ ) + diff --git a/data/chatstyles/Fresh-dark/Fresh-dark.css b/data/chatstyles/Fresh-dark/Fresh-dark.css new file mode 100644 index 0000000..7631207 --- /dev/null +++ b/data/chatstyles/Fresh-dark/Fresh-dark.css @@ -0,0 +1,302 @@ +/* + 'Fresh Dark' style for KMess. + Copyright (C) 2008, Valerio Pilo + Copyright (C) 2006, Diederik van der Boor + Copyright (c) 2006, Benjamin Deveze + + Design based on 'Fresh' by Benjamin Deveze + http://www.kde-look.org/content/show.php?content=43099 + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +*/ + + + +/* + * the incoming and outgoing messages are implemented as definition-list (
). + * each message type has a different background/border color. + * + * the header is added to the
tag, the message body to the
tag. + * this is easy to format with css, and easy to read without css markup. + */ + + +/* + * reset some default margins. + */ +dl, dt, dd +{ + margin: 0; + padding: 0; +} + + +/* + * make sure position: absolute stays in the message (for time). + */ +.incoming, +.outgoing, +.offlineIncoming +{ + position: relative; +} + + +/* + * general message layout and colors. + */ +.outgoing +{ + background-color: #120d00; + border-top: 1px solid #010700; + border-bottom: 1px solid #010700; +} + +.avatar +{ + background-image: url("bg_gravatar.gif"); + background-repeat: no-repeat; + float: left; + margin: 10px; + width: 93px; + height: 70px; + overflow: hidden; + /* instead of padding, use margin on img to align it. + makes the computation of width and height easier */ +} + +.rtl .avatar +{ + float: right; + background-image: url("bg_gravatar_rtl.gif"); +} + +.avatar img +{ + margin-left: 11px; + margin-top: 11px; + height: 48px; + width: 48px; + /* omitting the width auto scales, but it becomes ugly */ +} + +.rtl .avatar img +{ + margin-left: 34px; +} + +.incoming, +.outgoing, +.offlineIncoming +{ + margin-top: 4px; + margin-bottom: 4px; + /* new messages should appear below the float */ + clear: both; +} + +.incoming dl, +.outgoing dl, +.offlineIncoming dl +{ + /* for alignment of lines under the float */ + margin-left: 113px; /* avatar width + margin */ + margin-top: 11px; + padding-bottom: 0.7em; +} + +div.application, +div.notification, +div.presence, +div.system +{ + margin-left: 11px; + margin-top: 0.7em; + margin-bottom: 0.7em; /* no padding, so time also gets margin */ + position: relative; /* for time */ +} + + + +/* + * name in message title. + */ +dt span.name +{ + display: block; + color: #bbccdd; + font-weight: bold; + margin-bottom: 0.3em; + margin-right: 2px; +} + +.offlineIncoming dt span.name +{ + color: #485770; +} + + + +/* + * time in message title and other messages. + */ +span.time +{ + position: absolute; + right: 5px; + bottom: 0; + color: #ccddcc; + font-size: 8pt; + + /* some margins to fix most ugly stuff when resizing */ + margin-left: 5px; + margin-bottom: 0; +} + +.rtl span.time +{ + /* reverse for right-to-left */ + position: absolute; + left: 5px; + right: auto; + margin-left: 0; + margin-right: 5px; +} + + + +/* + * message body. + * reset spacing and default indent of dd element. + */ +dd +{ + margin: 0; + padding: 0; +} + +dd div.messageContent +{ + /* avoid overlapping the time field */ + padding-right: 5em; +} + + + +/* + * grouped messages splitter effect + */ +.messagegroup dd.middle-child, +.messagegroup dd.last-child +{ + margin-top: 0.4em; + padding-top: 0.4em; + border-top: 1px solid #000500; +} + +.messagegroup dd.last-child +{ + padding-bottom: 5px; +} + +.messagegroup dd +{ + position: relative; /* startpoint for absolute positions */ +} + + + +/* + * other messages; + * - application message (e.g. invitation) + * - notification message (e.g. file transfer complete) + * - system message (e.g. error, invitation not supported) + */ +div.application +{ + color: #0b0; +} + +div.presence +{ + color: #bbb; +} + +div.notification +{ + color: #bb0; +} + +div.system +{ + color: #b00; +} + +span.filename { + color: #0b0; +} + +span.failedFilename, +div.notification .filename { + color: #b00; +} + + + +/** + * Draw a border arround emoticon placeholders. + */ +img.customEmoticonPlaceholder +{ + border: 1px dotted #ccc; +} + + + +/* + * fix alignment of emoticons + */ +img.standardEmoticon, +img.customEmoticon, +img.customEmoticonPlaceholder +{ + vertical-align: top; +} + + + +/* + * Set the standard body margins. + * The extra #ChatMessageView prefix is needed to overrule + * the inline rule added by the chat window. + */ +#ChatMessageView body +{ + 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-dark/Fresh-dark.xsl b/data/chatstyles/Fresh-dark/Fresh-dark.xsl new file mode 100644 index 0000000..1e501fc --- /dev/null +++ b/data/chatstyles/Fresh-dark/Fresh-dark.xsl @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + + + + + + +
+
+ + +
+
+ + + + + + + + +
+
+ +
+ +
+ + + + : + +
+ + +
+ + + + +   + + + + + +
+ + + +
+
+
+ + +
+ +
+
+
+ + + +
+
+ + + + + + +
+ +
+
+
+
+ +
+
+ + + + +
+
+
+ + +
+
+ + + + + + + + + +
+
+ +
+ +
+ + + + : + +
+ + + +
+ + + + last-child + first-child + middle-child + + + + + + + + +
+ + + +
+
+
+
+ + +
+ +
+
+
+
+ +
diff --git a/data/chatstyles/Fresh-dark/bg_gravatar.gif b/data/chatstyles/Fresh-dark/bg_gravatar.gif new file mode 100644 index 0000000..7dbaa47 Binary files /dev/null and b/data/chatstyles/Fresh-dark/bg_gravatar.gif differ diff --git a/data/chatstyles/Fresh-dark/bg_gravatar_rtl.gif b/data/chatstyles/Fresh-dark/bg_gravatar_rtl.gif new file mode 100644 index 0000000..d5f09db Binary files /dev/null and b/data/chatstyles/Fresh-dark/bg_gravatar_rtl.gif differ diff --git a/data/chatstyles/Fresh-dark/buddy_icon.png b/data/chatstyles/Fresh-dark/buddy_icon.png new file mode 100644 index 0000000..184b0ba Binary files /dev/null and b/data/chatstyles/Fresh-dark/buddy_icon.png differ diff --git a/data/chatstyles/Fresh/CMakeLists.txt b/data/chatstyles/Fresh/CMakeLists.txt new file mode 100644 index 0000000..8957b50 --- /dev/null +++ b/data/chatstyles/Fresh/CMakeLists.txt @@ -0,0 +1,8 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + +install( FILES Fresh.xsl Fresh.css bg_gravatar.gif bg_gravatar_rtl.gif buddy_icon.png DESTINATION ${DATA_INSTALL_DIR}/kmess/styles/Fresh/ ) + diff --git a/kmess/styles/Fresh/Fresh.css b/data/chatstyles/Fresh/Fresh.css similarity index 94% rename from kmess/styles/Fresh/Fresh.css rename to data/chatstyles/Fresh/Fresh.css index 532dcb0..026391c 100644 --- a/kmess/styles/Fresh/Fresh.css +++ b/data/chatstyles/Fresh/Fresh.css @@ -118,6 +118,7 @@ dl, dt, dd div.application, div.notification, +div.presence, div.system { margin-left: 11px; @@ -227,6 +228,11 @@ div.application color: blue; } +div.presence +{ + color: gray; +} + div.notification { color: purple; @@ -280,3 +286,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/kmess/styles/Fresh/Fresh.xsl b/data/chatstyles/Fresh/Fresh.xsl similarity index 98% rename from kmess/styles/Fresh/Fresh.xsl rename to data/chatstyles/Fresh/Fresh.xsl index f50c983..9f8c25f 100644 --- a/kmess/styles/Fresh/Fresh.xsl +++ b/data/chatstyles/Fresh/Fresh.xsl @@ -136,12 +136,12 @@ - +
diff --git a/kmess/styles/Fresh/bg_gravatar.gif b/data/chatstyles/Fresh/bg_gravatar.gif similarity index 100% rename from kmess/styles/Fresh/bg_gravatar.gif rename to data/chatstyles/Fresh/bg_gravatar.gif diff --git a/kmess/styles/Fresh/bg_gravatar_rtl.gif b/data/chatstyles/Fresh/bg_gravatar_rtl.gif similarity index 100% rename from kmess/styles/Fresh/bg_gravatar_rtl.gif rename to data/chatstyles/Fresh/bg_gravatar_rtl.gif diff --git a/kmess/styles/Fresh/buddy_icon.png b/data/chatstyles/Fresh/buddy_icon.png similarity index 100% rename from kmess/styles/Fresh/buddy_icon.png rename to data/chatstyles/Fresh/buddy_icon.png diff --git a/data/chatstyles/Pure/CMakeLists.txt b/data/chatstyles/Pure/CMakeLists.txt new file mode 100644 index 0000000..f57995d --- /dev/null +++ b/data/chatstyles/Pure/CMakeLists.txt @@ -0,0 +1,24 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + +set(kmess_pure_FILES + Pure.css + Pure.xsl + arrow0.png + arrow1.png + clock.png + contact.png + corner-bl.png + corner-br.png + corner-tl.png + corner-tr.png + important.png + myself.png + system.png +) + +install( FILES ${kmess_pure_FILES} DESTINATION ${DATA_INSTALL_DIR}/kmess/styles/Pure/ ) + diff --git a/kmess/styles/Pure/Pure.css b/data/chatstyles/Pure/Pure.css similarity index 96% rename from kmess/styles/Pure/Pure.css rename to data/chatstyles/Pure/Pure.css index 799feac..b04686a 100644 --- a/kmess/styles/Pure/Pure.css +++ b/data/chatstyles/Pure/Pure.css @@ -253,6 +253,7 @@ dd */ div.application, div.notification, +div.presence, div.system { margin: 10px 0 10px; /* top and bottom margin */ @@ -263,6 +264,11 @@ div.application color: blue; } +div.presence +{ + color: gray; +} + div.notification { color: purple; @@ -319,3 +325,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/kmess/styles/Pure/Pure.xsl b/data/chatstyles/Pure/Pure.xsl similarity index 97% rename from kmess/styles/Pure/Pure.xsl rename to data/chatstyles/Pure/Pure.xsl index 6e88de3..15dcfa3 100644 --- a/kmess/styles/Pure/Pure.xsl +++ b/data/chatstyles/Pure/Pure.xsl @@ -104,7 +104,7 @@ &nbsp; - + @@ -121,12 +121,12 @@ - +
diff --git a/kmess/styles/Pure/action.png b/data/chatstyles/Pure/action.png similarity index 100% rename from kmess/styles/Pure/action.png rename to data/chatstyles/Pure/action.png diff --git a/kmess/styles/Pure/arrow0.png b/data/chatstyles/Pure/arrow0.png similarity index 100% rename from kmess/styles/Pure/arrow0.png rename to data/chatstyles/Pure/arrow0.png diff --git a/kmess/styles/Pure/arrow1.png b/data/chatstyles/Pure/arrow1.png similarity index 100% rename from kmess/styles/Pure/arrow1.png rename to data/chatstyles/Pure/arrow1.png diff --git a/kmess/styles/Pure/clock.png b/data/chatstyles/Pure/clock.png similarity index 100% rename from kmess/styles/Pure/clock.png rename to data/chatstyles/Pure/clock.png diff --git a/kmess/styles/Pure/contact.png b/data/chatstyles/Pure/contact.png similarity index 100% rename from kmess/styles/Pure/contact.png rename to data/chatstyles/Pure/contact.png diff --git a/kmess/styles/Pure/corner-bl.png b/data/chatstyles/Pure/corner-bl.png similarity index 100% rename from kmess/styles/Pure/corner-bl.png rename to data/chatstyles/Pure/corner-bl.png diff --git a/kmess/styles/Pure/corner-br.png b/data/chatstyles/Pure/corner-br.png similarity index 100% rename from kmess/styles/Pure/corner-br.png rename to data/chatstyles/Pure/corner-br.png diff --git a/kmess/styles/Pure/corner-tl.png b/data/chatstyles/Pure/corner-tl.png similarity index 100% rename from kmess/styles/Pure/corner-tl.png rename to data/chatstyles/Pure/corner-tl.png diff --git a/kmess/styles/Pure/corner-tr.png b/data/chatstyles/Pure/corner-tr.png similarity index 100% rename from kmess/styles/Pure/corner-tr.png rename to data/chatstyles/Pure/corner-tr.png diff --git a/kmess/styles/Pure/important.png b/data/chatstyles/Pure/important.png similarity index 100% rename from kmess/styles/Pure/important.png rename to data/chatstyles/Pure/important.png diff --git a/kmess/styles/Pure/myself.png b/data/chatstyles/Pure/myself.png similarity index 100% rename from kmess/styles/Pure/myself.png rename to data/chatstyles/Pure/myself.png diff --git a/kmess/styles/Pure/system.png b/data/chatstyles/Pure/system.png similarity index 100% rename from kmess/styles/Pure/system.png rename to data/chatstyles/Pure/system.png diff --git a/kmess/styles/examplemessage.xml b/data/chatstyles/examplemessage.xml similarity index 100% rename from kmess/styles/examplemessage.xml rename to data/chatstyles/examplemessage.xml diff --git a/kmess/styles/extract-xsl-messages b/data/chatstyles/extract-xsl-messages similarity index 100% rename from kmess/styles/extract-xsl-messages rename to data/chatstyles/extract-xsl-messages diff --git a/kmess/styles/extract-xsl-messages.xsl b/data/chatstyles/extract-xsl-messages.xsl similarity index 100% rename from kmess/styles/extract-xsl-messages.xsl rename to data/chatstyles/extract-xsl-messages.xsl diff --git a/data/emoticons/CMakeLists.txt b/data/emoticons/CMakeLists.txt new file mode 100644 index 0000000..b021577 --- /dev/null +++ b/data/emoticons/CMakeLists.txt @@ -0,0 +1,2 @@ + +ADD_SUBDIRECTORY( KMess2-new ) diff --git a/data/emoticons/KMess2-new/CMakeLists.txt b/data/emoticons/KMess2-new/CMakeLists.txt new file mode 100644 index 0000000..e69fb44 --- /dev/null +++ b/data/emoticons/KMess2-new/CMakeLists.txt @@ -0,0 +1,89 @@ + +SET( kmess_emoticon_FILES + emoticons.xml + smile.png + airplane.png + angel.png + angry.png + arrogant.png + asl.png + automobile.png + baringteeth.png + bat.png + beer.png + bowl.png + boy.png + brb.png + cake.png + camera.png + cat.png + cigarette.png + clock.png + cocktail.png + computer.png + confused.png + cry.png + cup.png + devil.png + dog.png + dude_hug.png + embarrassed.png + envelope.png + eyeroll.png + film.png + fingerscrossed.png + gameconsole.png + girl_hug.png + girl.png + handcuffs.png + highfive.png + huh.png + island.png + kiss.png + lightbulb.png + lightning.png + love.png + megasmile.png + messenger.png + mobilephone.png + money.png + moon.png + nerd.png + note.png + omg.png + party.png + phone.png + pizza.png + plate.png + present.png + rainbow.png + regular.png + rose.png + sad.png + sarcastic.png + secret.png + shade.png + sheep.png + sick.png + sleepy.png + snail.png + soccer.png + sshh.png + star.png + storm.png + sun.png + teeth.png + thinking.png + thumbs_down.png + thumbs_up.png + tongue.png + turtle.png + ugly.png + umbrella.png + unhappy.png + unlove.png + wilted_rose.png + wink.png +) + +INSTALL( FILES ${kmess_emoticon_FILES} DESTINATION ${SHARE_INSTALL_PREFIX}/emoticons/KMess-new ) diff --git a/kmess/pics/airplane.png b/data/emoticons/KMess2-new/airplane.png similarity index 100% rename from kmess/pics/airplane.png rename to data/emoticons/KMess2-new/airplane.png diff --git a/kmess/pics/angel.png b/data/emoticons/KMess2-new/angel.png similarity index 100% rename from kmess/pics/angel.png rename to data/emoticons/KMess2-new/angel.png diff --git a/kmess/pics/angry.png b/data/emoticons/KMess2-new/angry.png similarity index 100% rename from kmess/pics/angry.png rename to data/emoticons/KMess2-new/angry.png diff --git a/kmess/pics/arrogant.png b/data/emoticons/KMess2-new/arrogant.png similarity index 100% rename from kmess/pics/arrogant.png rename to data/emoticons/KMess2-new/arrogant.png diff --git a/kmess/pics/asl.png b/data/emoticons/KMess2-new/asl.png similarity index 100% rename from kmess/pics/asl.png rename to data/emoticons/KMess2-new/asl.png diff --git a/kmess/pics/automobile.png b/data/emoticons/KMess2-new/automobile.png similarity index 100% rename from kmess/pics/automobile.png rename to data/emoticons/KMess2-new/automobile.png diff --git a/kmess/pics/baringteeth.png b/data/emoticons/KMess2-new/baringteeth.png similarity index 100% rename from kmess/pics/baringteeth.png rename to data/emoticons/KMess2-new/baringteeth.png diff --git a/kmess/pics/bat.png b/data/emoticons/KMess2-new/bat.png similarity index 100% rename from kmess/pics/bat.png rename to data/emoticons/KMess2-new/bat.png diff --git a/kmess/pics/beer.png b/data/emoticons/KMess2-new/beer.png similarity index 100% rename from kmess/pics/beer.png rename to data/emoticons/KMess2-new/beer.png diff --git a/kmess/pics/bowl.png b/data/emoticons/KMess2-new/bowl.png similarity index 100% rename from kmess/pics/bowl.png rename to data/emoticons/KMess2-new/bowl.png diff --git a/kmess/pics/boy.png b/data/emoticons/KMess2-new/boy.png similarity index 100% rename from kmess/pics/boy.png rename to data/emoticons/KMess2-new/boy.png diff --git a/kmess/pics/brb.png b/data/emoticons/KMess2-new/brb.png similarity index 100% rename from kmess/pics/brb.png rename to data/emoticons/KMess2-new/brb.png diff --git a/kmess/pics/cake.png b/data/emoticons/KMess2-new/cake.png similarity index 100% rename from kmess/pics/cake.png rename to data/emoticons/KMess2-new/cake.png diff --git a/kmess/pics/camera.png b/data/emoticons/KMess2-new/camera.png similarity index 100% rename from kmess/pics/camera.png rename to data/emoticons/KMess2-new/camera.png diff --git a/kmess/pics/cat.png b/data/emoticons/KMess2-new/cat.png similarity index 100% rename from kmess/pics/cat.png rename to data/emoticons/KMess2-new/cat.png diff --git a/kmess/pics/cigarette.png b/data/emoticons/KMess2-new/cigarette.png similarity index 100% rename from kmess/pics/cigarette.png rename to data/emoticons/KMess2-new/cigarette.png diff --git a/kmess/pics/clock.png b/data/emoticons/KMess2-new/clock.png similarity index 100% rename from kmess/pics/clock.png rename to data/emoticons/KMess2-new/clock.png diff --git a/kmess/pics/cocktail.png b/data/emoticons/KMess2-new/cocktail.png similarity index 100% rename from kmess/pics/cocktail.png rename to data/emoticons/KMess2-new/cocktail.png diff --git a/kmess/pics/computer.png b/data/emoticons/KMess2-new/computer.png similarity index 100% rename from kmess/pics/computer.png rename to data/emoticons/KMess2-new/computer.png diff --git a/kmess/pics/confused.png b/data/emoticons/KMess2-new/confused.png similarity index 100% rename from kmess/pics/confused.png rename to data/emoticons/KMess2-new/confused.png diff --git a/kmess/pics/cry.png b/data/emoticons/KMess2-new/cry.png similarity index 100% rename from kmess/pics/cry.png rename to data/emoticons/KMess2-new/cry.png diff --git a/kmess/pics/cup.png b/data/emoticons/KMess2-new/cup.png similarity index 100% rename from kmess/pics/cup.png rename to data/emoticons/KMess2-new/cup.png diff --git a/kmess/pics/devil.png b/data/emoticons/KMess2-new/devil.png similarity index 100% rename from kmess/pics/devil.png rename to data/emoticons/KMess2-new/devil.png diff --git a/kmess/pics/dog.png b/data/emoticons/KMess2-new/dog.png similarity index 100% rename from kmess/pics/dog.png rename to data/emoticons/KMess2-new/dog.png diff --git a/kmess/pics/dude_hug.png b/data/emoticons/KMess2-new/dude_hug.png similarity index 100% rename from kmess/pics/dude_hug.png rename to data/emoticons/KMess2-new/dude_hug.png diff --git a/kmess/pics/embarrassed.png b/data/emoticons/KMess2-new/embarrassed.png similarity index 100% rename from kmess/pics/embarrassed.png rename to data/emoticons/KMess2-new/embarrassed.png diff --git a/kmess/pics/emoticons.xml b/data/emoticons/KMess2-new/emoticons.xml similarity index 98% rename from kmess/pics/emoticons.xml rename to data/emoticons/KMess2-new/emoticons.xml index 5e2ab92..5c7c659 100644 --- a/kmess/pics/emoticons.xml +++ b/data/emoticons/KMess2-new/emoticons.xml @@ -226,10 +226,6 @@ (bah) - - (nah) - - :[ :-[ diff --git a/kmess/pics/envelope.png b/data/emoticons/KMess2-new/envelope.png similarity index 100% rename from kmess/pics/envelope.png rename to data/emoticons/KMess2-new/envelope.png diff --git a/kmess/pics/eyeroll.png b/data/emoticons/KMess2-new/eyeroll.png similarity index 100% rename from kmess/pics/eyeroll.png rename to data/emoticons/KMess2-new/eyeroll.png diff --git a/kmess/pics/film.png b/data/emoticons/KMess2-new/film.png similarity index 100% rename from kmess/pics/film.png rename to data/emoticons/KMess2-new/film.png diff --git a/kmess/pics/fingerscrossed.png b/data/emoticons/KMess2-new/fingerscrossed.png similarity index 100% rename from kmess/pics/fingerscrossed.png rename to data/emoticons/KMess2-new/fingerscrossed.png diff --git a/kmess/pics/gameconsole.png b/data/emoticons/KMess2-new/gameconsole.png old mode 100755 new mode 100644 similarity index 100% rename from kmess/pics/gameconsole.png rename to data/emoticons/KMess2-new/gameconsole.png diff --git a/kmess/pics/girl.png b/data/emoticons/KMess2-new/girl.png similarity index 100% rename from kmess/pics/girl.png rename to data/emoticons/KMess2-new/girl.png diff --git a/kmess/pics/girl_hug.png b/data/emoticons/KMess2-new/girl_hug.png similarity index 100% rename from kmess/pics/girl_hug.png rename to data/emoticons/KMess2-new/girl_hug.png diff --git a/kmess/pics/handcuffs.png b/data/emoticons/KMess2-new/handcuffs.png similarity index 100% rename from kmess/pics/handcuffs.png rename to data/emoticons/KMess2-new/handcuffs.png diff --git a/kmess/pics/highfive.png b/data/emoticons/KMess2-new/highfive.png similarity index 100% rename from kmess/pics/highfive.png rename to data/emoticons/KMess2-new/highfive.png diff --git a/kmess/pics/huh.png b/data/emoticons/KMess2-new/huh.png similarity index 100% rename from kmess/pics/huh.png rename to data/emoticons/KMess2-new/huh.png diff --git a/kmess/pics/island.png b/data/emoticons/KMess2-new/island.png similarity index 100% rename from kmess/pics/island.png rename to data/emoticons/KMess2-new/island.png diff --git a/kmess/pics/kiss.png b/data/emoticons/KMess2-new/kiss.png similarity index 100% rename from kmess/pics/kiss.png rename to data/emoticons/KMess2-new/kiss.png diff --git a/kmess/pics/lightbulb.png b/data/emoticons/KMess2-new/lightbulb.png similarity index 100% rename from kmess/pics/lightbulb.png rename to data/emoticons/KMess2-new/lightbulb.png diff --git a/kmess/pics/lightning.png b/data/emoticons/KMess2-new/lightning.png similarity index 100% rename from kmess/pics/lightning.png rename to data/emoticons/KMess2-new/lightning.png diff --git a/kmess/pics/love.png b/data/emoticons/KMess2-new/love.png similarity index 100% rename from kmess/pics/love.png rename to data/emoticons/KMess2-new/love.png diff --git a/kmess/pics/megasmile.png b/data/emoticons/KMess2-new/megasmile.png similarity index 100% rename from kmess/pics/megasmile.png rename to data/emoticons/KMess2-new/megasmile.png diff --git a/kmess/pics/messenger.png b/data/emoticons/KMess2-new/messenger.png similarity index 100% rename from kmess/pics/messenger.png rename to data/emoticons/KMess2-new/messenger.png diff --git a/kmess/pics/mobilephone.png b/data/emoticons/KMess2-new/mobilephone.png similarity index 100% rename from kmess/pics/mobilephone.png rename to data/emoticons/KMess2-new/mobilephone.png diff --git a/kmess/pics/money.png b/data/emoticons/KMess2-new/money.png similarity index 100% rename from kmess/pics/money.png rename to data/emoticons/KMess2-new/money.png diff --git a/kmess/pics/moon.png b/data/emoticons/KMess2-new/moon.png similarity index 100% rename from kmess/pics/moon.png rename to data/emoticons/KMess2-new/moon.png diff --git a/kmess/pics/nerd.png b/data/emoticons/KMess2-new/nerd.png similarity index 100% rename from kmess/pics/nerd.png rename to data/emoticons/KMess2-new/nerd.png diff --git a/kmess/pics/note.png b/data/emoticons/KMess2-new/note.png similarity index 100% rename from kmess/pics/note.png rename to data/emoticons/KMess2-new/note.png diff --git a/kmess/pics/omg.png b/data/emoticons/KMess2-new/omg.png similarity index 100% rename from kmess/pics/omg.png rename to data/emoticons/KMess2-new/omg.png diff --git a/kmess/pics/party.png b/data/emoticons/KMess2-new/party.png similarity index 100% rename from kmess/pics/party.png rename to data/emoticons/KMess2-new/party.png diff --git a/kmess/pics/phone.png b/data/emoticons/KMess2-new/phone.png similarity index 100% rename from kmess/pics/phone.png rename to data/emoticons/KMess2-new/phone.png diff --git a/kmess/pics/pizza.png b/data/emoticons/KMess2-new/pizza.png similarity index 100% rename from kmess/pics/pizza.png rename to data/emoticons/KMess2-new/pizza.png diff --git a/kmess/pics/plate.png b/data/emoticons/KMess2-new/plate.png similarity index 100% rename from kmess/pics/plate.png rename to data/emoticons/KMess2-new/plate.png diff --git a/kmess/pics/present.png b/data/emoticons/KMess2-new/present.png similarity index 100% rename from kmess/pics/present.png rename to data/emoticons/KMess2-new/present.png diff --git a/kmess/pics/rainbow.png b/data/emoticons/KMess2-new/rainbow.png similarity index 100% rename from kmess/pics/rainbow.png rename to data/emoticons/KMess2-new/rainbow.png diff --git a/kmess/pics/readme.txt b/data/emoticons/KMess2-new/readme.txt similarity index 100% rename from kmess/pics/readme.txt rename to data/emoticons/KMess2-new/readme.txt diff --git a/kmess/pics/regular.png b/data/emoticons/KMess2-new/regular.png similarity index 100% rename from kmess/pics/regular.png rename to data/emoticons/KMess2-new/regular.png diff --git a/kmess/pics/rose.png b/data/emoticons/KMess2-new/rose.png similarity index 100% rename from kmess/pics/rose.png rename to data/emoticons/KMess2-new/rose.png diff --git a/kmess/pics/sad.png b/data/emoticons/KMess2-new/sad.png similarity index 100% rename from kmess/pics/sad.png rename to data/emoticons/KMess2-new/sad.png diff --git a/kmess/pics/sarcastic.png b/data/emoticons/KMess2-new/sarcastic.png similarity index 100% rename from kmess/pics/sarcastic.png rename to data/emoticons/KMess2-new/sarcastic.png diff --git a/kmess/pics/secret.png b/data/emoticons/KMess2-new/secret.png similarity index 100% rename from kmess/pics/secret.png rename to data/emoticons/KMess2-new/secret.png diff --git a/kmess/pics/shade.png b/data/emoticons/KMess2-new/shade.png similarity index 100% rename from kmess/pics/shade.png rename to data/emoticons/KMess2-new/shade.png diff --git a/kmess/pics/sheep.png b/data/emoticons/KMess2-new/sheep.png similarity index 100% rename from kmess/pics/sheep.png rename to data/emoticons/KMess2-new/sheep.png diff --git a/kmess/pics/sick.png b/data/emoticons/KMess2-new/sick.png similarity index 100% rename from kmess/pics/sick.png rename to data/emoticons/KMess2-new/sick.png diff --git a/kmess/pics/sleepy.png b/data/emoticons/KMess2-new/sleepy.png similarity index 100% rename from kmess/pics/sleepy.png rename to data/emoticons/KMess2-new/sleepy.png diff --git a/kmess/pics/smile.png b/data/emoticons/KMess2-new/smile.png similarity index 100% rename from kmess/pics/smile.png rename to data/emoticons/KMess2-new/smile.png diff --git a/kmess/pics/snail.png b/data/emoticons/KMess2-new/snail.png similarity index 100% rename from kmess/pics/snail.png rename to data/emoticons/KMess2-new/snail.png diff --git a/kmess/pics/soccer.png b/data/emoticons/KMess2-new/soccer.png similarity index 100% rename from kmess/pics/soccer.png rename to data/emoticons/KMess2-new/soccer.png diff --git a/kmess/pics/sshh.png b/data/emoticons/KMess2-new/sshh.png similarity index 100% rename from kmess/pics/sshh.png rename to data/emoticons/KMess2-new/sshh.png diff --git a/kmess/pics/star.png b/data/emoticons/KMess2-new/star.png similarity index 100% rename from kmess/pics/star.png rename to data/emoticons/KMess2-new/star.png diff --git a/kmess/pics/storm.png b/data/emoticons/KMess2-new/storm.png similarity index 100% rename from kmess/pics/storm.png rename to data/emoticons/KMess2-new/storm.png diff --git a/kmess/pics/sun.png b/data/emoticons/KMess2-new/sun.png similarity index 100% rename from kmess/pics/sun.png rename to data/emoticons/KMess2-new/sun.png diff --git a/kmess/pics/teeth.png b/data/emoticons/KMess2-new/teeth.png similarity index 100% rename from kmess/pics/teeth.png rename to data/emoticons/KMess2-new/teeth.png diff --git a/kmess/pics/thinking.png b/data/emoticons/KMess2-new/thinking.png similarity index 100% rename from kmess/pics/thinking.png rename to data/emoticons/KMess2-new/thinking.png diff --git a/kmess/pics/thumbs_down.png b/data/emoticons/KMess2-new/thumbs_down.png similarity index 100% rename from kmess/pics/thumbs_down.png rename to data/emoticons/KMess2-new/thumbs_down.png diff --git a/kmess/pics/thumbs_up.png b/data/emoticons/KMess2-new/thumbs_up.png similarity index 100% rename from kmess/pics/thumbs_up.png rename to data/emoticons/KMess2-new/thumbs_up.png diff --git a/kmess/pics/tongue.png b/data/emoticons/KMess2-new/tongue.png similarity index 100% rename from kmess/pics/tongue.png rename to data/emoticons/KMess2-new/tongue.png diff --git a/kmess/pics/turtle.png b/data/emoticons/KMess2-new/turtle.png similarity index 100% rename from kmess/pics/turtle.png rename to data/emoticons/KMess2-new/turtle.png diff --git a/kmess/pics/ugly.png b/data/emoticons/KMess2-new/ugly.png similarity index 100% rename from kmess/pics/ugly.png rename to data/emoticons/KMess2-new/ugly.png diff --git a/kmess/pics/umbrella.png b/data/emoticons/KMess2-new/umbrella.png similarity index 100% rename from kmess/pics/umbrella.png rename to data/emoticons/KMess2-new/umbrella.png diff --git a/kmess/pics/unhappy.png b/data/emoticons/KMess2-new/unhappy.png similarity index 100% rename from kmess/pics/unhappy.png rename to data/emoticons/KMess2-new/unhappy.png diff --git a/kmess/pics/unlove.png b/data/emoticons/KMess2-new/unlove.png similarity index 100% rename from kmess/pics/unlove.png rename to data/emoticons/KMess2-new/unlove.png diff --git a/kmess/pics/wilted_rose.png b/data/emoticons/KMess2-new/wilted_rose.png similarity index 100% rename from kmess/pics/wilted_rose.png rename to data/emoticons/KMess2-new/wilted_rose.png diff --git a/kmess/pics/wink.png b/data/emoticons/KMess2-new/wink.png similarity index 100% rename from kmess/pics/wink.png rename to data/emoticons/KMess2-new/wink.png diff --git a/data/icons/CMakeLists.txt b/data/icons/CMakeLists.txt new file mode 100644 index 0000000..44e60cf --- /dev/null +++ b/data/icons/CMakeLists.txt @@ -0,0 +1,15 @@ + +KDE4_INSTALL_ICONS( ${ICON_INSTALL_DIR} ) + +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/kmess/pics/gnomemeeting.png b/data/icons/gnomemeeting.png similarity index 100% rename from kmess/pics/gnomemeeting.png rename to data/icons/gnomemeeting.png diff --git a/data/icons/hi128-app-kmess.png b/data/icons/hi128-app-kmess.png new file mode 100644 index 0000000..89cc627 Binary files /dev/null and b/data/icons/hi128-app-kmess.png differ diff --git a/data/icons/hi16-app-kmess.png b/data/icons/hi16-app-kmess.png new file mode 100644 index 0000000..ba883cd Binary files /dev/null and b/data/icons/hi16-app-kmess.png differ diff --git a/data/icons/hi22-app-kmess.png b/data/icons/hi22-app-kmess.png new file mode 100644 index 0000000..bf9e4e4 Binary files /dev/null and b/data/icons/hi22-app-kmess.png differ diff --git a/data/icons/hi32-app-kmess.png b/data/icons/hi32-app-kmess.png new file mode 100644 index 0000000..1f69edd Binary files /dev/null and b/data/icons/hi32-app-kmess.png differ diff --git a/data/icons/hi48-app-kmess.png b/data/icons/hi48-app-kmess.png new file mode 100644 index 0000000..4a87384 Binary files /dev/null and b/data/icons/hi48-app-kmess.png differ diff --git a/data/icons/hi64-app-kmess.png b/data/icons/hi64-app-kmess.png new file mode 100644 index 0000000..5b0243e Binary files /dev/null and b/data/icons/hi64-app-kmess.png differ diff --git a/data/icons/hisc-apps-kmess.svgz b/data/icons/hisc-apps-kmess.svgz new file mode 100644 index 0000000..0d4a766 --- /dev/null +++ b/data/icons/hisc-apps-kmess.svgz @@ -0,0 +1,929 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/likeback_bug.png b/data/icons/likeback_bug.png new file mode 100644 index 0000000..1edc6c1 Binary files /dev/null and b/data/icons/likeback_bug.png differ diff --git a/data/icons/likeback_dislike.png b/data/icons/likeback_dislike.png new file mode 100644 index 0000000..fdc9a13 Binary files /dev/null and b/data/icons/likeback_dislike.png differ diff --git a/data/icons/likeback_feature.png b/data/icons/likeback_feature.png new file mode 100644 index 0000000..8d72794 Binary files /dev/null and b/data/icons/likeback_feature.png differ diff --git a/data/icons/likeback_like.png b/data/icons/likeback_like.png new file mode 100644 index 0000000..b62b611 Binary files /dev/null and b/data/icons/likeback_like.png differ diff --git a/kmess/kmess.desktop b/data/kmess.desktop similarity index 89% rename from kmess/kmess.desktop rename to data/kmess.desktop index 30b4707..ee7cde3 100644 --- a/kmess/kmess.desktop +++ b/data/kmess.desktop @@ -1,16 +1,16 @@ [Desktop Entry] Encoding=UTF-8 Name=KMess -Exec=kmess %i %m -caption "%c" +Exec=kmess -caption "%c" %i Icon=kmess Type=Application DocPath=kmess/index.html Terminal=0 Categories=Qt;KDE;Network;InstantMessaging; -Comment=MSN Messenger Clone for KDE 3 -Comment[de]=MSN Messenger Clone für KDE 3 -Comment[nl]=MSN Messenger Kloon voor KDE 3 -GenericName=MSN Client +Comment=Live Messenger Client for KDE +Comment[de]=Live-Messenger-Klon für KDE 4 +Comment[nl]=MSN Messenger Kloon voor KDE 4 +GenericName=Live Messenger Client GenericName[af]=Irc Kliënt GenericName[ar]=عميل MSN GenericName[be]=Кліент MSN @@ -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]=Live-Messenger-Programm GenericName[el]=Πελάτης MSN GenericName[eo]=MSN-kliento GenericName[es]=Cliente de MSN diff --git a/data/kmess.notifyrc b/data/kmess.notifyrc new file mode 100644 index 0000000..68d06ec --- /dev/null +++ b/data/kmess.notifyrc @@ -0,0 +1,52 @@ +[Global] +Name=KMess +IconName=kmess +Comment=KMess Messenger Client + +[Event/contact online] +Name=Contact Online +Comment=A contact has come online +Sound=kmess_logon.ogg +Action=Sound|Popup + +[Event/contact status] +Name=Contact Status +Comment=A contact has changed its MSN status +Sound=kmess_logon.ogg +Action= + +[Event/contact offline] +Name=Contact Offline +Comment=A contact has gone offline +Sound=kmess_logoff.ogg +Action=Sound|Popup + +[Event/chat start] +Name=Chat Start +Comment=A contact has started a chat with you +Sound=kmess_chat.ogg +Action=Sound|Popup|Taskbar + +[Event/new message] +Name=New Message +Comment=You received a message from a contact +Sound=kmess_chat.ogg +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|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 new file mode 100644 index 0000000..6e86d14 --- /dev/null +++ b/data/pics/CMakeLists.txt @@ -0,0 +1,24 @@ + +SET( kmess_PICS + away.png + background.png + berightback.png + blocked.png + busy.png + emoticons.png + empty.png + invisible.png + kmesspic.png + kmessstrip1.png + kmessstrip2.png + lunch.png + offline.png + online.png + onthephone.png + unknown.png + contact_food_overlay.png + contact_phone_overlay.png + contact_busy_overlay.png +) + +INSTALL( FILES ${kmess_PICS} DESTINATION ${DATA_INSTALL_DIR}/kmess/pics ) diff --git a/kmess/pics/away.png b/data/pics/away.png similarity index 100% rename from kmess/pics/away.png rename to data/pics/away.png diff --git a/data/pics/background.png b/data/pics/background.png new file mode 100644 index 0000000..f97c99c Binary files /dev/null and b/data/pics/background.png differ diff --git a/kmess/pics/berightback.png b/data/pics/berightback.png similarity index 100% rename from kmess/pics/berightback.png rename to data/pics/berightback.png diff --git a/kmess/pics/blocked.png b/data/pics/blocked.png similarity index 100% rename from kmess/pics/blocked.png rename to data/pics/blocked.png diff --git a/kmess/pics/busy.png b/data/pics/busy.png similarity index 100% rename from kmess/pics/busy.png rename to data/pics/busy.png diff --git a/data/pics/contact_busy_overlay.png b/data/pics/contact_busy_overlay.png new file mode 100644 index 0000000..554ca62 Binary files /dev/null and b/data/pics/contact_busy_overlay.png differ diff --git a/data/pics/contact_food_overlay.png b/data/pics/contact_food_overlay.png new file mode 100644 index 0000000..be7d0cd Binary files /dev/null and b/data/pics/contact_food_overlay.png differ diff --git a/data/pics/contact_phone_overlay.png b/data/pics/contact_phone_overlay.png new file mode 100644 index 0000000..70f613e Binary files /dev/null and b/data/pics/contact_phone_overlay.png differ diff --git a/kmess/pics/emoticons.png b/data/pics/emoticons.png similarity index 100% rename from kmess/pics/emoticons.png rename to data/pics/emoticons.png diff --git a/kmess/pics/empty.png b/data/pics/empty.png similarity index 100% rename from kmess/pics/empty.png rename to data/pics/empty.png diff --git a/kmess/pics/invisible.png b/data/pics/invisible.png similarity index 100% rename from kmess/pics/invisible.png rename to data/pics/invisible.png diff --git a/data/pics/kmesslogo.svgz b/data/pics/kmesslogo.svgz new file mode 100644 index 0000000..71dc235 Binary files /dev/null and b/data/pics/kmesslogo.svgz differ diff --git a/data/pics/kmesspic.png b/data/pics/kmesspic.png new file mode 100644 index 0000000..651ee9b Binary files /dev/null and b/data/pics/kmesspic.png differ diff --git a/data/pics/kmesspic.svgz b/data/pics/kmesspic.svgz new file mode 100644 index 0000000..3238c76 Binary files /dev/null and b/data/pics/kmesspic.svgz differ diff --git a/data/pics/kmessstrip1.png b/data/pics/kmessstrip1.png new file mode 100644 index 0000000..b99f3d4 Binary files /dev/null and b/data/pics/kmessstrip1.png differ diff --git a/data/pics/kmessstrip1.svgz b/data/pics/kmessstrip1.svgz new file mode 100644 index 0000000..85237f1 Binary files /dev/null and b/data/pics/kmessstrip1.svgz differ diff --git a/data/pics/kmessstrip2.png b/data/pics/kmessstrip2.png new file mode 100644 index 0000000..6baf07a Binary files /dev/null and b/data/pics/kmessstrip2.png differ diff --git a/data/pics/kmessstrip2.svgz b/data/pics/kmessstrip2.svgz new file mode 100644 index 0000000..ce0d9b3 Binary files /dev/null and b/data/pics/kmessstrip2.svgz differ diff --git a/kmess/pics/lunch.png b/data/pics/lunch.png similarity index 100% rename from kmess/pics/lunch.png rename to data/pics/lunch.png diff --git a/kmess/pics/offline.png b/data/pics/offline.png similarity index 100% rename from kmess/pics/offline.png rename to data/pics/offline.png diff --git a/kmess/pics/online.png b/data/pics/online.png similarity index 100% rename from kmess/pics/online.png rename to data/pics/online.png diff --git a/kmess/pics/onthephone.png b/data/pics/onthephone.png similarity index 100% rename from kmess/pics/onthephone.png rename to data/pics/onthephone.png diff --git a/kmess/pics/unknown.png b/data/pics/unknown.png similarity index 100% rename from kmess/pics/unknown.png rename to data/pics/unknown.png diff --git a/data/sounds/CMakeLists.txt b/data/sounds/CMakeLists.txt new file mode 100644 index 0000000..004ab1a --- /dev/null +++ b/data/sounds/CMakeLists.txt @@ -0,0 +1,9 @@ + +SET(kmess_SOUNDS + kmess_chat.ogg + kmess_logoff.ogg + kmess_logon.ogg + kmess_msg.ogg +) + +INSTALL( FILES ${kmess_SOUNDS} DESTINATION ${SOUND_INSTALL_DIR} ) diff --git a/kmess/sounds/README b/data/sounds/README similarity index 100% rename from kmess/sounds/README rename to data/sounds/README diff --git a/kmess/sounds/kmess_chat.ogg b/data/sounds/kmess_chat.ogg similarity index 100% rename from kmess/sounds/kmess_chat.ogg rename to data/sounds/kmess_chat.ogg diff --git a/kmess/sounds/kmess_logoff.ogg b/data/sounds/kmess_logoff.ogg similarity index 100% rename from kmess/sounds/kmess_logoff.ogg rename to data/sounds/kmess_logoff.ogg diff --git a/kmess/sounds/kmess_logon.ogg b/data/sounds/kmess_logon.ogg similarity index 100% rename from kmess/sounds/kmess_logon.ogg rename to data/sounds/kmess_logon.ogg diff --git a/kmess/sounds/kmess_msg.ogg b/data/sounds/kmess_msg.ogg similarity index 100% rename from kmess/sounds/kmess_msg.ogg rename to data/sounds/kmess_msg.ogg diff --git a/doc/.cvsignore b/doc/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/doc/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 0000000..a53ca07 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,5 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + +add_subdirectory( en ) + diff --git a/doc/Makefile.am b/doc/Makefile.am deleted file mode 100644 index 6ddbc3b..0000000 --- a/doc/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -SUBDIRS = en - diff --git a/doc/Makefile.in b/doc/Makefile.in deleted file mode 100644 index be2a81f..0000000 --- a/doc/Makefile.in +++ /dev/null @@ -1,717 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = doc -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -#>- html-recursive info-recursive install-data-recursive \ -#>- install-exec-recursive install-info-recursive \ -#>- install-recursive installcheck-recursive installdirs-recursive \ -#>- pdf-recursive ps-recursive uninstall-info-recursive \ -#>- uninstall-recursive -#>+ 6 -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive nmcheck-recursive bcheck-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -SUBDIRS = en -#>- all: all-recursive -#>+ 1 -all: docs-am all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu doc/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu doc/Makefile - cd $(top_srcdir) && perl admin/am_edit doc/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || mkdir "$(distdir)/$$subdir" \ - || exit 1; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="../$(top_distdir)" \ - distdir="../$(distdir)/$$subdir" \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-recursive -#>+ 1 -clean: kde-rpo-clean clean-recursive - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-recursive - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-info-am - -uninstall-info: uninstall-info-recursive - -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ - clean clean-generic clean-libtool clean-recursive ctags \ - ctags-recursive distclean distclean-generic distclean-libtool \ - distclean-recursive distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic maintainer-clean-recursive \ - mostlyclean mostlyclean-generic mostlyclean-libtool \ - mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Makefile.in apidocs_header.html doxygen.css Makefile.am apidocs_footer.html - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu doc/Makefile - cd $(top_srcdir) && perl admin/am_edit doc/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-recursive - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/doc/en/.cvsignore b/doc/en/.cvsignore deleted file mode 100644 index 319e92c..0000000 --- a/doc/en/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -index.cache.bz2 diff --git a/doc/en/CMakeLists.txt b/doc/en/CMakeLists.txt new file mode 100644 index 0000000..52c0ed5 --- /dev/null +++ b/doc/en/CMakeLists.txt @@ -0,0 +1,9 @@ + +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) + + +########### install files ############### + + +kde4_create_handbook( index.docbook INSTALL_DESTINATION "${HTML_INSTALL_DIR}/en" SUBDIR "kmess" ) + diff --git a/doc/en/Makefile.am b/doc/en/Makefile.am deleted file mode 100644 index 0d27d96..0000000 --- a/doc/en/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -EXTRA_DIST = index.docbook - -KDE_LANG = en -KDE_DOCS = kmess - diff --git a/doc/en/Makefile.in b/doc/en/Makefile.in deleted file mode 100644 index 61c1cb5..0000000 --- a/doc/en/Makefile.in +++ /dev/null @@ -1,617 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = doc/en -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -EXTRA_DIST = index.docbook -KDE_LANG = en -KDE_DOCS = kmess -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/en/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu doc/en/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/en/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu doc/en/Makefile - cd $(top_srcdir) && perl admin/am_edit doc/en/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -#>- distdir: $(DISTFILES) -#>+ 1 -distdir: distdir-nls $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -#>- uninstall: uninstall-am -#>+ 1 -uninstall: uninstall-docs uninstall-nls uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-docs clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -#>- install-data-am: -#>+ 1 -install-data-am: install-docs install-nls - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=emoticonsbutton.png mainwindow.png chatwindow-contextmenu.png styles-classic.png contactlist-contextmenu.png Makefile.in chatwindow-withsidebar.png picturechange-result.png startupscreen.png settings-dialog-chatlogs.png sidebarbutton.png settings-dialog-chatting.png chatwindow-custom-emoticons-add.png chatwindow-nosidebar.png styles-fresh.png chatwindow-emoticons.png settings-dialog-account.png popup-balloon.png settings-dialog-emoticons.png settings-dialog-emoticons-custom.png settings-dialog-email.png picturechange-dialog.png Makefile.am styles-classic-compact.png - -#>+ 24 -index.cache.bz2: $(srcdir)/index.docbook $(KDE_XSL_STYLESHEET) settings-dialog-account.png contactlist-contextmenu.png emoticonsbutton.png settings-dialog-chatlogs.png styles-classic-compact.png index.docbook styles-fresh.png picturechange-dialog.png settings-dialog-email.png settings-dialog-chatting.png settings-dialog-emoticons-custom.png settings-dialog-emoticons.png chatwindow-withsidebar.png styles-classic.png chatwindow-nosidebar.png chatwindow-contextmenu.png mainwindow.png popup-balloon.png picturechange-result.png chatwindow-custom-emoticons-add.png startupscreen.png chatwindow-emoticons.png sidebarbutton.png - @if test -n "$(MEINPROC)"; then echo $(MEINPROC) --check --cache index.cache.bz2 $(srcdir)/index.docbook; $(MEINPROC) --check --cache index.cache.bz2 $(srcdir)/index.docbook; fi - -docs-am: index.cache.bz2 - -install-docs: docs-am install-nls - $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess - @if test -f index.cache.bz2; then \ - echo $(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/; \ - $(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/; \ - elif test -f $(srcdir)/index.cache.bz2; then \ - echo $(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/; \ - $(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/; \ - fi - -rm -f $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/common - $(LN_S) $(kde_libs_htmldir)/$(KDE_LANG)/common $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/common - -uninstall-docs: - -rm -rf $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess - -clean-docs: - -rm -f index.cache.bz2 - - -#>+ 13 -install-nls: - $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess - @for base in settings-dialog-account.png contactlist-contextmenu.png emoticonsbutton.png settings-dialog-chatlogs.png styles-classic-compact.png index.docbook styles-fresh.png picturechange-dialog.png settings-dialog-email.png settings-dialog-chatting.png settings-dialog-emoticons-custom.png settings-dialog-emoticons.png chatwindow-withsidebar.png styles-classic.png chatwindow-nosidebar.png chatwindow-contextmenu.png mainwindow.png popup-balloon.png picturechange-result.png chatwindow-custom-emoticons-add.png startupscreen.png chatwindow-emoticons.png sidebarbutton.png ; do \ - echo $(INSTALL_DATA) $$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/$$base ;\ - $(INSTALL_DATA) $(srcdir)/$$base $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/$$base ;\ - done - -uninstall-nls: - for base in settings-dialog-account.png contactlist-contextmenu.png emoticonsbutton.png settings-dialog-chatlogs.png styles-classic-compact.png index.docbook styles-fresh.png picturechange-dialog.png settings-dialog-email.png settings-dialog-chatting.png settings-dialog-emoticons-custom.png settings-dialog-emoticons.png chatwindow-withsidebar.png styles-classic.png chatwindow-nosidebar.png chatwindow-contextmenu.png mainwindow.png popup-balloon.png picturechange-result.png chatwindow-custom-emoticons-add.png startupscreen.png chatwindow-emoticons.png sidebarbutton.png ; do \ - rm -f $(DESTDIR)$(kde_htmldir)/$(KDE_LANG)/kmess/$$base ;\ - done - - -#>+ 5 -distdir-nls: - for file in settings-dialog-account.png contactlist-contextmenu.png emoticonsbutton.png settings-dialog-chatlogs.png styles-classic-compact.png index.docbook styles-fresh.png picturechange-dialog.png settings-dialog-email.png settings-dialog-chatting.png settings-dialog-emoticons-custom.png settings-dialog-emoticons.png chatwindow-withsidebar.png styles-classic.png chatwindow-nosidebar.png chatwindow-contextmenu.png mainwindow.png popup-balloon.png picturechange-result.png chatwindow-custom-emoticons-add.png startupscreen.png chatwindow-emoticons.png sidebarbutton.png ; do \ - cp $(srcdir)/$$file $(distdir); \ - done - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/en/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu doc/en/Makefile - cd $(top_srcdir) && perl admin/am_edit doc/en/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/doc/en/chatwindow-contextmenu.png b/doc/en/chatwindow-contextmenu.png index d9a5c8a..eaab9b9 100644 Binary files a/doc/en/chatwindow-contextmenu.png and b/doc/en/chatwindow-contextmenu.png differ diff --git a/doc/en/chatwindow-custom-emoticons-add.png b/doc/en/chatwindow-custom-emoticons-add.png index 93fddac..16de678 100644 Binary files a/doc/en/chatwindow-custom-emoticons-add.png and b/doc/en/chatwindow-custom-emoticons-add.png differ diff --git a/doc/en/chatwindow-emoticons.png b/doc/en/chatwindow-emoticons.png index 9c05deb..900b60b 100644 Binary files a/doc/en/chatwindow-emoticons.png and b/doc/en/chatwindow-emoticons.png differ diff --git a/doc/en/chatwindow-nosidebar.png b/doc/en/chatwindow-nosidebar.png deleted file mode 100644 index dfd4420..0000000 Binary files a/doc/en/chatwindow-nosidebar.png and /dev/null differ diff --git a/doc/en/chatwindow-withsidebar.png b/doc/en/chatwindow-withsidebar.png deleted file mode 100644 index 1c931b9..0000000 Binary files a/doc/en/chatwindow-withsidebar.png and /dev/null differ diff --git a/doc/en/chatwindow.png b/doc/en/chatwindow.png new file mode 100644 index 0000000..21f7a8c Binary files /dev/null and b/doc/en/chatwindow.png differ diff --git a/doc/en/contactlist-contextmenu.png b/doc/en/contactlist-contextmenu.png index 5cb100f..48cbc6a 100644 Binary files a/doc/en/contactlist-contextmenu.png and b/doc/en/contactlist-contextmenu.png differ diff --git a/doc/en/contactlist-states.png b/doc/en/contactlist-states.png new file mode 100644 index 0000000..edcc204 Binary files /dev/null and b/doc/en/contactlist-states.png differ diff --git a/doc/en/contactlist.png b/doc/en/contactlist.png new file mode 100644 index 0000000..469166e Binary files /dev/null and b/doc/en/contactlist.png differ diff --git a/doc/en/emoticonsbutton.png b/doc/en/emoticonsbutton.png deleted file mode 100644 index 9d225dd..0000000 Binary files a/doc/en/emoticonsbutton.png and /dev/null differ diff --git a/doc/en/index.docbook b/doc/en/index.docbook index eee1bfc..529a9a7 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-03-27 &version; @@ -44,7 +44,23 @@ Pilo -
amroth@coldshock.net
+
valerio@kmess.org
+
+ + + Heimen + + Stoffels + +
cooleboy121HS@hotmail.com
+
+
+ + Panagiotis + + Papadopoulos + +
pano_90@gmx.net
@@ -60,7 +76,7 @@ Diederik van der Boor - 2007 + 2009 Valerio Pilo @@ -69,12 +85,11 @@ - &kapp; is an alternative MSN 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 - which is both clean and easy to use. + &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 &MacOS;. The + strength of &kapp; is its 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 +98,8 @@ KDE KMess Chat + Windows Live + Live Messenger MSN Client Messenger @@ -101,7 +118,7 @@ Introduction - &kapp; is an alternative Instant Messaging client for Linux. + &kapp; is an alternative Instant Messaging client for &Linux;. - 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 - to start an interactive chat conversation. + 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 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. - 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. + &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 &MacOS; X. MSN Messenger has been renamed to + &Windows; Live Messenger in February 2006. Its 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 - features and a clean and easy-to-use interface. - Like many Linux and KDE applications, &kapp; is free software. - The licensing terms are the GNU General Public License. + 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. 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 client software. + Rich, colorful chat styles. Multiple accounts are supported. + Chat log 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 and customizable notifications and warning messages. + Notifications can be blocked when the status is set to Busy. + Nudges can be blocked, winks can be hidden. + Annoying custom emoticons can be blacklisted. + 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 with offline and invisible contacts. + Nudges. + Custom emoticons. + Winks. + Ink (hand-written) messages. Exchange of Now Playing... information. - Transferring file thumbnail previews. - E-mail notifications for Hotmail accounts. + Email notifications for Hotmail/Live Mail accounts. + Messenger Plus! features: text formatting, tabbed chat windows. @@ -176,33 +205,39 @@ Note that all graphics should be in .png format. Use no gifs because of patent issues. - Use the same style for all screenshots - (Plastik widget, color scheme and window borders). + Use the default KDE style for all screenshots + (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;. + Because &kapp; is a &Windows; Live Messenger client, you need to have an account at the online &Windows; Live Service. + If you already have an existing account - ⪚ you have used &Windows; Live Messenger before - you can use this account for &kapp; too. + Otherwise, you can create an account at the &Microsoft; Passport web site. + After you created the account, you can log in to use &kapp;. - Creating an account + 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 create a new account, you can either create a new free &Windows; Live Hotmail address, + or register your own email address at register.passport.com . + A link to this site is also found at the login screen of &kapp; + After you have completed the registration process, you can use your email address to login. - 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. + You will also 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. + Until you have confirmed 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 ask the &Windows; Live Service to send you another confirmation email by clicking on + the Request verification email link in the account settings page of &kapp;. + + + You can manage the accounts saved within &kapp; from the &kapp; settings dialog. To learn + more about it, see . @@ -210,328 +245,472 @@ 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. - - The &kapp; startup screen - - - Use the check box field at the bottom of the window if you don't want your account data saved. - - + To ease the login process by only using the keyboard, you can press to + switch to the next field after you are done filling it, then press &Enter; + to start connecting. + If your account email is already memorized by &kapp; just choose it from the drop-down list. + The display picture will reflect the last known picture for that account or the &kapp; logo + if none was found. Clicking on the display picture will open the settings of the selected account, + using the mouse wheel will switch between the saved accounts. + + 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 or exit &kapp;. + Also any changes made to the settings of a guest account will be lost. + + + + 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 &kapp; passwords. However, if the &kde; Wallet is not available, &kapp; + will store the unencrypted account passwords in the file + ~/.kde4/share/config/kmessrc (~ is your home directory). + 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, uncheck the Remember password checkbox provided in &kapp;'s + startup screen. + + + + The &kapp; startup screen + + + The &kapp; startup screen + + + After logging in, your contact list appears. This is described in the next section. - - - &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. - - Using the Contacts List + Using the Contact 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; - - - 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 following image gives an example of a typical contact list: + + The main window and contact list + + + The main window and contact list + + + - 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: + To start chatting with a contact, just click his or her name on the list. + Please note that many of the actions and operations you can perform on the items of the + contact list, can be performed directly by clicking the &RMB; on the contact. This will pop up + the following context menu: - - + + + The context menu of a contact in the contact list - The context menu of a contact in the contact list. + The context menu of a contact in the contact list + + + + Hovering with the mouse over the name of a contact, brings up a tooltip with information about + that contact. - Setting your appearance + Setting your Appearance - Changing your status + 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. - The third is to right-click on the &kapp; tray icon, then click My Status. - There are different statuses available: + 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 click with the &RMB; on the &kapp; tray icon, then click + My Status. + You can select from the following different states: + + + Online + Away + Away with Auto-Reply + Idle + Be Right Back + Busy + Out to Lunch + On the Phone + Invisible + + + + The status context menu + + + The status context menu + + + + + The last item of the menu allows you to disconnect from the Live service. - - Online - Away - Away with auto reply - Be right Back - Busy - Out for Lunch - On the Phone - Invisible - + &kapp; differentiates between two Away states: + + + The standard Away status which is the one you may be + familiar with from other Instant Messenging clients. + + + 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 sent automatically to every person who starts a chat with you. + + - &kapp; differentiates between three 'Away' statuses. - The standard 'Away' status is the one you may be familiar with from other MSN Messenger clients. - - - 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. - - - 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"). - - - 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. + 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. - Starting chat conversations + Starting Chat Conversations - Starting a chat with a contact + 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 with the &LMB; on an available contact in the contact list, + or choose Chat from its context menu, accessible by clicking + with the &RMB; on the contact. + The chat window will open and you can start chatting with the contact. - Starting a chat with multiple participants + 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 . + In the opened chat window, go to Chat Invite.... + A window will appear, showing all available contacts. On the left, you can click on the + contacts you want to add to the chat. Then click the right arrow icon + button. On the right you will then see the contacts who are going to be + invited. To remove some from there, select them, and click the left arrow icon + button. + You can also invite contacts that are not on your contact list, by directly entering their + email address in the field on the left and clicking the add button. - Managing contacts + Managing Contacts - Adding a contact + 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 also add the new contact directly to one or more groups, by enabling + the checkboxes of the desired groups in the list. + After clicking on OK, the contact will be added to your contact + list. - Removing a contact + Removing a Contact - 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. - 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. + On the contact list, click with the &RMB; on the contact you would like to remove. + Choose Delete Contact from the context + menu. + A dialog will open, where you can select to either: + + + + Remove the contact but still allow him or her to see your status. + + + Remove and block the contact, to disallow him or her from either talking to you, or even + seeing your online status. + + + + After clicking on OK, either option will cause the contact to + disappear from your contact list. - Blocking a contact + 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. + On the contact list, click with the &RMB; 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 your + online status. + You can still see that contact's online status and you can still initiate a chat if you + want to. - Unblocking a contact + Unblocking a Contact - Right-click on the contact you would like to unblock. - Choose "Unblock Contact" from the context menu. - The Contact will be unblocked. + On the contact list, click with the &RMB; on the contact you would like to unblock. + Choose Unblock Contact from the + context menu. + The contact will be unblocked. + + + + + Copying a Contact to Another Group + + On the contact list, click with the &RMB; on the contact you would like to copy to another + group. + Choose Copy to Group and then, from + the popup menu which appears, choose the group where you would like to copy the contact + to. + The contact is then copied to the chosen group. - Moving a contact to another 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. + On the contact list, click with the &RMB; on the contact you would like to move to another + group. + Choose Move to Group and then, from + the popup menu which appears, choose the group where you would like to move the contact + to. The contact is then moved to the chosen group. - Renaming contacts + Renaming Contacts - The official client does not permit renaming of contacts, - you can only see the name the contact has entered. - &kapp; on the other hand allows you to set an alias for the contact. - This makes it possible to replace long annoying names with short descriptive ones. - See the Contact Properties section for more details. + Contacts can be renamed from the properties dialog. + This makes it possible, for example, to replace the long annoying name of a contact with a short descriptive name. + For more details, see . + + + + + Removing a Contact from a Group + + On the contact list, click with the &RMB; on the contact you would like to remove from a + group. + Choose Remove From Group. + The contact is then removed from the group. + + + If the contact is not present in any of your groups, &kapp; will automatically place him + or her in a special group called Individuals. - Managing groups + Managing Groups - Adding a group + 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. - - - - - 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. + 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. + The new group will be added to your contact list. - Rename a group + 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. - After confirming the action by clicking OK the group will be renamed. + On the contact list, click with the &RMB; on the name of the group you would like to + rename. + 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. + + + + + Removing a Group + + 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. + On the contact list, click with the &RMB; on the name of the group you would like to + remove. + Choose Remove Group from the context menu. + You will need to confirm the action, by clicking on Remove. - Changing the contact list appearance + Changing the Gontact List Appearance - Sorting contacts by Online/Offline or by Groups + Sorting Contacts - 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: + + + + Group + + Your contacts will be each placed in the groups they belong to. + + + + Online/Offline + + The contact list will only show the Online and the Offline + groups, and your contacts will be shown in one or the other, + depending if they are online or not. + + + + Mixed + + This will make the contact list to display all available contacts in their respective + groups, like with the Group. Unlike it however, all contacts who are + currently offline will only appear in the Offline group. + + + + + + + Show Allowed Contacts + + This option is available by using the menu option: + View Show Allowed Contacts. + When enabled, it adds an additional group to your contact list, named + Allowed. + It contains all contacts that you have allowed to see your online status and start chats + with you, but that you did not add to your contact list. + Contacts can only be removed entirely from the Allowed group if they no + longer have you listed in their contact list. - Show removed contacts + 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. + This option is available by using the menu option: + View Show Removed Contacts. + When enabled, it adds an additional group to your contact list, named + Removed. + It contains all the known removed contacts, who are contacts that you removed from your + contact list. - Other actions in the contact list window + Other Actions in the Contact List Window 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 - a personal message, just empty the field. + &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 on the window. + If you want to no longer display a personal message, just clean up the text field. - Send an e-mail to a contact using my Hotmail Account + Send an Email to a Contact Using your Live Mail 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. + On the contact list, click with the &RMB; on the name of the contact you would like to + send a mail to. + Choose Send Email from the context menu. + &kapp; will open your Live Mail Account in your favorite web browser, direct at the + Compose page. + + + This feature is also easily accessable while you chat with a contact. Click on the contact's picture in the + Contacts Panel and then choose Send Email + from the context menu. + To read more about the Contacts Panel, see . - See the MSN Profile of a contact + See the Live 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. - 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. + On the contact list, click with the &RMB; on the name of the contact you would like to + see the profile of. + Choose View Profile from the context menu. + &kapp; will open, in your favorite web browser, the profile page of the chosen contact. + You can also do this while in chat with a contact. Click on the contact's picture in the + Contacts Panel and then choose View Profile + from the context menu. + To read more about the Contacts Panel and how to open it, see . - Viewing your personal MSN Profile + Viewing your Personal Live Profile - Go to Connect Show My Profile. - &kapp; will then open your personal MSN Profile in your preferred web browser. + Go to Connect Show My Profile. + &kapp; will then open your personal Live Profile in your favorite web browser. - Open your Hotmail Inbox using &kapp; + Open your Live Mail 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. - Clicking on this information will open your Hotmail Inbox in your preferred web browser. + This option is only available if your email address has been created with Hotmail or + &Windows; Live. - This open is only available if your account has been registered with Hotmail or MSN. - - - - - Search for Contacts in the MSN Member Directory - - In Actions in the main &kapp; window will you find two entries: + The contact list window displays a link to your Live Mail account. + The link states how many unread email messages you have. + Clicking on this information will open your Live Mail Inbox in your preferred web browser. - - Search 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. + To enable or disable this option, see . @@ -540,224 +719,298 @@ Using the Chat Windows - The Chat Window is the place where your conversations happen. You can chat with one or more contacts together in a - single chat window: see Starting a chat with a contact and - Starting a chat with multiple participants for more details. + The Chat window is the place where your conversations happen. You can chat with one or more + contacts together in a single chat window: for more details, see + and . - - - The &kapp; chat window - + + By default, &kapp; will display all your chats within a single window, each one within a + tab: you can learn more about this behavior in . + + + + The &kapp; chat window + + + The &kapp; chat window + + Chatting - Once you have a chat window open, either opened by you or by a contact who has started a converstation 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. + 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 in your own messages in the smaller area on the bottom + of the window. - 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. + When you are done writing a message, you can press &Enter; to instantly send + it, or click the Send button at the bottom right of the message + editing area. - 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. + To insert a new line in your message, press Shift+Enter or click the + New line button at the bottom right of the message editing area. + + + On the right side of the window, you will see the Contacts Panel, present by default. + To learn more about the panels, see . + + + Near the top, below the toolbar, you will find the Tab Bar, which lists a box for each chat + currently active. New chats opened by your contacts will appear there. + To learn more about the tabs, see . + + + You can define shortcuts for all the actions you can perform in chat. You can go to + Settings Configure Shortcuts... to + define them. Many actions already have default 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, and Ctrl+Up + and its counterpart Ctrl+Down, which allow you to easily scroll through the + past chat messages and read what has been written previously. Emoticons - &kapp; comes with the default Emoticons theme made by David Vignoni. + &kapp; comes with the default emoticons theme made by David Vignoni. - + + The default &kapp; Emoticons The default &kapp; Emoticons + + + Below the message editing area you can find a button with a smilie. + By clicking this button, the message editing area will change, displaying all the available + emoticons from the emoticon theme which is currently selected. + Clicking on one of the shown emoticons will return to the normal message editing area, + inserting the clicked emoticon in your current message. Sending the message will then + display the emoticon in the chat. - 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. - - See also Emoticon Themes. + You can also enable a separate Panel to always keep your emoticons at hand. + To learn more about the panels, see . 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. + &kapp; can send your own created emoticons to your friends, and receive theirs. - When you first use &kapp; 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. - - - When a contact who you are chatting with sends to you a custom emoticon, you can click on it - to add it to your own custom emoticon theme. A dialog window will pop up: - + To use them click - below the message editing area - at the button with the purple smilie. + The message editing area will change, displaying all the available custom emoticons. + Clicking on one of the shown emoticons will return to the normal message editing area, + inserting the clicked emoticon in your current message. Sending the message will then + display the emoticon in the chat. Your contact will receive and see it shortly. + + + You can also enable a separate Panel to always keep your custom emoticons at hand. + To learn more about the panels, see . + + + 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 you received from contacts + Add emoticons by choosing images from your computer + + + When a contact you are chatting with sends you a custom emoticon, you can click on it + to save it to your own custom emoticons. A dialog window will pop up: + + + The Add Custom Emoticon dialog 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. - - + - Alternatively, you can open your account's Settings dialog, select Emoticons> Custom Emoticons icons - and click the Add new... button. + You may also use this dialog to can change the text shortcut associated with the new + emoticon. By clicking the Ok button, the new emoticon will instantly + be available. + + + Alternatively, you can manage your emoticons from the Account Settings dialog. + To learn more about the Account Settings, see . - File transfer + File Transfers - &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 - him or her. + &kapp; supports transferring files through MSN. + 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. - 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. + Then you can send a file by choosing from the menu Chat + Send File. + 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. - 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. + But by far, the easiest method to send one or more files to your contacts is drag and drop. + Drag some files from the desktop or a directory in &dolphin; or &konqueror;, + and drop them at the chat messages view, or message editing area. + The files will be sent immediately. + + + After your contact accepts the file transfer, the &kapp; file Transfer Window will appear + and the file transfer will start. + + + Please note that Live Messenger does not allow to its users to accept more than five file + transfers at once for each contact. + + + Additionally, that there could be problems if you are behind a router or a NAT. + Currently it is required to manually open the TCP ports 6891-6900 in your firewall. + The port range can be changed from the settings panel, see . + If you're behind a NAT router, you also need to make sure these ports are also forwarded to your local computer. - - Contact Sidebar + + Panels - The contact sidebar is located on the right side of the chatwindow. + The panels are movable and closeable areas of the chat window, where additional information + and other useful things are displayed. Currently &kapp; provides the following panels: - + + Contacts + Emoticons + Custom emoticons + + The Emoticons and Custom emoticons panels can also be displayed as buttons below the message editing area. + + + Chat window with the contacts panel (on the right side) - - Chat window with the sidebar (on the right side). + + Chat window with the contacts panel (on the right side) + + + The panels can be moved wherever you like: just click and hold the &LMB; on the panel title, + then move them around: they will stick on the chat window borders. When a panel is placed + on the top or bottom border, rather than the left or right side, its behavior will be + different. + For example, the contacts panel when at the top or bottom will only show the contact names, + status and personal message of the chat participants. + + + If you do not like a panel, you can click on the little X button near the + panel name, or you can do it from the menu: View + Panels then choose the panel to hide. - - 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. - - - - - The Contacts sidebar provides you with information and functions associated with each contact in - the chat. Information includes: - + + Contacts Panel + + The contacts panel provides you with information and functions associated with each + contact who is participating to the chat. Information includes: + - Nickname - Display picture - Current status - Email address - Personal Message + Display picture + Email address (by clicking on the display picture) + Contact status + Personal message + + Click with the &LMB; or &RMB; on the display picture of a contact in the contacts panel, + to bring up a context menu with even more operations: + + + A contact's context menu + + + A contact's context menu + + + + The contacts panel has some additional features: when the person is writing a message, + his or her display picture becomes brighter. + If you would like to see your own display picture more than just those of your contacts, + you can enable the account settings option Display your own display picture in + the chat window. Clicking your display picture there will bring up the account + settings. To learn more about how to enable this option, see . + + + Contacts panel adjusts its layout when it is placed at top or bottom of the chat window. + For example, it will not display the pictures for contacts, nor the picture of your account. + + - Right-click on a contact in the Contact Sidebar to bring up a menu with even more operations: - - - - - - 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). - + + Emoticons Panels + + There are two emoticon panels: the emoticons panel and the custom emoticons panel. + The only difference between them is that the first one shows the default emoticons (which are + like the standard MSN emoticons but with the &kapp; style), and the second one shows the + custom emoticons you currently have. + + + The emoticon panels also have a small preview area, which will show a bigger animated version + of the emoticon you hover your mouse cursor on. + + 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 nudges, just like &Windows; Live Messenger. They are a good way to + require attention from your contacts, but 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 the Nudge toolbar icon, 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 - caused by nudges, you can disable it in the Account settings. See the Alerts settings for details. + Unlike &Windows; Live Messenger, &kapp; does not limit the number of nudges you can send or + receive every minute. Try not to abuse this, as it is easy to make someone angry just by + using them a bit too much. If you do not like the shake effect nudges cause, + you can disable this in the account settings; see . 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 and View + Zoom Out, to increase or decrease the font size + displayed in the chats. - Save chat sessions + 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. - Save the chat now by clicking OK. - See also Automatic chat logging. + To save an active chat session to a file, you can click on Chat + Save Chat... in the chat window menu. + Choose the directory where the chat should be saved and name the file. Save the chat now + by clicking OK. + Also see . - - @@ -765,353 +1018,750 @@ 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 - Sound notifications dialog. + &kapp; can be customized as you wish. The settings of &kapp; are organized in the following groups: + + + Global settings (⪚ which web browser to use). + Personal settings for every account (⪚ your name, and picture). + Settings for a specific contact (⪚ a setting a contact alias). + + + The account settings dialog should cover most of your needs to personalize your account. + You can also personalize many details about your contacts with the contact settings, and change many + application-wide settings, like the favorite browser &kapp; will use, from the Configure &kapp; + dialog. + + + To learn more about the account settings, see . + To learn more about the contact settings, see . + To learn more about the configure &kapp; dialog, see . - The contact properties dialog + The Contact properties Dialog - By right-clicking on a contact in the contact list window, - you can open the Properties of the contact. + On the contact list, click with the &RMB; on the contact you would like to customize. + Choose Properties and the contact + properties dialog will appear. - - 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. - - - 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". - - - 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. - - - - - - - - The sound notifications dialog - - - Changing the sound notifications - - &kapp; has six different events that are by default - set up with sound notifications. These six 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 - - - - &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. - - - - - - The settings dialog - - The &kapp; configuration dialog allows to customize the application behavior in many ways. It's divided in pages - accessible by the icons on the left area of the Settings window. Each one contains settings for a different aspect - of &kapp;. - - - - Account - - - - The Account Settings page - - - Here you can change the details of your MSN account. - - - The friendly name field contains the name that your contacts will see in their contact lists. You cannot change it - 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. - - - 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 - 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 "Login with this account automatically at start-up" 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. - - - - - 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: - + + The Contact Settings dialog - - A notification balloon + + The Contact Settings dialog + + + The first tab allows you at one glance to see some information about the contact. + It also contains some useful options: by just checking or unchecking the group names within + the list at the middle, you can move the contact around the available groups. + You can change the display picture of the contact with one of your own. To do this, just + click on the display picture of your contact. You will be asked to choose a picture file. The image you + choose here will be used instead of the picture set by the contact. + + + Below, a checkbox allows you to enter a custom name for the contact, which will be used + instead of the name used by the contact. + You can also 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 + seeing notification popups about that contact. Uncheck the box Disable notifications + for this contact. + &kapp; also allows the user to choose a particular sound to be played when the contact comes + online or goes offline. + + + The second tab, Display Pictures, contains a list of all display pictures the + contact has used. By clicking on Clear Cache you can delete the display pictures. + You can also steal a display picture from the contact, using it as your own, by + clicking on Use As Display Picture. + + + The third tab, Notes, allows you to keep some annotations about the contact. + You can also access these notes directly from the contacts panel of the chat window. + To learn more about the contacts panel, see . + + + The fourth tab, Emoticons, allows you to restore previously hidden emoticons from + that contact. Just select the entry you want to restore and click on Restore. + + + + + The Settings Dialog + + The settings dialog allows to customize your account settings and personalize your account. + Settings are divided in pages, accessible with the icons on the left area. + Each page represents a different aspect of your account. + + + You can open this dialog from your contact list window, via the menu: Actions + Configure Account..., or from the tray icon, clicking + with the &RMB; on the &kapp; tray icon, then clicking Configure Account.... + + + + Account Page - 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". + From this page you can manage the most important details of your MSN account. + + + Account Settings Dialog - The Account page + + + Account Settings Dialog - The Account page + + + + The friendly name field contains the name that your contacts will see in their contact + lists. You cannot change it if your account is not verified with Passport (see for more details). You also cannot change it unless you are + currently connected with that account. - &kapp; supports the MSN feature that shows your contacts the music you are listening to. Unlike MSN, 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. + You can change the email address of your account, in case you have changed your MSN address. + This makes sure youre preferences are not lost. + + + The password field is usually blank. If you wish that &kapp; remembers your password, you can + enter it here and check the checkbox next to Remember password. + + + Your display picture can be easily changed by clicking on the Change... + button. A menu with three options will appear: + + + + Browse... + + Use this option to select an image from your computer. + The picture will be automatically scaled to the mandatory size of 96x96 pixels. + + + + Browse and Crop Picture... + + Use this option to select an image from your computer and crop it yourself. + This allows you to select a certain part of an image and use it as your display picture. + Drag a square on the image preview to specify which part you want to use. + The selected part will be highlighted and the part about to be discarded will + be darkened. When you have found which part of the image you want to use, click OK, + and &kapp; will resize it and set is as your display picture automatically. + + + + Set Previous Image... + + Use this option if you want to choose a display picture you previously already had used. + + + + + Below the button, the Do not use checkbox allows you to not use any display picture at all. + + + The Log in with this account automatically checkbox, when enabled, causes + &kapp; to automatically connect to MSN with this account every time the application is started. + Choosing an MSN status from the Login as dropdown list, will make + &kapp; set that status everytime you login to the &Windows; Live Messenger service. + + + The second tab, Status Options, contains some status-related options. + The Change status to Idle when inactive checkbox causes + &kapp; to change your status from Online to Idle whenever you + you do nothing for some time, which defaults to 5 minutes. You can change this period from + the spin box below the checkbox. + + + The Disable notifications when your status is set to Busy + checkbox will prevent all contact status and message notifications from disturbing you if + your status is set to Busy. + + - Enable the checkbox "Inform contacts of 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!): + + Contact List Page + + Account settings dialog - The contact list page + + + Account settings dialog - The contact list page + + + + This page contains some options which affect the contact list window. + + + The Display a count of unread email checkbox will show a link to your + Live Mail inbox, showing how many unread email you have. This however, will only be used + if your email account was created with the Live service. + + + Live Messenger is able to show your contacts the music you are listening to. Unlike WLM, + which only notifies them about what is playing in &Windows; Media Player, &kapp; will discover + which media player you are using and automatically show your friends the details of the tracks + you are listening to. + Enable the Show contacts which song I am listening to checkbox to + activate this feature. When you listen to music, &kapp; will show the track name in the + upper part of your contact list. + &kapp; supports a wide range of media players: all players supporting the MPRIS + specification are automatically supported. + The following list shows some of the currently supported players: - Amarok - Kaffeine - KsCD - Juk - Noatun + amaroK 1.x + &amarok; 2 + Audacious + BMPx + Dragon Player + &juk; + Kaffeine + &kscd; + Qmmp + VLC Media Player + XMMS2 - &kapp; can also detect user inactivity. When you do nothing for some time, which defaults to 5 minutes, your MSN - status will be set to Idle if it was previously set to Online. + Disabling the option Show background image removes the &kapp; logo, the + hummingbird, from the contact list background. + + + + The next two options affect how the friendly names of your contacts will be displayed. The + Enable "Messenger Plus!" formatting checkbox will show the colors and text + formatting used by your contacts in their friendly names and personal messages. By default, + this option is turned off: all the formatting is by default stripped out from the names, + to improve the readability of the contact list. + The checkbox named Show the email address of contacts instead of their friendly name + does just that, if you prefer seeing the email address of your contacts instead of their + friendly name, you can enable it. - - Emoticon Themes - - - The Emoticons page of the Settings Dialog - Standard emoticons 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. - - - 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 - - - Other than MSN emoticons themes, &kapp; can also manage custom emoticons. See the Custom Emoticons to learn more about their usage. Each account has - its own set of them; in the Settings dialog, you will be able to browse, rename, create or delete your account's - custom emoticons. - - - 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. - - - To create a new custom emoticon from an image on your PC, click on the Add new... - button. A dialog window will pop up: - + + Emoticons Page + + Account settings dialog - The emoticons page, emoticon themes tab - + + Account settings dialog - The emoticons page, emoticon themes tab + + + + &kapp; supports many different emoticon themes and can use those of other instant messaging + applications, such as &kopete;. + New themes can be downloaded by visiting the www.kde-look.org site. + + + The default &kapp; emoticon theme is named &kapp;-New, which contains the + emoticons created by David Vignoni. + + + Note that not every emoticon from an emoticon theme can be used by &kapp; currently. + Instead of replacing all your emoticons and emoticon shortcuts, &kapp; uses the emoticon theme as overlay. + All emoticon shortcuts remain identical and all emoticon images are replaced with the ones from the + emoticon theme, which have the same shortcut. + In other words, &kapp; looks if the emoticon theme has a new image for the :) shortcut, + one for the :P shortcut, etc.. + + + From the left tab, Emoticon Themes, you can choose which emoticon theme + &kapp; will use to show the default MSN emoticon shortcuts, like :-) and :P. + + + Account settings dialog - The emoticons page, custom emoticons tab + + + Account settings dialog - The emoticons page, custom emoticons tab + + + + Besides MSN emoticon themes, &kapp; can also manage custom emoticons. + Each account has its own set of custom emoticons. From this account settings page, + you are able to browse, rename, create or delete the custom emoticons of your accounts. + See the to learn more about their usage. + + + Any item you see in the list is an emoticon, with the shortcut displayed below it. + Select an item and click the Remove button to delete it. Click the + Rename button, or directly click on an item, to change the shortcut for the + selected emoticon. + + + To create a new custom emoticon from an image on your computer, click on the Add New... + button. A dialog window will pop up: + + + The Add Custom Emoticon dialog + + 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 - Custom Emoticons theme. + + + Click the ... button to select an image from your computer. You can also + directly type or paste from the clipboard the path of the file, in the field next to the + ... button. If the image is valid, it will be displayed in the square + on the top left corner of the dialog. Then choose a text shortcut to 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 the Apply buttons. - - Chatting - - - The Chatting page of the Settings Dialog - + + Chatting Page - 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. - - - 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. - - - 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 - 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. + This page customizes the appearance of your chat windows, and the formatting of chat messages. - - Chat Styles - - &kapp; allows you to choose between various styles for your chat windows. - The default theme is called 'Fresh', which displays the participants' pictures: - - - - The Fresh chat style. - - - 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: - - - - The Classic chat 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) - - Then change to the tab 'Chatting' and use the Chat Style dropdown menu - to change the theme. - - - - - Timestamps - - &kapp; has a function that displays a timestamp in every sent and recieved message. - See the screenshot below. - - + + Chat Style + + Account Settings Dialog - The Chat page, Style tab - - The timestamps, shown and hidden, in the Fresh chat style. + + Account Settings Dialog - The Chat page, Style tab + + + The first tab of this page contains many options to customize how the chats look like. + &kapp; allows you to choose between various styles for your chat windows. + To learn more about the available chat styles, see . + + You can choose the chat style between the available ones using the Chat style + drop-down menu. If you want to try out new things, click the Get New Styles... + button: you will be able to browse and download new chat styles in just a few seconds: + just choose, click install, and your new styles will be available for you to try! + + + Just below the style selection option, a box shows how chats will look like. At the + bottom, a the options make it possible to further customize the chat looks. + With the Show emoticons checkbox you can choose whether to show any + emoticon in chat, or not. The Show winks checkbox allows you to hide + received winks, which may be annoying. + + + When the Group follow-up messages from the same contact checkbox is + active, all messages sent by you or your contacts will be grouped together until another + participant writes something. In many cases, this will save a lot of space and make the + chat a lot more readable. + + + The Show timestamp checkbox controls if the time of arrival or + sending of messages is displayed. If it is enabled, you will also be able to show the + seconds or the date when the message was sent or received, instead of just the hours and + minutes. + + + + Chat Styles + + &kapp; allows you to choose between various styles for your chat windows. + The default theme is called 'Fresh', which displays the participants' pictures: + + + The Fresh chat style + + + The Fresh chat style + + + + 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: + + + The Classic chat style + + + The Classic chat style + + + + The Classic-compact style + + + The Classic-compact style + + + + + + + Chat Text + + Account Settings Dialog - The Chatting page, Text tab + + + Account Settings Dialog - The Chatting page, Text tab + + + + The second tab of the settings page, Text, allows to define how the text in chats will be + shown. + + + To change how your own chat messages are formatted, use the controls below + Your message font. The big button on the left allows you to change + the used font and its attributes (like size, italics, bold) and will show a preview of + your choice. Clicking the button on the right will change the font color. + + + Sometimes your contacts use fonts or colors that you might not like or that are difficult to + read: 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. + + + Use font effects in messages will enable font effects as often seen in + IRC clients: Words surrounded by asterisks (⪚ *bold*) will be displayed with a bold font, + those surrounded by forward slashes (⪚ /italics/) will be shown italicized, and those + surrounded by underscores (⪚ _underline_) will be underlined. + + + The last checkbox, Enable "Messenger Plus! formatting, will enable + Messenger Plus! formattings to the sent and received messages. By default, this option is turned off: + all the formatting is by default stripped out from the messages, to increase the readability of the + chat messages and friendly names shown. + + + + + Chat Behavior + + Account Settings Dialog - The Chatting page, Behavior tab + + + Account Settings Dialog - The Chatting page, Behavior tab + + + + The third and last tab contains some options important to define how the chat windows will + behave and will look like. + + + To disable the graphical effects seen when receiving and sending nudges, you can disable + the Shake the chat window when a nudge is received or sent checkbox. + + + If Display your own display picture in the chat window checkbox is + enabled, your own display picture will be displayed in the contacts panel, along with those of the + contacts in that chat. + To learn more about the contacts panel, see . + + + The last option of this page controls how your chats will be grouped together in windows + or tabs. + + + + Tabbed Chats + + Tabs are little labels at the top of your chat window, which allow you to keep many + chats in the same window, as opposed to having one chat per window. + Unlike &Windows; Live Messenger, which does not support this feature at all, &kapp; comes + with tabbed chats enabled by default. + + + Each tab in the chat window has a little close button on its label, to close it. + You can also do it by using the CtrlW + shortcut. + Clicking the window's close button will pop up a dialog box asking if you want to close + all the open tabs. Of course, it will not be shown if there only is one tab in the chat window. + + + If you have more than one tab in a chat window, you will be able to move them around by + dragging and dropping them using the &MMB;. + + + These are the available chat grouping options: + + + + Always + + All your chats are grouped together in one chat window, separated by tabs. + + + + Never + + This option will mimic the &Windows; Live Messenger behavior of one window per chat. + Tabs are never used. + + + + For contacts in the same group + + If you choose this option, &kapp; will use tabs for contacts in the same group. + For example, suppose you have the Friends and Coworkers + groups. If you chat with two friends, you will see the two chats as tabs in the same + window: but if a coworker contacts you, her chat will be shown in another window. + + + + - - Automatic Chat Logging - - - The Chat Logs page of the Settings Dialog - + + Chat Logging + + Account Settings Dialog - The Chat Logging page + + + Account Settings Dialog - The Chat Logging page + + - &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. - After applying the settings, &kapp; will automatically save all chat logs. - - - - - Email options - - - The Email page of the Settings Dialog - - - &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; gives you the opportunity to automatically save all chats when they end (which means + that a chat will be saved when you close its chat window or tab). - 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. + Enable the Enable chat logging checkbox to have &kapp; save all chats. + You will be able to look them up later in the Actions menu of the contact + list window, or through the right click context menu of a contact. - - - - Deleting a saved &kapp; Profile - 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. + The chats logs are not readily available without having &kapp; open: if you want, you can have + &kapp; save your chats also in a common format, to be able to access your chat logs even if + &kapp; is not running. To do so, enable the Additionally save chats logs to file + checkbox. + + + You can choose the format to save the additional logs in by using the File format + used for saving drop-down list. Normally you want to go for the Web + Pages (&HTML;) option, because &HTML; pages show all emoticons and colors you and + your contacts used. Please note that &HTML; chat logs that are opened on another computer, will + not contain any emoticons and display pictures. + With the other option, Plain Text, the saved files + will only contain basic information displayed in an IRC-like fashion. + + + You can also select how to separate and organize your additional chat log files: &kapp; will + create nested directories named as the chat's date and time, based on which option you + choose here. The choices are to organize by Year, by + Year then Month, by Year, Month then Day or to + Do not organize files at all. + + + The organizing directory will be created, accordingly to your choice, within the directory + you can choose at the bottom. + After applying the settings, &kapp; will start to automatically saving all chats. + + + + The &kapp; Settings Dialog + + The &kapp; configuration dialog allows to customize the general application behavior. + It has been divided in pages, accessible by the icons on the left area of the window. + + + You can open it from your Contact List window, via the menu: Actions + Configure &kapp;..., or from the tray icon, clicking + with the &RMB; on the &kapp; tray icon, then clicking + Configure &kapp;.... + + + + Accounts Page + + &kapp; Settings Dialog - The Accounts page + + + &kapp; Settings Dialog - The Accounts page + + + + This page lists all the accounts known by &kapp;. All changes made in this page will be + applied immediately, without you having to press the OK or the + Apply buttons. + + + By selecting an account from the list, you can choose to open the Account Settings dialog + for that account with the Edit button, or remove it with the + Remove button. In the latter case, you will be asked if you are sure + you want to delete the account. + + + Click on the Add New... button to create a new account: the Account + Settings page will appear, to allow you to immediately change its details. + + + + + Notifications Page + + &kapp; Settings Dialog - The Notifications page + + + &kapp; Settings Dialog - The Notifications page + + + + From this page, you are able to configure how &kapp; notifies you about contacts who come + online, new incoming messages, and also how it will show you informations and errors. + + + The list shows the various event types supported by &kapp;, along with the current status + of each event. The event status is a list of icons representing the various actions that + will be taken when that event will occur. + + + The following events are available: + + + A contact has started a chat with you + A contact has gone offline + A contact has come online + A contact has changed its MSN status + You have received a new email + You received a message from a contact + A contact requires your attention + Information on network and application status + + + For each event, you can choose many actions to perform: + + + + Play a sound + + A sound will be played: there are default sounds played for most actions, but you can + change them with your favorite ones. The little Play button + allows you to preview the selected sound. + + + + Show a message in a popup + + If this option is checked, a message will be shown within a passive notification. + If you are using &kde; as your desktop, you will see a Plasma notification; otherwise, a + notification box will appear near your &kapp; tray icon. + + + + Log to a file + + The event will be noted into a file of your choice. + + + + Mark taskbar entry + + The event will cause the corresponding window to be highlighted in your task bar. + + + + Run command + + When the event occurs, a shell command of your choice will be executed. + + + + + + + Settings Page + + This page contains some generic settings of the application. + + + + Web Browser + + &kapp; Settings Dialog - The Settings page, Web Browser tab + + + &kapp; Settings Dialog - The Settings page, Web Browser tab + + + + Here you can define which web browser will be invoked by &kapp; when you open your webmail + or click on a link in chat. + &kapp; provides the option to use a custom web browser instead of the &kde; default one + (which is &konqueror;, usually). + + + To use for example Firefox instead of the &kde; default browser, change the radiobutton + from Use the &kde; default browser to Use an installed + browser: and choose the one you want to use from the drop-down list. + + + Additionally, &kapp; allows you to run your own browser, if it is not present in the + aforementioned list. Select the Specify a custom command radiobutton + and enter the path or the name of the browser. To specify the &URL; that the browser should + open, add %u to the parameters. + + + + + Email Client + + &kapp; Settings Dialog - The Settings page, Email Client tab + + + &kapp; Settings Dialog - The Settings page, Email Client tab + + + + Here you can define which email client will be invoked by &kapp; when you want to send + mail on a non-Live account. + If you are using a Live account, you can choose to open the Live Mail website + instead of your email client, by enabling the Use Live Mail if the account + supports it checkbox. + + + To use Thunderbird for example instead of the &kde; default email client, change the + radiobutton from Use the &kde; default email client to Use + an installed email client: and choose the one you want to use from the + drop-down list. + + + Additionally, &kapp; allows you to run your own browser, if it is not present in the + aforementioned list. Select the Specify a custom command radiobutton + and enter the path or the name of the browser. To specify the &URL; that the browser should + open, add %u to the parameters. + + + + + File Transfers + + &kapp; Settings Dialog - The Settings page, File Transfers tab + + + &kapp; Settings Dialog - The Settings page, File Transfers tab + + + + + Here on the File Transfers tab, you can set a couple of important options. + + + When a contact sends you a file, you may want to always save it in a certain directory on + your computer. Select the checkbox next to Save all received files in one + directory: and specify the path to the directory you want all files to be saved + in, by clicking the .... + + + You can also specify the ports you want to use for file transfers. Make sure these ports are + also forwarded correctly by your router, if you have one. Check the settings of your router for this. + + + + + @@ -1138,153 +1788,158 @@ - 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. + No, you can register any email address at the + Passport site. - How can I disable "other folder" e-mail notification? It's all junk mail anyway. + Can you add voice chat and webcam support to &kapp;? - Open the settings dialog for your profile. - Under the "accounts" dialog, unclick "Show 'other folder' notifications". + Sure! We will add it for the next major release: version 2.1. - - Can you add voice chat support to &kapp;? - - - Perhaps in the future, but we have other priorities first. - Off course, nothing stops you from helping us, and implementing it yourself. - - - - - + 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. + 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. + + + Finally, verify if they are enabled in your Account Settings. + See . - Why do the emoticons just show up as black squares? + + Why do the emoticons just show up as white squares? or + Why does &kapp; not have any images? + You installed &kapp; to the wrong directory. - Basically, it should be configured to install to your KDE3 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. + Basically, it should be configured to install to your &kde; 4 directory. + This directory should be auto-detected, but you can also tell the configure script where + to find it. + For example: ./configure --prefix=/opt/kde4 + To find out where KDE 4 is installed, you can run kde4-config --prefix. - 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 interval of ports is 6891-6900 TCP. + You can specify which ports you want to use in the &kapp; Settings. + See . - What ports do I have to open when I want to use GnomeMeeting? - - - TCP ports 1720, and 30000-30010. UDP ports 5000-5003. - - - - - - Why is the size of my chat font ignored? + Why the contacts cannot see the size of my chat font? Because neither the official client nor other clients support them. - The font size information is not exchanged between clients. + The font size information is not exchanged between clients, just the name and the + formatting options. - Where should I submit a theme I made that uses Microsoft's MSN emoticons? + + Can I send you a theme I made, that uses &Microsoft;'s MSN emoticons, to be added to &kapp;? + - We don't want them. - 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, - GPL'ed for use by other MSN Messenger clients for Linux clients - if they should feel the same way we do. + We are sorry, but we cannot accept it. + Despite the fact that other Live Messenger clients for &Linux; use them, we will not use + them as well, because there are some copyright issues in doing so. + This means that the MSN emoticons are protected from unauthorized usage, which includes + us using them in &kapp;. + That is one of the reasons we have our own complete emoticon theme, released under the + open source GPL license, for use by other Live Messenger clients for &Linux; clients + if they should start feeling the same way we do. + + + However, nothing stops you from distributing it yourself: for example, via the + www.kde-look.org + site! - How do I use &kapp; SVN? (previously &kapp; CVS) + How do I use &kapp; from SVN? - Please take a look at Accessing SVN. + Please take a look at the Accessing SVN + page of our project's web site. - How do I build RPM packages? + How do I build RPM/DEB packages? - Please take a look at the installation guide in the appendix. + Please see . - Have you considered joining forces with Kopete? + Have you considered joining forces with &kopete;? 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 with radically different goals in mind. + We have always felt that those multiple-protocol supporting IM programs suffer from the + least-common-denominator problem. + For example, if 4 protocols don't support different fonts and one does, then none will + probably get font support; though they are getting better, lately. + We however, focus on the MSN-specific features and the Messenger experience, making it + very easy for people apt to Messenger to feel at home with &kapp;. - 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,8 +1949,14 @@ 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. - When I named it that, I didn't think anyone would actually end up using it. ;-) + Mess is a short form for Messenger and also to be a + self-deprecating joke. + + + + When I named it that, I didn't think anyone would actually end up using it. ;-) + + -- Mike K. Bennett @@ -1315,127 +1976,186 @@ --> - &kapp; - - - Program copyright 2002-2007 Mike K. Bennett mkb137b@hotmail.com, - copyright 2005-2007 Diederik van der Boor vdboor@codingdomain.com. + &kapp; - The program's coders are: + Copyrights: + + © 2002-2009 Mike K. Bennett mkb137b@hotmail.com + © 2005-2009 Diederik van der Boor vdboor@codingdomain.com + © 2007-2009 Valerio Pilo amroth@coldshock.net + + - - Mike K. Bennett mkb137b@hotmail.com - Michael Curtis mdcurtis@users.sourceforge.net - Diederik van der Boor vdboor@codingdomain.com - Richard Conway richardconway@users.sourceforgenet - Valerio Pilo amroth@coldshock.net - + The program's developers are: + + Mike K. Bennett mkb137b@hotmail.com + 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 + Sjors Gielen sjors@kmess.com + Adam Goossens fontknocker@gmail.com + - For a more detailed analysis of the commits to the source code, consider visiting: - KMess contributors at ohloh.net. + For a more detailed analysis of the commits to the source code, consider visiting our + &kapp; trac timeline, and the list of + &kapp; contributors at ohloh.net Code was taken from: - KMerlin, which provided the original inspiration for this program. - Kopete, from which the old popup balloons and initial MSNP2P designs were taken; they were ultimately replaced. The MSN Challenge handler from Kopete is still used. - KScreensaver, from which idle detection code was taken. + + KMerlin, which provided the original inspiration for this program. + + + &kopete;, from which the old popup balloons and initial MSNP2P designs were + taken; those were both ultimately replaced. The MSN Challenge handler from &kopete; is still + used. + KScreensaver, from which idle detection code was taken. + + BasKet, which has a nice close-to-tray icon screenshot feature and LikeBack + to let users contact the developers easily. + + Amarok, which provided the inspiration for the custom crash handler implementation. Special thanks to: - - - Jan Tönjes (Testing, documentation, web master, project management, etc...) jan.toenjes@web.de - Dane Harnett (Web design) dynamitedane@hotmail.com - David Vignoni (The main and yellow/blue/violet emoticon sets and Italian translation) dvgn@libero.it - Julien Joubin (Cartoon emoticons) jujubinche@netscape.net - Christian Müller (Default sound theme) cmue81@gmx.de - - + + Dane Harnett (Web design) dynamitedane@hotmail.com + 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 (&kapp; icon in Oxygen style) mike.s.anderton@gmail.com + Translators: - - - 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 + Ma'moun Diraneyya (More Arabic) mamoun.diraneyya@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 + Sergio Rafael Lemke (More Brazilian Portuguese) bedi.com@gmail.com + Maurício Arozi Moraes (More Brazilian Portuguese) - 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 + Adrià Arrufat (More Catalan) swiftscythe@gmail.com - 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 + Cheng Yang (More Simplified Chinese) yangzju@gmail.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 + Tryneeds-Chinese Translation Platform (More Traditional Chinese) tryneeds@gmail.com - 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 + Heimen Stoffels (More Dutch) djmusic121@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 + Antony Hussi (More Finnish) antony.hussi@tranciend.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 + Scias (More French) shining.scias@gmail.com + + 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 + Andrea Decorte (More Italian) adecorte@gmail.com + + Park Dong Cheon (Korean) pdc@kaist.ac.kr + + Øyvind Sæther (Norsk Bokmål) oyvind@sather.tk + + Zoran Milovanović (Serbian) provalisam@gmail.com + + 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 + Alexis Daniel Medina Medina (More Spanish) alexismedina@gmail.com + Manuel Ramírez (More Spanish) elpreto@kde.org.ar + + 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: + + Richard Conway (MSNP12 support, various patches) richardconway@users.sourceforgenet + Guido Solinas (Pictures in contact list code, contact client info, chat font zoom) whereismwhite@gmail.com + Pedro Ferreira (File transfer thumbnails) pedro.ferreira@fe.up.pt + Liu Sizhuang (P4-Context field support) chinatslsz@hotmail.com + Scott Morgan (Xinerama fixes) blumf@blumf.freeserve.co.uk + Laurence Anderson (Original file receive patch) l.d.anderson@warwick.ac.uk + Lin Haoxiang (file send bug fix, proxy connect code) linhaoxiang@hotmail.com + Mohamed Aser (internationalization of file saving fix) mohasr@link.net + Alexandre Peixoto Ferreira (Various internationalization fixes) alexandref@o2.net.br + Choe Hwanjin (Some internationalization fixes) hjchoe@hancom.com + 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 + Andrea Decorte (Group selection in 'contact added user' dialog) adecorte@gmail.com + + + - - Laurence Anderson (Original file receive patch) l.d.anderson@warwick.ac.uk - Alexandre Peixoto Ferreira (Some internationalization fixes) alexandref@o2.net.br - Lin Haoxiang (file send bug fix, proxy connect code) linhaoxiang@hotmail.com - Mohamed Aser (internationalization of file saving fix) mohasr@link.net - Choe Hwanjin (Some internationalization fixes) hjchoe@hancom.com - Scott Morgan (Xinerama fixes) blumf@blumf.freeserve.co.uk - Dane Harnett (Web design) dynamitedane@hotmail.com - 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) - - - - Documentation copyright 2002 Mike K. Bennett mkb137b@hotmail.com, - copyright 2007 Diederik van der Boor vdboor@codingdomain.com, - copyright 2007 Valerio Pilo amroth@coldshock.net + Documentation copyrights: + + © 2002 Mike K. Bennett mkb137b@hotmail.com + © 2007 Diederik van der Boor vdboor@codingdomain.com + © 2007-2009 Valerio Pilo amroth@coldshock.net + @@ -1462,16 +2182,19 @@ 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. - You can install &kapp; directly with your package manager, without having to download it from the &kapp; website. + The download page also provides links to distributions which include &kapp; in their package + repositories. + You can usually 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. @@ -1480,19 +2203,16 @@ 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 &MacOS; X. - To play winks, you need to have a flash-player and cabextract installed. - These packages can be installed opt-in later after &kapp; is installed. - - - 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. + To play winks, you need to have the Adobe™ Flash Player and + CabExtract + installed. + See . + libjpeg-devel + libpng-devel + zlib-devel + - Extract the source package + 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 @@ -1629,22 +2356,23 @@ - Starting the compilation + Starting the Compilation - This step translates the &kapp; source code to a runnable program. + This step translates the &kapp; source code to an executable program. Run the following commands to compile &kapp;: $ ./configure -$ make + $ make 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 some of 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 from 2 up to 5 or even 10 minutes, depending on your system. + When this command completes you will have a runnable program at: $ ./kmess/kmess @@ -1652,44 +2380,57 @@ Installing - It's finally possible to install! + It is finally possible to install! Run the following command. It will ask for your root password first. $ su -c '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: + 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 - Building a &kapp; package + Building a &kapp; Package The rpmbuild command is suitable for distibutions using the RPM package format. This includes distributions like SuSE, Mandriva, Redhat and Fedora. A &kapp; RPM package can be created with the command: - $ rpmbuild -tb kmess-&tarversion;.tar.gz + $ rpmbuild -tb kmess-&tarversion;.tar.gz The rpmbuild command runs a full source-based installation, but builds a package instead of installing &kapp;. - The final package can be found in a subfolder of /usr/src/packages/ or /usr/src/rpm/. + The final package can be found in a subdirectory of + /usr/src/packages or + /usr/src/rpm. 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. + Make sure users can always download the source package too, as required by the GPL + license. However, we recommend to use our &kapp; Installer whenever possible. - Tip: when you install the autopackage-devel tools before building the RPM package, - the rpm spec script uses apbuild to create a cleaner binary. + Tip: when you install the + autopackage-devel tools before building the RPM package, + the rpm spec script uses apbuild + to create a cleaner binary. diff --git a/doc/en/mainwindow.png b/doc/en/mainwindow.png deleted file mode 100644 index 00c853b..0000000 Binary files a/doc/en/mainwindow.png and /dev/null differ diff --git a/doc/en/picturechange-dialog.png b/doc/en/picturechange-dialog.png deleted file mode 100644 index efd8c9c..0000000 Binary files a/doc/en/picturechange-dialog.png and /dev/null differ diff --git a/doc/en/picturechange-result.png b/doc/en/picturechange-result.png deleted file mode 100644 index ba8012c..0000000 Binary files a/doc/en/picturechange-result.png and /dev/null differ diff --git a/doc/en/popup-balloon.png b/doc/en/popup-balloon.png deleted file mode 100644 index 1dce6ee..0000000 Binary files a/doc/en/popup-balloon.png and /dev/null differ diff --git a/doc/en/settings-account-chat-behavior.png b/doc/en/settings-account-chat-behavior.png new file mode 100644 index 0000000..9853450 Binary files /dev/null and b/doc/en/settings-account-chat-behavior.png differ diff --git a/doc/en/settings-account-chat-text.png b/doc/en/settings-account-chat-text.png new file mode 100644 index 0000000..91b433d Binary files /dev/null and b/doc/en/settings-account-chat-text.png differ diff --git a/doc/en/settings-account-chat.png b/doc/en/settings-account-chat.png new file mode 100644 index 0000000..23cb0e6 Binary files /dev/null and b/doc/en/settings-account-chat.png differ diff --git a/doc/en/settings-account-contactlist.png b/doc/en/settings-account-contactlist.png new file mode 100644 index 0000000..d3836f7 Binary files /dev/null and b/doc/en/settings-account-contactlist.png differ diff --git a/doc/en/settings-account-emoticons-custom-add.png b/doc/en/settings-account-emoticons-custom-add.png new file mode 100644 index 0000000..16de678 Binary files /dev/null and b/doc/en/settings-account-emoticons-custom-add.png differ diff --git a/doc/en/settings-account-emoticons-custom.png b/doc/en/settings-account-emoticons-custom.png new file mode 100644 index 0000000..1d15c5e Binary files /dev/null and b/doc/en/settings-account-emoticons-custom.png differ diff --git a/doc/en/settings-account-emoticons.png b/doc/en/settings-account-emoticons.png new file mode 100644 index 0000000..77c8cef Binary files /dev/null and b/doc/en/settings-account-emoticons.png differ diff --git a/doc/en/settings-account-logging.png b/doc/en/settings-account-logging.png new file mode 100644 index 0000000..868ac47 Binary files /dev/null and b/doc/en/settings-account-logging.png differ diff --git a/doc/en/settings-account.png b/doc/en/settings-account.png new file mode 100644 index 0000000..852e848 Binary files /dev/null and b/doc/en/settings-account.png differ diff --git a/doc/en/settings-contact.png b/doc/en/settings-contact.png new file mode 100644 index 0000000..61edade Binary files /dev/null and b/doc/en/settings-contact.png differ diff --git a/doc/en/settings-dialog-account.png b/doc/en/settings-dialog-account.png deleted file mode 100644 index 6bf1be5..0000000 Binary files a/doc/en/settings-dialog-account.png and /dev/null differ diff --git a/doc/en/settings-dialog-chatlogs.png b/doc/en/settings-dialog-chatlogs.png deleted file mode 100644 index cc2cbd2..0000000 Binary files a/doc/en/settings-dialog-chatlogs.png and /dev/null differ diff --git a/doc/en/settings-dialog-chatting.png b/doc/en/settings-dialog-chatting.png deleted file mode 100644 index 8590e09..0000000 Binary files a/doc/en/settings-dialog-chatting.png and /dev/null differ diff --git a/doc/en/settings-dialog-email.png b/doc/en/settings-dialog-email.png deleted file mode 100644 index c799f8e..0000000 Binary files a/doc/en/settings-dialog-email.png and /dev/null differ diff --git a/doc/en/settings-dialog-emoticons-custom.png b/doc/en/settings-dialog-emoticons-custom.png deleted file mode 100644 index 909ed24..0000000 Binary files a/doc/en/settings-dialog-emoticons-custom.png and /dev/null differ diff --git a/doc/en/settings-dialog-emoticons.png b/doc/en/settings-dialog-emoticons.png deleted file mode 100644 index 6254be6..0000000 Binary files a/doc/en/settings-dialog-emoticons.png and /dev/null differ diff --git a/doc/en/settings-kmess-accounts.png b/doc/en/settings-kmess-accounts.png new file mode 100644 index 0000000..58910ea Binary files /dev/null and b/doc/en/settings-kmess-accounts.png differ diff --git a/doc/en/settings-kmess-notifications.png b/doc/en/settings-kmess-notifications.png new file mode 100644 index 0000000..d40f444 Binary files /dev/null and b/doc/en/settings-kmess-notifications.png differ diff --git a/doc/en/settings-kmess-settings-email.png b/doc/en/settings-kmess-settings-email.png new file mode 100644 index 0000000..64ad395 Binary files /dev/null and b/doc/en/settings-kmess-settings-email.png differ diff --git a/doc/en/settings-kmess-settings-filetransfers.png b/doc/en/settings-kmess-settings-filetransfers.png new file mode 100644 index 0000000..1641b44 Binary files /dev/null and b/doc/en/settings-kmess-settings-filetransfers.png differ diff --git a/doc/en/settings-kmess-settings-web.png b/doc/en/settings-kmess-settings-web.png new file mode 100644 index 0000000..cb8a3dd Binary files /dev/null and b/doc/en/settings-kmess-settings-web.png differ diff --git a/doc/en/sidebarbutton.png b/doc/en/sidebarbutton.png deleted file mode 100644 index 5ef0b4a..0000000 Binary files a/doc/en/sidebarbutton.png and /dev/null differ diff --git a/doc/en/startupscreen.png b/doc/en/startupscreen.png index 68690de..fc38cd8 100644 Binary files a/doc/en/startupscreen.png and b/doc/en/startupscreen.png differ diff --git a/doc/en/styles-fresh.png b/doc/en/styles-fresh.png index 16df4f0..170b7a7 100644 Binary files a/doc/en/styles-fresh.png and b/doc/en/styles-fresh.png differ diff --git a/kmess.kdevelop b/kmess.kdevelop index 0355b04..9f48a39 100644 --- a/kmess.kdevelop +++ b/kmess.kdevelop @@ -1,147 +1,113 @@ - + - Mike K. Bennett - mkb137b@hotmail.com - KDevKDEAutoProject - C++ - - KDE - Qt - + KDevCustomProject . false - - + The KMess Development Team + development@kmess.org + 2.0 SVN - KDE4 branch + C++ + kdevctags2 kdevfilelist - kdevfileselector - kdevfileview + kmess + KMess is a fully featured MSN client for KDE. + + kdevsubversion - - - kmess - debug - kmess/kmess - - - \s--build=i386-linux --host=i386-linux --target=i386-linux --enable-debug\s - - - true - 1 - false - - - - - - 0 - false - - - - \s-O3 -Wall - + + . - executable - / - kmess/kmess - + ./build + custom + ./build/kmess/ + false true - - - + + ./build + false + false + false - - - - build-default - - - - kdevgccoptions - kdevgppoptions - kdevpgf77options - - - - - -g - - - - - - --enable-debug-output --enable-debug=full - build-debug - - - - kdevgccoptions - kdevgppoptions - kdevpgf77options - - - - -g - -g -ansi -pedantic -Wall - - - - - - - - - - - - - false - false - - - *.o,*.lo,*.a,CVS,*.moc.cpp,*.cpp~,*.h~,*.m4,*.kdev*,*.in,Makefile* - true - false - - + + make + ./build + + + false + 3 + false + + default + + + + 0 + + + + + *.h + *.cpp + CMakeLists.txt + + + build/* + build + build/CMakeTmp + build/CMakeTmp/check_qt_visibility.cpp + build/config-kmess.h + build/kmess + build/kmess/kmess_automoc.cpp + build/kmess/moc_alertspage.cpp + build/kmess/moc_chatloggingpage.cpp + build/kmess/moc_chatstylepage.cpp + build/kmess/moc_emailpage.cpp + build/kmess/moc_kmessapplication.cpp + build/kmess/moc_webapplicationp2p.cpp + build/kmess/moc_webcamtransferp2p.cpp + build/kmess/ui_accountswidgetinterface.h + build/kmess/ui_addemoticondialoginterface.h + build/kmess/ui_alertssettings.h + build/kmess/ui_chatloggingsettings.h + build/kmess/ui_chattingsettings.h + build/kmess/ui_chatviewinterface.h + build/kmess/ui_contactaddeduserdialoginterface.h + build/kmess/ui_contactframeinterface.h + build/kmess/ui_emailsettings.h + build/kmess/ui_emoticonwidgetinterface.h + build/kmess/ui_initialviewinterface.h + build/kmess/ui_kmessviewinterface.h + build/kmess/ui_passivepopupinterface.h + build/kmess/ui_transferentryinterface.h + build/kmess/ui_transferwindowinterface.h + + + 0 + + + + Release + + + + + + + + + + + + + + - - gtk - gnustep - python - php - perl - ada - ada_bugs_gcc - bash - bash_bugs - c++_bugs_gcc - clanlib - w3c-dom-level2-html - fortran_bugs_gcc - gnome1 - gtk_bugs - haskell - haskell_bugs_ghc - java_bugs_gcc - java_bugs_sun - opengl - php_bugs - pascal_bugs_fp - perl_bugs - python_bugs - w3c-svg - w3c-uaag10 - sw - wxwidgets_bugs - html/ html/ @@ -149,46 +115,9 @@ - - gdk-pixbuf - pango - panel-applet - libglade - libbonoboui - gtk - gobject - libgnome - glib - libgimpthumb - libgimpwidgets - libgimpmodule - libgimpmath - libgimp - libgimpcolor - libgimpbase - gdk - gconf - atk - + + - - - libtool - - - - - - true - false - false - - - false - true - 10 - - .h @@ -200,45 +129,86 @@ true true true - true + false true true true 250 - 250 + 400 250 + false + 0 + true + true + false + std=_GLIBCXX_STD;__gnu_cxx=std + true + false + true + false + false + true + true + false + .; + + false + 3 + 3 + /usr/lib/qt3 + EmbeddedKDevDesigner + /usr/lib/qt3/bin/qmake + /usr/lib/qt3/bin/designer + + get set m_,_ - newValue + theValue true true + + false + true + Vertical + - - - - An empty C++ header file - - - An empty C++ code file - - - Base dialog to be used in the other C++ code. - - - - - - true - true - true - true - -C - + + + + + + + true + false + + + *.o,*.lo,CVS,*~,cmake* + true + false + + + + + + + + + + true + false + false + + + false + true + 10 + + @@ -246,4 +216,9 @@ + + + ./tags + + diff --git a/kmess.lsm b/kmess.lsm index e0b2e54..e7eb65b 100644 --- a/kmess.lsm +++ b/kmess.lsm @@ -1,11 +1,11 @@ Begin4 -Title: KMess -Version: 1.5.2 -Entered-date: 2005-05-05 -Description: An MSN Messenger client of KDE -Keywords: KDE X11 desktop MSN Messenger -Author: Mike K. Bennett +Title: KMess +Version: 2.0beta2 +Entered-date: 2009-05-10 +Description: A MSN Messenger / Windows Live Messenger client for KDE +Keywords: KDE, X11, desktop, WLM, MSN, Live, Messenger +Author: KMess Developers Team Primary-site: http://www.kmess.org/ -Platforms: Linux and other Unices -Copying-policy: GNU Public License +Platforms: Linux (and most unices) and Windows; requires KDE (at least 4.0) +Copying-policy: GNU General Public License 2.0 End diff --git a/kmess.spec b/kmess.spec index b787350..752a2a6 100644 --- a/kmess.spec +++ b/kmess.spec @@ -1,4 +1,5 @@ # KMess spec file to build RPM packages +# # Based on work from Pascal Bleser , # Simon Eisenmann , # and the smb4k project @@ -6,17 +7,25 @@ # RPM spec options are well explained at # http://fedora.redhat.com/participate/developers-guide/ch-rpm-building.html # and /usr/lib/rpm/macros +# -# package settings -%define kmess_version 1.5.2 -%define kmess_tar_version 1.5.2 + +# PACKAGE SETTINGS +# +%define kmess_version 2.0beta2 +%define kmess_tar_version 2.0beta2 %define rpm_release 1 %define with_debug 0 %define doc_files AUTHORS COPYING FEATURES INSTALL NEWS README TODO +# For debugging this specfile +%define debug_rpmbuild 0 -# detect distro + + +# DETECT DISTRO +# %define is_fedora %(test -e /etc/fedora-release && echo 1 || echo 0) %define is_mandrake %(test -e /etc/mandrake-release && echo 1 || echo 0) %define is_redhat %(test -e /etc/redhat-release && echo 1 || echo 0) @@ -26,27 +35,67 @@ # slackware is not an rpm distro, but "rpm2tgz" should do the trick # debian does not use RPM, but rpmbuild can be abused too - # Many redhat based distro's still have /etc/redhat-release arround: %if %is_redhat -%define is_redhat %(grep -q "Red Hat" /etc/redhat-release && echo 1 || echo 0) +%define is_redhat %(grep -q "Red Hat" /etc/redhat-release && echo 1 || echo 0) %endif -# detect kde version + +# DETECT KDE VERSION +# # The cut for '-' is used to fix versions like "3.1-10" done by Red Hat -%define kde_config %(test -e /opt/kde3/bin/kde-config && echo "/opt/kde3/bin/kde-config" || echo "kde-config") +# +%define kde_config %(test -e /usr/bin/kde4-config && echo "/usr/bin/kde4-config" || echo "kde4-config") %define kde_version %(%{kde_config} --version | grep '^KDE:' | cut -f2 -d" " | cut -f1 -d"-" ) %define kde_major_version %(echo "%{kde_version}" | cut -f1-2 -d.) %define kde_vernum %(echo "%{kde_major_version}" | tr -d '.') -# detect autopackage compiler (to support "build on newer, run on older" development) + +# DETECT RUNTIME PATHS +%define kde_prefix %(%{kde_config} --prefix) +%define qtlib_prefix %(%{kde_config} --qt-libraries) + + + +# DETECT KDE PACKAGE +# +# Use rpm to locate the packages for various KDE components based on your system. +# +%define kdelibs_package %(rpm -qf %{kde_prefix}/lib/libkdeui.so.5 | cut -f1 -d"-") +%define qtgui_package %(rpm -qf %{qtlib_prefix}/libQtGui.so.4 | cut -f1 -d"-") +%define kdelibs_dev_package %(rpm -qf %{kde_prefix}/lib/libkdeui.so | cut -f1-2 -d"-") +%define qtgui_dev_package %(rpm -qf %{qtlib_prefix}/libQtGui.so | cut -f1-2 -d"-") +%if ! %(echo %{kdelibs_package} | grep -q 'not owned by any package' ; echo $?) + %define kdelibs_package libkde4 +%endif +%if ! %(echo %{qtgui_package} | grep -q 'not owned by any package' ; echo $?) + %define qtgui_package libqt4 +%endif +%if ! %(echo %{kdelibs_dev_package} | grep -q 'not owned by any package' ; echo $?) + %define kdelibs_dev_package libkde4-devel +%endif +%if ! %(echo %{qtgui_dev_package} | grep -q 'not owned by any package' ; echo $?) + %define qtgui_dev_package libqt4-devel +%endif + + + +# DETECT AUTOPACKAGE COMPILER +# +# support "build on newer, run on older" development) # see http://autopackage.org/aptools.html for details +# %define has_apgcc %(test -e /usr/bin/apg++ && echo 1 || echo 0) -# misc defaults + +# DISTRO SPECIFIC STUFF +# +# Set the rpm file suffix and name to add in the file. +# First define the defaults +# %define distro Unknown %define release_suffix %{rpm_release} %define is_rpm_distro 1 @@ -54,8 +103,6 @@ %define release_suffix %{rpm_release}-debug %endif - -# distro specific stuff %if %is_fedora %define fedora_version %(rpm -q --queryformat '%{VERSION}' fedora-release) %define fedora_vernum %(echo "%fedora_version" | tr -d '.') @@ -78,11 +125,17 @@ %endif %if %is_suse +%define is_opensuse %(grep -q openSUSE /etc/SuSE-release && echo 1 || echo 0) %define suse_version %(grep VERSION /etc/SuSE-release | cut -f3 -d" ") %define suse_vernum %(echo "%suse_version" | tr -d '.') +%if %is_opensuse +%define release_suffix %{rpm_release}.openSUSE%{suse_vernum}.kde%{kde_vernum} +%define distro openSUSE %{suse_version} +%else %define release_suffix %{rpm_release}.SuSELinux%{suse_vernum}.kde%{kde_vernum} %define distro SuSE Linux %{suse_version} %endif +%endif %if %is_slackware %define slackware_version %(cat /etc/slackware-version | cut -f2 -d" " | cut -f1-2 -d".") @@ -106,41 +159,43 @@ -# Package meta data -Summary: MSN Messenger Client for KDE +# SET META DATA +# +# Finally enter the package meta data. +# This uses all the detected settings above. +# +# The 'Requires' and 'BuildRequires' are automatically +# auto-completed with all libraries our compiled binary links to. +# +Summary: MSN Messenger / Windows Live Messenger client for KDE Name: kmess Version: %{kmess_version} Release: %{release_suffix} Source: kmess-%{kmess_tar_version}.tar.gz -#Source: http://osdn.dl.sourceforge.net/sourceforge/kmess/kmess-%{kmess_tar_version}.tar.gz -URL: http://kmess.sourceforge.net/ +URL: http://www.kmess.org/ Group: Networking/Instant Messaging -Packager: Diederik van der Boor +Packager: KMess Developers Team License: GPL Distribution: %distro - - -## -- package build configuration - +BuildRequires: cmake >= 2.4.5 BuildRoot: %{_tmppath}/build-kmess-%{kmess_version} -AutoReqProv: no -%if %is_suse -#Requires: kdelibs3 >= %{kde_major_version}.0 -Requires: kdelibs3 >= %{kde_major_version}.0, kdelibs3 < %{kde_major_version}.999 -Requires: qt3, libstdc++ -BuildRequires: kdelibs3 >= 3.1.0, kdelibs3-devel >= 3.1.0 -BuildRequires: gcc-c++, libstdc++-devel, autoconf, automake, libtool, make, pkgconfig +%if %kdelibs_package +Requires: %{kdelibs_package} >= 4.0 +BuildRequires: %{kdelibs_dev_package} >= 4.0 %endif - +%if %qtgui_package +Requires: %{qtgui_dev_package} >= 4.3 +BuildRequires: %{qtgui_package} >= 4.3 +%endif %description -KMess is a MSN Messenger client 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 MSN Messenger / Windows Live Messenger client 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. Authors: -------- @@ -151,68 +206,39 @@ Authors: Richard Conway Valerio Pilo + %prep -# ------ Configure ------ # - - -# install check, otherwise the package version is incorrect. -set +x -if test -z "%kde_vernum"; then - echo "" >&2 - echo "" >&2 - echo " ------------------------------------" >&2 - echo " KDE version could not be detected! " >&2 - echo " Package building will not continue." >&2 - echo " ------------------------------------" >&2 - echo "" >&2 - echo " Please run rpmbuild as normal user or run rpmbuild as:" >&2 - echo " PATH=\$PATH:/path/to/kde rpmbuild -tb kmess-%{kmess_tar_version}.tar.gz" - echo "" >&2 - echo "" >&2 - echo "" >&2 - exit 1 -fi +# BUILD CONFIGURATION +# +# Extract the files, configure the build +# # Be verbose -set +x; echo -e "\n\nStarting build for KMess package..."; # set -x +set +x; echo -e "\n\nStarting build for KMess package..."; set -x set +x; echo -e "\n\n\033[1;34mExtracting files...\033[0m\n"; set -x # Extract the files %setup -q -n "kmess-%{kmess_tar_version}" +# Be verbose again +set +x; echo -e "\n\n\033[1;34mStarting configure...\033[0m\n"; set -x -%if %has_apgcc - # Be verbose - set +x; echo -e "\n\n\033[1;34mStarting configure...\033[0m\n\nAutopackage compiler detected, using apg++ to compile %{name}.\n"; set -x - # use same settings as autopackage/default.apspec uses - export APBUILD_BOGUS_DEPS='art_lgpl art_lgpl_2 dl expat fontconfig freetype GL ICE idn kdefx kdesu kwalletclient m nsl png pthread resolv SM util X11 Xcursor Xft Xi Xinerama Xmu Xrandr Xrender' - export APBUILD_STATIC='Xrender Xext Xss' - CC=apgcc \ - CXX=apg++ \ -%else - # Be verbose again - set +x; echo -e "\n\n\033[1;34mStarting configure...\033[0m\n"; set -x -%endif -%if %with_debug - CFLAGS="${RPM_OPT_FLAGS} -O0 -g -ggdb" \ - CXXFLAGS="${RPM_OPT_FLAGS} -O0 -g -ggdb" \ -%else - CFLAGS="${RPM_OPT_FLAGS}" \ - CXXFLAGS="${RPM_OPT_FLAGS}" \ -%endif -./configure \ -%if %with_debug - --enable-debug -%else - --disable-debug -%endif +# Configure the build +./configure --prefix=%{kde_prefix} --build-dir=rpmbuild \ +%if %with_debug + --build-type=debugfull --enable-debug-output +%else + --build-type=relwithdebinfo +%endif %build -# ------ make ------ # +# COMPILING +# +# compiles everything using make +# -# Be verbose again set +x; echo -e "\n\n\033[1;34mStarting make...\033[0m\n"; set -x # Setup for parallel builds (no cpus + 1) @@ -222,30 +248,37 @@ if [ -z "$numprocs" -o "$numprocs" = "0" ]; then fi # Start make -%{__make} -j$numprocs +cd rpmbuild +#%{__make} -j$numprocs %install -# ------ make install ------ # +# INSTALLING +# +# Install all files in a separate folder. +# Track the files to build the package later. +# # Be verbose again set +x; echo -e "\n\n\033[1;34mStarting make install...\033[0m\n"; set -x -# Remove old build root +# Remove old build install root %{__rm} -rf "${RPM_BUILD_ROOT}" mkdir "${RPM_BUILD_ROOT}" # required by some distro's, slackware for always builds in /usr/src/rpms/BUILD -# # for testing: -# mkdir -p ${RPM_BUILD_ROOT}/usr/bin/ -# cp %(kde-config --prefix)/bin/kmess ${RPM_BUILD_ROOT}/usr/bin/kmess -# echo "install-strip:" > Makefile - -# Install in build root -%if %with_debug - %{__make} DESTDIR="${RPM_BUILD_ROOT}" install +%if %debug_rpmbuild + mkdir -p ${RPM_BUILD_ROOT}/usr/bin/ + cp %(kde4-config --prefix)/bin/kmess ${RPM_BUILD_ROOT}/usr/bin/kmess + echo "install/strip:" > Makefile %else - %{__make} DESTDIR="${RPM_BUILD_ROOT}" install-strip +%if %with_debug + cd rpmbuild + %{__make} install DESTDIR="${RPM_BUILD_ROOT}" +%else + cd rpmbuild + %{__make} install/strip DESTDIR="${RPM_BUILD_ROOT}" +%endif %endif # Add package description file for slackware @@ -256,14 +289,14 @@ mkdir "${RPM_BUILD_ROOT}" # required by some distro's, slackware for always bui |-----handy-ruler------------------------------------------------------| %{name}: KMess %{kmess_version} MSN Messenger Client for KDE %{name}: -%{name}: KMess is a MSN Messenger client for Linux. It enables Linux -%{name}: users to chat with friends online who are using MSN Messenger -%{name}: in Windows or Mac OS. The strength of KMess is it's integration -%{name}: with the KDE desktop environment, focus on MSN Messenger specific -%{name}: features and an easy-to-use interface. -%{name}: +%{name}: KMess is a MSN Messenger / Windows Live Messenger client for Linux. +%{name}: It enables Linux users to chat with friends online who are using +%{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}: Package Created By: KMess development team -%{name}: +%{name}: END %endif ##' fix syntax for vim @@ -277,9 +310,9 @@ Version: %{version} Section: kde Priority: optional Architecture: i386 -Depends: kdelibs4 (>=4:%{kde_major_version}.0) +Depends: kdelibs5 (>=5:%{kde_major_version}.0) Maintainer: The KMess Developers -Description: KMess is a MSN Messenger client for KDE. +Description: KMess is a MSN Messenger / Windows Live Messenger client for Linux. . It enables Linux users to chat with friends online who are using MSN Messenger in Windows or Mac OS. @@ -338,8 +371,16 @@ find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> "$RPM_BUILD_DIR/file.lis +# FILES TO PACKAGE +# +%files -f ../file.list.kmess +%doc ChangeLog %{doc_files} + + + %clean -# ------ finishing build ------ # +# CLEANUP +# # clean up temporary folders %{__rm} -rf "${RPM_BUILD_ROOT}" @@ -366,14 +407,15 @@ set +x -# ------ files to build, changelog to include ------ # - -%files -f ../file.list.kmess -%doc ChangeLog %{doc_files} - - -# Use `date +"%a %b %d %Y"` +# RPM CHANGELOG +# +# Use `date +"%a %b %d %Y"` to generate the dates. +# %changelog +* Wed Apr 30 2008 Valerio Pilo +- Updated the specfile for KMess 2.0 +- Changed the build process to use CMake + * Wed May 11 2005 Diederik van der Boor - Updated dependencies - Fixed slackware building support diff --git a/kmess.supp b/kmess.supp new file mode 100644 index 0000000..41d289e --- /dev/null +++ b/kmess.supp @@ -0,0 +1,606 @@ +{ + + Memcheck:Param + write(buf) + fun:__write_nocancel + obj:/usr/lib/libICE.so.6.3.0 + fun:_IceWrite + fun:IceFlush + fun:_ZL14sm_setPropertyPKcS0_iP11SmPropValue + fun:_ZL14sm_setPropertyRK7QStringS1_ + fun:_ZL22sm_performSaveYourselfP22QSessionManagerPrivate + fun:_ZL23sm_saveYourselfCallbackP8_SmcConnPviiii + fun:_SmcProcessMessage + fun:IceProcessMessages + fun:_ZN17QSmSocketReceiver11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv +} +{ + + Memcheck:Cond + fun:BN_mod_inverse + fun:BN_MONT_CTX_set + fun:BN_MONT_CTX_set_locked + obj:/lib/libcrypto.so.0.9.8 + fun:RSA_verify + fun:EVP_VerifyFinal + fun:ASN1_item_verify + obj:/lib/libcrypto.so.0.9.8 + fun:X509_verify_cert + fun:ssl_verify_cert_chain + fun:ssl3_get_server_certificate + fun:ssl3_connect +} +{ + + Memcheck:Cond + fun:BN_div + fun:BN_nnmod + fun:BN_mod_inverse + fun:BN_MONT_CTX_set + fun:BN_MONT_CTX_set_locked + obj:/lib/libcrypto.so.0.9.8 + fun:RSA_verify + fun:EVP_VerifyFinal + fun:ASN1_item_verify + obj:/lib/libcrypto.so.0.9.8 + fun:X509_verify_cert + fun:ssl_verify_cert_chain +} +{ + + Memcheck:Cond + fun:BN_div + fun:BN_nnmod + fun:BN_mod_inverse + fun:BN_MONT_CTX_set + fun:BN_MONT_CTX_set_locked + obj:/lib/libcrypto.so.0.9.8 + fun:RSA_verify + fun:EVP_VerifyFinal + fun:ASN1_item_verify + obj:/lib/libcrypto.so.0.9.8 + fun:X509_verify_cert + fun:ssl_verify_cert_chain +} +{ + + Memcheck:Cond + fun:BN_mod_inverse + fun:BN_MONT_CTX_set + fun:BN_MONT_CTX_set_locked + obj:/lib/libcrypto.so.0.9.8 + fun:ssl3_send_client_key_exchange + fun:ssl3_connect + fun:_ZN24QSslSocketBackendPrivate14testConnectionEv + fun:_ZN24QSslSocketBackendPrivate8transmitEv + fun:_ZN10QSslSocket11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv + fun:_ZN22QAbstractSocketPrivate19canReadNotificationEv + fun:_ZN13QReadNotifier5eventEP6QEvent +} +{ + + Memcheck:Cond + fun:BN_div + fun:BN_MONT_CTX_set + fun:BN_MONT_CTX_set_locked + obj:/lib/libcrypto.so.0.9.8 + fun:ssl3_send_client_key_exchange + fun:ssl3_connect + fun:_ZN24QSslSocketBackendPrivate14testConnectionEv + fun:_ZN24QSslSocketBackendPrivate8transmitEv + fun:_ZN10QSslSocket11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv + fun:_ZN22QAbstractSocketPrivate19canReadNotificationEv + fun:_ZN13QReadNotifier5eventEP6QEvent +} +{ + + Memcheck:Cond + fun:deflate + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + fun:png_write_row + fun:png_write_image + fun:_ZN15QPNGImageWriter10writeImageERK6QImageiRK7QStringii + fun:_ZN11QPngHandler5writeERK6QImage + fun:_ZN12QImageWriter5writeERK6QImage + fun:_ZlsR11QDataStreamRK6QImage + fun:_ZlsR11QDataStreamRK7QPixmap + fun:_ZN20KNotificationManager6notifyEP13KNotificationRK7QPixmapRK11QStringListRK5QListI5QPairI7QStringSA_EERKSA_ +} +{ + + Memcheck:Value8 + fun:crc32 + obj:/usr/lib/libpng12.so.0.27.0 + fun:png_write_chunk_data + fun:png_write_chunk + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + fun:png_write_row + fun:png_write_image + fun:_ZN15QPNGImageWriter10writeImageERK6QImageiRK7QStringii + fun:_ZN11QPngHandler5writeERK6QImage +} +{ + + Memcheck:Value8 + fun:crc32 + obj:/usr/lib/libpng12.so.0.27.0 + fun:png_write_chunk_data + fun:png_write_chunk + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + obj:/usr/lib/libpng12.so.0.27.0 + fun:png_write_row + fun:png_write_image + fun:_ZN15QPNGImageWriter10writeImageERK6QImageiRK7QStringii + fun:_ZN11QPngHandler5writeERK6QImage +} +{ + + Memcheck:Param + writev(vector[...]) + fun:writev + obj:/lib/libdbus-1.so.3.4.0 + obj:/lib/libdbus-1.so.3.4.0 + obj:/lib/libdbus-1.so.3.4.0 + obj:/lib/libdbus-1.so.3.4.0 + obj:/lib/libdbus-1.so.3.4.0 + obj:/lib/libdbus-1.so.3.4.0 + obj:/lib/libdbus-1.so.3.4.0 + fun:dbus_connection_send_with_reply + fun:_ZN22QDBusConnectionPrivate18sendWithReplyAsyncERK12QDBusMessagei + fun:_ZN22QDBusConnectionPrivate18sendWithReplyAsyncERK12QDBusMessageP7QObjectPKcS6_i + fun:_ZNK15QDBusConnection16callWithCallbackERK12QDBusMessageP7QObjectPKcS6_i +} +{ + + Memcheck:Param + write(buf) + obj:/lib/libc-2.9.so + obj:/usr/lib/libICE.so.6.3.0 + fun:_IceWrite + fun:IceFlush + fun:SmcCloseConnection + fun:_ZN15QSessionManagerD0Ev + fun:_ZN12QApplicationD2Ev + fun:_ZN16KMessApplicationD1Ev + fun:main +} +{ + + Memcheck:Leak + fun:malloc + fun:_ZN7QString7reallocEi + fun:_ZN7QString6resizeEi + fun:_ZN7QString8fromUtf8EPKci + fun:_ZL26fromPercentEncodingMutableP10QByteArray + fun:_ZNK11QUrlPrivate5parseENS_12ParseOptionsE + fun:_ZNK4QUrl7isValidEv + fun:_ZN4KUrl14_setEncodedUrlERK10QByteArray + fun:_ZN4KUrlC1ERK7QString + fun:_ZN5khtml6Loader20servePendingRequestsEv + fun:_ZN5khtml19CachedCSSStyleSheetC1EPNS_9DocLoaderERKN3DOM9DOMStringEN3KIO12CacheControlEPKc + fun:_ZN5khtml5Cache13requestObjectINS_19CachedCSSStyleSheetELNS_12CachedObject4TypeE1EEEPT_PNS_9DocLoaderERK4KUrlPKc +} +{ + + Memcheck:Leak + fun:malloc + obj:/usr/lib/libxml2.so.2.6.32 + fun:xmlSAX2StartElementNs + obj:/usr/lib/libxml2.so.2.6.32 + fun:xmlParseElement + fun:xmlParseContent + fun:xmlParseElement + fun:xmlParseDocument + fun:xmlSAXParseMemoryWithData + fun:_ZN17XslTransformation13setStylesheetERK7QString + fun:_ZN16ChatMessageStyle8setStyleERK7QString + fun:_ZN15ChatMessageView15updateChatStyleEv +} +{ + + Memcheck:Leak + fun:_Znwm + fun:_ZN19QDockAreaLayoutInfo12restoreStateER11QDataStreamR5QListIP11QDockWidgetEb + fun:_ZN15QDockAreaLayout12restoreStateER11QDataStreamRK5QListIP11QDockWidgetEb + fun:_ZN22QMainWindowLayoutState11checkFormatER11QDataStreamb + fun:_ZN22QMainWindowLayoutState12restoreStateER11QDataStreamRKS_ + fun:_ZN17QMainWindowLayout12restoreStateER11QDataStream + fun:_ZN11QMainWindow12restoreStateERK10QByteArrayi + fun:_ZN11KMainWindow23applyMainWindowSettingsERK12KConfigGroupb + fun:_ZN13KXmlGuiWindow23applyMainWindowSettingsERK12KConfigGroupb + fun:_ZN10ChatWindow10initializeEv + fun:_ZN10ChatMaster16createChatWindowEP4Chat + fun:_ZN10ChatMaster10createChatEP24MsnSwitchboardConnectionb +} +{ + + Memcheck:Leak + fun:malloc + fun:_ZN8QMapData11node_createEPPNS_4NodeEi + fun:_ZN4QMapI10QByteArray11QStringListE11node_createEP8QMapDataPPNS3_4NodeERKS0_RKS1_ + fun:_ZNK13KStandardDirs12resourceDirsEPKc + fun:_ZN10KIconThemeC1ERK7QStringS2_ + fun:_ZN18KIconLoaderPrivate14initIconThemesEv + fun:_ZN11KIconLoader9addAppDirERK7QString + fun:_ZN16KMessApplication15initializePathsEv + fun:_ZN16KMessApplicationC1Ev + fun:main +} +{ + + Memcheck:Leak + fun:malloc + obj:/usr/lib/libxslt.so.1.1.24 + fun:xsltParseStylesheetProcess + fun:xsltParseStylesheetImportedDoc + fun:xsltParseStylesheetDoc + fun:_ZN17XslTransformation13setStylesheetERK7QString + fun:_ZN16ChatMessageStyle8setStyleERK7QString + fun:_ZN15ChatMessageView15updateChatStyleEv + fun:_ZN8ChatView10initializeEv + fun:_ZN4Chat10initializeEP24MsnSwitchboardConnection + fun:_ZN10ChatMaster10createChatEP24MsnSwitchboardConnectionb + fun:_ZN10ChatMaster11qt_metacallEN11QMetaObject4CallEiPPv +} +{ + + Memcheck:Leak + fun:malloc + obj:/usr/lib/libfontconfig.so.1.3.0 + obj:/usr/lib/libfontconfig.so.1.3.0 + obj:/usr/lib/libfontconfig.so.1.3.0 + obj:/usr/lib/libfontconfig.so.1.3.0 + obj:/usr/lib/libexpat.so.1.5.2 + obj:/usr/lib/libexpat.so.1.5.2 + obj:/usr/lib/libexpat.so.1.5.2 + obj:/usr/lib/libexpat.so.1.5.2 + fun:XML_ParseBuffer + fun:FcConfigParseAndLoad + fun:FcConfigParseAndLoad +} +{ + + Memcheck:Leak + fun:malloc + fun:nss_parse_service_list + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwuid_r@@GLIBC_2.2.5 + fun:_ZL22sm_performSaveYourselfP22QSessionManagerPrivate + fun:_ZL23sm_saveYourselfCallbackP8_SmcConnPviiii + fun:_SmcProcessMessage + fun:IceProcessMessages + fun:_ZN17QSmSocketReceiver11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv +} +{ + + Memcheck:Leak + fun:malloc + fun:_XimOpenIM + fun:_XimRegisterIMInstantiateCallback + fun:XRegisterIMInstantiateCallback + fun:_ZN16QXIMInputContextC1Ev + fun:_ZN20QInputContextFactory6createERK7QStringP7QObject + fun:_ZNK12QApplication12inputContextEv + fun:_ZN19QApplicationPrivate14setFocusWidgetEP7QWidgetN2Qt11FocusReasonE + fun:_ZN7QWidget8setFocusEN2Qt11FocusReasonE + fun:_ZN12QApplication15setActiveWindowEP7QWidget + fun:_ZN12QApplication15x11ProcessEventEP7_XEvent + fun:_ZL22x11EventSourceDispatchP8_GSourcePFiPvES1_ +} +{ + + Memcheck:Leak + fun:_Znwm + fun:_ZN5khtml11RenderStyleC1Eb + fun:_ZN5khtml11RenderStyleC1Ev + fun:_ZN5khtml16CSSStyleSelector21setupDefaultRootStyleEPN3DOM12DocumentImplE + fun:_ZN5khtml16CSSStyleSelectorC1EPN3DOM12DocumentImplE7QStringPNS1_18StyleSheetListImplERK4KUrlb + fun:_ZN3DOM12DocumentImpl6attachEv + fun:_ZN9KHTMLPart5beginERK4KUrlii + fun:_ZN15ChatMessageView7setHtmlERK7QString + fun:_ZN15ChatMessageView9clearViewEb + fun:_ZN15ChatMessageViewC1EP7QWidget + fun:_ZN8ChatViewC2EP7QWidget + fun:_ZN4ChatC1EP7QWidget +} +{ + + Memcheck:Leak + fun:malloc + fun:CRYPTO_malloc + fun:c2i_ASN1_BIT_STRING + fun:asn1_ex_c2i + obj:/lib/libcrypto.so.0.9.8 + fun:ASN1_item_ex_d2i + obj:/lib/libcrypto.so.0.9.8 + obj:/lib/libcrypto.so.0.9.8 + fun:ASN1_item_ex_d2i + obj:/lib/libcrypto.so.0.9.8 + obj:/lib/libcrypto.so.0.9.8 + fun:ASN1_item_ex_d2i +} +{ + + Memcheck:Leak + fun:realloc + obj:/usr/lib/libfontconfig.so.1.3.0 + obj:/usr/lib/libfontconfig.so.1.3.0 + fun:FcDefaultSubstitute + fun:_ZN13QFontDatabase4loadEPK12QFontPrivatei + fun:_ZNK12QFontPrivate15engineForScriptEi + fun:_ZNK12QFontMetrics6heightEv + fun:_ZN10QStatusBar8reformatEv + fun:_ZN10QStatusBar18setSizeGripEnabledEb + fun:_ZN10QStatusBarC2EP7QWidget + fun:_ZN10KStatusBarC1EP7QWidget + fun:_ZN11KMainWindow9statusBarEv +} +{ + + Memcheck:Leak + fun:malloc + fun:_ZN8QMapData11node_createEPPNS_4NodeEi + fun:_ZN4QMapI9KEntryKey6KEntryE6insertERKS0_RKS1_ + fun:_ZN9KEntryMap8setEntryERK10QByteArrayS2_S2_6QFlagsINS_11EntryOptionEE + fun:_ZN17KConfigIniBackend11parseConfigERK10QByteArrayR9KEntryMap6QFlagsIN14KConfigBackend11ParseOptionEEb + fun:_ZN17KConfigIniBackend11parseConfigERK10QByteArrayR9KEntryMap6QFlagsIN14KConfigBackend11ParseOptionEE + fun:_ZN14KConfigPrivate16parseConfigFilesEv + fun:_ZN7KConfig20reparseConfigurationEv + fun:_ZN7KConfigC1ERK7QString6QFlagsINS_8OpenFlagEEPKc + fun:_ZN11KMessConfig15getGlobalConfigERK7QString + fun:_ZN13NetworkWindowD0Ev + fun:_ZN13NetworkWindow7destroyEv +} +{ + + Memcheck:Leak + fun:malloc + fun:CRYPTO_malloc + fun:SSL_new + fun:_ZN24QSslSocketBackendPrivate14initSslContextEv + fun:_ZN24QSslSocketBackendPrivate21startClientEncryptionEv + fun:_ZN17QSslSocketPrivate16_q_connectedSlotEv + fun:_ZN10QSslSocket11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv + fun:_ZN22QAbstractSocketPrivate25fetchConnectionParametersEv + fun:_ZN22QAbstractSocketPrivate17_q_testConnectionEv + fun:_ZN14QWriteNotifier5eventEP6QEvent + fun:_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent +} +{ + + Memcheck:Cond + fun:BN_div + fun:BN_MONT_CTX_set + fun:BN_MONT_CTX_set_locked + obj:/lib/libcrypto.so.0.9.8 + fun:RSA_verify + fun:EVP_VerifyFinal + fun:ASN1_item_verify + obj:/lib/libcrypto.so.0.9.8 + fun:X509_verify_cert + fun:ssl_verify_cert_chain + fun:ssl3_get_server_certificate + fun:ssl3_connect +} +{ + + Memcheck:Leak + fun:_Znwm + fun:_ZNK14QX11PixmapData11paintEngineEv + fun:_ZN8QPainter5beginEP12QPaintDevice + fun:_ZN11KIconEngine6pixmapERK5QSizeN5QIcon4ModeENS3_5StateE + fun:_ZNK5QIcon6pixmapERK5QSizeNS_4ModeENS_5StateE + fun:_ZN14QWidgetPrivate17setWindowIcon_sysEb + fun:_ZN7QWidget6createEmbb + fun:_ZN7QWidget10setVisibleEb + fun:_ZN7QWidget4showEv + fun:_ZN11LikeBackBar8autoMoveEv + fun:_ZN11LikeBackBar11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv +} +{ + + Memcheck:Leak + fun:malloc + fun:CRYPTO_malloc + fun:ssl3_setup_buffers + fun:ssl3_connect + fun:_ZN24QSslSocketBackendPrivate14testConnectionEv + fun:_ZN24QSslSocketBackendPrivate21startClientEncryptionEv + fun:_ZN17QSslSocketPrivate16_q_connectedSlotEv + fun:_ZN10QSslSocket11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv + fun:_ZN22QAbstractSocketPrivate25fetchConnectionParametersEv + fun:_ZN22QAbstractSocketPrivate17_q_testConnectionEv + fun:_ZN14QWriteNotifier5eventEP6QEvent +} +{ + + Memcheck:Leak + fun:malloc + fun:CRYPTO_malloc + fun:ASN1_OBJECT_new + fun:c2i_ASN1_OBJECT + fun:asn1_ex_c2i + obj:/lib/libcrypto.so.0.9.8 + fun:ASN1_item_ex_d2i + obj:/lib/libcrypto.so.0.9.8 + obj:/lib/libcrypto.so.0.9.8 + fun:ASN1_item_ex_d2i + obj:/lib/libcrypto.so.0.9.8 + obj:/lib/libcrypto.so.0.9.8 +} +{ + + Memcheck:Cond + fun:_ZL13PolygonRegionPK6QPointii + fun:_ZN7QRegionC1ERK8QPolygonN2Qt8FillRuleE + fun:_ZN15QX11PaintEngine11updateStateERK17QPaintEngineState + fun:_ZN15QPainterPrivate15updateStateImplEP13QPainterState + fun:_ZN15QPainterPrivate11updateStateEP13QPainterState + fun:_ZN8QPainter13setClipRegionERK7QRegionN2Qt13ClipOperationE + fun:_ZNK14QWidgetPrivate15paintBackgroundEP8QPainterRK7QRegionRK6QPointi + fun:_ZN14QWidgetPrivate10drawWidgetEP12QPaintDeviceRK7QRegionRK6QPointiP8QPainterP19QWidgetBackingStore + fun:_ZN19QWidgetBackingStore4syncEv + fun:_ZN14QWidgetPrivate16syncBackingStoreEv + fun:_ZN7QWidget5eventEP6QEvent + fun:_ZN11QMainWindow5eventEP6QEvent +} +{ + + Memcheck:Cond + fun:_ZL13PolygonRegionPK6QPointii + fun:_ZN7QRegionC1ERK8QPolygonN2Qt8FillRuleE + fun:_ZN15QX11PaintEngine11updateStateERK17QPaintEngineState + fun:_ZN15QPainterPrivate15updateStateImplEP13QPainterState + fun:_ZN15QPainterPrivate11updateStateEP13QPainterState + fun:_ZN8QPainter13setClipRegionERK7QRegionN2Qt13ClipOperationE + fun:_ZNK14QWidgetPrivate15paintBackgroundEP8QPainterRK7QRegionRK6QPointi + fun:_ZN14QWidgetPrivate10drawWidgetEP12QPaintDeviceRK7QRegionRK6QPointiP8QPainterP19QWidgetBackingStore + fun:_ZN19QWidgetBackingStore4syncEv + fun:_ZN14QWidgetPrivate16syncBackingStoreEv + fun:_ZN7QWidget5eventEP6QEvent + fun:_ZN11QMainWindow5eventEP6QEvent +} +{ + + Memcheck:Leak + fun:malloc + fun:_ZN7QString7reallocEi + fun:_ZN7QString6resizeEi + fun:_ZN7QString8fromUtf8EPKci + fun:_ZL26fromPercentEncodingMutableP10QByteArray + fun:_ZNK11QUrlPrivate5parseENS_12ParseOptionsE + fun:_ZNK4QUrl7isValidEv + fun:_ZN4KUrl14_setEncodedUrlERK10QByteArray + fun:_ZN4KUrlC1ERK7QString + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 + fun:_ZN11QMetaObject8activateEP7QObjectiiPPv +} +{ + + Memcheck:Leak + fun:realloc + obj:/usr/lib/libfontconfig.so.1.3.0 + obj:/usr/lib/libfontconfig.so.1.3.0 + fun:FcPatternDuplicate + fun:_ZL14tryPatternLoadP10_FcPatterniRK8QFontDefiPS0_ + fun:_ZN13QFontDatabase4loadEPK12QFontPrivatei + fun:_ZNK12QFontPrivate15engineForScriptEi + fun:_ZNK12QFontMetrics6ascentEv + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 +} +{ + + Memcheck:Leak + fun:malloc + fun:_ZN8QMapData11node_createEPPNS_4NodeEi + fun:_ZN4QMapI7QStringS0_E11node_createEP8QMapDataPPNS2_4NodeERKS0_S8_ + fun:_ZN4QMapI7QStringS0_E13detach_helperEv + fun:_ZN4QMapI7QStringS0_E6detachEv + fun:_ZN4QMapI7QStringS0_E5beginEv + fun:_ZN17XslTransformation20updateParametersListEv + fun:_ZN17XslTransformation13setParametersE4QMapI7QStringS1_E + fun:_ZN16ChatMessageStyle8setStyleERK7QString + fun:_ZN13ChatStylePage20slotChatStyleChangedERK7QString + fun:_ZN13ChatStylePage12loadSettingsEPK7Account + fun:_ZN21AccountSettingsDialog12loadSettingsEP7AccountbNS_4PageE +} +{ + + Memcheck:Leak + fun:_Znwm + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 + obj:/usr/lib/libkhtml.so.5.2.0 + fun:_ZN9KHTMLPart5beginERK4KUrlii + fun:_ZN15ChatMessageView7setHtmlERK7QString + fun:_ZN15ChatMessageView9clearViewEb + fun:_ZN15ChatMessageViewC1EP7QWidget + fun:_ZN8ChatViewC2EP7QWidget + fun:_ZN4ChatC1EP7QWidget +} +{ + + Memcheck:Leak + fun:_Znwm + fun:_ZN19QDockAreaLayoutInfo12restoreStateER11QDataStreamR5QListIP11QDockWidgetEb + fun:_ZN15QDockAreaLayout12restoreStateER11QDataStreamRK5QListIP11QDockWidgetEb + fun:_ZN22QMainWindowLayoutState11checkFormatER11QDataStreamb + fun:_ZN22QMainWindowLayoutState12restoreStateER11QDataStreamRKS_ + fun:_ZN17QMainWindowLayout12restoreStateER11QDataStream + fun:_ZN11QMainWindow12restoreStateERK10QByteArrayi + fun:_ZN10ChatWindow14readPropertiesERK12KConfigGroup + fun:_ZN10ChatWindow10initializeEv + fun:_ZN10ChatMaster16createChatWindowEP4Chat + fun:_ZN10ChatMaster10createChatEP24MsnSwitchboardConnectionb + fun:_ZN10ChatMaster11qt_metacallEN11QMetaObject4CallEiPPv +} +{ + + Memcheck:Leak + fun:malloc + fun:_ZN7QVectorI5QListIN14QObjectPrivate10ConnectionEEE7reallocEii + fun:_ZN14QObjectPrivate13addConnectionEiPNS_10ConnectionE + fun:_ZN11QMetaObject7connectEPK7QObjectiS2_iiPi + fun:_ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE + fun:_ZN14KActionPrivate4initEP7KAction + fun:_ZN7KActionC1ERK5KIconRK7QStringP7QObject + fun:_ZN8LikeBack18sendACommentActionEP17KActionCollection + fun:_ZN14KMessInterface10initializeEv + fun:_ZN5KMess10initializeEv + fun:_ZN16KMessApplication20initializeMainWindowEv + fun:_ZN16KMessApplicationC1Ev +} +{ + + Memcheck:Leak + fun:realloc + fun:_ZN9QListData7reallocEi + fun:_ZN9QListData6appendEv + fun:_ZN5QListIP7QObjectE6appendERKS1_ + fun:_ZN14QObjectPrivate16setParent_helperEP7QObject + fun:_ZN15QSocketNotifierC2EiNS_4TypeEP7QObject + fun:_ZN19QNativeSocketEngine27setWriteNotificationEnabledEb + fun:_ZN22QAbstractSocketPrivate23_q_connectToNextAddressEv + fun:_ZN22QAbstractSocketPrivate18_q_startConnectingERK9QHostInfo + fun:_ZN15QAbstractSocket27connectToHostImplementationERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE + fun:_ZN15QAbstractSocket11qt_metacallEN11QMetaObject4CallEiPPv + fun:_ZNK11QMetaMethod6invokeEP7QObjectN2Qt14ConnectionTypeE22QGenericReturnArgument16QGenericArgumentS5_S5_S5_S5_S5_S5_S5_S5_S5_ +} +{ + + Memcheck:Leak + fun:realloc + obj:/usr/lib/libfontconfig.so.1.3.0 + obj:/usr/lib/libfontconfig.so.1.3.0 + fun:FcDefaultSubstitute + fun:_ZN13QFontDatabase4loadEPK12QFontPrivatei + fun:_ZNK12QFontPrivate15engineForScriptEi + fun:_ZNK12QFontMetrics6ascentEv + fun:_ZN5khtml18CachedFontInstanceC1EPNS_16CachedFontFamilyEi + fun:_ZN5khtml16CachedFontFamily9queryFontEi + fun:_ZNK5khtml4Font6updateEi + fun:_ZN5khtml4Font11initDefaultEv + fun:_ZN5khtml11RenderStyleC1Eb +} diff --git a/kmess/Makefile.am b/kmess/Makefile.am deleted file mode 100644 index 814e9e7..0000000 --- a/kmess/Makefile.am +++ /dev/null @@ -1,110 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - - - -bin_PROGRAMS = kmess -xdg_apps_DATA = kmess.desktop - -# AUTO requires the "--.png" naming convension -KDE_ICON = AUTO - -kmess_SOURCES = binreloc.c kmessdebug.cpp account.cpp autologinview.cpp \ - contactlistviewitem.cpp currentaccount.cpp emoticon.cpp emoticonmanager.cpp \ - emoticontheme.cpp grouplistviewitem.cpp idletimer.cpp initialview.cpp \ - initialviewinterface.ui kmess.cpp kmessapplication.cpp kmessinterface.cpp kmesslistviewitem.cpp \ - kmesstest.cpp kmessview.cpp kmessviewinterface.ui main.cpp msnobject.cpp \ - nowlisteningclient.cpp systemtraywidget.cpp thumbnailprovider.cpp xautolock.cpp - -# for Autopackage BinReloc support. this passes -# the --enable-binreloc result to the compiler -AM_CPPFLAGS = $(BINRELOC_CFLAGS) $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) - - -# Weird stuff but required: added tcpconnectionbase.o manually. -# "UNIX linkers are single-pass, so if you have two libraries -# referring to each other, you need to mention those libraries twice." -# The ordering also matters because if this issue. -# When two .a files reffer each other, this sometimes doesn't work either. -# The only solution seams to list the conflicting .o file separately. -kmess_LDADD = $(top_builddir)/kmess/actions/libactions.a \ - $(top_builddir)/kmess/chat/libchat.a \ - $(top_builddir)/kmess/contact/libcontact.a \ - $(top_builddir)/kmess/crypt/libmsncrypt.a \ - $(top_builddir)/kmess/dialogs/libdialogs.a \ - $(top_builddir)/kmess/dialogs/addemoticondialog.o \ - $(top_builddir)/kmess/settings/libsettings.a \ - $(top_builddir)/kmess/network/libnetwork.a \ - $(top_builddir)/kmess/network/applications/libapplications.a \ - $(top_builddir)/kmess/network/soap/libsoap.a \ - $(top_builddir)/kmess/network/upnp/libupnp.a \ - $(top_builddir)/kmess/network/extra/libextra.a \ - $(top_builddir)/kmess/network/tcpconnectionbase.o \ - $(top_builddir)/kmess/notification/libnotification.a \ - $(KPHONE_GSM_LIB) $(KPHONE_ILBC_LIB) $(KPHONE_DISSIPATE2_LIB) \ - $(LIB_XSCREENSAVER) \ - $(LIB_KDEUI) $(LIB_KDECORE) $(LIB_KIO) $(LIB_KHTML) \ - $(LIB_QT) \ - $(LIBSOCKET) \ - $(LIBXML_LIBS) $(LIBXSLT_LIBS) - -SUBDIRS = actions crypt contact chat dialogs network settings notification pics sounds styles - -generaldatadir = $(kde_datadir)/kmess -generaldata_DATA = eventsrc - -noinst_HEADERS = binreloc.h kmessinterface.h account.h autologinview.h \ - contactlistviewitem.h currentaccount.h emoticon.h emoticonmanager.h emoticontheme.h \ - grouplistviewitem.h idletimer.h initialview.h kmess.h kmessapplication.h kmessdebug.h \ - kmesslistviewitem.h kmesstest.h kmessview.h msnobject.h nowlisteningclient.h \ - specialgroups.h systemtraywidget.h thumbnailprovider.h xautolock.h - -# These paths are KDE specific. Use them: -# kde_appsdir Where your application's menu entry (.desktop) should go to. -# kde_icondir Where your icon should go to - better use KDE_ICON. -# kde_sounddir Where your sounds should go to. -# kde_htmldir Where your docs should go to. (contains lang subdirs) -# kde_datadir Where you install application data. (Use a subdir) -# kde_locale Where translation files should go to. (contains lang subdirs) -# kde_cgidir Where cgi-bin executables should go to. -# kde_confdir Where config files should go to (system-wide ones with default values). -# kde_mimedir Where mimetypes .desktop files should go to. -# kde_servicesdir Where services .desktop files should go to. -# kde_servicetypesdir Where servicetypes .desktop files should go to. -# kde_toolbardir Where general toolbar icons should go to (deprecated, use KDE_ICON). -# kde_wallpaperdir Where general wallpapers should go to. -# kde_templatesdir Where templates for the "New" menu (Konqueror/KDesktop) should go to. -# kde_bindir Where executables should go to. Use bin_PROGRAMS or bin_SCRIPTS. -# kde_libdir Where shared libraries should go to. Use lib_LTLIBRARIES. -# kde_moduledir Where modules (e.g. parts) should go to. Use kde_module_LTLIBRARIES. -# kde_styledir Where Qt/KDE widget styles should go to (new in KDE 3). -# kde_designerdir Where Qt Designer plugins should go to (new in KDE 3). - - -# set the include path for X, qt and KDE -INCLUDES = $(all_includes) - -# let automoc handle all of the meta source files (moc) -METASOURCES = AUTO - -# the library search path. -# the -lpthread is required for Autopackage/BinReloc -kmess_LDFLAGS = $(KDE_RPATH) $(all_libraries) -lpthread - -# Uncomment the following two lines if you add a ui.rc file for your application to make use of -# KDEs XML GUI builing -#rcdir = $(kde_datadir)/kmess -#rc_DATA = kmessui.rc - -# The rc.cpp target contains all messages from the .ui files -messages: rc.cpp - @echo "extracting translations from *.ui files.." - $(EXTRACTRC) `find . -name '*.ui' -o -name '*.rc' | sort ` > rc.cpp - @echo "extracting translations from *.xsl files.." - sh ./styles/extract-xsl-messages >> rc.cpp - @echo "extracting translations from *.cpp files.." - LIST=`find . -name '*.h' -o -name '*.cpp' | sort`; \ - if test -n "$$LIST"; then \ - $(XGETTEXT) --from-code=UTF-8 $$LIST -o $(podir)/kmess.pot; \ - fi - -AM_CXXFLAGS = -ggdb diff --git a/kmess/Makefile.in b/kmess/Makefile.in deleted file mode 100644 index 4891166..0000000 --- a/kmess/Makefile.in +++ /dev/null @@ -1,1415 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - - - -SOURCES = $(kmess_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -bin_PROGRAMS = kmess$(EXEEXT) -subdir = kmess -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(generaldatadir)" "$(DESTDIR)$(xdg_appsdir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) -am_kmess_OBJECTS = binreloc.$(OBJEXT) kmessdebug.$(OBJEXT) \ - account.$(OBJEXT) autologinview.$(OBJEXT) \ - contactlistviewitem.$(OBJEXT) currentaccount.$(OBJEXT) \ - emoticon.$(OBJEXT) emoticonmanager.$(OBJEXT) \ - emoticontheme.$(OBJEXT) grouplistviewitem.$(OBJEXT) \ - idletimer.$(OBJEXT) initialview.$(OBJEXT) kmess.$(OBJEXT) \ - kmessapplication.$(OBJEXT) kmessinterface.$(OBJEXT) \ - kmesslistviewitem.$(OBJEXT) kmesstest.$(OBJEXT) \ - kmessview.$(OBJEXT) main.$(OBJEXT) msnobject.$(OBJEXT) \ - nowlisteningclient.$(OBJEXT) systemtraywidget.$(OBJEXT) \ - thumbnailprovider.$(OBJEXT) xautolock.$(OBJEXT) -#>- kmess_OBJECTS = $(am_kmess_OBJECTS) -#>+ 14 -kmess_final_OBJECTS = binreloc.o kmess.all_cpp.o -kmess_nofinal_OBJECTS = binreloc.$(OBJEXT) kmessdebug.$(OBJEXT) \ - account.$(OBJEXT) autologinview.$(OBJEXT) \ - contactlistviewitem.$(OBJEXT) currentaccount.$(OBJEXT) \ - emoticon.$(OBJEXT) emoticonmanager.$(OBJEXT) \ - emoticontheme.$(OBJEXT) grouplistviewitem.$(OBJEXT) \ - idletimer.$(OBJEXT) initialview.$(OBJEXT) kmess.$(OBJEXT) \ - kmessapplication.$(OBJEXT) kmessinterface.$(OBJEXT) \ - kmesslistviewitem.$(OBJEXT) kmesstest.$(OBJEXT) \ - kmessview.$(OBJEXT) main.$(OBJEXT) msnobject.$(OBJEXT) \ - nowlisteningclient.$(OBJEXT) systemtraywidget.$(OBJEXT) \ - thumbnailprovider.$(OBJEXT) xautolock.$(OBJEXT) initialviewinterface.$(OBJEXT) kmessviewinterface.$(OBJEXT) -@KDE_USE_FINAL_FALSE@kmess_OBJECTS = $(kmess_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@kmess_OBJECTS = $(kmess_final_OBJECTS) -am__DEPENDENCIES_1 = -kmess_DEPENDENCIES = $(top_builddir)/kmess/actions/libactions.a \ - $(top_builddir)/kmess/chat/libchat.a \ - $(top_builddir)/kmess/contact/libcontact.a \ - $(top_builddir)/kmess/crypt/libmsncrypt.a \ - $(top_builddir)/kmess/dialogs/libdialogs.a \ - $(top_builddir)/kmess/dialogs/addemoticondialog.o \ - $(top_builddir)/kmess/settings/libsettings.a \ - $(top_builddir)/kmess/network/libnetwork.a \ - $(top_builddir)/kmess/network/applications/libapplications.a \ - $(top_builddir)/kmess/network/soap/libsoap.a \ - $(top_builddir)/kmess/network/upnp/libupnp.a \ - $(top_builddir)/kmess/network/extra/libextra.a \ - $(top_builddir)/kmess/network/tcpconnectionbase.o \ - $(top_builddir)/kmess/notification/libnotification.a \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/account.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/autologinview.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/binreloc.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactlistviewitem.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/currentaccount.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/emoticon.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/emoticonmanager.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/emoticontheme.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/grouplistviewitem.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/idletimer.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/initialview.Po ./$(DEPDIR)/kmess.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/kmessapplication.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/kmessdebug.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/kmessinterface.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/kmesslistviewitem.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/kmesstest.Po ./$(DEPDIR)/kmessview.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/main.Po ./$(DEPDIR)/msnobject.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/nowlisteningclient.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/systemtraywidget.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/thumbnailprovider.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/xautolock.Po -#>+ 42 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/initialviewinterface.P $(DEPDIR)/kmessviewinterface.P $(DEPDIR)/kmess.all_cpp.P ./$(DEPDIR)/account.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/autologinview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/binreloc.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactlistviewitem.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/currentaccount.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticon.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonmanager.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticontheme.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/grouplistviewitem.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/idletimer.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/initialview.Po ./$(DEPDIR)/kmess.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessapplication.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessdebug.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessinterface.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmesslistviewitem.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmesstest.Po ./$(DEPDIR)/kmessview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/main.Po ./$(DEPDIR)/msnobject.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/nowlisteningclient.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/systemtraywidget.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/thumbnailprovider.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/xautolock.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/initialviewinterface.P $(DEPDIR)/kmessviewinterface.P ./$(DEPDIR)/account.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/autologinview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/binreloc.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactlistviewitem.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/currentaccount.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticon.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonmanager.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticontheme.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/grouplistviewitem.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/idletimer.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/initialview.Po ./$(DEPDIR)/kmess.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessapplication.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessdebug.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessinterface.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmesslistviewitem.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmesstest.Po ./$(DEPDIR)/kmessview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/main.Po ./$(DEPDIR)/msnobject.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/nowlisteningclient.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/systemtraywidget.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/thumbnailprovider.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/xautolock.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(kmess_SOURCES) -DIST_SOURCES = $(kmess_SOURCES) -#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -#>- html-recursive info-recursive install-data-recursive \ -#>- install-exec-recursive install-info-recursive \ -#>- install-recursive installcheck-recursive installdirs-recursive \ -#>- pdf-recursive ps-recursive uninstall-info-recursive \ -#>- uninstall-recursive -#>+ 6 -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive nmcheck-recursive bcheck-recursive -generaldataDATA_INSTALL = $(INSTALL_DATA) -xdg_appsDATA_INSTALL = $(INSTALL_DATA) -DATA = $(generaldata_DATA) $(xdg_apps_DATA) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -xdg_apps_DATA = kmess.desktop - -# AUTO requires the "--.png" naming convension -KDE_ICON = AUTO -#>- kmess_SOURCES = binreloc.c kmessdebug.cpp account.cpp autologinview.cpp \ -#>- contactlistviewitem.cpp currentaccount.cpp emoticon.cpp emoticonmanager.cpp \ -#>- emoticontheme.cpp grouplistviewitem.cpp idletimer.cpp initialview.cpp \ -#>- initialviewinterface.ui kmess.cpp kmessapplication.cpp kmessinterface.cpp kmesslistviewitem.cpp \ -#>- kmesstest.cpp kmessview.cpp kmessviewinterface.ui main.cpp msnobject.cpp \ -#>- nowlisteningclient.cpp systemtraywidget.cpp thumbnailprovider.cpp xautolock.cpp -#>+ 6 -kmess_SOURCES=binreloc.c kmessdebug.cpp account.cpp autologinview.cpp \ - contactlistviewitem.cpp currentaccount.cpp emoticon.cpp emoticonmanager.cpp \ - emoticontheme.cpp grouplistviewitem.cpp idletimer.cpp initialview.cpp \ - kmess.cpp kmessapplication.cpp kmessinterface.cpp kmesslistviewitem.cpp \ - kmesstest.cpp kmessview.cpp main.cpp msnobject.cpp \ - nowlisteningclient.cpp systemtraywidget.cpp thumbnailprovider.cpp xautolock.cpp initialviewinterface.cpp kmessviewinterface.cpp - - -# for Autopackage BinReloc support. this passes -# the --enable-binreloc result to the compiler -AM_CPPFLAGS = $(BINRELOC_CFLAGS) $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) - -# Weird stuff but required: added tcpconnectionbase.o manually. -# "UNIX linkers are single-pass, so if you have two libraries -# referring to each other, you need to mention those libraries twice." -# The ordering also matters because if this issue. -# When two .a files reffer each other, this sometimes doesn't work either. -# The only solution seams to list the conflicting .o file separately. -kmess_LDADD = $(top_builddir)/kmess/actions/libactions.a \ - $(top_builddir)/kmess/chat/libchat.a \ - $(top_builddir)/kmess/contact/libcontact.a \ - $(top_builddir)/kmess/crypt/libmsncrypt.a \ - $(top_builddir)/kmess/dialogs/libdialogs.a \ - $(top_builddir)/kmess/dialogs/addemoticondialog.o \ - $(top_builddir)/kmess/settings/libsettings.a \ - $(top_builddir)/kmess/network/libnetwork.a \ - $(top_builddir)/kmess/network/applications/libapplications.a \ - $(top_builddir)/kmess/network/soap/libsoap.a \ - $(top_builddir)/kmess/network/upnp/libupnp.a \ - $(top_builddir)/kmess/network/extra/libextra.a \ - $(top_builddir)/kmess/network/tcpconnectionbase.o \ - $(top_builddir)/kmess/notification/libnotification.a \ - $(KPHONE_GSM_LIB) $(KPHONE_ILBC_LIB) $(KPHONE_DISSIPATE2_LIB) \ - $(LIB_XSCREENSAVER) \ - $(LIB_KDEUI) $(LIB_KDECORE) $(LIB_KIO) $(LIB_KHTML) \ - $(LIB_QT) \ - $(LIBSOCKET) \ - $(LIBXML_LIBS) $(LIBXSLT_LIBS) - -SUBDIRS = actions crypt contact chat dialogs network settings notification pics sounds styles -generaldatadir = $(kde_datadir)/kmess -generaldata_DATA = eventsrc -noinst_HEADERS = binreloc.h kmessinterface.h account.h autologinview.h \ - contactlistviewitem.h currentaccount.h emoticon.h emoticonmanager.h emoticontheme.h \ - grouplistviewitem.h idletimer.h initialview.h kmess.h kmessapplication.h kmessdebug.h \ - kmesslistviewitem.h kmesstest.h kmessview.h msnobject.h nowlisteningclient.h \ - specialgroups.h systemtraywidget.h thumbnailprovider.h xautolock.h - - -# These paths are KDE specific. Use them: -# kde_appsdir Where your application's menu entry (.desktop) should go to. -# kde_icondir Where your icon should go to - better use KDE_ICON. -# kde_sounddir Where your sounds should go to. -# kde_htmldir Where your docs should go to. (contains lang subdirs) -# kde_datadir Where you install application data. (Use a subdir) -# kde_locale Where translation files should go to. (contains lang subdirs) -# kde_cgidir Where cgi-bin executables should go to. -# kde_confdir Where config files should go to (system-wide ones with default values). -# kde_mimedir Where mimetypes .desktop files should go to. -# kde_servicesdir Where services .desktop files should go to. -# kde_servicetypesdir Where servicetypes .desktop files should go to. -# kde_toolbardir Where general toolbar icons should go to (deprecated, use KDE_ICON). -# kde_wallpaperdir Where general wallpapers should go to. -# kde_templatesdir Where templates for the "New" menu (Konqueror/KDesktop) should go to. -# kde_bindir Where executables should go to. Use bin_PROGRAMS or bin_SCRIPTS. -# kde_libdir Where shared libraries should go to. Use lib_LTLIBRARIES. -# kde_moduledir Where modules (e.g. parts) should go to. Use kde_module_LTLIBRARIES. -# kde_styledir Where Qt/KDE widget styles should go to (new in KDE 3). -# kde_designerdir Where Qt Designer plugins should go to (new in KDE 3). - -# set the include path for X, qt and KDE -INCLUDES = $(all_includes) - -# let automoc handle all of the meta source files (moc) -#>- METASOURCES = AUTO - -# the library search path. -# the -lpthread is required for Autopackage/BinReloc -kmess_LDFLAGS = $(KDE_RPATH) $(all_libraries) -lpthread -AM_CXXFLAGS = -ggdb -#>- all: all-recursive -#>+ 1 -all: docs-am all-recursive - -.SUFFIXES: -.SUFFIXES: .c .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -kmess$(EXEEXT): $(kmess_OBJECTS) $(kmess_DEPENDENCIES) - @rm -f kmess$(EXEEXT) - $(CXXLINK) $(kmess_LDFLAGS) $(kmess_OBJECTS) $(kmess_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/account.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autologinview.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binreloc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactlistviewitem.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/currentaccount.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emoticon.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emoticonmanager.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emoticontheme.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grouplistviewitem.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idletimer.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/initialview.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmess.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmessapplication.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmessdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmessinterface.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmesslistviewitem.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmesstest.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmessview.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnobject.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nowlisteningclient.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/systemtraywidget.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumbnailprovider.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xautolock.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-generaldataDATA: $(generaldata_DATA) - @$(NORMAL_INSTALL) - test -z "$(generaldatadir)" || $(mkdir_p) "$(DESTDIR)$(generaldatadir)" - @list='$(generaldata_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(generaldataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(generaldatadir)/$$f'"; \ - $(generaldataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(generaldatadir)/$$f"; \ - done - -uninstall-generaldataDATA: - @$(NORMAL_UNINSTALL) - @list='$(generaldata_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(generaldatadir)/$$f'"; \ - rm -f "$(DESTDIR)$(generaldatadir)/$$f"; \ - done -install-xdg_appsDATA: $(xdg_apps_DATA) - @$(NORMAL_INSTALL) - test -z "$(xdg_appsdir)" || $(mkdir_p) "$(DESTDIR)$(xdg_appsdir)" - @list='$(xdg_apps_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(xdg_appsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(xdg_appsdir)/$$f'"; \ - $(xdg_appsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(xdg_appsdir)/$$f"; \ - done - -uninstall-xdg_appsDATA: - @$(NORMAL_UNINSTALL) - @list='$(xdg_apps_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(xdg_appsdir)/$$f'"; \ - rm -f "$(DESTDIR)$(xdg_appsdir)/$$f"; \ - done - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || mkdir "$(distdir)/$$subdir" \ - || exit 1; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="../$(top_distdir)" \ - distdir="../$(distdir)/$$subdir" \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(generaldatadir)" "$(DESTDIR)$(xdg_appsdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-recursive -#>+ 1 -clean: kde-rpo-clean clean-recursive - -#>- clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-metasources clean-ui clean-bcheck clean-final clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -#>- install-data-am: install-generaldataDATA install-xdg_appsDATA -#>+ 1 -install-data-am: install-kde-icons install-generaldataDATA install-xdg_appsDATA - -install-exec-am: install-binPROGRAMS - -install-info: install-info-recursive - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -#>- uninstall-am: uninstall-binPROGRAMS uninstall-generaldataDATA \ -#>- uninstall-info-am uninstall-xdg_appsDATA -#>+ 2 -uninstall-am: uninstall-kde-icons uninstall-binPROGRAMS uninstall-generaldataDATA \ - uninstall-info-am uninstall-xdg_appsDATA - -uninstall-info: uninstall-info-recursive - -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ - clean clean-binPROGRAMS clean-generic clean-libtool \ - clean-recursive ctags ctags-recursive distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-recursive distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-exec install-exec-am \ - install-generaldataDATA install-info install-info-am \ - install-man install-strip install-xdg_appsDATA installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic maintainer-clean-recursive \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-generaldataDATA \ - uninstall-info-am uninstall-xdg_appsDATA - - -# Uncomment the following two lines if you add a ui.rc file for your application to make use of -# KDEs XML GUI builing -#rcdir = $(kde_datadir)/kmess -#rc_DATA = kmessui.rc - -# The rc.cpp target contains all messages from the .ui files -messages: rc.cpp - @echo "extracting translations from *.ui files.." - $(EXTRACTRC) `find . -name '*.ui' -o -name '*.rc' | sort ` > rc.cpp - @echo "extracting translations from *.xsl files.." - sh ./styles/extract-xsl-messages >> rc.cpp - @echo "extracting translations from *.cpp files.." - LIST=`find . -name '*.h' -o -name '*.cpp' | sort`; \ - if test -n "$$LIST"; then \ - $(XGETTEXT) --from-code=UTF-8 $$LIST -o $(podir)/kmess.pot; \ - fi -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -kmessview.moc: $(srcdir)/kmessview.h - $(MOC) $(srcdir)/kmessview.h -o kmessview.moc - -#>+ 2 -mocs: kmessview.moc - -#>+ 3 -autologinview.moc: $(srcdir)/autologinview.h - $(MOC) $(srcdir)/autologinview.h -o autologinview.moc - -#>+ 2 -mocs: autologinview.moc - -#>+ 3 -kmesstest.moc: $(srcdir)/kmesstest.h - $(MOC) $(srcdir)/kmesstest.h -o kmesstest.moc - -#>+ 2 -mocs: kmesstest.moc - -#>+ 3 -currentaccount.moc: $(srcdir)/currentaccount.h - $(MOC) $(srcdir)/currentaccount.h -o currentaccount.moc - -#>+ 2 -mocs: currentaccount.moc - -#>+ 3 -xautolock.moc: $(srcdir)/xautolock.h - $(MOC) $(srcdir)/xautolock.h -o xautolock.moc - -#>+ 2 -mocs: xautolock.moc - -#>+ 3 -idletimer.moc: $(srcdir)/idletimer.h - $(MOC) $(srcdir)/idletimer.h -o idletimer.moc - -#>+ 2 -mocs: idletimer.moc - -#>+ 3 -contactlistviewitem.moc: $(srcdir)/contactlistviewitem.h - $(MOC) $(srcdir)/contactlistviewitem.h -o contactlistviewitem.moc - -#>+ 2 -mocs: contactlistviewitem.moc - -#>+ 3 -nowlisteningclient.moc: $(srcdir)/nowlisteningclient.h - $(MOC) $(srcdir)/nowlisteningclient.h -o nowlisteningclient.moc - -#>+ 2 -mocs: nowlisteningclient.moc - -#>+ 3 -kmess.moc: $(srcdir)/kmess.h - $(MOC) $(srcdir)/kmess.h -o kmess.moc - -#>+ 2 -mocs: kmess.moc - -#>+ 3 -emoticon.moc: $(srcdir)/emoticon.h - $(MOC) $(srcdir)/emoticon.h -o emoticon.moc - -#>+ 2 -mocs: emoticon.moc - -#>+ 3 -initialview.moc: $(srcdir)/initialview.h - $(MOC) $(srcdir)/initialview.h -o initialview.moc - -#>+ 2 -mocs: initialview.moc - -#>+ 3 -account.moc: $(srcdir)/account.h - $(MOC) $(srcdir)/account.h -o account.moc - -#>+ 2 -mocs: account.moc - -#>+ 3 -kmessinterface.moc: $(srcdir)/kmessinterface.h - $(MOC) $(srcdir)/kmessinterface.h -o kmessinterface.moc - -#>+ 2 -mocs: kmessinterface.moc - -#>+ 3 -emoticonmanager.moc: $(srcdir)/emoticonmanager.h - $(MOC) $(srcdir)/emoticonmanager.h -o emoticonmanager.moc - -#>+ 2 -mocs: emoticonmanager.moc - -#>+ 3 -systemtraywidget.moc: $(srcdir)/systemtraywidget.h - $(MOC) $(srcdir)/systemtraywidget.h -o systemtraywidget.moc - -#>+ 2 -mocs: systemtraywidget.moc - -#>+ 3 -emoticontheme.moc: $(srcdir)/emoticontheme.h - $(MOC) $(srcdir)/emoticontheme.h -o emoticontheme.moc - -#>+ 2 -mocs: emoticontheme.moc - -#>+ 3 -thumbnailprovider.moc: $(srcdir)/thumbnailprovider.h - $(MOC) $(srcdir)/thumbnailprovider.h -o thumbnailprovider.moc - -#>+ 2 -mocs: thumbnailprovider.moc - -#>+ 3 -grouplistviewitem.moc: $(srcdir)/grouplistviewitem.h - $(MOC) $(srcdir)/grouplistviewitem.h -o grouplistviewitem.moc - -#>+ 2 -mocs: grouplistviewitem.moc - -#>+ 3 -clean-metasources: - -rm -f kmessview.moc autologinview.moc kmesstest.moc currentaccount.moc xautolock.moc idletimer.moc contactlistviewitem.moc nowlisteningclient.moc kmess.moc emoticon.moc initialview.moc account.moc kmessinterface.moc emoticonmanager.moc systemtraywidget.moc emoticontheme.moc thumbnailprovider.moc grouplistviewitem.moc - -#>+ 2 -KDE_DIST=lo22-app-kmess.png kmess.dox lo16-app-kmess.png hi48-app-kmess.png eventsrc hi128-app-kmess.png lo32-app-kmess.png hi32-app-kmess.png kmess.desktop initialviewinterface.ui configure.in.in hi16-app-kmess.png Makefile.in hi64-app-kmess.png kmessviewinterface.ui Makefile.am hi22-app-kmess.png - -#>+ 5 -clean-ui: - -rm -f \ - initialviewinterface.cpp initialviewinterface.h initialviewinterface.moc \ - kmessviewinterface.cpp kmessviewinterface.h kmessviewinterface.moc - -#>+ 2 -docs-am: - -#>+ 31 -install-kde-icons: - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/64x64/apps - $(INSTALL_DATA) $(srcdir)/hi64-app-kmess.png $(DESTDIR)$(kde_icondir)/hicolor/64x64/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps - $(INSTALL_DATA) $(srcdir)/hi16-app-kmess.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps - $(INSTALL_DATA) $(srcdir)/hi32-app-kmess.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/16x16/apps - $(INSTALL_DATA) $(srcdir)/lo16-app-kmess.png $(DESTDIR)$(kde_icondir)/locolor/16x16/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/128x128/apps - $(INSTALL_DATA) $(srcdir)/hi128-app-kmess.png $(DESTDIR)$(kde_icondir)/hicolor/128x128/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps - $(INSTALL_DATA) $(srcdir)/hi22-app-kmess.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/32x32/apps - $(INSTALL_DATA) $(srcdir)/lo32-app-kmess.png $(DESTDIR)$(kde_icondir)/locolor/32x32/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps - $(INSTALL_DATA) $(srcdir)/hi48-app-kmess.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps/kmess.png - $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/22x22/apps - $(INSTALL_DATA) $(srcdir)/lo22-app-kmess.png $(DESTDIR)$(kde_icondir)/locolor/22x22/apps/kmess.png - -uninstall-kde-icons: - -rm -f $(DESTDIR)$(kde_icondir)/hicolor/64x64/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/hicolor/128x128/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/locolor/32x32/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps/kmess.png - -rm -f $(DESTDIR)$(kde_icondir)/locolor/22x22/apps/kmess.png - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-recursive - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -kmess.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/kmessdebug.cpp $(srcdir)/account.cpp $(srcdir)/autologinview.cpp $(srcdir)/contactlistviewitem.cpp $(srcdir)/currentaccount.cpp $(srcdir)/emoticon.cpp $(srcdir)/emoticonmanager.cpp $(srcdir)/emoticontheme.cpp $(srcdir)/grouplistviewitem.cpp $(srcdir)/idletimer.cpp $(srcdir)/initialview.cpp $(srcdir)/kmess.cpp $(srcdir)/kmessapplication.cpp $(srcdir)/kmessinterface.cpp $(srcdir)/kmesslistviewitem.cpp $(srcdir)/kmesstest.cpp $(srcdir)/kmessview.cpp $(srcdir)/main.cpp $(srcdir)/msnobject.cpp $(srcdir)/nowlisteningclient.cpp $(srcdir)/systemtraywidget.cpp $(srcdir)/thumbnailprovider.cpp $(srcdir)/xautolock.cpp initialviewinterface.cpp kmessviewinterface.cpp kmessview.moc kmessviewinterface.moc initialviewinterface.moc autologinview.moc kmesstest.moc currentaccount.moc xautolock.moc idletimer.moc kmess.moc nowlisteningclient.moc contactlistviewitem.moc emoticon.moc initialview.moc account.moc kmessinterface.moc emoticonmanager.moc systemtraywidget.moc emoticontheme.moc thumbnailprovider.moc grouplistviewitem.moc - @echo 'creating kmess.all_cpp.cpp ...'; \ - rm -f kmess.all_cpp.files kmess.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> kmess.all_cpp.final; \ - for file in kmessdebug.cpp account.cpp autologinview.cpp contactlistviewitem.cpp currentaccount.cpp emoticon.cpp emoticonmanager.cpp emoticontheme.cpp grouplistviewitem.cpp idletimer.cpp initialview.cpp kmess.cpp kmessapplication.cpp kmessinterface.cpp kmesslistviewitem.cpp kmesstest.cpp kmessview.cpp main.cpp msnobject.cpp nowlisteningclient.cpp systemtraywidget.cpp thumbnailprovider.cpp xautolock.cpp initialviewinterface.cpp kmessviewinterface.cpp ; do \ - echo "#include \"$$file\"" >> kmess.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> kmess.all_cpp.final; \ - done; \ - cat kmess.all_cpp.final kmess.all_cpp.files > kmess.all_cpp.cpp; \ - rm -f kmess.all_cpp.final kmess.all_cpp.files - -#>+ 3 -clean-final: - -rm -f kmess.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) kmess_OBJECTS="$(kmess_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) kmess_OBJECTS="$(kmess_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) kmess_OBJECTS="$(kmess_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) kmess_OBJECTS="$(kmess_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 63 -kmesstest.o: kmesstest.moc -$(srcdir)/main.cpp: initialviewinterface.h kmessviewinterface.h -emoticontheme.o: emoticontheme.moc -account.lo: account.moc -$(srcdir)/idletimer.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/currentaccount.cpp: initialviewinterface.h kmessviewinterface.h -idletimer.o: idletimer.moc -xautolock.o: xautolock.moc -$(srcdir)/kmessinterface.cpp: initialviewinterface.h kmessviewinterface.h -nmcheck-am: nmcheck -currentaccount.o: currentaccount.moc -autologinview.o: autologinview.moc -$(srcdir)/account.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/kmess.cpp: initialviewinterface.h kmessviewinterface.h -currentaccount.lo: currentaccount.moc -nowlisteningclient.o: nowlisteningclient.moc -thumbnailprovider.o: thumbnailprovider.moc -$(srcdir)/emoticonmanager.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/kmesslistviewitem.cpp: initialviewinterface.h kmessviewinterface.h -systemtraywidget.o: systemtraywidget.moc -emoticontheme.lo: emoticontheme.moc -systemtraywidget.lo: systemtraywidget.moc -$(srcdir)/msnobject.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/kmesstest.cpp: initialviewinterface.h kmessviewinterface.h -kmesstest.lo: kmesstest.moc -kmessinterface.o: kmessinterface.moc -$(srcdir)/kmessapplication.cpp: initialviewinterface.h kmessviewinterface.h -emoticon.o: emoticon.moc -$(srcdir)/binreloc.c: initialviewinterface.h kmessviewinterface.h -contactlistviewitem.o: contactlistviewitem.moc -$(srcdir)/thumbnailprovider.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/nowlisteningclient.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/kmessdebug.cpp: initialviewinterface.h kmessviewinterface.h -initialview.lo: initialview.moc -$(srcdir)/systemtraywidget.cpp: initialviewinterface.h kmessviewinterface.h -grouplistviewitem.o: grouplistviewitem.moc -$(srcdir)/autologinview.cpp: initialviewinterface.h kmessviewinterface.h -initialview.o: initialview.moc -account.o: account.moc -$(srcdir)/xautolock.cpp: initialviewinterface.h kmessviewinterface.h -kmess.lo: kmess.moc -$(srcdir)/emoticontheme.cpp: initialviewinterface.h kmessviewinterface.h -emoticon.lo: emoticon.moc -$(srcdir)/emoticon.cpp: initialviewinterface.h kmessviewinterface.h -idletimer.lo: idletimer.moc -$(srcdir)/initialview.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/contactlistviewitem.cpp: initialviewinterface.h kmessviewinterface.h -kmessinterface.lo: kmessinterface.moc -kmess.o: kmess.moc -emoticonmanager.lo: emoticonmanager.moc -kmessview.o: kmessview.moc -autologinview.lo: autologinview.moc -thumbnailprovider.lo: thumbnailprovider.moc -emoticonmanager.o: emoticonmanager.moc -nmcheck: -grouplistviewitem.lo: grouplistviewitem.moc -xautolock.lo: xautolock.moc -contactlistviewitem.lo: contactlistviewitem.moc -nowlisteningclient.lo: nowlisteningclient.moc -kmessview.lo: kmessview.moc -$(srcdir)/kmessview.cpp: initialviewinterface.h kmessviewinterface.h -$(srcdir)/grouplistviewitem.cpp: initialviewinterface.h kmessviewinterface.h - -#>+ 30 -kmessviewinterface.cpp: $(srcdir)/kmessviewinterface.ui kmessviewinterface.h kmessviewinterface.moc - rm -f kmessviewinterface.cpp - echo '#include ' > kmessviewinterface.cpp - echo '#include ' >> kmessviewinterface.cpp - $(UIC) -tr ${UIC_TR} -i kmessviewinterface.h $(srcdir)/kmessviewinterface.ui > kmessviewinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" kmessviewinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_kmessviewinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> kmessviewinterface.cpp ;\ - rm -f kmessviewinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "kmessviewinterface.moc"' >> kmessviewinterface.cpp; else rm -f kmessviewinterface.cpp ; exit $$ret ; fi - -kmessviewinterface.h: $(srcdir)/kmessviewinterface.ui - rm -rf kmessviewinterface.h; - $(UIC) $(srcdir)/kmessviewinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> kmessviewinterface.h ; -kmessviewinterface.moc: kmessviewinterface.h - $(MOC) kmessviewinterface.h -o kmessviewinterface.moc - -initialviewinterface.cpp: $(srcdir)/initialviewinterface.ui initialviewinterface.h initialviewinterface.moc - rm -f initialviewinterface.cpp - echo '#include ' > initialviewinterface.cpp - echo '#include ' >> initialviewinterface.cpp - $(UIC) -tr ${UIC_TR} -i initialviewinterface.h $(srcdir)/initialviewinterface.ui > initialviewinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" initialviewinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_initialviewinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> initialviewinterface.cpp ;\ - rm -f initialviewinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "initialviewinterface.moc"' >> initialviewinterface.cpp; else rm -f initialviewinterface.cpp ; exit $$ret ; fi - -initialviewinterface.h: $(srcdir)/initialviewinterface.ui - rm -rf initialviewinterface.h; - $(UIC) $(srcdir)/initialviewinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> initialviewinterface.h ; -initialviewinterface.moc: initialviewinterface.h - $(MOC) initialviewinterface.h -o initialviewinterface.moc diff --git a/kmess/account.cpp b/kmess/account.cpp deleted file mode 100644 index 3c65edc..0000000 --- a/kmess/account.cpp +++ /dev/null @@ -1,1500 +0,0 @@ -/*************************************************************************** - account.cpp - description - ------------------- - begin : Sun Jan 5 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 "account.h" - -#include "msnobject.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "kmessdebug.h" - -#ifdef KMESSDEBUG_ACCOUNT - #define KMESSDEBUG_ACCOUNT_GENERAL - #define KMESSDEBUG_ACCOUNT_DIRTY -#endif - -// The constructor -Account::Account() - : autoreplyMessage_( i18n("I'm away from my computer") ), - chatStyle_( "Fresh" ), - contactFontColor_("#000000"), - customImageIndex_(0), - deleted_(false), - dirty_(false), - doNotifyContactsOnline_(true), - doNotifyContactsStatus_(false), - doNotifyContactsChatStart_(true), - doNotifyContactsChatMessages_(false), - doNotifyContactsOffline_(true), - doNotifyEmails_(true), - emailCommand_("kmail"), - emailSupported_(true), // Assume true (for new accounts), until the msn server proves the opposite - emoticonStyle_("KMess-new"), - fontColor_("#000000"), - friendlyName_( i18n("Your name") ), - guestAccount_(true), - groupFollowupMessages_(true), - handle_( i18n("you@hotmail.com") ), - idleTime_(5), - initialStatus_("NLN"), - notificationDuration_(10), - saveChats_(false), - savedChatDirectoryStructure_( 0 ), - shakeNudge_(true), - showAllowedContacts_(false), - showContactsByGroup_(true), - showEmail_(true), - showMessageTime_(true), - showNowListening_(false), - showListPictures_(false), - showOfflineContacts_(true), - showOtherFolders_(true), - showRemovedContacts_(false), - showSidebar_(true), - useAutologin_(false), - useContactFont_(false), - useEmoticons_(true), - useFontEffects_(true), - useHotmail_(true), - useIdleTimer_(true), - - verified_(true), - - showImage_(true), - msnObject_(0) -{ - QDir homeDir; - - font_.setFamily("Arial"); - font_.setBold(false); - font_.setItalic(false); - font_.setUnderline(false); - font_.setPointSize(12); - - contactFont_.setFamily("Arial"); - contactFont_.setBold(false); - contactFont_.setItalic(false); - contactFont_.setUnderline(false); - - homeDir = QDir::home(); - saveChatPath_ = homeDir.absPath(); -} - - - -// The destructor -Account::~Account() -{ - if ( msnObject_ ) - delete msnObject_; - -#ifdef KMESSDEBUG_ACCOUNT_GENERAL - kdDebug() << "DESTROYED Account [handle=" << handle_ << "]" << endl; -#endif -} - - - -// 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. - - setLoginInformation ( account->getHandle(), - account->getFriendlyName(), - account->getPassword() ); - setShowAllowedContacts ( account->getShowAllowedContacts() ); - setShowContactsByGroup ( account->getShowContactsByGroup() ); - setShowOfflineContacts ( account->getShowOfflineContacts() ); - setShowRemovedContacts ( account->getShowRemovedContacts() ); - setShowListPictures ( account->getShowListPictures() ); - setEmoticonStyle ( account->getEmoticonStyle() ); - - setAlertsInformation ( account->getUseIdleTimer(), - account->getIdleTime(), - account->getShakeNudge(), - account->getShowNowListening() ); - setNotificationsInformation( account->getNotifyContactsOnline(), - account->getNotifyContactsStatus(), - account->getNotifyContactsChatStart(), - account->getNotifyContactsChatMessages(), - account->getNotifyContactsOffline(), - account->getNotifyEmails(), - account->getNotificationDuration() ); - setChatInformation ( account->getUseContactFont(), - account->getUseEmoticons(), - account->getUseFontEffects(), - account->getShowMessageTime(), - account->getGroupFollowupMessages(), - account->getChatStyle() ); - setChatLoggingInformation ( account->getSaveChats(), - account->getSaveChatPath(), - account->getSavedChatDirectoryStructure() ); - setEmailInformation ( account->getUseHotmail(), - account->getEmailCommand(), - account->getShowEmail(), - account->getShowOtherFolders() ); - setEmailSupported ( account->getEmailSupported() ); - setFontInformation ( account->getFont(), - account->getFontColor(), - account->getContactFont(), - account->getContactFontColor() ); - setPersonalMessage ( account->getPersonalMessage() ); - - setUseAutologin ( account->getUseAutologin() ); - setAutoreplyMessage ( account->getAutoreplyMessage() ); - setShowSidebar ( account->getShowSidebar() ); - setInitialStatus ( account->getInitialStatus() ); - setGuestAccount ( account->isGuestAccount() ); - - setShowImage ( account->getShowImage() ); - setTemporaryPassword ( account->getTemporaryPassword() ); - setVerified ( account->isVerified() ); - - dirty_ = account->isDirty(); - customImageIndex_ = account->customImageIndex_; - 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. - setPersonalMessage ( account->getPersonalMessage() ); - setShowAllowedContacts( account->getShowAllowedContacts() ); - setShowOfflineContacts( account->getShowOfflineContacts() ); - setShowRemovedContacts( account->getShowRemovedContacts() ); - setShowContactsByGroup( account->getShowContactsByGroup() ); - setShowListPictures ( account->getShowListPictures() ); - setAutoreplyMessage ( account->getAutoreplyMessage() ); - setEmailSupported ( account->getEmailSupported() ); - setGuestAccount ( account->isGuestAccount() ); - setShowSidebar ( account->getShowSidebar() ); - setVerified ( account->isVerified() ); - - password_ = account->getPassword(); - dirty_ = account->isDirty(); - customImageIndex_ = account->customImageIndex_; -} - - - -// Delete the account data -void Account::deleteAccountData() -{ - // Can be called twice, avoid warnings. - if( deleted_ ) - { - return; - } - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "Account::deleteAccountData: deleting configuration fields" << endl; -#endif - - KConfig *config = kapp->config(); - QString groupName; - QStringList groups = config->groupList(); - - // Delete Profile_ - if( ! config->deleteGroup("Profile_" + handle_) ) - { - kdWarning() << "Account::deleteAccountData: Could not remove 'Profile_" << handle_ << "' from the config file!" << endl; - } - - // Delete Contact_/ - QString contactPrefix = "Contact_" + handle_ + "/"; - for( QStringList::Iterator it = groups.begin(); it != groups.end(); ++it ) - { - groupName = *it; - if( groupName.startsWith(contactPrefix) ) - { - if( ! config->deleteGroup(groupName) ) - { - kdWarning() << "Account::deleteAccountData: Could not remove '" << groupName << "' from the config file!" << endl; - } - } - } - - // Mark as deleted, so other classes avoid saving the settings again. - deleted_ = true; - guestAccount_ = true; -} - - - -// Read the auto-reply message. -const QString& Account::getAutoreplyMessage() const -{ - return autoreplyMessage_; -} - - - -// Return the chat style name. -const QString& Account::getChatStyle() const -{ - return chatStyle_; -} - - - -// Return the font used for contact messages, if forced to. -const QFont& Account::getContactFont() const -{ - return contactFont_; -} - - - -// Return the color of the forced contact font. -const QString& Account::getContactFontColor() const -{ - return contactFontColor_; -} - - - -// Read the email command used when not using hotmail -const QString& Account::getEmailCommand() const -{ - return emailCommand_; -} - - -// Return whether email notifications are supported -bool Account::getEmailSupported() const -{ - return emailSupported_; -} - - -// Return the user message font. -const QFont& Account::getFont() const -{ - return font_; -} - - - -// Return the color of the user message font. -const QString& Account::getFontColor() const -{ - return fontColor_; -} - - - -// Return the user's friendlyName -QString Account::getFriendlyName() const -{ - return friendlyName_; -} - - - -// Whether follow-up messages from the contact should be grouped. -bool Account::getGroupFollowupMessages() const -{ - return groupFollowupMessages_; -} - - - -// Return the user's handle -QString Account::getHandle() const -{ - return handle_; -} - - - -// Return the length of time waited before the user goes idle. -const int& Account::getIdleTime() const -{ - return idleTime_; -} - - - -// Return the path for a new the custom display image. -QString Account::getNewCustomImagePath() -{ - customImageIndex_++; // Ensures the image name is always unique, so the ChatWindow's KHTMLPart doesn't cache the image. - QString imageRoot = ::locateLocal("data", "kmess"); - QString safeHandle = getHandle().lower().replace( QRegExp( "[^a-z0-9_.@]" ), "-" ); - return imageRoot + "/msnpicture-" + safeHandle + "-" + QString::number(customImageIndex_) + ".png"; -} - - - -// 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 incoming mail. -bool Account::getNotifyEmails() const -{ - return doNotifyEmails_; -} - - - -// Return whether now listening information should be displayed. -bool Account::getShowNowListening() const -{ - return showNowListening_; -} - - - -// Return the user's password -QString Account::getPassword() const -{ - return password_; -} - - - -// Return the personal message -QString Account::getPersonalMessage() const -{ - return personalMessage_; -} - - - -// Return the selected emoticon's style -const QString& Account::getEmoticonStyle() const -{ - return emoticonStyle_; -} - - - -// Return the status to set upon connection -QString Account::getInitialStatus() const -{ - return initialStatus_; -} - - - -// Return whether or not to save chats. -bool Account::getSaveChats() const -{ - return saveChats_; -} - - - -// Return the base directory to which chats are saved. -const QString& Account::getSaveChatPath() const -{ - return saveChatPath_; -} - - - -// Return the code of the structure used to save chats. -const int& Account::getSavedChatDirectoryStructure() const -{ - return savedChatDirectoryStructure_; -} - - - -// Read whether the chat window should shake when a nudge is received or sent. -bool Account::getShakeNudge() const -{ - return shakeNudge_; -} - - - -// Read whether or not allowed contacts are shown. -bool Account::getShowAllowedContacts() const -{ - return showAllowedContacts_; -} - - - -// Read whether contacts are shown by group or by online/offline. -bool Account::getShowContactsByGroup() const -{ - return showContactsByGroup_; -} - - - -// Read whether the email information should be shown in the main view. -bool Account::getShowEmail() const -{ - return showEmail_; -} - - - -// Read whether message times should be shown. -bool Account::getShowMessageTime() const -{ - return showMessageTime_; -} - - - -// Read whether offline contacts should be shown. -bool Account::getShowOfflineContacts() const -{ - return showOfflineContacts_; -} - - - -// Read property of bool showOtherFolders. -bool Account::getShowOtherFolders() const -{ - return showOtherFolders_; -} - - - -// Read whether or not removed (reverse) contacts are shown. -bool Account::getShowRemovedContacts() const -{ - return showRemovedContacts_; -} - - - -// Read whether or not the sidebar should be shown in chats -bool Account::getShowSidebar() const -{ - return showSidebar_; -} - - - -// Return the a temporary password for the account for login attempts from the initialview dialog -const QString & Account::getTemporaryPassword() const -{ - return temporaryPassword_; -} - - - -// Return whether or not to autologin with this profile. -bool Account::getUseAutologin() const -{ - return useAutologin_; -} - - - -// Return whether or not to show contact messages in the stored font. -bool Account::getUseContactFont() const -{ - return useContactFont_; -} - - - -// Return whether or not to show emoticons in chats. -bool Account::getUseEmoticons() const -{ - return useEmoticons_; -} - - - -// Return whether or not to use the bold/italic/underline effects. -bool Account::getUseFontEffects() const -{ - return useFontEffects_; -} - - - -// Read whether the user uses hotmail to read email or a set command -bool Account::getUseHotmail() const -{ - return useHotmail_; -} - - - -// Return whether the idle timer should be used. -bool Account::getUseIdleTimer() const -{ - return useIdleTimer_; -} - - - -// Returns whether or not to send our display image -bool Account::getShowImage() const -{ - return showImage_; -} - - -// Returns whether display pictures should be shown in contact list -bool Account::getShowListPictures() const -{ - return showListPictures_; -} - - - -// Return the path of the custom display image. -const QString Account::getCustomImagePath() const -{ - QString safeHandle = getHandle().lower().replace( QRegExp( "[^a-z0-9_.@]" ), "-" ); - QString suffix = ( customImageIndex_ > 0 ? "-" + QString::number(customImageIndex_) : QString::null ); - - return ::locateLocal("data", "kmess/msnpicture-" + safeHandle + suffix + ".png"); -} - - - -// Return the path to the *current* display image -const QString Account::getImagePath() const -{ - KStandardDirs *dirs = KGlobal::dirs(); - QString imagePath; - - // return image path if user has selected to show it else return QString::null - if( showImage_ ) - { - // if the user has selected a custom image it will be located (usually) in - // ~/.kde/share/apps/kmess/msnpicture-handle.png - imagePath = getCustomImagePath(); - - // If the file can't be found, fallback to the default image. - if(! QFile::exists(imagePath)) - { - imagePath = dirs->findResource( "data", "kmess/pics/kmesspic.png" ); - } - - return imagePath; - } - else - { - return QString::null; - } -} - - -// Returns the string representation of the MsnObject -const QString Account::getMsnObjectString() const -{ - if ( msnObject_ ) - return msnObject_->objectString(); - else - return ""; -} - - - -// Whether the account is marked to be deleted -bool Account::isDeleted() const -{ - return deleted_; -} - - - -// Whether the account has unsaved settings changes -bool Account::isDirty() const -{ - return dirty_; -} - - - -// Whether the account is a guest account, not permanently saved on the computer -bool Account::isGuestAccount() const -{ - return guestAccount_; -} - - - -// Return whether the account's passport is verified -bool Account::isVerified() const -{ - return verified_; -} - - - -// Read in account properties -void Account::readProperties(KConfig *config, QString handle) -{ - handle_ = handle; - QDir homeDir; - QString defaultPath; - - homeDir = QDir::home(); - defaultPath = homeDir.absPath(); - - // Go the the profile's group - config->setGroup( "Profile_" + handle_ ); - - autoreplyMessage_ = config->readEntry ( "autoreplymessage", i18n("I'm away from my computer") ); - chatStyle_ = config->readEntry ( "chatStyle", "Fresh " ); -// contactFont_.setFamily done below - contactFont_.setBold ( config->readBoolEntry( "contactfontbold", false ) ); - contactFont_.setItalic ( config->readBoolEntry( "contactfontitalic", false ) ); - contactFont_.setUnderline ( config->readBoolEntry( "contactfontunderline", false ) ); - contactFont_.setPointSize ( config->readNumEntry ( "contactfontpointsize", 10 ) ); - contactFontColor_ = config->readEntry ( "contactfontcolor" , "#000000" ); - customImageIndex_ = config->readNumEntry ( "customimageindex", 0 ); - doNotifyContactsOnline_ = config->readBoolEntry( "doNotifyContactsOnline", true ); - doNotifyContactsStatus_ = config->readBoolEntry( "doNotifyContactsStatus", false ); - doNotifyContactsChatStart_ = config->readBoolEntry( "doNotifyContactsChatStart", true ); - doNotifyContactsChatMessages_ = config->readBoolEntry( "doNotifyContactsChatMessages", false ); - doNotifyContactsOffline_ = config->readBoolEntry( "doNotifyContactsOffline", true ); - doNotifyEmails_ = config->readBoolEntry( "doNotifyEmails", true ); - emailCommand_ = config->readEntry ( "emailCommand", "kmail" ); - emoticonStyle_ = config->readEntry ( "emoticonStyle", "KMess-new" ); -//font_.setFamily done below - font_.setBold ( config->readBoolEntry( "fontbold", false ) ); - font_.setItalic ( config->readBoolEntry( "fontitalic", false ) ); - font_.setPointSize ( config->readNumEntry ( "fontpointsize", 12 ) ); - font_.setUnderline ( config->readBoolEntry( "fontunderline", false ) ); - fontColor_ = config->readEntry ( "fontColor" , "#000000" ); - friendlyName_ = config->readEntry ( "friendlyName" , QString::null ); - groupFollowupMessages_ = config->readBoolEntry( "groupfollowupmessages", true ); - idleTime_ = config->readNumEntry ( "idleTime", 5 ); - initialStatus_ = config->readEntry ( "initialStatus", "NLN" ); - notificationDuration_ = config->readNumEntry ( "notification", 5 ); - password_ = config->readEntry ( "password" , QString::null ); - personalMessage_ = config->readEntry ( "personalMessage", QString::null ); - saveChatPath_ = config->readEntry ( "saveChatPath", defaultPath ); - saveChats_ = config->readBoolEntry( "saveChats", false ); - savedChatDirectoryStructure_ = config->readNumEntry ( "savedChatDirectoryStructure", 0 ); - shakeNudge_ = config->readBoolEntry( "shakeNudge", true ); - showAllowedContacts_ = config->readBoolEntry( "showAllowed", false ); - showContactsByGroup_ = config->readBoolEntry( "showByGroup", true ); - showEmail_ = config->readBoolEntry( "showEmail", true ); - showImage_ = config->readBoolEntry( "showImage", true ); - showListPictures_ = config->readBoolEntry( "showListPictures", false ); - showMessageTime_ = config->readBoolEntry( "showMessageTime", true ); - showNowListening_ = config->readBoolEntry( "showNowListening", false ); - showOfflineContacts_ = config->readBoolEntry( "showOfflineContacts", true ); - showOtherFolders_ = config->readBoolEntry( "showOtherFolders", true ); - showRemovedContacts_ = config->readBoolEntry( "showRemoved", false ); - showSidebar_ = config->readBoolEntry( "showSidebar", true ); - useAutologin_ = config->readBoolEntry( "useAutologin", false ); - useContactFont_ = config->readBoolEntry( "useContactFont", false ); - useEmoticons_ = config->readBoolEntry( "useEmoticons", true ); - useFontEffects_ = config->readBoolEntry( "useFontEffects", true ); - useHotmail_ = config->readBoolEntry( "useHotmail", true ); - useIdleTimer_ = config->readBoolEntry( "useIdleTimer", true ); - - updateMsnObject(); - - - // Read font setting, remove accel character if it's still there. - // That's a KMess 1.3 issue, but still visible in 1.4 if you never changed font settings. - QString normalFont = config->readEntry("fontfamily", "Arial"); - QString contactFont = config->readEntry( "contactfontfamily", "Arial"); - font_.setFamily( normalFont.replace("&", QString::null) ); - contactFont_.setFamily( contactFont.replace("&", QString::null) ); - - // After reading options from file, consider "dirty" to still be false - guestAccount_ = false; - dirty_ = false; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::readProperties(): Resetting 'dirty' to false." << endl; -#endif - - // If a chat style is removed, fall back to the default. - // 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() ) - { -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::readProperties(): Auto-corrected chat & setting, setting 'dirty' to true." << endl; -#endif - - // Fall back to our new default. - chatStyle_ = "Fresh"; - groupFollowupMessages_ = true; // Make sure Fresh looks good. - dirty_ = true; - } - - // If the fonts were auto-corrected, make sure the modified setting is saved in the kmessrc. - // Avoids questions and discussions like "yes, it's there but that's not a problem". Better just fix it. - if( normalFont.contains("&") || contactFont.contains("&") ) - { -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::readProperties(): Auto-corrected font & setting, setting 'dirty' to true." << endl; -#endif - dirty_ = true; - } -} - - - -// Save account properties -void Account::saveProperties(KConfig *config) -{ - // Protect against unwanted usage - if( guestAccount_ ) - { - kdWarning() << "Account::saveProperties: Application attempted to save a guest account!" << endl; - } - if( deleted_ ) - { - kdWarning() << "Account::saveProperties: Application attempted to save the deleted account again!" << endl; - } - - if ( dirty_ ) - { -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::saveProperties(): Account " << handle_ << " is 'dirty', save properties." << endl; -#endif - // Go the the profile's group - config->setGroup( "Profile_" + handle_ ); - - // Remove old chatFormat, replaced by chatStyle - config->deleteEntry( "chatFormat" ); - - config->writeEntry( "autoreplymessage", autoreplyMessage_ ); - config->writeEntry( "chatStyle", chatStyle_ ); - config->writeEntry( "contactfontfamily", contactFont_.family() ); - config->writeEntry( "contactfontbold", contactFont_.bold() ); - config->writeEntry( "contactfontitalic", contactFont_.italic() ); - config->writeEntry( "contactfontunderline", contactFont_.underline() ); - config->writeEntry( "contactfontpointsize", contactFont_.pointSize() ); - config->writeEntry( "contactfontcolor", contactFontColor_ ); - config->writeEntry( "customimageindex", customImageIndex_ ); - config->writeEntry( "doNotifyContactsOnline", doNotifyContactsOnline_ ); - config->writeEntry( "doNotifyContactsStatus", doNotifyContactsStatus_ ); - config->writeEntry( "doNotifyContactsChatStart", doNotifyContactsChatStart_ ); - config->writeEntry( "doNotifyContactsChatMessages", doNotifyContactsChatMessages_ ); - config->writeEntry( "doNotifyContactsOffline", doNotifyContactsOffline_ ); - config->writeEntry( "doNotifyEmails", doNotifyEmails_ ); - config->writeEntry( "emailCommand", emailCommand_ ); - config->writeEntry( "emoticonStyle", emoticonStyle_ ); - config->writeEntry( "fontfamily", font_.family() ); - config->writeEntry( "fontbold", font_.bold() ); - config->writeEntry( "fontitalic", font_.italic() ); - config->writeEntry( "fontunderline", font_.underline() ); - config->writeEntry( "fontpointsize", font_.pointSize() ); - config->writeEntry( "fontColor", fontColor_ ); - config->writeEntry( "friendlyName", friendlyName_ ); - config->writeEntry( "groupfollowupmessages", groupFollowupMessages_ ); - config->writeEntry( "idleTime", idleTime_ ); - config->writeEntry( "notification", notificationDuration_ ); - config->writeEntry( "password", password_ ); - config->writeEntry( "personalMessage", personalMessage_ ); - config->writeEntry( "saveChatPath", saveChatPath_ ); - config->writeEntry( "saveChats", saveChats_ ); - config->writeEntry( "savedChatDirectoryStructure", savedChatDirectoryStructure_ ); - config->writeEntry( "shakeNudge", shakeNudge_ ); - config->writeEntry( "showAllowed", showAllowedContacts_ ); - config->writeEntry( "showByGroup", showContactsByGroup_ ); - config->writeEntry( "showEmail", showEmail_ ); - config->writeEntry( "showListPictures", showListPictures_ ); - config->writeEntry( "showMessageTime", showMessageTime_ ); - config->writeEntry( "showNowListening", showNowListening_ ); - config->writeEntry( "showOfflineContacts", showOfflineContacts_ ); - config->writeEntry( "showOtherFolders", showOtherFolders_ ); - config->writeEntry( "showRemoved", showRemovedContacts_ ); - config->writeEntry( "showSidebar", showSidebar_ ); - config->writeEntry( "initialStatus", initialStatus_ ); - config->writeEntry( "useAutologin", useAutologin_ ); - config->writeEntry( "useContactFont", useContactFont_ ); - config->writeEntry( "useEmoticons", useEmoticons_ ); - config->writeEntry( "useFontEffects", useFontEffects_ ); - config->writeEntry( "useHotmail", useHotmail_ ); - config->writeEntry( "useIdleTimer", useIdleTimer_ ); - config->writeEntry( "showImage", showImage_ ); - } -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - else - { - kdDebug() << "Account::saveProperties(): Account " << handle_ << " is NOT 'dirty', don't save properties." << endl; - } -#endif - - // Save to disk the changes now, to avoid losing data. - config->sync(); -} - - - -// The login succeeded with the new password. Save the temporary password as new account password. -void Account::saveTemporaryPassword() -{ - if( ! temporaryPassword_.isEmpty() && temporaryPassword_ != password_ ) - { - password_ = temporaryPassword_; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::saveTemporaryPassword(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set common alerts information -void Account::setAlertsInformation( bool useIdleTimer, int idleTime, bool shakeNudge, bool showNowListening ) -{ - useIdleTimer_ = useIdleTimer; - idleTime_ = idleTime; - shakeNudge_ = shakeNudge; - - emit changedNotificationsSettings(); - emit changedTimerSettings(); - - if( showNowListening_ != showNowListening ) - { -#ifdef KMESSDEBUG_ACCOUNT_GENERAL - kdDebug() << "Now listening settings changed, notifying listeners." << endl; -#endif - - showNowListening_ = showNowListening; - emit changedNowListeningSettings(); - } - - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setAlertsInformation(): Setting 'dirty' to true." << endl; -#endif -} - - - -// Set notification alerts information -void Account::setNotificationsInformation( bool doNotifyContactsOnline, bool doNotifyContactsStatus, bool doNotifyContactsChatStart, - bool doNotifyContactsChatMessages, bool doNotifyContactsOffline, bool doNotifyEmails, int notificationDuration ) -{ - doNotifyContactsOnline_ = doNotifyContactsOnline; - doNotifyContactsStatus_ = doNotifyContactsStatus; - doNotifyContactsChatStart_ = doNotifyContactsChatStart; - doNotifyContactsChatMessages_ = doNotifyContactsChatMessages; - doNotifyContactsOffline_ = doNotifyContactsOffline; - doNotifyEmails_ = doNotifyEmails; - notificationDuration_ = notificationDuration; - - emit changedNotificationsSettings(); - - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setNotificationsInformation(): Setting 'dirty' to true." << endl; -#endif -} - - - -// Set the auto-reply message. -void Account::setAutoreplyMessage( const QString& autoreplyMessage) -{ - if ( autoreplyMessage_ != autoreplyMessage ) - { - autoreplyMessage_ = autoreplyMessage; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setAutoreplyMessage(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set chat information -void Account::setChatInformation( bool useContactFont, bool useEmoticons, bool useFontEffects, - bool showMessageTime, bool groupFollowupMessages, const QString& chatStyle ) -{ - bool changedSettings = (useContactFont_ != useContactFont) - || (useEmoticons_ != useEmoticons) - || (useFontEffects_ != useFontEffects) - || (showMessageTime_ != showMessageTime) - || (groupFollowupMessages_ != groupFollowupMessages) - || (chatStyle_ != chatStyle); - - // Avoid signals because the chat windows will regenerate all messages. - if( ! changedSettings ) - { - return; - } - - useContactFont_ = useContactFont; - useEmoticons_ = useEmoticons; - useFontEffects_ = useFontEffects; - showMessageTime_ = showMessageTime; - groupFollowupMessages_ = groupFollowupMessages; - chatStyle_ = chatStyle; - emit changedChatStyleSettings(); - dirty_ = true; - -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setChatInformation(): Setting 'dirty' to true." << endl; -#endif -} - - - -// Set chat logging information -void Account::setChatLoggingInformation( bool saveChats, const QString& saveChatPath, const int& directoryStructure ) -{ - if( saveChats_ != saveChats - || saveChatPath_ != saveChatPath - || savedChatDirectoryStructure_ != directoryStructure ) - { - saveChats_ = saveChats; - saveChatPath_ = saveChatPath; - savedChatDirectoryStructure_ = directoryStructure; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setChatLoggingInformation(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set email information -void Account::setEmailInformation( bool useHotmail, const QString& emailCommand, bool showEmail, bool showOtherFolders ) -{ - if( useHotmail_ != useHotmail - || emailCommand_ != emailCommand - || showEmail_ != showEmail - || showOtherFolders_ != showOtherFolders ) - { - useHotmail_ = useHotmail; - emailCommand_ = emailCommand; - showEmail_ = showEmail; - showOtherFolders_ = showOtherFolders; - - emit changedEmailDisplaySettings(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setEmailInformation(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Update the email-supported state (protected method) -void Account::setEmailSupported(bool emailSupported) -{ - emailSupported_ = emailSupported; -} - - - -// Set the font -void Account::setFont( const QFont& font ) -{ - if( font != font_ ) - { - font_ = font; - emit changedFontSettings(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setFont(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set the font color -void Account::setFontColor( const QString& fontColor ) -{ - if( fontColor != fontColor_ ) - { - fontColor_ = fontColor; - emit changedFontSettings(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setFontColor(): Setting 'dirty' to true." << endl; -#endif - } -} - - - - -// Set the fonts and font colors -void Account::setFontInformation( const QFont& font, const QString &fontColor, const QFont& contactFont, const QString &contactFontColor) -{ - bool changedSettings = (font_ != font) - || (fontColor_ != fontColor) - || (contactFont_ != contactFont) - || (contactFontColor_ != contactFontColor); - - // Avoid signals because the chat windows will regenerate all messages. - if( ! changedSettings ) - { - return; - } - - font_ = font; - fontColor_ = fontColor; - contactFont_ = contactFont; - contactFontColor_ = contactFontColor; - emit changedFontSettings(); - dirty_ = true; - -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setFontInformation(): Setting 'dirty' to true." << endl; -#endif -} - - - -// Set the emoticon path -void Account::setEmoticonStyle( const QString& emoticonStyle ) -{ - if( emoticonStyle != emoticonStyle_ ) - { - // Set the new style, and signal EmoticonManager about it. - emoticonStyle_ = emoticonStyle; - emit changedEmoticonSettings(); - - // Tell the account settings changed and need to be saved - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setEmoticonStyle(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Change the friendly name -void Account::setFriendlyName(const QString& newName) -{ - if ( ( newName != "" ) && ( newName != friendlyName_ ) ) - { - friendlyName_ = newName; - emit changedFriendlyName(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setFriendlyName(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Whether the account is a guest account, not permanently saved on the computer -void Account::setGuestAccount( bool guestAccount ) -{ - guestAccount_ = guestAccount; - - // Undelete when user did restore the account. - if( ! guestAccount_ ) - { - deleted_ = false; - } -} - - - -// Change the status to set upon connection -void Account::setInitialStatus( QString status ) -{ - if( initialStatus_ == status ) - { - return; - } - - initialStatus_ = status; - dirty_ = true; - -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setInitialStatus(): Setting 'dirty' to true." << endl; -#endif -} - - - -// Set basic account data -void Account::setLoginInformation( QString handle, QString friendlyName, QString password ) -{ -#ifdef KMESSTEST - ASSERT( handle.contains("@") ); - ASSERT( handle != "" ); -#endif - - if( handle_ != handle.lower() - || friendlyName_ != friendlyName - || ( ! password.isEmpty() && password != password_ ) ) - { - handle_ = handle.lower(); - - // Never change the nickname if the account is not verified. We would receive a server error - if( verified_ ) - { - friendlyName_ = friendlyName; - emit changedFriendlyName(); - } - - if( ! password.isEmpty() ) - { - password_ = password; - } - - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setLoginInformation(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// 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 incoming mail. -void Account::setNotifyEmails( bool doNotifyEmails ) -{ - doNotifyEmails_ = doNotifyEmails; -} - - -// Set the personal message -void Account::setPersonalMessage(const QString& newMessage) -{ - if( newMessage != personalMessage_ ) - { - personalMessage_ = newMessage; - emit changedPersonalMessage(); - - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setPersonalMessage(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set whether or not allowed contacts are shown. -void Account::setShowAllowedContacts( bool showAllowedContacts ) -{ - if( showAllowedContacts != showAllowedContacts_ ) - { - showAllowedContacts_ = showAllowedContacts; - emit changedDisplaySettings(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setShowAllowedContacts(): Setting 'dirty' to true." << endl; -#endif - } -} - - - - -// Set whether contacts are shown by group or by online/offline. -void Account::setShowContactsByGroup( bool showContactsByGroup ) -{ - if ( showContactsByGroup != showContactsByGroup_ ) - { - showContactsByGroup_ = showContactsByGroup; - emit changedViewMode(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setShowContactsByGroup(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set whether offline contacts should be shown. -void Account::setShowOfflineContacts( bool showOfflineContacts ) -{ - if( showOfflineContacts != showOfflineContacts_ ) - { - showOfflineContacts_ = showOfflineContacts; - emit changedDisplaySettings(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setShowOfflineContacts(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set whether or not removed (reverse) contacts are shown. -void Account::setShowRemovedContacts( bool showRemovedContacts ) -{ - if( showRemovedContacts != showRemovedContacts_ ) - { - showRemovedContacts_ = showRemovedContacts; - emit changedDisplaySettings(); - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setShowRemovedContacts(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set whether or not the sidebar should be shown in chats -void Account::setShowSidebar( bool showSidebar ) -{ - if ( showSidebar_ != showSidebar ) - { - showSidebar_ = showSidebar; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setShowSidebar(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set a temporary password for the account for login attempts from the initialview dialog -void Account::setTemporaryPassword( const QString &temporaryPassword ) -{ - temporaryPassword_ = temporaryPassword; -} - - - -// Set whether or not to login with this account. -void Account::setUseAutologin( bool useAutologin) -{ - if( useAutologin != useAutologin_ ) - { - useAutologin_ = useAutologin; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setUseAutologin(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set whether or not to show emoticons in chats. -void Account::setUseEmoticons( bool useEmoticons) -{ - useEmoticons_ = useEmoticons; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setUseEmoticons(): Setting 'dirty' to true." << endl; -#endif -} - - - -// Set whether the account's passport is verified -void Account::setVerified( bool verified ) -{ - verified_ = verified; -} - - - -// Set whether or not to send our display image -void Account::setShowImage( bool showImage ) -{ - if( showImage != showImage_ ) - { - showImage_ = showImage; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setShowImage(): Setting 'dirty' to true." << endl; -#endif - } -} - - - -// Set whether the display pictures of the contacts should be shown in list -void Account::setShowListPictures( bool showPictures) -{ - // No need to update - if( showPictures == showListPictures_ ) - { - return; - } - - showListPictures_ = showPictures; - emit changedDisplaySettings(); - dirty_ = true; - -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kdDebug() << "Account::setShowListPictures(): Setting 'dirty' to true." << endl; -#endif -} - - - -// Creates the MsnObject only if the user wants to show a display picture -void Account::updateMsnObject() -{ - QString oldMsnString; - QString newMsnString; - - if( msnObject_ ) - { - oldMsnString = msnObject_->objectString(); - delete msnObject_; - msnObject_ = 0; - } - -#ifdef KMESSDEBUG_ACCOUNT_GENERAL - kdDebug() << "Account::updateMsnObject: Show Image: " << showImage_ << endl; -#endif - - if ( showImage_ ) - { -#ifdef KMESSDEBUG_ACCOUNT_GENERAL - kdDebug() << "Account::updateMsnObject: Image source: " << getImagePath() << endl; -#endif - - QFile iFile( getImagePath() ); - if ( iFile.open( IO_ReadOnly ) ) - { - QByteArray data = iFile.readAll(); - iFile.close(); - - msnObject_ = new MsnObject( handle_, "KMess.tmp", "", MsnObject::DISPLAYPIC, data ); - newMsnString = msnObject_->objectString(); - } - else - { - kdWarning() << "Account::updateMsnObject() - Image could not be loaded: " << getImagePath() << endl; - } - } - - // Detect if there was a change. - if(oldMsnString != newMsnString) - { -#ifdef KMESSDEBUG_ACCOUNT_GENERAL - kdDebug() << "Account::updateMsnObject: result is: '" << newMsnString << "'" << endl; -#endif - emit changedMsnObject(); - } -} - - -#include "account.moc" diff --git a/kmess/actions/.cvsignore b/kmess/actions/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/actions/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/actions/Makefile.am b/kmess/actions/Makefile.am deleted file mode 100644 index a28c13d..0000000 --- a/kmess/actions/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libactions.a - -INCLUDES = $(all_includes) - -libactions_a_METASOURCES = AUTO - -libactions_a_SOURCES = accountaction.cpp - - -EXTRA_DIST = accountaction.cpp accountaction.h - -####### kdevelop will overwrite this part!!! (end)############ diff --git a/kmess/actions/Makefile.in b/kmess/actions/Makefile.in deleted file mode 100644 index a99fbf8..0000000 --- a/kmess/actions/Makefile.in +++ /dev/null @@ -1,713 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -SOURCES = $(libactions_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/actions -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libactions_a_AR = $(AR) $(ARFLAGS) -libactions_a_LIBADD = -am_libactions_a_OBJECTS = accountaction.$(OBJEXT) -#>- libactions_a_OBJECTS = $(am_libactions_a_OBJECTS) -#>+ 1 -libactions_a_OBJECTS = accountaction.$(OBJEXT) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/accountaction.Po -#>+ 1 -@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/accountaction.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libactions_a_SOURCES) -DIST_SOURCES = $(libactions_a_SOURCES) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libactions.a -INCLUDES = $(all_includes) -#>- libactions_a_METASOURCES = AUTO -libactions_a_SOURCES = accountaction.cpp -EXTRA_DIST = accountaction.cpp accountaction.h -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/actions/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/actions/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/actions/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/actions/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/actions/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libactions.a: $(libactions_a_OBJECTS) $(libactions_a_DEPENDENCIES) - -rm -f libactions.a - $(libactions_a_AR) libactions.a $(libactions_a_OBJECTS) $(libactions_a_LIBADD) - $(RANLIB) libactions.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accountaction.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-bcheck clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - - -####### kdevelop will overwrite this part!!! (end)############ -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -accountaction.moc: $(srcdir)/accountaction.h - $(MOC) $(srcdir)/accountaction.h -o accountaction.moc - -#>+ 2 -mocs: accountaction.moc - -#>+ 3 -clean-metasources: - -rm -f accountaction.moc - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/actions/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/actions/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/actions/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 5 -nmcheck: -accountaction.lo: accountaction.moc -nmcheck-am: nmcheck -accountaction.o: accountaction.moc diff --git a/kmess/autologinview.cpp b/kmess/autologinview.cpp deleted file mode 100644 index 6a8d182..0000000 --- a/kmess/autologinview.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/*************************************************************************** - autologinview.cpp - description - ------------------- - begin : Mon Feb 10 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 "autologinview.h" - -#include -#include -#include -#include -#include - -#include -#include - -// The constructor -AutologinView::AutologinView(QWidget *parent, const char *name ) - : QWidget(parent,name) -{ - KIconLoader *loader = KGlobal::iconLoader(); - QFont font; - - // Select an image to load into the main screen.. mmmm, eggs! - // Applied both in InitialView and AutologinView. - QString imageName; - QDate currentDate = QDate::currentDate(); - if( currentDate.month() == 12 && currentDate.day() > 15 ) - { - imageName = "kmesslogo2"; - } - else - { - imageName = "kmesslogo"; - } - - setPaletteBackgroundColor( QColor( 85, 170, 255 ) ); - - QVBoxLayout *mainLayout = new QVBoxLayout( this, 0, 0, "mainLayout" ); - - // Create label with the chosen icon - QPixmap icon = loader->loadIcon( imageName, KIcon::User ); - QLabel *logoPixmapLabel = new QLabel( this, "logoPixmapLabel" ); - logoPixmapLabel->setScaledContents( FALSE ); - logoPixmapLabel->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignHCenter ) ); - logoPixmapLabel->setPixmap( icon ); - logoPixmapLabel->setMinimumSize( icon.width(), icon.height() ); - - // Add to layout - mainLayout->addWidget( logoPixmapLabel ); - - // Creater logging in label - QLabel *connectingLabel = new QLabel( i18n("Logging in..."), this, "connectingLabel" ); - connectingLabel->setPaletteForegroundColor( Qt::black ); - connectingLabel->setAlignment( int( QLabel::AlignHCenter ) ); - - // Make fond bold - font = connectingLabel->font(); - font.setPointSize( 18 ); - font.setBold( true ); - connectingLabel->setFont( font ); - - // Add to layout - mainLayout->addWidget( connectingLabel ); -} - - - -// The destructor -AutologinView::~AutologinView() -{ -} - -#include "autologinview.moc" diff --git a/kmess/chat/.cvsignore b/kmess/chat/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/chat/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/chat/Makefile.am b/kmess/chat/Makefile.am deleted file mode 100644 index dd94e1a..0000000 --- a/kmess/chat/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libchat.a - -INCLUDES = $(all_includes) - -libchat_a_METASOURCES = AUTO - -libchat_a_SOURCES = chatmaster.cpp chatmessage.cpp chatmessagestyle.cpp \ - chatmessageview.cpp chatview.cpp chatviewinterface.ui chatwindow.cpp \ - chatwindowinterface.cpp contactaction.cpp contactframe.cpp contactframeinterface.ui \ - contactsidebar.cpp emoticonbutton.cpp emoticonsidebar.cpp websidebar.cpp \ - xsltransformation.cpp - -AM_CPPFLAGS = $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) - -noinst_HEADERS = websidebar.h xsltransformation.h chatview.h contactframe.h \ - contactsidebar.h emoticonbutton.h chatmaster.h chatwindowinterface.h \ - contactaction.h chatwindow.h chatmessage.h chatmessagestyle.h chatmessageview.h \ - emoticonsidebar.h - -####### kdevelop will overwrite this part!!! (end)############ diff --git a/kmess/chat/Makefile.in b/kmess/chat/Makefile.in deleted file mode 100644 index af51cf7..0000000 --- a/kmess/chat/Makefile.in +++ /dev/null @@ -1,963 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libchat_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/chat -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libchat_a_AR = $(AR) $(ARFLAGS) -libchat_a_LIBADD = -am_libchat_a_OBJECTS = chatmaster.$(OBJEXT) chatmessage.$(OBJEXT) \ - chatmessagestyle.$(OBJEXT) chatmessageview.$(OBJEXT) \ - chatview.$(OBJEXT) chatwindow.$(OBJEXT) \ - chatwindowinterface.$(OBJEXT) contactaction.$(OBJEXT) \ - contactframe.$(OBJEXT) contactsidebar.$(OBJEXT) \ - emoticonbutton.$(OBJEXT) emoticonsidebar.$(OBJEXT) \ - websidebar.$(OBJEXT) xsltransformation.$(OBJEXT) -#>- libchat_a_OBJECTS = $(am_libchat_a_OBJECTS) -#>+ 10 -libchat_a_final_OBJECTS = libchat_a.all_cpp.o -libchat_a_nofinal_OBJECTS = chatmaster.$(OBJEXT) chatmessage.$(OBJEXT) \ - chatmessagestyle.$(OBJEXT) chatmessageview.$(OBJEXT) \ - chatview.$(OBJEXT) chatwindow.$(OBJEXT) \ - chatwindowinterface.$(OBJEXT) contactaction.$(OBJEXT) \ - contactframe.$(OBJEXT) contactsidebar.$(OBJEXT) \ - emoticonbutton.$(OBJEXT) emoticonsidebar.$(OBJEXT) \ - websidebar.$(OBJEXT) xsltransformation.$(OBJEXT) chatviewinterface.$(OBJEXT) contactframeinterface.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libchat_a_OBJECTS = $(libchat_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libchat_a_OBJECTS = $(libchat_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/chatmaster.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/chatmessage.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/chatmessagestyle.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/chatmessageview.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/chatview.Po ./$(DEPDIR)/chatwindow.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/chatwindowinterface.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactaction.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactframe.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactsidebar.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/emoticonbutton.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/emoticonsidebar.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/websidebar.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/xsltransformation.Po -#>+ 26 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/chatviewinterface.P $(DEPDIR)/contactframeinterface.P $(DEPDIR)/libchat_a.all_cpp.P ./$(DEPDIR)/chatmaster.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatmessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatmessagestyle.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatmessageview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatview.Po ./$(DEPDIR)/chatwindow.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatwindowinterface.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactaction.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactframe.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactsidebar.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonbutton.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonsidebar.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/websidebar.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/xsltransformation.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/chatviewinterface.P $(DEPDIR)/contactframeinterface.P ./$(DEPDIR)/chatmaster.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatmessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatmessagestyle.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatmessageview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatview.Po ./$(DEPDIR)/chatwindow.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/chatwindowinterface.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactaction.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactframe.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactsidebar.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonbutton.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonsidebar.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/websidebar.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/xsltransformation.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libchat_a_SOURCES) -DIST_SOURCES = $(libchat_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libchat.a -INCLUDES = $(all_includes) -#>- libchat_a_METASOURCES = AUTO -#>- libchat_a_SOURCES = chatmaster.cpp chatmessage.cpp chatmessagestyle.cpp \ -#>- chatmessageview.cpp chatview.cpp chatviewinterface.ui chatwindow.cpp \ -#>- chatwindowinterface.cpp contactaction.cpp contactframe.cpp contactframeinterface.ui \ -#>- contactsidebar.cpp emoticonbutton.cpp emoticonsidebar.cpp websidebar.cpp \ -#>- xsltransformation.cpp -#>+ 5 -libchat_a_SOURCES=chatmaster.cpp chatmessage.cpp chatmessagestyle.cpp \ - chatmessageview.cpp chatview.cpp chatwindow.cpp \ - chatwindowinterface.cpp contactaction.cpp contactframe.cpp \ - contactsidebar.cpp emoticonbutton.cpp emoticonsidebar.cpp websidebar.cpp \ - xsltransformation.cpp chatviewinterface.cpp contactframeinterface.cpp - -AM_CPPFLAGS = $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) -noinst_HEADERS = websidebar.h xsltransformation.h chatview.h contactframe.h \ - contactsidebar.h emoticonbutton.h chatmaster.h chatwindowinterface.h \ - contactaction.h chatwindow.h chatmessage.h chatmessagestyle.h chatmessageview.h \ - emoticonsidebar.h - -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/chat/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/chat/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/chat/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/chat/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/chat/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libchat.a: $(libchat_a_OBJECTS) $(libchat_a_DEPENDENCIES) - -rm -f libchat.a - $(libchat_a_AR) libchat.a $(libchat_a_OBJECTS) $(libchat_a_LIBADD) - $(RANLIB) libchat.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatmaster.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatmessage.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatmessagestyle.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatmessageview.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatview.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatwindow.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatwindowinterface.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactaction.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactframe.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactsidebar.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emoticonbutton.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emoticonsidebar.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/websidebar.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsltransformation.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-ui clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - - -####### kdevelop will overwrite this part!!! (end)############ -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -chatmessageview.moc: $(srcdir)/chatmessageview.h - $(MOC) $(srcdir)/chatmessageview.h -o chatmessageview.moc - -#>+ 2 -mocs: chatmessageview.moc - -#>+ 3 -chatmessagestyle.moc: $(srcdir)/chatmessagestyle.h - $(MOC) $(srcdir)/chatmessagestyle.h -o chatmessagestyle.moc - -#>+ 2 -mocs: chatmessagestyle.moc - -#>+ 3 -chatwindow.moc: $(srcdir)/chatwindow.h - $(MOC) $(srcdir)/chatwindow.h -o chatwindow.moc - -#>+ 2 -mocs: chatwindow.moc - -#>+ 3 -contactsidebar.moc: $(srcdir)/contactsidebar.h - $(MOC) $(srcdir)/contactsidebar.h -o contactsidebar.moc - -#>+ 2 -mocs: contactsidebar.moc - -#>+ 3 -emoticonsidebar.moc: $(srcdir)/emoticonsidebar.h - $(MOC) $(srcdir)/emoticonsidebar.h -o emoticonsidebar.moc - -#>+ 2 -mocs: emoticonsidebar.moc - -#>+ 3 -contactframe.moc: $(srcdir)/contactframe.h - $(MOC) $(srcdir)/contactframe.h -o contactframe.moc - -#>+ 2 -mocs: contactframe.moc - -#>+ 3 -websidebar.moc: $(srcdir)/websidebar.h - $(MOC) $(srcdir)/websidebar.h -o websidebar.moc - -#>+ 2 -mocs: websidebar.moc - -#>+ 3 -chatmaster.moc: $(srcdir)/chatmaster.h - $(MOC) $(srcdir)/chatmaster.h -o chatmaster.moc - -#>+ 2 -mocs: chatmaster.moc - -#>+ 3 -chatview.moc: $(srcdir)/chatview.h - $(MOC) $(srcdir)/chatview.h -o chatview.moc - -#>+ 2 -mocs: chatview.moc - -#>+ 3 -chatwindowinterface.moc: $(srcdir)/chatwindowinterface.h - $(MOC) $(srcdir)/chatwindowinterface.h -o chatwindowinterface.moc - -#>+ 2 -mocs: chatwindowinterface.moc - -#>+ 3 -emoticonbutton.moc: $(srcdir)/emoticonbutton.h - $(MOC) $(srcdir)/emoticonbutton.h -o emoticonbutton.moc - -#>+ 2 -mocs: emoticonbutton.moc - -#>+ 3 -contactaction.moc: $(srcdir)/contactaction.h - $(MOC) $(srcdir)/contactaction.h -o contactaction.moc - -#>+ 2 -mocs: contactaction.moc - -#>+ 3 -clean-metasources: - -rm -f chatmessageview.moc chatmessagestyle.moc chatwindow.moc contactsidebar.moc emoticonsidebar.moc contactframe.moc websidebar.moc chatmaster.moc chatview.moc chatwindowinterface.moc emoticonbutton.moc contactaction.moc - -#>+ 2 -KDE_DIST=chatviewinterface.ui configure.in.in Makefile.in contactframeinterface.ui Makefile.am - -#>+ 5 -clean-ui: - -rm -f \ - chatviewinterface.cpp chatviewinterface.h chatviewinterface.moc \ - contactframeinterface.cpp contactframeinterface.h contactframeinterface.moc - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/chat/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/chat/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/chat/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libchat_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/chatmaster.cpp $(srcdir)/chatmessage.cpp $(srcdir)/chatmessagestyle.cpp $(srcdir)/chatmessageview.cpp $(srcdir)/chatview.cpp $(srcdir)/chatwindow.cpp $(srcdir)/chatwindowinterface.cpp $(srcdir)/contactaction.cpp $(srcdir)/contactframe.cpp $(srcdir)/contactsidebar.cpp $(srcdir)/emoticonbutton.cpp $(srcdir)/emoticonsidebar.cpp $(srcdir)/websidebar.cpp $(srcdir)/xsltransformation.cpp chatviewinterface.cpp contactframeinterface.cpp chatmessageview.moc contactframeinterface.moc chatmessagestyle.moc chatwindow.moc contactframe.moc emoticonsidebar.moc contactsidebar.moc websidebar.moc chatmaster.moc chatview.moc chatwindowinterface.moc emoticonbutton.moc chatviewinterface.moc contactaction.moc - @echo 'creating libchat_a.all_cpp.cpp ...'; \ - rm -f libchat_a.all_cpp.files libchat_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libchat_a.all_cpp.final; \ - for file in chatmaster.cpp chatmessage.cpp chatmessagestyle.cpp chatmessageview.cpp chatview.cpp chatwindow.cpp chatwindowinterface.cpp contactaction.cpp contactframe.cpp contactsidebar.cpp emoticonbutton.cpp emoticonsidebar.cpp websidebar.cpp xsltransformation.cpp chatviewinterface.cpp contactframeinterface.cpp ; do \ - echo "#include \"$$file\"" >> libchat_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libchat_a.all_cpp.final; \ - done; \ - cat libchat_a.all_cpp.final libchat_a.all_cpp.files > libchat_a.all_cpp.cpp; \ - rm -f libchat_a.all_cpp.final libchat_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libchat_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libchat_a_OBJECTS="$(libchat_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libchat_a_OBJECTS="$(libchat_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libchat_a_OBJECTS="$(libchat_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libchat_a_OBJECTS="$(libchat_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 41 -$(srcdir)/xsltransformation.cpp: chatviewinterface.h contactframeinterface.h -$(srcdir)/chatview.cpp: chatviewinterface.h contactframeinterface.h -chatmaster.lo: chatmaster.moc -chatwindow.lo: chatwindow.moc -chatmessageview.lo: chatmessageview.moc -chatwindowinterface.o: chatwindowinterface.moc -contactframe.o: contactframe.moc -chatwindow.o: chatwindow.moc -emoticonbutton.o: emoticonbutton.moc -chatview.o: chatview.moc -$(srcdir)/contactaction.cpp: chatviewinterface.h contactframeinterface.h -$(srcdir)/chatwindowinterface.cpp: chatviewinterface.h contactframeinterface.h -nmcheck-am: nmcheck -$(srcdir)/chatmessagestyle.cpp: chatviewinterface.h contactframeinterface.h -chatmessagestyle.o: chatmessagestyle.moc -$(srcdir)/emoticonbutton.cpp: chatviewinterface.h contactframeinterface.h -$(srcdir)/contactframe.cpp: chatviewinterface.h contactframeinterface.h -contactaction.lo: contactaction.moc -contactsidebar.o: contactsidebar.moc -emoticonsidebar.o: emoticonsidebar.moc -chatmaster.o: chatmaster.moc -websidebar.lo: websidebar.moc -chatview.lo: chatview.moc -contactaction.o: contactaction.moc -$(srcdir)/emoticonsidebar.cpp: chatviewinterface.h contactframeinterface.h -$(srcdir)/websidebar.cpp: chatviewinterface.h contactframeinterface.h -$(srcdir)/chatmessage.cpp: chatviewinterface.h contactframeinterface.h -$(srcdir)/contactsidebar.cpp: chatviewinterface.h contactframeinterface.h -emoticonsidebar.lo: emoticonsidebar.moc -$(srcdir)/chatwindow.cpp: chatviewinterface.h contactframeinterface.h -emoticonbutton.lo: emoticonbutton.moc -nmcheck: -contactsidebar.lo: contactsidebar.moc -$(srcdir)/chatmessageview.cpp: chatviewinterface.h contactframeinterface.h -$(srcdir)/chatmaster.cpp: chatviewinterface.h contactframeinterface.h -contactframe.lo: contactframe.moc -chatmessageview.o: chatmessageview.moc -chatmessagestyle.lo: chatmessagestyle.moc -chatwindowinterface.lo: chatwindowinterface.moc -websidebar.o: websidebar.moc - -#>+ 30 -chatviewinterface.cpp: $(srcdir)/chatviewinterface.ui chatviewinterface.h chatviewinterface.moc - rm -f chatviewinterface.cpp - echo '#include ' > chatviewinterface.cpp - echo '#include ' >> chatviewinterface.cpp - $(UIC) -tr ${UIC_TR} -i chatviewinterface.h $(srcdir)/chatviewinterface.ui > chatviewinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" chatviewinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_chatviewinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> chatviewinterface.cpp ;\ - rm -f chatviewinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "chatviewinterface.moc"' >> chatviewinterface.cpp; else rm -f chatviewinterface.cpp ; exit $$ret ; fi - -chatviewinterface.h: $(srcdir)/chatviewinterface.ui - rm -rf chatviewinterface.h; - $(UIC) $(srcdir)/chatviewinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> chatviewinterface.h ; -chatviewinterface.moc: chatviewinterface.h - $(MOC) chatviewinterface.h -o chatviewinterface.moc - -contactframeinterface.cpp: $(srcdir)/contactframeinterface.ui contactframeinterface.h contactframeinterface.moc - rm -f contactframeinterface.cpp - echo '#include ' > contactframeinterface.cpp - echo '#include ' >> contactframeinterface.cpp - $(UIC) -tr ${UIC_TR} -i contactframeinterface.h $(srcdir)/contactframeinterface.ui > contactframeinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" contactframeinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_contactframeinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> contactframeinterface.cpp ;\ - rm -f contactframeinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "contactframeinterface.moc"' >> contactframeinterface.cpp; else rm -f contactframeinterface.cpp ; exit $$ret ; fi - -contactframeinterface.h: $(srcdir)/contactframeinterface.ui - rm -rf contactframeinterface.h; - $(UIC) $(srcdir)/contactframeinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> contactframeinterface.h ; -contactframeinterface.moc: contactframeinterface.h - $(MOC) contactframeinterface.h -o contactframeinterface.moc diff --git a/kmess/chat/chatmaster.cpp b/kmess/chat/chatmaster.cpp deleted file mode 100644 index a44c6da..0000000 --- a/kmess/chat/chatmaster.cpp +++ /dev/null @@ -1,1595 +0,0 @@ -/*************************************************************************** - chatmaster.cpp - description - ------------------- - begin : Sat Jan 18 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 "chatmaster.h" - -#include "chatwindow.h" -#include "chatmessage.h" - -#include "../currentaccount.h" -#include "../kmessdebug.h" -#include "../msnobject.h" - -#include "../contact/contact.h" -#include "../contact/contactlist.h" -#include "../network/msnswitchboardconnection.h" - -#include "../network/applications/applicationlist.h" -#include "../network/applications/mimeapplication.h" -#include "../network/applications/p2papplication.h" -#include "../network/applications/picturetransferp2p.h" -#include "../network/applications/filetransfer.h" -#include "../network/applications/filetransferp2p.h" -#include "../network/applications/gnomemeeting.h" - -#include -#include - -#include -#include - - - -// The constructor -ChatMaster::ChatMaster(QObject *parent) - : QObject(parent, "ChatMaster"), - initialized_(false) -{ - pendingDisplayPictures_.clear(); - pendingMimeMessages_.setAutoDelete(true); -} - - - -// The destructor -ChatMaster::~ChatMaster() -{ - disconnected(); - -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::~ChatMaster() - DESTROYED." << endl; -#endif -} - - -// The user has disconnected, so close all open chats and switchboard connections -void ChatMaster::disconnected() -{ - if( chatWindows_.count() > 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::disconnected() - Closing " << chatWindows_.count() << " open chat windows." << endl; -#endif - - // Go through all the chat windows - ChatWindow *chatWindow; - QPtrListIterator it( chatWindows_ ); - while( ( chatWindow = it.current() ) != 0 ) - { - ++it; - - // Disconnect the chat windows so they won't cause problems - chatWindow->setSwitchboardConnection( 0 ); - - // We should disable each and every part you can input to, not the whole window - chatWindow->disable(); - } - - // Clear the chat window collection - chatWindows_.setAutoDelete(false); - chatWindows_.clear(); - } - - if( switchboardConnections_.count() > 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::disconnected() - Closing open switchboards." << endl; -#endif - - MsnSwitchboardConnection *current; - QPtrListIterator it( switchboardConnections_ ); - while( ( current = it.current() ) != 0 ) - { - ++it; - - delete current; - } - } -} - - - -// Forward the signal of a new incoming message from a chat window -void ChatMaster::forwardNewChatMessage( const ChatMessage &message, ChatWindow *chatWindow ) -{ -#ifdef KMESSTEST - ASSERT( chatWindow != 0 ); -#endif -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::forwardNewChatMessage() - Forwarding the new chat message signal." << endl; -#endif - emit newChatMessage( message, chatWindow ); -} - - - -// Forward a new switchboard server request signal coming from an existing switchboard connection -void ChatMaster::forwardRequestNewSwitchboard( QString handle ) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::forwardRequestSwitchboard() - Forwarding the new switchboard request signal for " - << handle << "." << endl; -#endif - - emit requestSwitchboard( handle, ChatInformation::CONNECTION_REFRESH ); -} - - - -// Forward a request to add or remove a contact from the contactlist, which comes from the ContactFrame. -void ChatMaster::forwardSetContactAdded( QString handle, bool isAdded ) -{ - if( isAdded ) - { - emit addContact( handle ); - } - else - { - emit removeContact( handle, false ); - } -} - - - -// Forward a request to allow a contact, which comes from the ContactFrame. -void ChatMaster::forwardSetContactAllowed( QString handle ) -{ - emit allowContact( handle ); -} - - - -// Forward a request to block or unblock a contact, which comes from the ContactFrame. -void ChatMaster::forwardSetContactBlocked( QString handle, bool isBlocked ) -{ - if( isBlocked ) - { - emit blockContact( handle ); - } - else - { - emit unblockContact( handle ); - } -} - - - -// Return the application list for a given contact -ApplicationList * ChatMaster::getApplicationList(const QString &handle) -{ - ApplicationList *appList = 0; - - // Get the contact. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle(handle); - if(KMESS_NULL(contact)) return 0; - - // Get the application list - if( contact->hasApplicationList() ) - { - appList = contact->getApplicationList(); - } - else - { - // Create object if it wasn't created yet for this contact. -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::getApplicationList() - Creating application list for contact " << handle << endl; -#endif - appList = contact->createApplicationList(); - - // Connect signals from the applist - connect( appList, SIGNAL( newApplication(Application*) ), // A new application was created. - this, SLOT( slotConnectApplication(Application*) )); - connect( appList, SIGNAL( putMsg(const MimeMessage&, const QString&, bool) ), // Request to send message - this, SLOT( slotDeliverMimeMessage(const MimeMessage&, const QString&, bool) )); - } - - return appList; -} - - - -// Return the chat window which uses the given switchboard connection -ChatWindow * ChatMaster::getChatWindowBySwitchboard(const MsnSwitchboardConnection *connection) -{ - // Look through the chat windows for an exclusive chat with the contact given - for( ChatWindow *chatWindow = chatWindows_.first(); chatWindow; chatWindow = chatWindows_.next() ) - { - if( chatWindow->getSwitchboardConnection() == connection ) - { - return chatWindow; - } - } - - return 0; -} - - - -// Return the chat window where we're having an conversation with the given contact. -ChatWindow * ChatMaster::getContactChatWindow(const QString &handle, bool privateChat) -{ - ChatWindow *result = 0; - - // Look through the chat windows for an exclusive chat with the contact given - for( ChatWindow *chatWindow = chatWindows_.first(); chatWindow; chatWindow = chatWindows_.next() ) - { - if( chatWindow->isExclusiveChatWithContact(handle) ) - { - return chatWindow; // best candidate found. - } - else if( ! privateChat && chatWindow->isContactInChat( handle ) ) - { - result = chatWindow; // keep as option. - } - } - - return result; -} - - - -// Return the chat window where we're having a conversation with the given contacts. -ChatWindow *ChatMaster::getContactsChatWindow( const QStringList &handles ) -{ - // Do nothing if there are no open chats or if the list is empty (faster) - if( handles.isEmpty() || chatWindows_.isEmpty() ) - { - return 0; - } - - ChatWindow *result = 0; - - // Look through the chat windows for a group chat with all the list's contacts - for( ChatWindow *chatWindow = chatWindows_.first(); chatWindow; chatWindow = chatWindows_.next() ) - { - bool found = true; - - // Check every contact in the list to see if they're all present in this chat - for( QStringList::ConstIterator it = handles.begin(); it != handles.end(); ++it ) - { - if( ! chatWindow->isContactInChat( *it ) ) - { - found = false; - break; - } - } - - if( found ) - { - result = chatWindow; - break; - } - } - - return result; -} - - - -// Return the chat connection where we're having an conversation with the given contact. -MsnSwitchboardConnection * ChatMaster::getContactSwitchboardConnection(const QString &handle, bool privateChat) -{ - MsnSwitchboardConnection *current; - QPtrListIterator it( switchboardConnections_ ); - while( ( current = it.current() ) != 0 ) - { - ++it; - - if( ! current->isContactInChat( handle ) ) - { - continue; - } - - if( ( ! privateChat ) - || ( privateChat && current->isExclusiveChatWithContact( handle ) ) ) - { - return current; - } - } - - return 0; - - // TODO: I've replaced this method's code to use ChatMaster's internal list of switchboards. If it works correctly, - // the old code, commented below, can be deleted later on, maybe for 1.5 final. - /* - ContactBase *contact = CurrentAccount::instance()->getContactByHandle(handle); - if(KMESS_NULL(contact)) return 0; - - MsnSwitchboardConnection *connection; - - // Get the connections directly from the contact, no need to navigate through all chat windows. - const QPtrList &connections = contact->getSwitchboardConnections(); - QPtrListIterator it(connections); - - MsnSwitchboardConnection *result = 0; - while( it.current() != 0 ) - { - connection = it.current(); - if( connection->isExclusiveChatWithContact(handle) ) - { - return connection; // best candidate found - } - else if( ! privateChat && connection->isContactInChat(handle) ) - { - result = connection; // keep as option. - } - - ++it; - } - - // Have a second try, check for currently inactive switchboards. - if( result == 0 ) - { - QPtrListIterator it( switchboardConnections_ ); - while( it.current() != 0 ) - { - connection = it.current(); - if( connection->isEmpty() && connection->getLastContact() == handle ) - { - return connection; - } - ++it; - } - } - - return result; - */ -} - - - -// Initialize the class -bool ChatMaster::initialize() -{ - if ( initialized_ ) - { - kdDebug() << "ChatMaster::initialize() - Already initialized." << endl; - return false; - } - - // Connect the contact. - CurrentAccount *currentAccount = CurrentAccount::instance(); - const ContactList *contactList = currentAccount->getContactList(); - connect( contactList, SIGNAL( contactChangedMsnObject(Contact*) ), - this, SLOT ( slotContactChangedMsnObject(Contact*) )); - - initialized_ = true; - return true; -} - - - -// Check whether the contact is in any of the existing chat windows. -bool ChatMaster::isContactInChat( const QString &handle ) -{ - // Find the chat window where we have an exclusive chat - return ( getContactChatWindow( handle, false ) != 0 ); -} - - - -// Verify if a new chat can be opened and requests a switchboard -void ChatMaster::requestChat( QString handle ) -{ - // Look through the chat windows for an exclusive chat with the given contact - ChatWindow *chatWindow = getContactChatWindow( handle, true ); - - // Create a new one if needed - if( chatWindow == 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::requestChat() - Requesting a connection to " << handle << endl; -#endif - - emit requestSwitchboard( handle, ChatInformation::CONNECTION_CHAT ); - } - else - { - // Or notify about the presence of the existing one. - raiseChat( chatWindow, true ); - } -} - - - -// A chat window is closing -void ChatMaster::slotChatWindowClosing(QObject *chatWindow) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotChatWindowClosing() - Marking chat window as closing." << endl; -#endif - - // Make sure this chat window don't receive new messages. - ChatWindow *window = static_cast( chatWindow ); - closingChatWindows_.append( window ); - - // The contains check avoids deleting references to old switchboards which may be outdated and don't exist anymore. - MsnSwitchboardConnection *switchboard = window->getSwitchboardConnection(); - if( switchboard && switchboardConnections_.contains( switchboard ) ) - { - delete switchboard; - } -} - - -// A chat window was destroyed -void ChatMaster::slotChatWindowDestroyed(QObject *chatWindow) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotChatWindowDestroyed() - Removing chat window from list." << endl; -#endif - - // Remove from the list - ChatWindow *window = static_cast( chatWindow ); - chatWindows_ .remove( window ); - closingChatWindows_ .remove( window ); -} - - - -// A new application was created for a contact. -void ChatMaster::slotConnectApplication(Application *application) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotConnectApplication() - Connecting application signals." << endl; -#endif - - connect( application, SIGNAL( applicationMessage(const ChatMessage&) ), - this, SLOT( showSpecialMessage(const ChatMessage&) ) ); -} - - - -// Append the message to the queue, waiting to be delivered -void ChatMaster::queueMessage( const MimeMessage &message, const QString &handle, bool privateChatRequired ) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::queueMessage() - Adding message for '" << handle << "' to the queue " - << "(size=" << ( pendingMimeMessages_.count() + 1 ) << ")." << endl; -#endif - // NOTE: Store these pending in ApplicationList class instead? - - PendingMimeMessage *pending = new PendingMimeMessage; - pending->handle = handle; - pending->message = message; - pending->privateChatRequired = privateChatRequired; - - // No active connection found. - // Request a new chat with the contact, keep the message pending. - pendingMimeMessages_.append( pending ); -} - - - -// Raise an existing chat window. Forcing a raise is reasonable only when the user requests to, since it makes the window -// to grab keyboard focus and be raised on top of other windows. -void ChatMaster::raiseChat( ChatWindow *chatWindow, bool force ) -{ - if( chatWindow == 0 || ! chatWindows_.contains( chatWindow ) ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::raiseChat() - Invalid raising request received; chat is probably already closed." << endl; -#endif - return; - } - - // 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->hasFocus() ) - { - return; - } - - if( force ) - { - chatWindow->hide(); - - if( chatWindow->isMinimized() ) - chatWindow->showNormal(); - else - chatWindow->show(); - } - else if( chatWindow->isHidden() ) - { - chatWindow->showMinimized(); - } - - // Along with notifying about it, also force the window to show and receive focus. - if( force ) - { - chatWindow->raise(); - chatWindow->setFocus(); - chatWindow->setActiveWindow(); - } -} - - - -/** - * @brief Send all pending mime messages for the contact. - * @param handle The contact to send messages for. - * @param connection The switchboard connection that can be used to send the messages. - */ -void ChatMaster::sendPendingMimeMessages( const QString &handle, MsnSwitchboardConnection *connection ) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster: Sending pending messages for contact " << handle << ", if any." << endl; -#endif - - bool isPrivateChat = (connection->getContactsInChat().size() < 2); - - PendingMimeMessage *pendingMimeMessage = pendingMimeMessages_.first(); - while( pendingMimeMessage != 0 ) - { - // Ignore messages for other contacts - if( pendingMimeMessage->handle != handle ) - { - // Get next message - pendingMimeMessage = pendingMimeMessages_.next(); - continue; - } - - // Ignore messages that can only be sent on a private chat. - if( pendingMimeMessage->privateChatRequired && ! isPrivateChat ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster: Switchboard is not a private chat, keeping message in queue." << endl; -#endif - - // Get next message - pendingMimeMessage = pendingMimeMessages_.next(); - continue; - } - - // Check when the connection is busy again - if( connection->isBusy() ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster: Switchboard is busy again, keeping remaining messages in the queue." << endl; -#endif - return; - } - - // Check whether the contact is still in the chat. - if( ! connection->isConnected() || ! connection->getContactsInChat().contains( handle ) ) - { - // getContactsInChat() may be empty, don't re-invite the last contact to deviver the message -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster: Switchboard is not connected or contact left chat, keeping remaining messages in the queue." << endl; -#endif - return; - } - - // Send the message - connection->sendApplicationMessage( pendingMimeMessage->message ); - - // Remove from queue - pendingMimeMessages_.remove( pendingMimeMessage ); // updates current() - pendingMimeMessage = pendingMimeMessages_.current(); - } -} - - - -// Deliver a chat message to the chat window (can be an Application message or an Offline-IM from MsnNotificationConnection). -void ChatMaster::showSpecialMessage( const ChatMessage &message ) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::showSpecialMessage() - Delivering application/OIM chat message to chat window." << endl; -#endif - - const QString &handle = message.getContactHandle(); - -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::showSpecialMessage() - Message info, Contact: " << handle << " - Message body: '" << message.getBody() << "' - " - "Message type: " << message.getType() << " - Message class: " << message.getContentsClass() << "." << endl; -#endif - - ChatWindow *chatWindow = getContactChatWindow( handle, true ); - - // Deliver the message to the contact's chat window - if( chatWindow != 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::showSpecialMessage() - Chat window exists, delivering message." << endl; -#endif - - // The chat window is currently closing - if( closingChatWindows_.contains( chatWindow ) ) - { - if( message.isNormalMessage() ) - { - // TODO: Sometimes, you close a window when the other contact sends a new message, and you lose it. - // Maybe it's possible to avoid the loss, for example with a notification balloon to notify of the message. - kdWarning() << "ChatMaster::showSpecialMessage() - Chat window is closing, suppressing message '" << message.getBody() << "' from '" << handle << "'." << endl; - } -#ifdef KMESSDEBUG_CHATMASTER - else - { - kdDebug() << "ChatMaster::showSpecialMessage() - Chat window is closing, suppressing message." << endl; - } -#endif - - return; - } - - chatWindow->receivedMessage( message ); - return; - } - - // No window is available - we should check if it's needed to create a new window, or if the message - // can be safely ignored. - switch( message.getContentsClass() ) - { - case ChatMessage::CONTENT_MESSAGE: - case ChatMessage::CONTENT_NOTIFICATION_NUDGE: - case ChatMessage::CONTENT_NOTIFICATION_WINK: - case ChatMessage::CONTENT_SYSTEM_NOTICE: - case ChatMessage::CONTENT_SYSTEM_ERROR: - case ChatMessage::CONTENT_APP_INVITE: -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::showSpecialMessage() - Message is important, delivering it." << endl; -#endif - break; - - default: -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::showSpecialMessage() - Message is not important, will be ignored." << endl; -#endif - return; - } - - - // Check if a switchboard is present - MsnSwitchboardConnection *switchboard = getContactSwitchboardConnection( handle, true ); - if( switchboard == 0 ) - { - // 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 ) ); - if( switchboard == 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::showSpecialMessage() - Could not create an offline switchboard." << endl; -#endif - return; - } - } - - // Create a new chat window for the message - chatWindow = createChatWindow( switchboard ); - if( chatWindow == 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::showSpecialMessage() - Could not create a chat window." << endl; -#endif - return; - } - - // Deliver the message to the new chat window - chatWindow->receivedMessage( message ); -} - - - -// Display an MSN Object that was received. -void ChatMaster::showMsnObject(const QString &handle, const MsnObject &msnObject, ChatWindow *chatWindow) -{ - QString fileName; - QPtrListIterator it( chatWindows_ ); - QString emoticonCode; - - // Get the contact - // Note I don't use msnObject.getCreator, because I don't want to trust the other client! - ContactBase *contact = 0; - Contact *msnContact = 0; - - // Get msn object filename - fileName = PictureTransferP2P::getPictureFileName( msnObject ); - - // Handle the picture - switch( msnObject.getType() ) - { - 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); - if(KMESS_NULL(msnContact)) return; - msnContact->getExtension()->setContactPicturePath( fileName ); - pendingDisplayPictures_.remove( handle ); - break; - - case MsnObject::WINK: - // Show the Wink in the chat window where the original datacast message came from. - if(KMESS_NULL(chatWindow)) return; - chatWindow->showWink(handle, fileName, msnObject.getFriendly()); - break; - - case MsnObject::EMOTICON: - // Inform the contact that a custom emoticon can be parsed. - contact = CurrentAccount::instance()->getContactByHandle(handle); - if(KMESS_NULL(contact)) return; - emoticonCode = contact->getEmoticonCode(msnObject.getDataHash()); // always put before addEmoticonFile()! - contact->addEmoticonFile( msnObject.getDataHash(), fileName ); - - // Update all chat windows where the contact is. - while( it.current() != 0 ) - { - chatWindow = it.current(); - if( chatWindow->isContactInChat(handle) ) - { - chatWindow->updateCustomEmoticon(handle, emoticonCode); - } - ++it; - } - break; - - case MsnObject::BACKGROUND: - // handle background transfers - - case MsnObject::VOICECLIP: - // handle voicelip transfers - - default: - kdWarning() << "ChatMaster::slotShowMsnObject() - Unable to handle MsnObject pictures of type '" << msnObject.getType() << "'." << endl; - } -} - - - -// Determine what to do when a contact changed it's picture. -void ChatMaster::slotContactChangedMsnObject( Contact *contact ) -{ - QString handle = contact->getHandle(); - MsnObject msnObject( *contact->getMsnObject() ); - - // If the contact no longer likes to display an msn object, remove it - if( contact->getMsnObject() == 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotContactChangedMsnObject() - Contact '" << handle << "' removed its MSN object" << endl; -#endif - - contact->getExtension()->setContactPicturePath( QString::null ); - return; - } - - // See if the file already exists. - QString objectFileName = PictureTransferP2P::getPictureFileName( msnObject ); - if( QFile::exists( objectFileName ) ) - { - if( QImage::imageFormat( objectFileName ) != 0 - && msnObject.verifyFile( objectFileName ) ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotContactChangedMsnObject() - Picture for '" << handle << "' is already downloaded." << endl; -#endif - - contact->getExtension()->setContactPicturePath( objectFileName ); - return; - } - else - { -#ifdef KMESSDEBUG_CHATMASTER - bool corruptQt = QImage::imageFormat( objectFileName ) == 0; - kdDebug() << "ChatMaster::slotContactChangedMsnObject() - Picture for '" << handle - << "' is already downloaded, but corrupt " - << ( corruptQt ? "(detected by QImage)" : "(detected by MsnObject)" ) - << ", deleting it: '" << objectFileName << "'" << endl; -#endif - QFile::remove( objectFileName ); - - // If the file was set as picture. reset right away. - if( contact->getExtension()->getContactPicturePath() == objectFileName ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdWarning() << "ChatMaster::slotContactChangedMsnObject() - Corrupt picture was already set, " - << "resetting contact picture." << endl; -#endif - contact->getExtension()->setContactPicturePath( QString::null ); - } - } - } - - // If the contact is active in a chat, - // download the new picture straight away. - MsnSwitchboardConnection *switchboard = getContactSwitchboardConnection( handle, true ); - if( switchboard != 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotContactChangedMsnObject() - Contact '" << handle << "' changed its MSN object." << endl; -#endif - - // Automatically decides which switchboard is the best to use, - // this may change during the transfer. - startMsnObjectDownload( handle, &msnObject, 0 ); - return; - } - - - // Queue a request to download it later in the background. - // That method will check for the prerequisites to download it, - // since that may change between this point and the timedUpdate() call. - -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotContactChangedMsnObject() - Contact '" << handle << "' changed its MSN object, queueing a request for it." << endl; -#endif - - // Request the contact's msnobject - if( ! pendingDisplayPictures_.contains( handle ) ) - { - pendingDisplayPictures_.append( handle ); - } -} - - - -// A contact joined to one of our switchboard sessions. -void ChatMaster::slotContactJoinedChat(QString handle) -{ - // Get switchboard connection from slot sender - MsnSwitchboardConnection *connection = static_cast( const_cast( sender() ) ); - if(KMESS_NULL(connection)) return; - - // Send any pending messages, if any - if( pendingMimeMessages_.count() > 0 ) - { - // Find the chat window where the contact is the only participant. - if( connection->getContactsInChat().size() > 1 ) - { - // Contact joined chat conversation with multiple partipipants, ignore this. -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "Contact '" << handle << "' joined multi-chat, not sending pending messages." << endl; -#endif - } - else - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotContactJoinedChat() - Contact '" << handle << "' joined chat, checking for pending messages." << endl; -#endif - - // Send the messages - if( pendingMimeMessages_.count() > 0 ) - { - sendPendingMimeMessages( handle, connection ); - } - } - } - - - // 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() ) - { - if( contact->getMsnObject() != 0 ) - { - startMsnObjectDownload( contact->getHandle(), contact->getMsnObject(), 0 ); - } - } -} - - - -/** - * @brief Deliver an application command to the correct application. - */ -void ChatMaster::slotDeliverAppCommand(QString cookie, QString handle, QString command) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotDeliverAppCommand() - Delivering application command." << endl; -#endif - - Application *app = 0; - - // Get the contact. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle(handle); - if(KMESS_NULL(contact)) return; - - // Get the application list - if( contact->hasApplicationList() ) - { - app = contact->getApplicationList()->getApplicationByCookie(cookie); - } - - // App not found. - if( app == 0 ) - { - kdWarning() << "ChatMaster::slotDeliverAppCommand() - Application not found to deliver user command (contact=" << contact << ", command=" << command << ")." << endl; - return; - } - - // Deliver the 'accept' or 'cancel' command. - app->gotCommand( command ); -} - - - -/** - * @brief Deliver a message from an Application to the switchboard connection. - * @param message The Mime message to deliver. The message can contain a normal MIME or binary P2P payload. - * @param handle The contact the message should be delivered to. - * @param privateChatRequired Whether a private chat is required to deliver the message. If not, a multi-chat will be used when available. - * - * This method automatically determines which switchboard is should use to deliver the message. - * When the contact is not present in any of the existing switchboard connections, a new connection request will be made. - * The message will be queued for delivery to the switchboard so it can be delivered once it's available. - * Conversations with multiple contacts are avoided because of the networking overhead; - * since the switchboard is a broadcast channel, each participant receives the message. - * - * Unlike the direct connection link, the switchboard is only capable of transferring mime messages. - * To transfer the P2P data, the P2PApplication has to wrap the message as MimeMessage payload. - */ -void ChatMaster::slotDeliverMimeMessage(const MimeMessage &message, const QString &handle, bool privateChatRequired) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotDeliverMimeMessage() - Delivering application message for '" << handle << "' to switchboard." << endl; -#endif -#ifdef KMESSTEST - QString contentType = message.getValue("Content-Type"); - ASSERT( contentType == "application/x-msnmsgrp2p" - || contentType == "text/x-msmsgsinvite" - || contentType.section(';', 0, 0) == "text/x-msmsgsinvite" ); // for ; charset= suffix - if( contentType == "application/x-msnmsgrp2p" ) - { - ASSERT( message.getValue("P2P-Dest") == handle ); - } -#endif - - MsnSwitchboardConnection *connection = getContactSwitchboardConnection(handle, privateChatRequired); - - if( connection != 0 ) - { - if( connection->isBusy() ) - { - // Connection has unacked messages, keep waiting until the switchboard is ready to send -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotDeliverMimeMessage() - Switchboard is currently busy, queueing message until the switchboard is ready to send." << endl; -#endif - queueMessage( message, handle, privateChatRequired ); - - // Pause application so it won't continue to send much more messages (see P2PApplication::slotSendData()). - ApplicationList *appList = getApplicationList(handle); - if( appList != 0 ) - { - appList->pauseApplications(); - } - } - else - { - // Deliver the message - connection->sendApplicationMessage(message); - } - } - else - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotDeliverMimeMessage() - No switchboard available to deliver message," - << " requesting chat and queueing message " << (pendingMimeMessages_.count() + 1) << "." << endl; -#endif - - emit requestSwitchboard( handle, ChatInformation::CONNECTION_BACKGROUND ); - queueMessage( message, handle, privateChatRequired ); - } -} - - - -// The switchboard received a Mime message -void ChatMaster::slotGotMessage(const MimeMessage &message, const QString &handle) -{ - ApplicationList *appList = getApplicationList(handle); - if( appList != 0 ) - { - appList->gotMessage(message); - } -} - - - -// The switchboard received a P2P message -void ChatMaster::slotGotMessage(const P2PMessage &message, const QString &handle) -{ - ApplicationList *appList = getApplicationList(handle); - if( appList != 0 ) - { - appList->gotMessage(message); - } -} - - - -// The switchboard received an msn object -void ChatMaster::slotGotMsnObject(const QString &msnObjectData, const QString &handle) -{ - // Get the contact. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle(handle); - if(KMESS_NULL(contact)) return; - - // Get the switchboard connection where the emoticon/wink/voiceclip was posted - const MsnSwitchboardConnection *connection = static_cast( sender() ); - ChatWindow *chatWindow = 0; - if( connection != 0 ) - { - chatWindow = getChatWindowBySwitchboard(connection); - } - - // Parse the msn object - MsnObject msnObject(msnObjectData); - - // Get the contact name, - QString friendlyName = CurrentAccount::instance()->getContactFriendlyNameByHandle(handle); - - // Determine the statusmessage to display. - QString statusMessage; - MsnObject::MsnObjectType objectType = msnObject.getType(); - if( objectType == MsnObject::WINK ) - { - statusMessage = i18n("%1 is sending a wink: %2").arg(friendlyName).arg(msnObject.getFriendly()); - } - - // Show the status message - if( ! statusMessage.isEmpty() ) - { - if( ! KMESS_NULL(connection) && ! KMESS_NULL(chatWindow) ) - { - chatWindow->showStatusMessage( statusMessage ); - } - } - - startMsnObjectDownload( handle, &msnObject, chatWindow ); -} - - - -// A msn object (picture, wink, emoticon) was received for the contact. -void ChatMaster::slotMsnObjectReceived(const QString &handle, const MsnObject &msnObject) -{ -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotMsnObjectReceived() - Received msn object from: " << handle << "." << endl; -#endif - - ChatWindow *chatWindow = 0; - - // Get sender of this signal, slotGotMsnObject() assigned this to the p2papp. - const P2PApplication *application = static_cast( sender() ); - if( application != 0 ) - { - chatWindow = application->getChatWindow(); - if( chatWindow != 0 && ! chatWindows_.contains(chatWindow) ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotMsnObjectReceived() - Original chat window not found for received MSNObject " - << "(objecttype=" << msnObject.getType() - << " contact=" << handle << ")." << endl; -#endif - chatWindow = getContactChatWindow(handle, true); - } - } - - showMsnObject(handle, msnObject, chatWindow); -} - - - -// The switchboard is ready to send more messages. -void ChatMaster::slotSwitchboardReady() -{ - // No need to send pending messages or resume an application (a message is always queued before the app is paused). - if( pendingMimeMessages_.isEmpty() ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotSwitchboardReady() - A switchboard is ready to send more messages, no messages pending." << endl; -#endif - return; - } - - // Get the connection - MsnSwitchboardConnection *connection = static_cast( const_cast( sender() ) ); - if(KMESS_NULL(connection)) return; - - // Get the contacts - const QStringList &contacts = connection->getContactsInChat(); - bool isPrivateChat = (contacts.size() < 2); - -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotSwitchboardReady() - A switchboard is ready to send more messages, " << pendingMimeMessages_.count() << " messages pending." << endl; -#endif - - // Send all pending messages - sendPendingMimeMessages( contacts[0], connection ); - - // See if the switchboard is still ready. - // Don't use connection->isBusy() as it will break with - // the test above when exactly all messages are sent before the connection became busy. - if( ! pendingMimeMessages_.isEmpty() ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::slotSwitchboardReady() - Switchboard is busy again, not notifying applications." << endl; -#endif - return; - } - - // A switchboard is still available. - // If the contact applications were paused, resume them now. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle( contacts[0] ); - if( contact != 0 && contact->hasApplicationList() ) - { - contact->getApplicationList()->resumeApplications(isPrivateChat); - } -} - - - -// Delete an existing switchboard -void ChatMaster::slotSwitchboardDelete( MsnSwitchboardConnection *closing ) -{ - switchboardConnections_.remove( closing ); - - for( ChatWindow *chatWindow = chatWindows_.first(); chatWindow; chatWindow = chatWindows_.next() ) - { - if( chatWindow->getSwitchboardConnection() == closing ) - { - chatWindow->setSwitchboardConnection( 0 ); - } - } - - disconnect( closing, 0, this, 0 ); - - closing->deleteLater(); -} - - - -// Configure and start the Mime application object. -void ChatMaster::startApplication( MimeApplication *application ) -{ - // Get the application list. - ApplicationList *appList = getApplicationList( application->getContactHandle() ); - if(KMESS_NULL(appList)) return; - - // Add to list - appList->addApplication( application ); // requires MimeApplication/P2PApplication type. - - // Initialize appliation - slotConnectApplication( application ); - application->start(); -} - - - -// Configure and start the P2P application object. -void ChatMaster::startApplication( P2PApplication *application ) -{ - // Get the application list. - ApplicationList *appList = getApplicationList( application->getContactHandle() ); - if(KMESS_NULL(appList)) return; - - // Add to list. - appList->addApplication( application ); // requires MimeApplication/P2PApplication type. - - // Initialize application - slotConnectApplication( application ); - application->start(); -} - - - -// Start a connection with the information gathered from the Notification connection -MsnSwitchboardConnection *ChatMaster::startSwitchboard( const ChatInformation &chatInfo ) -{ - MsnSwitchboardConnection *switchboard = getContactSwitchboardConnection( chatInfo.getContactHandle(), true ); - ChatWindow *chatWindow = getChatWindowBySwitchboard( switchboard ); - - if( switchboard != 0 && chatInfo.getType() != ChatInformation::CONNECTION_REFRESH ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::startSwitchboard() - Deleting old switchboard connection." << endl; -#endif - slotSwitchboardDelete( switchboard ); - switchboard = 0; - } - - if( switchboard == 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::startSwitchboard() - Creating new switchboard connection." << endl; -#endif - // Initialize the switchboard connection - switchboard = new MsnSwitchboardConnection(); - if( ! switchboard->initialize() ) - { - kdWarning() << "ChatMaster::startSwitchboard() - Couldn't initialize switchboard connection." << endl; - delete switchboard; - return 0; - } - - 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( gotMessage(const MimeMessage&, const QString&) ), - this, SLOT ( slotGotMessage(const MimeMessage&, const QString&) )); - connect(switchboard, SIGNAL( gotMessage(const P2PMessage&, const QString&) ), - this, SLOT ( slotGotMessage(const P2PMessage&, const QString&) )); - connect(switchboard, SIGNAL( gotMsnObject(const QString&, const QString&) ), - this, SLOT ( slotGotMsnObject(const QString&, const QString&) )); - connect(switchboard, SIGNAL( readySend() ), - this, SLOT ( slotSwitchboardReady() )); - connect(switchboard, SIGNAL( requestNewSwitchboard(QString) ), - this, SLOT ( forwardRequestNewSwitchboard(QString) )); - connect(switchboard, SIGNAL( requestChatWindow(MsnSwitchboardConnection*) ), - this, SLOT ( createChatWindow(MsnSwitchboardConnection*) )); - connect(switchboard, SIGNAL( deleteMe(MsnSwitchboardConnection*) ), - this, SLOT ( slotSwitchboardDelete(MsnSwitchboardConnection*) )); - } - - switchboard->connectTo( chatInfo ); - - if( chatWindow != 0 ) - { - chatWindow->setSwitchboardConnection( switchboard ); - } - - // If this switchboard is a background one, made to request a contact's picture, - // we can remove the pending request from the list now. - if( chatInfo.getType() == ChatInformation::CONNECTION_BACKGROUND - && pendingDisplayPictures_.contains( chatInfo.getContactHandle() ) ) - { - pendingDisplayPictures_.remove( chatInfo.getContactHandle() ); - } - - return switchboard; -} - - - -// Start a chat with the information gathered from a switchboard connection -ChatWindow *ChatMaster::createChatWindow( MsnSwitchboardConnection *switchboard ) -{ - ChatWindow *chatWindow; - - // If the new chat is a group chat, find existing group chat windows; else find private chats - QStringList participants = switchboard->getContactsInChat(); - if( participants.count() == 1 ) - { - chatWindow = getContactChatWindow( switchboard->getFirstContact(), true ); - } - else - { - chatWindow = getContactsChatWindow( participants ); - } - - if( chatWindow != 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::createChatWindow() - Chatwindow with " - << switchboard->getContactsInChat().join(",") << " already exists, raising it." << endl; -#endif - } - else - { - // Create object - chatWindow = new ChatWindow( kapp->mainWidget(), "ChatWindow" ); - - // Connect signals - connect( chatWindow, SIGNAL( closing(QObject*) ), - this, SLOT ( slotChatWindowClosing(QObject*) )); - connect( chatWindow, SIGNAL( destroyed(QObject*) ), - this, SLOT ( slotChatWindowDestroyed(QObject*) )); - connect( chatWindow, SIGNAL( newChatMessage(const ChatMessage&, ChatWindow*) ), - this, SLOT ( forwardNewChatMessage(const ChatMessage&, ChatWindow*) )); - connect( chatWindow, SIGNAL( setContactAllowed( QString ) ), - this, SLOT ( forwardSetContactAllowed( QString ) ) ); - connect( chatWindow, SIGNAL( setContactAdded( QString, bool ) ), - this, SLOT ( forwardSetContactAdded( QString, bool ) ) ); - connect( chatWindow, SIGNAL( setContactBlocked( QString, bool ) ), - this, SLOT ( forwardSetContactBlocked( QString, bool ) )); - connect( chatWindow, SIGNAL( appCommand(QString, QString, QString) ), - this, SLOT ( slotDeliverAppCommand(QString, QString, QString) )); - - // Connect request signals - connect( chatWindow, SIGNAL( requestFileTransfer(const QString&, const QString&) ), - this, SLOT ( startFileTransfer(const QString&, const QString&) )); - connect( chatWindow, SIGNAL( requestNetMeeting(const QString&) ), - this, SLOT ( startNetMeeting(const QString&) )); - - // Bail out if the window could not be initialized - if( ! chatWindow->initialize( switchboard->getFirstContact() ) ) - { - kdWarning() << "ChatMaster::createChatWindow() - Couldn't initialize the new chat window!" << endl; - return 0; - } - - chatWindows_.append( chatWindow ); - } - - // Finally, notify the chat window about the new chat - chatWindow->setSwitchboardConnection( switchboard ); - chatWindow->startChat(); - - // 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( chatWindow, switchboard->getUserStartedChat() ); - - return chatWindow; -} - - - -// Start a file transfer with the information from the ChatWindow -void ChatMaster::startFileTransfer( const QString &handle, const QString &filename ) -{ - ApplicationList *appList = getApplicationList(handle); - if(KMESS_NULL(appList)) return; - - // Get the contact properties, see how we can transfer the file. - const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); - if( contact != 0 && contact->hasP2PSupport() ) - { - // The contact supports file transfer over MSNP2P - P2PApplication *app = new FileTransferP2P(appList, filename); - startApplication(app); - } - else - { - // This should be so rare that it justifies a warning message. - if( contact == 0 ) - { - kdWarning() << "Contact '" << handle << "' object not found, using old MIME invitations because P2P might not be supported." << endl; - } - else - { - kdWarning() << "Contact '" << handle << "' does not support P2P transfers, using old MIME invitations instead." << endl; - } - - // The contact only supports file transfer the old way - MimeApplication *app = new FileTransfer(handle, filename); - startApplication(app); - } -} - - - -// Start a netmeeting invitation -void ChatMaster::startNetMeeting(const QString &handle) -{ - // Get the application list - ApplicationList *appList = getApplicationList(handle); - if(KMESS_NULL(appList)) return; - - // Get the contact - const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); - if(KMESS_NULL(contact)) return; - - // Create the application - MimeApplication *app = new GnomeMeeting(handle); - startApplication(app); -} - - - -// Start a picture transfer to get the contact's msn object. -void ChatMaster::startMsnObjectDownload( const QString &handle, const MsnObject *msnObject, ChatWindow *chatWindow ) -{ - // Test input - if(KMESS_NULL(msnObject)) return; - - // Get the application list - ApplicationList *appList = getApplicationList(handle); - if(KMESS_NULL(appList)) return; - - // First check if the actual object is currently being downloaded already. - // call before cache check, since file can be partially downloaded. - if( appList->hasMsnObjectTransfer(*msnObject) ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::startMsnObjectDownload() - object is already being downloaded, not sending a second invite." << endl; -#endif - return; - } - - // Get the picture filename, perhaps from a cache - QString objectFileName = PictureTransferP2P::getPictureFileName( *msnObject ); - bool fileExists = QFile::exists( objectFileName ); - - // Check if the image can be read. - if( fileExists - && ( QImage::imageFormat( objectFileName ) == 0 || ! msnObject->verifyFile( objectFileName ) ) ) - { -#ifdef KMESSDEBUG_CHATMASTER - bool corruptQt = QImage::imageFormat( objectFileName ) == 0; - kdDebug() << "ChatMaster::startMsnObjectDownload() - Cached MsnObject is corrupt " - << ( corruptQt ? "(detected by QImage)" : "(detected by MsnObject)" ) - << ", deleting it: '" << objectFileName << "'" << endl; -#endif - QFile::remove( objectFileName ); - fileExists = false; - } - - // Avoid downloading again if it exists - if( fileExists ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::startMsnObjectDownload() - Contact MsnObject is already in cache." << endl; -#endif - - // Already have it, handle processing in a generic way. - // Don't use slotMsnObjectReceived() because it uses sender() to get the ChatWindow object. - showMsnObject(handle, msnObject->objectString(), chatWindow); - } - else - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::startMsnObjectDownload() - Starting MsnObject download (type=" << msnObject->getType() << ")." << endl; -#endif - - // Create and initialize the application. - P2PApplication *app = new PictureTransferP2P(appList, *msnObject); - app->setChatWindow( chatWindow ); // for winks, to display in originating chat window. - connect(app, SIGNAL( pictureReceived(const QString&, const MsnObject&) ), - this, SLOT ( slotMsnObjectReceived(const QString&, const MsnObject&) )); - startApplication(app); - } -} - - - -/** - * Periodically called method for update commands. - * - * This method is synchronized with the ping timer of MsnNotificationConnection - * to avoid multiple timers which reduces power consumption (see www.linuxpowertop.org). - * - * Currently this is used to download display pictures in the background, - * but it can also be used for other events. - */ -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() == "HDN" ) - { - return; - } - -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - handling timed events." << endl; -#endif - - // See if there are pictures to download. - // Get 4 pictures at once. - int requestCount = pendingDisplayPictures_.count(); - requestCount = requestCount > 4 ? 4 : requestCount; - while( requestCount > 0 && ! pendingDisplayPictures_.isEmpty() ) - { - // Unshift the first handle of the list. - QString handle = pendingDisplayPictures_.first(); - pendingDisplayPictures_.remove( handle ); - -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - see if the display picture of '" << handle << "' should be downloaded." << endl; -#endif - - // See if the picture was already downloaded somehow (e.g. user opened a chat) - - // First get the contact. - // Using getContactList()->.. because it skips the InvitedContact objectss returned by CurrentAccount::getContactByHandle() - Contact *contact = CurrentAccount::instance()->getContactList()->getContactByHandle( handle ); - if( contact == 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - contact not found, was it removed?" << endl; -#endif - continue; - } - - // See if the contact is still online. - if( contact->isOffline() ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - contact is no longer online." << endl; -#endif - continue; - } - - // See if the contact is still blocked. - // Avoid starting a chat which "invites" the contact to chat back. - if( contact->isBlocked() ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - contact is blocked." << endl; -#endif - continue; - } - - // Get the msn object, can become null now. - const MsnObject *msnObject = contact->getMsnObject(); - if( msnObject == 0 ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - MsnObject has been reset." << endl; -#endif - continue; - } - - // See if the object already exists in the cache - QString objectFileName = PictureTransferP2P::getPictureFileName( *msnObject ); - if( QFile::exists( objectFileName ) - && QImage::imageFormat( objectFileName ) != 0 - && msnObject->verifyFile( objectFileName ) ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - Picture is already downloaded." << endl; -#endif - continue; - } - - - // See if the actual object is currently being downloaded (e.g. user just opened a chat). - // Put as last check because it creates the ApplicationList on demand. - - -#ifdef KMESSDEBUG_CHATMASTER - // Made the debug output easier to understand. - if( ! contact->hasApplicationList() ) - { - kdDebug() << "ChatMaster::timedUpdate() - Picture is not available, creating application list." << endl; - } -#endif - - // Get the application list - ApplicationList *appList = getApplicationList( handle ); - if( KMESS_NULL(appList) ) continue; - - // See if a picture is currently being downloaded. - if( appList->hasMsnObjectTransfer( *msnObject ) ) - { -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - transfer for the picture is already active." << endl; -#endif - continue; - } - - - // All tests passed. - // Download the picture. - -#ifdef KMESSDEBUG_CHATMASTER - kdDebug() << "ChatMaster::timedUpdate() - Picture is not available, starting switchboard connection to download it." << endl; -#endif - - // Start a chat to download the picture. - // The download will be initiated up by ChatMaster::slotContactJoinedChat(). - emit requestSwitchboard( handle, ChatInformation::CONNECTION_BACKGROUND ); - requestCount--; - } -} - - -#include "chatmaster.moc" diff --git a/kmess/chat/chatmessagestyle.cpp b/kmess/chat/chatmessagestyle.cpp deleted file mode 100644 index fcb9fcd..0000000 --- a/kmess/chat/chatmessagestyle.cpp +++ /dev/null @@ -1,1250 +0,0 @@ -/*************************************************************************** - chatmessagestyle.cpp - description - ------------------- - begin : Sat Okt 29 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 "chatmessagestyle.h" - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "../contact/contactbase.h" -#include "../emoticonmanager.h" -#include "../emoticon.h" -#include "../kmessdebug.h" -#include "../currentaccount.h" - -#include "chatmessage.h" -#include "xsltransformation.h" - - - -// The constructor -ChatMessageStyle::ChatMessageStyle() - : QObject(0, "ChatMessageStyle") - , contactFontColor_("#000000") - , lastPendingEmoticonId_(0) - , showTime_(true) - , useContactFont_(false) - , useEmoticons_(true) - , useFontEffects_(true) -{ - xslTransformation_ = new XslTransformation(); - - // Get placeholder for pending custom emoticons. - pendingPlaceholder_ = KGlobal::dirs()->findResource("appdata", "pics/empty.png"); -#ifdef KMESSTEST - ASSERT( QFile::exists(pendingPlaceholder_) ); -#endif -} - - - -// The destructor -ChatMessageStyle::~ChatMessageStyle() -{ - delete xslTransformation_; -} - - - -// Convert a chat message to HTML string -QString ChatMessageStyle::convertMessage(const ChatMessage &message) -{ - // Reset state, changed by parseMsnString - pendingEmoticonTags_.clear(); - - // Create and convert the XML message - if(xslTransformation_ == 0 || ! xslTransformation_->hasStylesheet()) - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessage: no XSL theme loaded (theme=" << name_ << ")," - << " using fallback theme." << endl; -#endif - - // Create fallback message. - return createFallbackMessage(message); - } - else - { - QString xmlMessage = createMessageXml(message); - QString parsedMessage = xslTransformation_->convertXmlString(xmlMessage); - - // Strip DOCTYPE because it should only appear in convertMessageRoot() output - parsedMessage = stripDoctype(parsedMessage); - - if( parsedMessage.isNull() ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessage: XSL conversion failed (theme=" << name_ << ")," - << " using fallback theme." << endl; -#endif - return createFallbackMessage(message); - } - else if( isEmptyResult(parsedMessage) ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessage: XSL conversion returned no data (theme=" << name_ << ")," - << " using fallback theme." << endl; -#endif - return createFallbackMessage(message); - } - else - { - // Received expected result - return parsedMessage; // DONE! - } - } -} - - - -// Convert a group of chat message to HTML string -QString ChatMessageStyle::convertMessageList(const QPtrList &messageList) -{ - // Reset state, changed by parseMsnString - pendingEmoticonTags_.clear(); - - // Warn for empty list, avoid broken markup - if( messageList.isEmpty() ) - { - kdWarning() << "ChatMessageStyle::convertMessageList: no messages given!"; - return QString::null; - } - else if( messageList.count() == 1 ) - { - // When there is only one message, don't wrap it in a . - // Makes the calling-code easier, and the layout consistent. - return convertMessage( * messageList.getFirst() ); - } - - // Create iterator - QPtrListIterator it(messageList); - bool hasStyle = (xslTransformation_ != 0 && xslTransformation_->hasStylesheet()); - QString parsedMessage; - - // Avoid all the trouble when we can't create - if( ! hasStyle ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessageList: no XSL theme loaded (theme=" << name_ << ")," - << " using fallback theme." << endl; -#endif - } - else - { - // Create XML string. - QString xmlMessage = "\n"; - while( it.current() != 0 ) - { - xmlMessage += createMessageXml(*it.current()) + "\n"; - ++it; - } - xmlMessage += "\n"; - - // Convert - parsedMessage = xslTransformation_->convertXmlString(xmlMessage); - - // Strip DOCTYPE because it should only appear in convertMessageRoot() output - parsedMessage = stripDoctype(parsedMessage); - - if( parsedMessage.isNull() ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessageList: XSL conversion failed (theme=" << name_ << ")," - << " using fallback theme." << endl; -#endif - } - else if( isEmptyResult(parsedMessage) ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessage: XSL conversion returned no data (theme=" << name_ << ")," - << " using fallback theme." << endl; -#endif - } - else - { - // Received expected result - return parsedMessage; // DONE! - } - } - - // Conversion failed, create fallback - while( it.current() != 0 ) - { - parsedMessage += createFallbackMessage(*it.current()); - ++it; - } - 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 ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessageRoot: no XSL theme loaded." << endl; -#endif - } - else - { - // Not much to add here yet.. - QString xmlMessage = "" - ""; - - // Convert - parsedMessage = xslTransformation_->convertXmlString(xmlMessage); - if( ! parsedMessage.isNull() ) - { - if( isEmptyResult(parsedMessage) ) - { - // Indicate the chat style doesn't define the whole header/footer, - // so KMess can use it's default instead. - return QString::null; - } - return parsedMessage; // DONE! - } - else - { -#ifdef KMESSDEBUG_CHATVIEW - kdWarning() << "ChatMessageStyle::convertMessageRoot: XSL conversion failed (theme=" << name_ << ")." << endl; -#endif - } - } - - return QString::null; -} - - -// Convert the message as HTML, fallback method when XML fails. -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"; - - // Reset state, changed by parseMsnString - pendingEmoticonTags_.clear(); - - // Create the fallback message when the XML/XSL conversion failed - if( message.isNormalMessage() ) - { - // Contact message - QString fontBefore; - QString fontAfter; - QString time; - QFont font; - QString color; - - // Extract fonts - parseFont(message, font, color, fontBefore, fontAfter); - - // Escape HTML, replace emoticons - parseMsnString( name, handle /*, true */ ); - parseMsnString( body, handle ); - - // Replace font special effects, like *bold* - if( useFontEffects_ ) - { - parseEffects( name ); - parseEffects( body ); - } - - // Replace newlines with
- parseBody(body); - - // Misc variables - if( showTime_ ) - { - QTime messageTime = message.getTime(); - time = KGlobal::locale()->formatTime( messageTime, true ); - } - color = (type == ChatMessage::TYPE_INCOMING || type == ChatMessage::TYPE_OFFLINE_INCOMING) - ? "666699" : "666666"; - - // Create HTML - return "
" + (showTime_ ? time + " " : "") - + i18n("%1 says:").arg(name) - + "
" - + fontBefore + body + "

" + fontAfter - + "
"; - } - else if( type == ChatMessage::TYPE_SYSTEM ) - { - // Red system message - parseMsnString(body); - parseBody(body); - return "

" - "" + body + "" - "
"; - } - else if( type == ChatMessage::TYPE_APPLICATION || type == ChatMessage::TYPE_APPLICATION_WEBCAM - || type == ChatMessage::TYPE_APPLICATION_FILE || type == ChatMessage::TYPE_APPLICATION_AUDIO ) - { - // Blue application message - parseMsnString(body); - parseBody(body); - return "
" + body + "
"; - } - else - { - // Purple notification message - parseMsnString(body); - parseBody(body); - return "
" + body + "
"; - } -} - - - -// Convert the message as XML. -QString ChatMessageStyle::createMessageXml(const ChatMessage &message) -{ - QString date; - QString time; - QString fontBefore; - QString fontAfter; - QString xmlMessage; - QString parsedMessage; - QString typeString; - QString color; - QFont font; - - // Get message info - int type = message.getType(); - QString handle = message.getContactHandle(); - QString name = message.getContactName(); - QString body = message.getBody(); - bool isRtl = body.isRightToLeft(); - bool nameIsRtl = name.isRightToLeft(); - - // See if this is a contact's message and not the user - - - // Prepare the strings for HTML - // App messages are not parsed, they may contain HTML (links to click on, etc..) - if( message.isNormalMessage() ) - { - parseFont(message, font, color, fontBefore, fontAfter); - parseMsnString( name, handle /*, true */ ); - parseMsnString( body, handle ); - - // Parse effects characters (_, *, /) - if( useFontEffects_ ) - { - parseEffects( name ); - parseEffects( body ); - } - } - - - // Replace newlines with
tags - parseBody(body); - - // Show the message time - if( showTime_ ) - { - // Get the time - const QDateTime &messageDate = message.getDateTime(); - date = KGlobal::locale()->formatDate( messageDate.date(), true ); - time = KGlobal::locale()->formatTime( messageDate.time(), true ); - } - - - // Get message type for XSL - switch(type) - { - case ChatMessage::TYPE_INCOMING: typeString = "incoming"; break; - case ChatMessage::TYPE_OUTGOING: typeString = "outgoing"; break; - case ChatMessage::TYPE_SYSTEM: typeString = "system"; break; - case ChatMessage::TYPE_APPLICATION_FILE: - case ChatMessage::TYPE_APPLICATION_WEBCAM: - case ChatMessage::TYPE_APPLICATION_AUDIO: - case ChatMessage::TYPE_APPLICATION: typeString = "application"; break; - case ChatMessage::TYPE_OFFLINE_INCOMING: typeString = "offlineIncoming"; break; - case ChatMessage::TYPE_NOTIFICATION: - default: - typeString = "notification"; - break; - } - - - // IMPORTANT: - // The QStyleSheet::escape() function doesn't escape quotes. - // Special care needs to be taken to avoid XML parsing errors. - - // Create an XML message for the XSL theme conversion - // "" - xmlMessage = "\n"; - - // The contact can be empty for some notification messges - if(! message.getContactHandle().isEmpty() ) - { - xmlMessage += " \n" - " \n"; - - // If the user doesn't have a display picture, the style will use a default image. - if( ! message.getContactPicturePath().isEmpty() && QFile::exists( message.getContactPicturePath() ) ) - { - xmlMessage += " \n"; - } - - if( ! name.isEmpty() ) - { - xmlMessage += " \n"; - } - - xmlMessage += " \n" - " \n"; - } - - // Add message - xmlMessage += " " + QStyleSheet::escape( body ) + "\n" // escape again for XML - "\n"; - return xmlMessage; -} - - - -// Escape the strings for use in XML attributes -QString ChatMessageStyle::escapeAttribute(const QString &value) const -{ - return QStyleSheet::escape(value).replace("\"", """).replace("'", "'"); -} - - - -// Return the base folder of the style. -const QString & ChatMessageStyle::getBaseFolder() const -{ - return baseFolder_; -} - - - -// Return the font used for contact messages, if forced to. -const QFont& ChatMessageStyle::getContactFont() const -{ - return contactFont_; -} - - - -// Return the color of the forced contact font. -const QString& ChatMessageStyle::getContactFontColor() const -{ - return contactFontColor_; -} - - - -// Return the css file attached to the stylesheet. Return null if there is none. -QString ChatMessageStyle::getCssFile() const -{ - QString cssFile = baseFolder_ + name_ + ".css"; - if( ! QFile::exists(cssFile) ) - { - return QString::null; - } - else - { - return cssFile; - } -} - - - -// Return the name of the style. -const QString & ChatMessageStyle::getName() const -{ - return name_; -} - - - -// Return the ID's of inserted tags for the pending emoticons. -const QStringList & ChatMessageStyle::getPendingEmoticonTagIds() const -{ - return pendingEmoticonTags_; -} - - -// Return whether or not to show contact messages in the stored font. -bool ChatMessageStyle::getUseContactFont() const -{ - return useContactFont_; -} - - - -// Return whether the given result is empty -bool ChatMessageStyle::isEmptyResult( const QString &parsedMessage ) -{ - return stripDoctype(parsedMessage).stripWhiteSpace().isEmpty(); -} - - - -// Return whether an style is loaded. -bool ChatMessageStyle::hasStyle() const -{ - return (xslTransformation_ != 0 && xslTransformation_->hasStylesheet()); -} - - - -// Replace the newline characters -void ChatMessageStyle::parseBody(QString &body) const -{ - // Replace any newline characters in the message with "
" so that carriage returns will show properly. - body = body.replace(QRegExp("\r?\n?$"), QString::null) // Remove last \n - .replace( "\r\n", "
" ) - .replace( '\r', "
" ) - .replace( '\n', "
" ); -} - - -// Do some effects characters (ie, bold, underline and italic specials) -void ChatMessageStyle::parseEffects(QString &text) const -{ - int offset = 0; - int nextOffset = 0; - QRegExp effectsSearch; - QString effectsCharacter; - QChar boundaryCharacter; - int tagPosOpen, tagPosClose; - QString replacement; - - // Process bold, italics, underline - const char* effectHtml = "biu"; // bold, italic, underline - QString effectCharacters = "*/_"; - - for( int i = 0; i < 3; i++ ) - { - effectsCharacter = QRegExp::escape( effectCharacters.mid(i, 1) ); - effectsSearch.setPattern( effectsCharacter + "([a-zA-Z0-9]+)" + effectsCharacter ); - - offset = 0; - - while( offset >= 0 ) - { - // Find next pattern match - offset = effectsSearch.search( text, nextOffset ); - if( offset == -1 ) - { - break; - } - - // Skip effects contained in HTML tags - tagPosOpen = text.find( "<", nextOffset ); - tagPosClose = text.find( ">", tagPosOpen ); - if( tagPosOpen != -1 && tagPosClose != -1 && offset > tagPosOpen && offset < tagPosClose ) - { - // Continue from the first character after the HTML tag - nextOffset = tagPosClose + 1; - continue; - } - - nextOffset = offset + effectsSearch.matchedLength(); - - // Abort if there is a normal char before - if( offset != 0 ) - { - boundaryCharacter = text.at( offset - 1 ); - if( ! boundaryCharacter.isSpace() && ! boundaryCharacter.isPunct() ) - { - continue; - } - } - - // Abort if there is a normal char after - if( (uint) ( offset + effectsSearch.matchedLength() ) < text.length() ) - { - boundaryCharacter = text.at( offset + effectsSearch.matchedLength() ); - if( ! boundaryCharacter.isSpace() && ! boundaryCharacter.isPunct() ) - { - continue; - } - } - - // Replace if start and end are free. - if( effectHtml[i] == 'b' ) - { - // Bold is standard - replacement = "*" + effectsSearch.cap(1) + "*"; - } - else if( effectHtml[i] == 'i' ) - { - // Same for italics - replacement = "/" + effectsSearch.cap(1) + "/"; - } - else if( effectHtml[i] == 'u' ) - { - // For underline, re-use the line, don't add an _ outside. - replacement = " " + effectsSearch.cap(1) + " "; - } - - // Replace and change offset - text.replace(offset, effectsSearch.matchedLength(), replacement); - nextOffset = offset + replacement.length() + 2; - } - } -} - - - -// Parse the font tags -void ChatMessageStyle::parseFont(const ChatMessage &message, QFont &font, QString &color, QString& fontBefore, QString& fontAfter) const -{ - // Extract the font from the message. - ChatMessage::MessageType type = message.getType(); - if( useContactFont_ && (type == ChatMessage::TYPE_INCOMING || type == ChatMessage::TYPE_OFFLINE_INCOMING) ) - { - // Replace the given font with the user's stored contact font - font = contactFont_; - color = contactFontColor_; - } - else - { - // Use the font settings from the message - font = message.getFont(); - color = message.getFontColor(); - } - - // 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"; - - // Create the font HTML for the message - fontBefore = ""; - fontAfter = ""; - if( font.bold() ) fontBefore += ""; - if( font.italic() ) fontBefore += ""; - if( font.underline() ) fontBefore += ""; - fontBefore += ""; - fontAfter += ""; - if( font.underline() ) fontAfter += ""; - if( font.italic() ) fontAfter += ""; - if( font.bold() ) fontAfter += ""; -} - - - -// Replace the Messenger Plus characters with HTML markup -void ChatMessageStyle::parseMsnPlusString( QString &text ) const -{ - /* - I'm really concerned about the way MSN+ embeds reserved characters into the - text, which may cause i18n problems, but given the popularity of MSN+, this - really needs to be implemented. - */ - - 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( unsigned 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.search( text, index, QRegExp::CaretAtOffset ); - - switch( fontCapture.cap(1).toInt() ) - { - case 0: - color = QColor( "white" ); - break; - case 1: - color = QColor( "black" ); - break; - case 2: - color = QColor( "blue" ); - break; - case 3: - color = QColor( "green" ); - break; - case 4: - color = QColor( "red" ); - break; - case 5: - color = QColor( "brown" ); - break; - case 6: - color = QColor( "purple" ); - break; - case 7: - color = QColor( "orange" ); - break; - case 8: - color = QColor( "yellow" ); - break; - case 9: - color = QColor( "lightGreen" ); - break; - case 10: - color = QColor( "cyan" ); - break; - case 11: - color = QColor( "lightBlue" ); - break; - case 12: - color = QColor( "blue" ); - break; - case 13: - color = QColor( "pink" ); - break; - case 14: - color = QColor( "darkGray" ); - break; - case 15: - default: - color = QColor( "gray" ); - break; - } - - // 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.search( 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( "" ); -} - - - -// Replace the MSN characters with HTML markup -void ChatMessageStyle::parseMsnString( QString &text, const QString &handle, bool alwaysShowEmoticons ) -{ - text.replace( "&", "&" ) - .replace( "<", "<" ) - .replace( ">", ">" ) - .replace( "'", "'" ) - .replace( '"', """ ); - - // MessengerPlus is quite a "low level" encoding, so do it first - parseMsnPlusString( 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; - const EmoticonManager *manager = EmoticonManager::instance(); - - // Build a collection of all emoticon data. - const QRegExp &emoticonRegExp = manager->getHtmlPattern(); - const QMap &emoticonReplacements = manager->getHtmlReplacements(); - - - QString code; - QRegExp customRegExp; - QRegExp pendingRegExp; - QMap customReplacements; - QString customEmoticonsPattern; - - // Get theme of custom emoticons. - if( ! handle.isEmpty() ) - { - if( handle == CurrentAccount::instance()->getHandle() ) - { - customRegExp = manager->getHtmlPattern( true ); - customReplacements = manager->getHtmlReplacements( false, 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(); - - allowAddingEmoticons = true; - customEmoticonsPattern = manager->getHtmlPattern( true ).pattern(); - } - } - } - - - 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 e-mail username - "\\@" // match '@' - "[a-z0-9\\-\\.]+" // match domain hostname - "[a-z0-9]{2,3}" // 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 - ")" // 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)$" ); - - 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] = ( ( useEmoticons_ || alwaysShowEmoticons ) && ! emoticonRegExp.isEmpty() ? &emoticonRegExp : 0 ); - regexps[3] = &linkRegExp; - regexps[4] = &emailRegExp; - regexps[5] = &geekLinkRegExp; - - -#ifdef KMESSTEST - ASSERT( emoticonRegExp.isValid() ); - ASSERT( emailRegExp.isValid() ); - ASSERT( linkRegExp.isValid() ); - ASSERT( geekLinkRegExp.isValid() ); -#endif - - 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; // avoid gcc warning - for(int i = 0; i < REGEXP_COUNT; i++) - { - if( regexps[ i ] == 0 ) - { - continue; - } - - matches[ i ] = regexps[ i ]->search( text, lastPos ); - if( matches[ i ] == -1 || (int) text.length() < matches[ i ] ) - { - continue; - } - -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatMessageStyle: regexp " << i << " matches at character " << matches[ i ] << endl; -#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_CHATVIEW - kdWarning() << "ChatMessageStyle::parseMsnString() - Emoticon replacement for '" << code << "' not found!" << endl; -#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 && ! customEmoticonsPattern.contains( code ) ) - { - QString urlCode = KURL::encode_string( code ); - - // 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 - kdDebug() << "ChatMessageStyle::parseMsnString() - Skipping unmatched code '" << code << "'" << endl; -#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.match(link) != -1 // 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.match(tld) == -1 ) - || ( tld.length() == 3 && topLevelDomain.match(tld) != -1 ) ) - { - matchedLength = linkBefore.length() + link.length(); // filter out puntuation char - replacement = linkBefore + "" + link + ""; - } - } - break; - - // Nothing was found, stop. - case -1: - break; - - default: -#ifdef KMESSTEST - kdWarning() << "ChatMessageStyle: result of regular expression " << matchedRegExp << " is unhandled!" << endl; -#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_CHATVIEW - kdDebug() << "ChatMessageStyle: replacing '" << text.mid( matchStart, matchedLength ) << "' with: " << replacement << " (matched regexp=" << matchedRegExp << ")" << endl; -#endif - text = 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( " ", "  " ); -} - - - -// The the contact font -void ChatMessageStyle::setContactFont(const QFont &font) -{ - contactFont_ = font; -} - - - -// The the contact font color -void ChatMessageStyle::setContactFontColor(const QString &fontColor) -{ - contactFontColor_ = fontColor; -} - - - -// Set the show time state -void ChatMessageStyle::setShowTime(bool showTime) -{ - showTime_ = showTime; -} - - - -// Set the message style, return false if it failed -bool ChatMessageStyle::setStyle(const QString &style) -{ - KStandardDirs *dirs = KGlobal::dirs(); - QString path = dirs->findResource( "data", "kmess/styles/" + style + "/" + style + ".xsl" ); - - if(path.isNull()) - { - kdWarning() << "ChatMessageStyle::setStyle: could not find the style named '" << style << "'." << endl; - return false; - } - - // Set stylesheet - name_ = style; - xslTransformation_->setStylesheet(path); - bool styleSheetLoaded = xslTransformation_->hasStylesheet(); - - if(styleSheetLoaded) - { - // Update the base folder - KURL pathUrl; - pathUrl.setPath(path); - baseFolder_ = pathUrl.directory(false); - - QMap parameters; - parameters["basepath"] = baseFolder_; - parameters["csspath"] = getCssFile(); - xslTransformation_->setParameters(parameters); - } - - // Indicate whether the stylesheet could be loaded - return styleSheetLoaded; -} - - - -// Enable or disable contact font overrides -void ChatMessageStyle::setUseContactFont(bool useContactFont) -{ - useContactFont_ = useContactFont; -} - - - -// Enable or disable emoticons -void ChatMessageStyle::setUseEmoticons(bool useEmoticons) -{ - useEmoticons_ = useEmoticons; -} - - - -// Enable or disable font effects -void ChatMessageStyle::setUseFontEffects(bool useFontEffects) -{ - useFontEffects_ = useFontEffects; -} - - - -// Strip the DOCTYPE tag from the message -QString ChatMessageStyle::stripDoctype( const QString &parsedMessage ) -{ - if( parsedMessage.startsWith( "\r?\n?"); - int endPos = parsedMessage.find(re); - if( endPos == -1 ) - { - kdWarning() << "ChatMesageStyle: Could not strip DOCTYPE tag: end position not found!" << endl; - return parsedMessage; - } - - // Strip both end end possible \r\n character - return parsedMessage.mid( endPos + re.matchedLength() ); - } - else - { - return parsedMessage; - } -} - - - -#include "chatmessagestyle.moc" - diff --git a/kmess/chat/chatmessageview.cpp b/kmess/chat/chatmessageview.cpp deleted file mode 100644 index 8748a0f..0000000 --- a/kmess/chat/chatmessageview.cpp +++ /dev/null @@ -1,441 +0,0 @@ -/*************************************************************************** - chatmessageview.cpp - description - ------------------- - begin : Sat Nov 8 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 "chatmessageview.h" - -#include "../kmessdebug.h" - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "../dialogs/addemoticondialog.h" -#include "../emoticonmanager.h" -#include "../emoticontheme.h" - -// The constructor -ChatMessageView::ChatMessageView(QWidget *parent, const char *name) - : KHTMLPart(parent, name) - , isEmpty_(true) - , lastMessageId_(0) -{ - initialize(); -} - - - -// The destructor -ChatMessageView::~ChatMessageView() -{ -} - - - -/** - * Remove from the chat all links to add an emoticon - * - * This method is called when you've added a custom emoticon that a contact has sent you. - * It searches the chat for the emoticon you have added; and removes the "add this emoticon" - * link from all the occurrences of it. - * This way, you can't add twice an emoticon. This behavior mimicks that of MSN/Windows Live - * Messenger. - */ -void ChatMessageView::addedEmoticon( QString shortcut ) -{ -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView::addedEmoticon() - Replacing add emoticon links with shortcut '" << shortcut << "'." << endl; -#endif - - // The shortcut in emoticon links is url-encoded, convert the original one to match it - shortcut = KURL::encode_string( shortcut ); - - DOM::HTMLElement link, parent, image; - DOM::HTMLDocument document = htmlDocument(); - - // Find all the list's links which point to this emoticon - DOM::NodeList linksList = document.getElementsByName( "newEmoticon_" + shortcut ); - - if( linksList.isNull() ) - { - return; - } - - // Check all the links in the list. The search is done backwards, because when we delete one of the items - // of the list, the list itself shortens down reassigning the indices, and a regular loop would fail - for( long i = (linksList.length() - 1); i >= 0; i-- ) - { - link = linksList.item( i ); - if( link.isNull() || ! link.isHTMLElement() ) - { -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView::addedEmoticon() - Link null, skipping." << endl; -#endif - continue; - } - - // Replace the link with its first child (the emoticon image) - parent = link.parentNode(); - image = link.firstChild(); - - if( parent.isNull() ) - { -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView::addedEmoticon() - Parent null, skipping." << endl; -#endif - continue; - } - - if( image.isNull() ) - { -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView::addedEmoticon() - Image null, skipping." << endl; -#endif - continue; - } - - parent.replaceChild( image, link ); - } -} - - - -// Add the given html to the chat browser and scroll to the end -void ChatMessageView::addHtmlMessage(const QString &text) -{ - lastMessageId_++; - - // Create new HTML node - DOM::HTMLElement newNode = document().createElement("div"); - newNode.setAttribute( "id", "message" + QString::number(lastMessageId_) ); - newNode.setAttribute( "class", "messageContainer" ); - newNode.setInnerHTML( text ); - - DOM::HTMLElement messageRoot = htmlDocument().getElementById("messageRoot"); - if( messageRoot.isNull() ) - { - messageRoot = htmlDocument().body(); - } - messageRoot.appendChild( document().createTextNode("\n") ); - messageRoot.appendChild( newNode ); - 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())); -} - - - -// Return the HTML source of the page. -QString ChatMessageView::getHtml() const -{ - // TODO: toHTML() Is deprecated, but documentSource() is only present in KDE 3.4 - return htmlDocument().toHTML(); -} - - - -// Initialize the widget -void ChatMessageView::initialize() -{ - // Disable features that might do harm - setJScriptEnabled(false); - setJavaEnabled(false); - setMetaRefreshEnabled(false); - setOnlyLocalReferences(false); // enable for winks - setPluginsEnabled(true); // enable for winks - - // Load a standard empty HTML page. - setStandardHtml(QString::null); - - // Connect signals for browsing - connect( browserExtension(), SIGNAL( openURLRequest(const KURL&, const KParts::URLArgs&) ), - this, SIGNAL( openURLRequest(const KURL&, const KParts::URLArgs&) ) ); - - // Make sure this widget can't get any focus. - view()->setFocusPolicy( QWidget::NoFocus ); -} - - -// Whether or not the message area is empty -bool ChatMessageView::isEmpty() const -{ - return isEmpty_; -} - - - -// 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); - if( lastNode.isNull() || ! lastNode.isHTMLElement() ) - { - kdWarning() << "ChatMessageView::replaceLastMessage: message block with id='" + lastId + "' not found, appending message instead." << endl; - addHtmlMessage(text); - return; - } - - // Replace contents - 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 to the bottom of the chat browser -void ChatMessageView::scrollChatToBottom() -{ - // Make sure the browser scrolls to the bottom - view()->scrollBy( 0, view()->contentsHeight() ); -} - - - -// Replace the entire contents with new HTML code -void ChatMessageView::setHtml(const QString &htmlRoot, const QString &htmlBody) -{ - // Write root elements - begin(); - write(htmlRoot); - - // Also insert the given HTML body. - DOM::HTMLElement messageRoot = document().getElementById("messageRoot"); - if( messageRoot.isNull() ) - { - kdWarning() << "chat style does not define the 'messageRoot' element." << endl; - messageRoot = htmlDocument().body(); - } - 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) -{ - // no: htmlDocument().body().setInnerHTML(html); - // Write new contents and css links all at once. document().addStyleSheet() is supported since KDE 3.4. - - // 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(); - - // Reset state variables. - lastMessageId_ = 0; -} - - - -// 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 ) -{ -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView: Replacing emoticon '" << code << "' with '" << replacement << "' for '" << handle << "'" << endl; -#endif -#ifdef KMESSTEST - ASSERT( ! code.isEmpty() ); - ASSERT( ! replacement.isEmpty() ); - ASSERT( ! handle.isEmpty() ); -#endif - - // Check for empty replacements. - if( replacement.isEmpty() ) - { - kdWarning() << "ChatMessageView: can't update custom emoticon, replacement not found (contact=" << handle << ")." << endl; - return; - } - - // The pattern used to find if the new custom emoticon is already in our theme - 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) - { -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView: Checking DOM element '" << *it << "'" << endl; -#endif - - // Check if the element is valid - DOM::HTMLElement img = document.getElementById(*it); - if( img.isNull() ) - { -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView: Skipped null element." << endl; -#endif - continue; - } - - // Get the image's alternative text attribute - QString imageAltText = img.getAttribute("alt").string(); - - // Before converting the alt attribute, save it; we'll use it later - 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) - imageAltText.replace( "&", "&" ) - .replace( "<", "<" ).replace( ">", ">" ) - .replace( "'", "'" ).replace( '"', """ ); - - // See if this element's ALT attribute matches the shortcut - if( img.isNull() || imageAltText != code ) - { -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView: Skipped invalid element (searched '" << code << "', found '" << imageAltText << "')." << endl; -#endif - continue; - } - - // Also check whether the handle is also set, avoid replacing someone elses code. - if( img.getAttribute("contact") != handle ) - { -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView: Emoticon code found, but different handle: " << img.getAttribute("contact") << endl; -#endif - continue; - } - - - // Update image placeholder attributes (replacing childs is too much trouble). - // Create a regexp to parse the replacement attributes. - QRegExp attribRegExp( - "([a-z]+)=" // words followed by an = - "(?:" // start of options - "'([^']*)'|" // attrib separated by single quote, or.. - "\"([^\"]*)\"|" // attrib separated by double quote, or.. - "([^ \t\r\n>]+)" // attrib followed by space, newline, tab, endtag - ")" // end of options - ); -#ifdef KMESSTEST - ASSERT( attribRegExp.isValid() ); -#endif - - int attribPos = 0; - while(true) - { - // Find next attribute - attribPos = attribRegExp.search(replacement, attribPos); - if( attribPos == -1 ) - { - break; - } - -#ifdef KMESSDEBUG_CHATMESSAGEVIEW - kdDebug() << "ChatMessageView: Emoticon replacement has attribute: " << attribRegExp.cap(1) << "=" << attribRegExp.cap(2) << endl; -#endif - img.setAttribute( attribRegExp.cap(1), attribRegExp.cap(2) ); - - // Also change the image's class and reset its ID - img.setAttribute( "class", "customEmoticon" ); - img.setAttribute( "id", QString::null ); - - attribPos += attribRegExp.matchedLength(); - } - - - // Allow the user to "steal" this emoticon - bool isNewEmoticon = ! customEmoticonsPattern.contains( code ); - if( handle != CurrentAccount::instance()->getHandle() && isNewEmoticon ) - { - // Remove any title in the emoticon image, as it would be displayed instead of the - // title from the link we're creating (a KHTML issue?) - img.setAttribute( "title", QString::null ); - - // Get the full image tag: we'll get the file name from it when the user clicks on the link - QString imgTag = img.toHTML(); - - // 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::encode_string( 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 newNode = document.createElement("a"); - newNode.setAttribute( "name", "newEmoticon_" + urlCode ); - newNode.setAttribute( "title", i18n( "Add this emoticon: %1" ).arg( originalCode ) ); - newNode.setAttribute( "href", "kmess://emoticon/" + handle + "/" + urlCode + "/" + KURL::encode_string( imgTag ) ); - - // Set the original image as the link text - newNode.setInnerHTML( imgTag ); - - // And put it in its place - img.parentNode().replaceChild( newNode, img ); - } - } - - // Force updating the view to display instantly the new image - view()->repaintContents(); -} - - -#include "chatmessageview.moc" diff --git a/kmess/chat/chatmessageview.h b/kmess/chat/chatmessageview.h deleted file mode 100644 index a8f3dce..0000000 --- a/kmess/chat/chatmessageview.h +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - chatmessageview.h - description - ------------------- - begin : Sat Nov 8 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. * - * * - ***************************************************************************/ - -#ifndef CHATMESSAGEVIEW_H -#define CHATMESSAGEVIEW_H - -#include -#include - -class QStringList; - - -/** - * This class is used to display chat messages. - * A KHTMLPart is used for this because unlike QTextBrowser, KHTML has support for CSS. - * - * @author Diederik van der Boor - */ -class ChatMessageView : public KHTMLPart -{ - Q_OBJECT - - public: // public methods - - // The constructor - ChatMessageView(QWidget *parent, const char *name); - // 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; - // 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 ); - - - public slots: - // Finds the links to add a custom emoticon, and remove them because we've already added that emoticon - void addedEmoticon( QString shortcut ); - // Scroll to the bottom of the chat browser - void scrollChatToBottom(); - - private: // private methods - // Initialize the widget - void initialize(); - - private: // private properties - // Whether or not the chat message area is empty - bool isEmpty_; - // The last message id, for replaceLastMessage() - int lastMessageId_; - - signals: - // Signal that there's an application command - void appCommand(QString cookie, QString contact, QString method); - // Signal a click on an URL - void openURLRequest( const KURL &url, const KParts::URLArgs &urlArgs ); -}; - -#endif - diff --git a/kmess/chat/chatview.cpp b/kmess/chat/chatview.cpp deleted file mode 100644 index 51e1a67..0000000 --- a/kmess/chat/chatview.cpp +++ /dev/null @@ -1,1171 +0,0 @@ -/*************************************************************************** - chatview.cpp - description - ------------------- - begin : Wed Jan 15 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 "chatview.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "chatmessage.h" -#include "chatmessagestyle.h" -#include "chatmessageview.h" - -#include "../contact/contactbase.h" -#include "../dialogs/addemoticondialog.h" -#include "../currentaccount.h" -#include "../emoticonmanager.h" -#include "../kmessdebug.h" - -// The constructor -ChatView::ChatView(QWidget *parent, const char *name ) - : ChatViewInterface(parent,name), - chatStyle_(0), - currentAccount_(0), - doSendTypingMessages_(true), - initialized_(false), - messageBarHeight_(100), - sidebarWidth_(140) -{ - // Insert a KHTMLPart in the placeholder - chatMessageView_ = new ChatMessageView( khtmlPlaceholder_, "ChatMessageView" ); - connect( chatMessageView_, SIGNAL( popupMenu(const QString&, const QPoint&) ), - this, SLOT ( slotShowContextMenu(const QString&, const QPoint&) )); - connect( chatMessageView_, SIGNAL( openURLRequest(const KURL&, const KParts::URLArgs&) ), - this, SLOT( slotOpenURLRequest(const KURL&, const KParts::URLArgs&) ) ); - - // Create a layout to maximize the KHTMLPart - QBoxLayout *messageLayout = new QHBoxLayout( khtmlPlaceholder_ ); - messageLayout->addWidget( chatMessageView_->view() ); // Stretches widget - - // Set default colors of message edit, because the text color will be overwritten with the defined one. - messageEdit_->setPaletteBackgroundColor( Qt::white ); - messageEdit_->setPaletteForegroundColor( Qt::black ); - - // 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( currentColorChanged( const QColor & ) ), - this, SLOT ( editorColorChanged( const QColor & ) ) ); - - // Set initial widget state - messageEdit_->setFocus(); - sendButton_ ->setEnabled( false ); - sendButton_ ->setFocusPolicy( QWidget::NoFocus ); - newLineButton_->setFocusPolicy( QWidget::NoFocus ); - messageSplitter_->setResizeMode( messageBar_, QSplitter::KeepSize ); - sidebarSplitter_->setResizeMode( sidebarContainer_, QSplitter::KeepSize ); - - sidebar_->removeItem( sidebar_->currentItem() ); - - // Enable drag&drop of files to the message box - messageEdit_->setAcceptDrops( true ); - messageEdit_->installEventFilter( this ); - messageEdit_->viewport()->installEventFilter( this ); - - // And to the messages view - chatMessageView_->view()->setAcceptDrops( true ); - chatMessageView_->view()->installEventFilter( this ); - - // Enable auto-delete - chatMessages_.setAutoDelete(true); -} - - -// The destructor -ChatView::~ChatView() -{ - // Clear messages, chat style - chatMessages_.clear(); - delete chatStyle_; -} - - - -// Delete the newline behind the message edit's cursor. -void ChatView::deleteNewlineAtCursor() -{ - int endpara, endindex, startpara, startindex; - - // Get the cursor's position in the message edit - messageEdit_->getCursorPosition(&endpara, &endindex); - - // The position before the cursor will be one index behind the end, - // unless the index is zero. - if ( endindex == 0 ) - { - startpara = endpara - 1; - startindex = messageEdit_->paragraphLength( startpara ); - // Select the character behind the cursor - messageEdit_->setSelection(startpara, startindex, endpara, endindex); - // Delete the selection, which should be a newline. - messageEdit_->del(); - } -} - - - -// Event filter to detect special actions in the message editor; also detect those of the message view. They get filtered -// 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 = static_cast ( event ); - QDropEvent *dropEvent = static_cast( event ); - - switch( event->type() ) - { - case QEvent::WindowActivate: - messageEdit_->setFocus(); - break; - - case QEvent::DragEnter: - dropEvent->accept( QUriDrag::decodeLocalFiles( dropEvent, fileList ) ); - break; - - case QEvent::Drop: - if( QUriDrag::decodeLocalFiles( dropEvent, fileList ) ) - { - // Process the drop only if it comes from out of our application. - if( dropEvent->source() == 0 ) - { - #ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::eventFilter() - Drag'n'dropped files: " << fileList.join( " - " ) << endl; - #endif - emit sendFiles( fileList ); - } - - // Blocks further handling of this event. - keyEvent->ignore(); - return true; - } - break; - - case QEvent::KeyPress: - // Detect if ctrl+enter or shift+enter has been pressed, to insert a new line - // instead of sending the message - if( (keyEvent->state() & Qt::ShiftButton || keyEvent->state() & Qt::ControlButton ) - && (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter ) ) - { - messageEdit_->insert( "\n" ); - // Blocks further handling of this event. - keyEvent->ignore(); - return true; - } - // Detect text copying from the Message View - else if( keyEvent->state() & Qt::ControlButton && keyEvent->key() == Qt::Key_C ) - { - editCopy(); - } - // Detect 'save chat' command - else if( keyEvent->state() & Qt::ControlButton && keyEvent->key() == Qt::Key_S ) - { - showSaveChatDialog(); - } - break; - - default: - break; - } - - return false; -} - - - -// The color in the text box changed. -void ChatView::editorColorChanged(const QColor &color) -{ -#ifdef KMESSTEST - ASSERT( currentAccount_ != 0 ); -#endif - // Sometimes the text box color seems to spontaneously reset to black. - // If this happened, set the color back to the user's color. - if ( color.name() != currentAccount_->getFontColor() ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView - Restore the color to the account setting by calling 'updateEditorFont'." << endl; -#endif - updateEditorFont(); - } -} - - - -// Copy the currently selected text -void ChatView::editCopy() -{ - if( messageEdit_->hasSelectedText() ) - { - messageEdit_->copy(); - } - else if( chatMessageView_->hasSelection() ) // never has focus, only selection. - { - kapp->clipboard()->setText( chatMessageView_->selectedText() ); - // setData() for HTML version. - } -} - - - -// 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_ ); - } -} - - -// The user pressed return in the message editor, so send the message -void ChatView::enterPressed() -{ - if(! messageEdit_->text().isEmpty()) - { - // Don't send any typing messages while preparing to send the message in the text box... - doSendTypingMessages_ = false; - - // Pressing enter caused a newline to be entered under the cursor... remove it. - deleteNewlineAtCursor(); - - // Send the message. - sendMessage(); - - // Now messages can again be sent - doSendTypingMessages_ = true; - } -} - - - -// Initialize the object -bool ChatView::initialize() -{ -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView: initializing." << endl; -#endif - - if ( initialized_ ) - { - kdDebug() << "ChatView already initialized." << endl; - return false; - } - if ( !initializeCurrentAccount() ) - { - return false; - } - - // Set the default widget sizes - sidebarContainer_->resize( sidebarWidth_, sidebarContainer_->height() ); - messageBar_->resize( messageBar_->width(), messageBarHeight_ ); - - // Restore the level of zoom in the chat messages view - chatMessageView_->setZoomFactor( currentZoom_ ); - - // Get chat style - chatStyle_ = new ChatMessageStyle(); - updateChatStyle(); - - initialized_ = true; - return true; -} - - - -// Initialize the current account -bool ChatView::initializeCurrentAccount() -{ - currentAccount_ = CurrentAccount::instance(); - if ( currentAccount_ == 0 ) - { - kdDebug() << "ChatView - Couldn't get the instance of the current account." << endl; - return false; - } - connect( currentAccount_, SIGNAL( changedFontSettings() ), - this, SLOT ( updateEditorFont() ) ); - connect( currentAccount_, SIGNAL( changedChatStyleSettings() ), - this, SLOT ( updateChatStyle() ) ); - updateEditorFont(); - return true; -} - - - -// Return the encoding of the HTML document. -QString ChatView::getEncoding() const -{ - return chatMessageView_->encoding(); -} - - - -// Return the HTML source of the page. -QString ChatView::getHtml() const -{ - return chatMessageView_->getHtml(); -} - - - -// Return the selected text in the message area. -QString ChatView::getSelectedText(bool asHtml) const -{ - if( asHtml ) - { -#if KDE_IS_VERSION(3,4,0) - return chatMessageView_->selectedTextAsHTML(); -#else - return chatMessageView_->selectedText(); -#endif - } - else - { - return chatMessageView_->selectedText(); - } -} - - - -// Insert an emoticon into the message editor -void ChatView::insertEmoticon( QString emoticonText ) -{ - // Insert the text at the cursor. - messageEdit_->insert( emoticonText ); - // Delete the newline there - deleteNewlineAtCursor(); -} - - - -// Whether or not the message area is empty -bool ChatView::isEmpty() const -{ - return chatMessageView_->isEmpty(); -} - - - -// The message text changed, so the user is typing -void ChatView::messageTextChanged() -{ - if ( doSendTypingMessages_ ) - { - // Disable or enable the send button depending on whether or not the message edit is empty - if ( messageEdit_->text().isEmpty() ) - { - sendButton_->setEnabled( false ); - } - else - { - sendButton_->setEnabled( true ); - - // If the last character of the message is a newline, sending the typing signal will - // cause the actual text message to be received twice, so check the last character... - if ( messageEdit_->text().right(1) != "\n" ) - { - // If the typing timer isn't already going... - if ( !userTypingTimer_.isActive() ) - { - emit userIsTyping(); - userTypingTimer_.start( 4000, true ); - } - } - } - } -} - - - -// The user clicked the new line button so insert a new line in the editor -void ChatView::newLineClicked() -{ - messageEdit_->insert("\n"); -} - - - -// Restore the window properties (called by the parent ChatWindow) -void ChatView::readProperties( KConfig *config ) -{ -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::readProperties() - Reading saved properties." << endl; -#endif - - config->setGroup( "Chat View" ); - sidebarWidth_ = config->readNumEntry( "SidebarWidth" , 140 ); - messageBarHeight_ = config->readNumEntry( "MessagebarHeight" , 100 ); - currentZoom_ = config->readNumEntry( "CurrentZoom" , 100 ); -} - - - -// Save the chat to the given file -void ChatView::saveChatToFile( const QString &path ) -{ -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView: saving chat to '" << path << "'." << endl; -#endif - - // Create and open the file. - QFile file( path ); - if( ! file.open( IO_WriteOnly ) ) - { - kdWarning() << "ChatView: File save failed - couldn't open file '" << path << "'." << endl; - 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; - } - - // Get the text - // Make the text show nicely when viewed in an editor. - QString text = getHtml(); - text = text.replace( QRegExp("
"), "
\n" ); - - // Get encoding - QTextCodec *codec = QTextCodec::codecForName(getEncoding()); - if(codec == 0) - { - kdWarning() << "Could not find codec '" << getEncoding() << "', special characters might not be saved correctly!" << endl; - } -#ifdef KMESSDEBUG_CHATVIEW - else - { - kdDebug() << "ChatView: found codec '" << codec->name() << "' for '" << getEncoding() << "'." << endl; - } -#endif - - // Output the HTML with the right text encoding - QTextStream textStream( &file ); - if(codec != 0) - { - textStream.setCodec( codec ); - } - textStream << text; - file.close(); -} - - - -// Save the window properties (called by parent ChatWindow) -void ChatView::saveProperties( KConfig *config ) -{ -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::saveProperties() - Saving properties." << endl; -#endif - - config->setGroup( "Chat View" ); - config->writeEntry( "SidebarWidth" , sidebarContainer_->width() ); - config->writeEntry( "MessagebarHeight" , messageBar_->height() ); - config->writeEntry( "CurrentZoom" , currentZoom_ ); -} - - - -// Scroll to the bottom of the chat browser -void ChatView::scrollChatToBottom() -{ - chatMessageView_->scrollChatToBottom(); -} - - - -// The user clicked send, so send the message -void ChatView::sendClicked() -{ - sendMessage(); - - // Ensure the typing area always gets focus, - // so the user can type the next message directly. - // This area looses focus when you do other things like choosing emoticons. - messageEdit_->setFocus(); -} - - - -// Send a message via the server -void ChatView::sendMessage() -{ - uint maxSendableMessageLength = 1400; - - QString text = messageEdit_->text(); - - if(! text.isEmpty()) - { - messageEdit_->clear(); - - // 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. - QCString utf8Text = text.utf8(); - if ( utf8Text.length() > maxSendableMessageLength ) - { - // If so, then divide the text into the first part and a remainder. - QCString remainder = utf8Text.right( utf8Text.length() - maxSendableMessageLength ); - text = QString::fromUtf8( utf8Text.left( maxSendableMessageLength ) ); - - // Return the remainder to the message edit. - messageEdit_->setText( QString::fromUtf8( remainder ) ); - } - - // Replace "\n"s with "\r\n"s - text = text.replace( QRegExp("\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(), - currentAccount_->getImagePath(), - currentAccount_->getFont(), - currentAccount_->getFontColor() ); - - showMessage(message); - } -} - - - -// Add the given message to the message browser. -void ChatView::showMessage(const ChatMessage &message) -{ - if(KMESS_NULL(chatStyle_)) return; - - // Clone the message so it can be stored in the local qptrlist 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( message.isNormalMessage() && currentAccount_->getGroupFollowupMessages() ) - { - ChatMessage *lastContactMessage = lastContactMessages_.last(); - if( lastContactMessage != 0 ) - { - // Check for contact handle and message type, so offline messages won't be - // grouped with normal incoming messages. - if( lastContactMessage->getContactHandle() == message.getContactHandle() - && lastContactMessage->getType() == message.getType() ) - { - lastContactMessages_.append(chatMessage); - } - else - { - lastContactMessages_.clear(); - } - } - } - else - { - lastContactMessages_.clear(); - } - - // Convert the message, add to the browser. - if( lastContactMessages_.count() > 1 ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::showMessage: replacing last contact message with new contents." << endl; -#endif - - messageHtml = chatStyle_->convertMessageList(lastContactMessages_); - chatMessageView_->replaceLastMessage(messageHtml); - } - else - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::showMessage: appending new message." << endl; -#endif - - messageHtml = chatStyle_->convertMessage(message); - chatMessageView_->addHtmlMessage(messageHtml); - - if( message.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 ); -} - - - -// Show a dialog to save the chat. -void ChatView::showSaveChatDialog() -{ - QFileInfo targetFile; - int overwriteAllowed; - QString path = currentAccount_->getSaveChatPath() + "/kmess-chat.html"; // Default name for the saved chat - - // 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" ); - - // Verify if the user has canceled the command - if( path.isEmpty() ) - { - return; - } - - // Default to accept the path name - overwriteAllowed = KMessageBox::Ok; - - // Check if the file exists and if so, warn the user - targetFile.setFile( path ); - if( targetFile.exists() ) - { - overwriteAllowed = KMessageBox::warningContinueCancel( - 0, - i18n("The file '%1' already exists.\ndo you want to overwrite it?").arg( targetFile.fileName() ), - i18n("Overwrite File"), - KGuiItem( i18n("Over&write") ) ); - } - - } while( overwriteAllowed == KMessageBox::Cancel ); - - saveChatToFile( path ); -} - - - -/** - * Open a dialog to add a new custom emoticon seen in the chat - */ -void ChatView::slotAddNewEmoticon() -{ - if( ! chatViewClickedUrl_.isValid() || chatViewClickedUrl_.protocol() != "kmess" || chatViewClickedUrl_.host() != "emoticon" ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotAddNewEmoticon() - Ignoring request for invalid URL: " << chatViewClickedUrl_.url() << endl; -#endif - - return; - } - -/* - * Everytime we generate a link to add an emoticon, we have only access to HTML representations of the image, that means tags like: - * kmess://emoticon/contactHandle/urlEncodedShortcut/urlEncodedPictureTag - */ - - QString path = chatViewClickedUrl_.path().mid( 1 ); // remove first / - -#ifdef KMESSTEST - ASSERT( ! path.isEmpty() ); -#endif - - // Reset the url - chatViewClickedUrl_ = KURL(); - - 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 (as an HTML tag) - - const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); - if( contact == 0 ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotAddNewEmoticon() - Contact handle not found: " << handle << endl; -#endif - - return; - } - - - // URL-Decode the encoded strings - picture = KURL::decode_string( picture ); - shortcut = KURL::decode_string( shortcut ); - - // Strip the emoticon picture name from the tag - picture = picture.replace( "\"", "'" ); - picture = picture.mid( picture.find( "src='" ) + 5 ); - picture = picture.mid( 0, picture.find( "'" ) ); - -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotAddNewEmoticon() - Showing Add Emoticon dialog - shortcut=" << shortcut << " picture=" << picture << endl; -#endif - - // Finally, show the dialog, preselecting the picture file and shortcut - AddEmoticonDialog *addDialog = new AddEmoticonDialog( EmoticonManager::instance()->getTheme( true ), this, "AddEmoticonDialogChat" ); - - connect( addDialog, SIGNAL( addedEmoticon(QString) ), - chatMessageView_, SLOT( addedEmoticon(QString) ) ); - - addDialog->preSelect( picture, shortcut ); - -} - - - -// The user clicked the "copy address" or "copy email" option in the context menu -void ChatView::slotCopyAddress() -{ - QString url = chatViewClickedUrl_.url(); - - if( ! chatViewClickedUrl_.isValid() ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotCopyAddress() - Not copying invalid URL: " << url << endl; -#endif - - return; - } - -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotCopyAddress() - Copying URL: " << url << endl; -#endif - - // Strip the pseudo-protocol 'mail to' from email addresses - if( url.left( 7 ) == "mailto:" ) - { - url = url.mid( 7 ); - } - - kapp->clipboard()->setText( url ); - - // Reset the url - chatViewClickedUrl_ = KURL(); -} - - - -// The user clicked the "copy text" option in the context menu. -void ChatView::slotCopyChatText() -{ - kapp->clipboard()->setText( this->getSelectedText( false ) ); -} - - - -// Open a new url clicked in the khtml widget -void ChatView::slotOpenURLRequest( const KURL &url, const KParts::URLArgs &/* urlArgs */ ) -{ - chatViewClickedUrl_ = url; - - // Internal URLs form: kmess://call_type/parameters?more_parameters - - if( url.protocol() == "kmess" ) - { - // Application URLs form: kmess://application/responseType/contactHandle?cookieId - if( url.host() == "application" ) - { - // Handle the applications input - slotSendAppCommand(); - } - // Emoticon URLs form: kmess://emoticon/contactHandle/urlEncodedShortcut/urlEncodedPictureTag - else if( url.host() == "emoticon" ) - { - // Add a new emoticon - slotAddNewEmoticon(); - } - } - else - { - // Just execute the link - slotVisitAddress(); - } -} - - - -// The user clicked the "select all" option in the context menu. -void ChatView::slotSelectAllChatText() -{ - chatMessageView_->selectAll(); -} - - - -/** - * The user clicked a kmess internal link in the ChatMessageView - */ -void ChatView::slotSendAppCommand() -{ - // Ignore non-internal links and non-application internal links - if( ! chatViewClickedUrl_.isValid() || chatViewClickedUrl_.protocol() != "kmess" || chatViewClickedUrl_.host() != "application" ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotSendAppCommand() - Not sending invalid application link: " << chatViewClickedUrl_.url() << endl; -#endif - - return; - } - -/* - * KMess' internal application URLs are in the form - * kmess://application/responseType/accountHandle?cookieId - */ - - 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 - -#ifdef KMESSTEST - ASSERT( ! path.isEmpty() ); - ASSERT( ! query.isEmpty() ); -#endif - -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotSendAppCommand() - Sending application link - method=" << method << " contact=" << contact << " cookie=" << cookie << endl; -#endif - - emit appCommand( cookie, contact, method ); -} - - - -// The user right clicked at the KHTMLPart to show a popup. -void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &point ) -{ - KAction *urlAction = 0; - - // Add items to this context menu - KPopupMenu *contextMenu = new KPopupMenu( this ); - - // Analyze incoming URL, if present - if( ! clickedUrl.isEmpty() ) - { - KURL url( clickedUrl ); - -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotShowContextMenu() - Clicked URL: " << url.prettyURL() << endl; -#endif - - if( url.protocol() == "kmess" && url.host() == "emoticon" ) - { - urlAction = new KAction( i18n("Add this &Emoticon..."), "add", 0, this, SLOT(slotAddNewEmoticon()), this, "addemoticon" ); - urlAction->plug( contextMenu ); - } - else if( url.protocol().left( 6 ) == "mailto" ) - { - urlAction = new KAction( i18n("Send &Email"), "mail_generic", 0, this, SLOT(slotVisitAddress()), this, "sendemail" ); - urlAction->plug( contextMenu ); - urlAction = new KAction( i18n("Copy E&mail"), "copy", 0, this, SLOT(slotCopyAddress()), this, "copyemail" ); - urlAction->plug( contextMenu ); - } - else - { - urlAction = new KAction( i18n("Visit &Link"), "launch", 0, this, SLOT(slotVisitAddress()), this, "visiturl" ); - urlAction->plug( contextMenu ); - urlAction = new KAction( i18n("Copy &Address"), "copy", 0, this, SLOT(slotCopyAddress()), this, "copyurl" ); - urlAction->plug( contextMenu ); - } - - chatViewClickedUrl_ = url; - } - - // Create items - KAction *copyAction = KStdAction::copy( this, SLOT(slotCopyChatText()), 0 ); // , actionCollection() ); - KAction *selectAllAction = KStdAction::selectAll( this, SLOT(slotSelectAllChatText()), 0 ); // , actionCollection() ); - KAction *saveToFileAction = KStdAction::save( this, SLOT(showSaveChatDialog()), 0 ); // , actionCollection() ); - - // Update the labels a bit though - copyAction ->setText( i18n("&Copy text") ); - selectAllAction ->setText( i18n("Select &All") ); - 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 ) - { - contextMenu->insertSeparator(); - } - - copyAction->plug( contextMenu ); - selectAllAction->plug( contextMenu ); - - contextMenu->insertSeparator(); - saveToFileAction->plug( contextMenu ); - - // Set items disabled, depending on the text selection - if( chatMessageView_->hasSelection() ) - { - saveToFileAction->setEnabled( false ); - } - else - { - copyAction->setEnabled( false ); - } - - // Show the menu - contextMenu->exec( point ); - delete contextMenu; - delete copyAction; -} - - - -// The user clicked the "visit address" or "send email" option in the context menu, or clicked a link in the ChatMessageView -void ChatView::slotVisitAddress() -{ - QString url = chatViewClickedUrl_.url(); - - if( ! chatViewClickedUrl_.isValid() ) - { -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotVisitAddress() - Not opening invalid URL: " << url << endl; -#endif - - return; - } - -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::slotVisitAddress() - Opening URL: " << url << endl; -#endif - - kapp->invokeBrowser( url ); - - // Reset the url - chatViewClickedUrl_ = KURL(); -} - - - -// Update the editor's font to match the account's font -void ChatView::updateEditorFont() -{ -#ifdef KMESSTEST - ASSERT( currentAccount_ != 0 ); -#endif - QColor color; - - if( currentAccount_ == 0 ) - { - return; - } - - // Change the color to the user's color - color.setNamedColor( currentAccount_->getFontColor() ); - messageEdit_->setColor( color ); - messageEdit_->setPaletteForegroundColor( color ); - messageEdit_->setFont( currentAccount_->getFont() ); - messageEdit_->setCurrentFont( currentAccount_->getFont() ); - messageEdit_->setPointSize( 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(); - } - } -} - - - -// Update the chat style -void ChatView::updateChatStyle() -{ -#ifdef KMESSDEBUG_CHATVIEW - kdDebug() << "ChatView::updateChatStyle: updating style." << endl; -#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() ); - - // Support grouping of follow-up messages. - bool groupFollowups = currentAccount_->getGroupFollowupMessages(); - lastContactMessages_.clear(); - - // Replace the entire contents with the new style. - QString newHtml; - QPtrListIterator it(chatMessages_); - while( it.current() != 0 ) - { - ChatMessage *chatMessage = it.current(); - - 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"; - } - ++it; - } - - QString messageRoot = chatStyle_->convertMessageRoot(); - if( messageRoot.isNull() ) - { - // Assign standard HTML - chatMessageView_->setStandardHtml( newHtml, chatStyle_->getCssFile(), chatStyle_->getBaseFolder() ); - } - else - { - // Assign the custom HTML root - chatMessageView_->setHtml( messageRoot, newHtml ); - } - - // 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())); -} - - - -// Update the messages which contain custom emoticons -void ChatView::updateCustomEmoticon( const QString &handle, const QString &code ) -{ -#ifdef KMESSTEST - ASSERT( ! code.isEmpty() ); -#endif - - // Check for empty replacements. - if( code.isEmpty() ) - { - kdWarning() << "ChatView: can't update custom emoticon, emoticon code not given (contact=" << handle << ")." << endl; - return; - } - - // Get contact emoticon replacements. - const ContactBase *contact = currentAccount_->getContactByHandle(handle); - if(KMESS_NULL(contact)) return; - - // Get emoticon replacement, instruct chatMesasgeView to replace it. - const QString &replacement = contact->getEmoticonReplacements()[code]; - chatMessageView_->updateCustomEmoticon( code, replacement, handle, pendingEmoticonTags_ ); -} - - -#include "chatview.moc" - diff --git a/kmess/chat/chatviewinterface.ui b/kmess/chat/chatviewinterface.ui deleted file mode 100644 index fdc25ec..0000000 --- a/kmess/chat/chatviewinterface.ui +++ /dev/null @@ -1,312 +0,0 @@ - -ChatViewInterface - - - ChatViewInterface - - - - 0 - 0 - 426 - 341 - - - - ChatViewInterface - - - - unnamed - - - 2 - - - 1 - - - - sidebarSplitter_ - - - 1 - - - Horizontal - - - 6 - - - false - - - - messageSplitter_ - - - 1 - - - Vertical - - - 6 - - - false - - - - khtmlPlaceholder_ - - - - 7 - 3 - 0 - 0 - - - - - 250 - 250 - - - - StyledPanel - - - Sunken - - - 2 - - - - - messageBar_ - - - NoFrame - - - Plain - - - 0 - - - - unnamed - - - 1 - - - - layout5 - - - - unnamed - - - - layout4 - - - - unnamed - - - - sendButton_ - - - - 0 - 0 - 0 - 0 - - - - - 80 - 30 - - - - S&end - - - Alt+E - - - - - newLineButton_ - - - - 0 - 0 - 0 - 0 - - - - - 80 - 30 - - - - Ne&w Line - - - Alt+W - - - - - - - spacer2 - - - Vertical - - - Expanding - - - - 20 - 10 - - - - - - - - messageEdit_ - - - - 7 - 2 - 0 - 0 - - - - - 200 - 70 - - - - - 32767 - 32767 - - - - - - - - - sidebarContainer_ - - - NoFrame - - - Plain - - - - unnamed - - - 0 - - - 0 - - - - sidebar_ - - - - 120 - 0 - - - - 0 - - - - dummy - - - PaletteBackground - - - Sidebar - - - - - - - - - - - messageEdit_ - textChanged() - ChatViewInterface - messageTextChanged() - - - messageEdit_ - returnPressed() - ChatViewInterface - enterPressed() - - - newLineButton_ - pressed() - ChatViewInterface - newLineClicked() - - - sendButton_ - pressed() - ChatViewInterface - sendClicked() - - - - messageEdit_ - sendButton_ - newLineButton_ - - - enterPressed() - sendClicked() - newLineClicked() - messageTextChanged() - urlClicked(const QString &url) - - - diff --git a/kmess/chat/chatwindow.cpp b/kmess/chat/chatwindow.cpp deleted file mode 100644 index 5cc4137..0000000 --- a/kmess/chat/chatwindow.cpp +++ /dev/null @@ -1,2036 +0,0 @@ -/*************************************************************************** - chatwindow.cpp - description - ------------------- - begin : Wed Jan 15 22:41:32 CST 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 "chatwindow.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../actions/accountaction.h" -#include "../contact/contactbase.h" -#include "../contact/contactlist.h" -#include "../network/chatinformation.h" -#include "../network/msnswitchboardconnection.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" -#include "../specialgroups.h" -#include "../kmessapplication.h" -#include "../network/extra/xmlfunctions.h" -#include "chatview.h" -#include "chatmessageview.h" -#include "contactaction.h" -#include "contactsidebar.h" -#include "emoticonsidebar.h" -#include "websidebar.h" - -#ifdef KMESSDEBUG_CHATWINDOW - #define KMESSDEBUG_CHATWINDOW_GENERAL - #define KMESSDEBUG_CHATWINDOW_CONTACTS - #define KMESSDEBUG_CHATWINDOW_FILETRANSFER -#endif - -/** - * Define the maximum interval (in seconds) between each update of - * the status bar label, when displaying "contact is typing" messages. - */ -#define MAXIMUM_TYPING_TIME 5 - -// The constructor -ChatWindow::ChatWindow(QWidget *parent, const char *name ) - : ChatWindowInterface(parent, name), - chatView_(0), - contactSidebar_(0), - currentAccount_(0), - customEmoticonSidebar_(0), - firstMessage_(true), - initialized_(false), - lastContact_(QString::null), - msnSwitchboardConnection_(0), - standardEmoticonSidebar_(0), - temporarySidebar_(false), - webSidebar_(0) -{ - setWFlags(getWFlags() | WDestructiveClose); // Closing the window destroyes the object too - - statusLabel_ = new KSqueezedTextLabel( this ); - statusBar()->addWidget( statusLabel_, 1 ); - - caption_ = i18n("Chat"); - setCaption( caption_ ); - - // Install a filter to catch window activation events, to stop title blinking - installEventFilter( this ); - - // Connect the blink timer - connect( &blinkTimer_, SIGNAL( timeout() ), - this, SLOT ( blinkCaption() ) ); - // Connect the status clear timer - connect( &statusTimer_, SIGNAL( timeout() ), - this, SLOT ( updateTypingMessage() )); -} - - - -// The destructor -ChatWindow::~ChatWindow() -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "ChatWindow destructor: closing window..." << endl; -#endif - - // Saving properties manually. - saveProperties( kapp->config() ); - - // Delete the child objects. - // Also reset pointer, because calls from closeConnectionLater - // could invoke showMessage(). - delete chatView_; - chatView_ = 0; - - // Delete the contact actions - // Avoid crashing when the switchboard/contact fires a "contactLeftChat" signal. - while( ! contactActions_.isEmpty() ) - { - ContactAction *action = contactActions_.first(); - if( contactActions_.removeFirst() ) - { - delete action; - } - } - -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "DESTROYED ChatWindow " << endl; -#endif -} - - - -// Filter to catch window activation events -bool ChatWindow::eventFilter( QObject */*obj*/, QEvent *event ) -{ - // Stop blinking if the window is active - if( blinkTimer_.isActive() && event->type() == QEvent::WindowActivate ) - { - blinkTimer_.stop(); - setCaption( caption_ ); - } - - return false; -} - - - -// Make the caption blink if the window still doesn't have focus -void ChatWindow::blinkCaption() -{ - // If the window now has focus, stop blinking - if( isActiveWindow() ) - { - // Stop the timer - blinkTimer_.stop(); - - // Reset the caption to normal - setCaption( caption_ ); - return; - } - - // Make the caption alternate case - if ( blinkToUpper_ ) - { - setCaption( QString( "* " + caption_.upper() ) ); - } - else - { - setCaption( QString( "* " + caption_.lower() ) ); - } - - blinkToUpper_ = ! blinkToUpper_; -} - - - -// Toggle the sidebar based on account preferences -void ChatWindow::checkSidebarPreferences() -{ - if(KMESS_NULL(chatView_)) return; - if(KMESS_NULL(chatView_->sidebarContainer_)) return; - if(KMESS_NULL(currentAccount_)) return; - - if( currentAccount_->getShowSidebar() ) - { - temporarySidebar_ = false; - chatView_->sidebarContainer_->show(); - } - else - { - temporarySidebar_ = true; - chatView_->sidebarContainer_->hide(); - } -} - - - -// Choose the contact to start an invitation with. -const QString & ChatWindow::chooseContact() -{ - if( KMESS_NULL(msnSwitchboardConnection_) ) return QString::null; - - // Choose the contact. - const QStringList &contactsInChat = msnSwitchboardConnection_->getContactsInChat(); - switch( contactsInChat.count() > 1 ) - { - case 0: - // No contacts in the chat - if( msnSwitchboardConnection_->getLastContact().isEmpty() ) - { - // Send invitation to the first contact that should appear in the chat. - return msnSwitchboardConnection_->getFirstContact(); - } - else - { - // Resume chat with last contact - return msnSwitchboardConnection_->getLastContact(); - } - - case 1: - // Choose the only contact available in the chat - return contactsInChat.first(); - - 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.") ); - return QString::null; - } -} - - - -// A contact joined the chat -void ChatWindow::contactJoined(QString handle, QString friendlyName) -{ - ContactAction *contactAction; - - // Avoid newlines which cause problems to the UI layout. - caption_ = getCaption().replace( "\n", " " ); - setCaption( caption_ ); - - 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, - // or when a multi-chat has started. - if( ( ! chatView_->sidebarContainer_->isVisible() && ! currentAccount_->getShowSidebar() ) - || ( msnSwitchboardConnection_ && msnSwitchboardConnection_->getContactsInChat().size() > 1 ) ) - { - chatView_->showMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_PRESENCE, - false, - i18n("%1 has joined the chat.").arg(friendlyName), - handle, - friendlyName ) ); - } - - ContactBase *contact = currentAccount_->getContactByHandle( handle ); - if( contact ) - { - connect( contact, SIGNAL( changedFriendlyName() ), this, SLOT( update() ) ); - } -} - - - -// A contact left the chat -void ChatWindow::contactLeft(QString handle, bool isChatIdle ) -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow: contact '" << handle << "' has left" << (isChatIdle ? " due to inactivity." : "") << "." << endl; -#endif - - ContactAction *contactAction = getContactActionByHandle( handle ); - - if ( contactAction != 0 ) - { - contactAction->setInChat( false ); - } - - // Change the caption to remove the contact who has left - caption_ = getCaption().replace( "\n", "" ); - setCaption( caption_ ); - - participants_.remove( 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, - // or a user left a multi-chat - if( ( ! chatView_->sidebarContainer_->isVisible() && ! currentAccount_->getShowSidebar() ) - || ( msnSwitchboardConnection_ && msnSwitchboardConnection_->getContactsInChat().size() > 0 ) ) - { - QString contactName = currentAccount_->getContactFriendlyNameByHandle( handle ); - QString message; - - if( isChatIdle ) - { - message = i18n( "The conversation went idle, %1 has left the chat." ).arg( contactName ); - } - else - { - message = i18n( "%1 has left the chat." ).arg( contactName ); - } - - chatView_->showMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_PRESENCE, - false, - message, - handle, - contactName ) ); - } - - ContactBase *contact = currentAccount_->getContactByHandle( handle ); - if( contact ) - { - disconnect( contact, SIGNAL( changedFriendlyName() ), this, SLOT( update() ) ); - } -} - - - -// A contact is typing -void ChatWindow::contactTyping(QString, QString friendlyName) -{ - // If a contact is still typing, re-insert it in the list, so that the typing start time is updated - if( typingContacts_.contains( friendlyName ) ) - { - typingContacts_.remove( friendlyName ); - } - - // Add this contact to the list of contacts which are typing, and record when it has started writing - QTime startTime = QTime::currentTime(); - startTime.start(); - typingContacts_.insert( friendlyName, startTime ); - - // Update the actual status bar - updateTypingMessage(); -} - - - -// Create the contact actions -void ChatWindow::createContactActions() -{ - ContactAction *contactAction; - QDictIterator it( currentAccount_->getContactList()->getContactList() ); - Contact *contact; - - while ( it.current() ) - { - contact = it.current(); - contactAction = new ContactAction( contact, inviteMenu_ ); - connect( contactAction, SIGNAL( activated(QString) ), - this, SLOT ( inviteContact(QString) ) ); - contactActions_.append( contactAction ); - ++it; - } -} - - - -// Disable the parts of the window which allow user interaction, to allow viewing conversations from disconnected accounts -void ChatWindow::disable() -{ - if( msnSwitchboardConnection_ != 0 ) - { - setSwitchboardConnection( 0 ); - } - - menuBar()->setEnabled( false ); - toolBar("mainToolBar")->setEnabled( false ); - chatView_->messageEdit_->setEnabled( false ); - chatView_->sendButton_->setEnabled( false ); - chatView_->newLineButton_->setEnabled( false ); - chatView_->sidebarContainer_->setEnabled( false ); -} - - - - -// put the marked text/object into the clipboard and remove -// it from the document -void ChatWindow::editCut() -{ - if( chatView_->messageEdit_->hasFocus() ) - { - chatView_->messageEdit_->cut(); - } -} - - - -// put the marked text/object into the clipboard -void ChatWindow::editCopy() -{ - chatView_->editCopy(); -} - - - -// Bring up a dialog to change the message font color. -void ChatWindow::editFont() -{ - QFont selection; - QString fontFamily; - int leftBracket; - - selection = currentAccount_->getFont(); - - int result = KFontDialog::getFont( selection, false, 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.find( "[" ); - if ( leftBracket >= 0 ) - { - fontFamily = fontFamily.left( leftBracket ); - } - fontFamily = fontFamily.stripWhiteSpace(); - selection.setFamily( fontFamily ); - // Set it to the stored account - currentAccount_->setFont( selection ); - - // Commit changes to disk, now - KConfig *config = kapp->config(); - currentAccount_->saveProperties( config ); - } -} - - - -// Bring up a dialog to change the message font color. -void ChatWindow::editFontColor() -{ - QColor color; - QString fontColor; - - // 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(); - // Set it to the stored account - currentAccount_->setFontColor(fontColor); - - // Commit changes to disk, now - KConfig *config = kapp->config(); - currentAccount_->saveProperties( config ); - } -} - - - -// paste the clipboard into the document -void ChatWindow::editPaste() -{ - // Regardless of focus, always paste in message edit. - chatView_->messageEdit_->paste(); -} - - - -// enlarge the font size -void ChatWindow::editZoomIn() -{ - chatView_->changeZoomFactor( true ); -} - - - -// decrease the font size -void ChatWindow::editZoomOut() -{ - chatView_->changeZoomFactor( false ); -} - - - -// The emoticon button was pressed. -void ChatWindow::emoticonButtonPressed() -{ - // When the side bar is hidden, temporary show it. - if( ! chatView_->sidebarContainer_->isVisible() ) - { - temporarySidebar_ = true; - chatView_->sidebar_->setCurrentItem( standardEmoticonSidebar_ ); - chatView_->sidebarContainer_->show(); - } - else - { - // Sidebar is visible - - // Show the emoticon sidebar - if( chatView_->sidebar_->currentItem() != standardEmoticonSidebar_ ) - { - // Show emoticons - chatView_->sidebar_->setCurrentItem( standardEmoticonSidebar_ ); - } - else - { - // Emotion sidebar is displayed currently - // Hide the emoticon sidebar - if( temporarySidebar_ ) - { - // Hide again - chatView_->sidebarContainer_->hide(); - } - else - { - // Show Main tab (contacts) again - chatView_->sidebar_->setCurrentItem( contactSidebar_ ); - } - } - } -} - - - -// Forward the application command to the ChatMaster -void ChatWindow::forwardAppCommand(QString cookie, QString contact, QString command) -{ - emit appCommand(cookie, contact, command); -} - - - -// Return a list of the contacts in the chat to be used as window caption -QString ChatWindow::getCaption() -{ - QStringList activeContacts; - - // The chat has no switchboard connection.. it is not even a chat! - 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(); - } - - // How many people are there in here? - switch( activeContacts.count() ) - { - // The chat is empty - case 0: - return i18n("Chat"); - break; - - // One contact is connected; or the only contact of the session has left - case 1: - return i18n( "%1 - Chat" ) - .arg( currentAccount_->getContactFriendlyNameByHandle( activeContacts[0] ) ); - break; - - // Two contacts are connected - case 2: - return i18n( "%1 and %2 - Chat" ) - .arg( currentAccount_->getContactFriendlyNameByHandle( activeContacts[0] ) ) - .arg( currentAccount_->getContactFriendlyNameByHandle( activeContacts[1] ) ); - break; - - // Three or more contacts are connected - default: - return i18n( "%1 et al. - Chat" ) - .arg( currentAccount_->getContactFriendlyNameByHandle( activeContacts[0] ) ); - break; - } - - // We can't arrive here. Is there a clean way to avoid the useless compiler warning? - return QString::null; -} - - - -// Return the contact action with the given handle -ContactAction* ChatWindow::getContactActionByHandle(const QString& handle) -{ - ContactAction *contactAction; - - for ( contactAction = contactActions_.first(); contactAction; contactAction = contactActions_.next() ) - { - if ( contactAction->getHandle() == handle ) - { - return contactAction; - } - } - return 0; -} - - - -// Return the switchboard connection used by the chat window. -MsnSwitchboardConnection * ChatWindow::getSwitchboardConnection() const -{ - return msnSwitchboardConnection_; -} - - - -// Initialize the object -bool ChatWindow::initialize( QString handle ) -{ - if ( initialized_ ) - { - kdDebug() << "ChatWindow already initialized." << endl; - return false; - } - readProperties(kapp->config()); // We need the properties now. - if ( !initializeChatView() ) - { - kdDebug() << "ChatWindow - Couldn't setup the chat view widget." << endl; - return false; - } - if ( !initializeContactSidebar() ) - { - kdDebug() << "ChatWindow - Couldn't setup the contacts sidebar widget." << endl; - return false; - } - if ( !initializeEmoticonSidebar() ) - { - kdDebug() << "ChatWindow - Couldn't setup the emoticon sidebar widget." << endl; - return false; - } - if ( !initializeWebSidebar() ) - { - kdDebug() << "ChatWindow - Couldn't setup the web sidebar widget." << endl; - return false; - } - if ( !initializeCurrentAccount() ) - { - kdDebug() << "ChatWindow - Couldn't setup the current account." << endl; - return false; - } - - // Pre-register this contact as a participant in the chat window. - // At this time we still don't have a switchboard, this is needed to ensure that this window is - // recognized as this contact's window right from the start. - participants_.clear(); - lastContact_ = handle; - - // Save the date/time the chat started. - // Use it to save a chatlog later. - startDate_ = QDate::currentDate(); - startTime_ = QTime::currentTime(); - - // Update the chat window caption with the contact name - update(); - - initialized_ = true; - return true; -} - - - -// Set up the main chat view -bool ChatWindow::initializeChatView() -{ - - // Create the chat view - chatView_ = new ChatView( this, "ChatView" ); - - if ( chatView_ == 0 ) - { - kdDebug() << "ChatWindow - Couldn't create a new chat view." << endl; - return false; - } - - // Make it read its properties - chatView_->readProperties( kapp->config() ); - - // Initialize it - if ( ! chatView_->initialize() ) - { - kdDebug() << "ChatWindow - Couldn't initialize the chat view." << endl; - return false; - } - - setCentralWidget( chatView_ ); - - connect( chatView_, SIGNAL( sendFiles(QStringList) ), - this, SLOT( slotStartFileTransfer(QStringList) ) ); - connect( chatView_, SIGNAL( appCommand(QString, QString, QString) ), - this, SLOT( forwardAppCommand(QString, QString, QString) ) ); - connect( chatView_, SIGNAL( sendMessageToContact(QString) ), - this, SLOT( userSentMessage() ) ); - - return true; -} - - - -// Set up the contact sidebar -bool ChatWindow::initializeContactSidebar() -{ -#ifdef KMESSTEST - ASSERT( contactSidebar_ == 0 ); -#endif - if ( chatView_ == 0 ) - { - kdDebug() << "ChatWindow - The chatview widget needs to be created before the contact sidebar." << endl; - return false; - } - // Create the sidebar - contactSidebar_ = new ContactSidebar( chatView_->sidebar_, "ContactSidebar" ); - - // Initialize the sidebar - if ( !contactSidebar_->initialize() ) - { - kdDebug() << "ChatWindow - Couldn't initialize the contact sidebar." << endl; - return false; - } - - chatView_->sidebar_->addItem( contactSidebar_, i18n( "Contacts" ) ); - chatView_->sidebar_->setCurrentItem( contactSidebar_ ); - - // connect some signals so that the sidebars can send commands back - connect( contactSidebar_, SIGNAL( inviteContact( QString ) ), - this, SLOT( inviteContact( QString ) ) ); - 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 ) ) ); - -#ifdef KMESSTEST - ASSERT( contactSidebar_ != 0 ); -#endif - return true; -} - - - -// Set up the current account -bool ChatWindow::initializeCurrentAccount() -{ -#ifdef KMESSTEST - ASSERT( currentAccount_ == 0 ); -#endif - - currentAccount_ = CurrentAccount::instance(); - if ( currentAccount_ == 0 ) - { - kdDebug() << "ChatWindow - Couldn't get an instance of the current account." << endl; - return false; - } - - // Set up some widgets based on account settings - emoticonAction_->setChecked( currentAccount_->getUseEmoticons() ); - -#ifdef KMESSTEST - ASSERT( currentAccount_ != 0 ); -#endif - return true; -} - - - -// Initialize the emoticon chooser -bool ChatWindow::initializeEmoticonSidebar() -{ - if( KMESS_NULL(chatView_) ) return false; - - // Create the emoticon sidebars - standardEmoticonSidebar_ = new EmoticonSidebar( chatView_->sidebar_, "StandardEmoticonSidebar", false ); - customEmoticonSidebar_ = new EmoticonSidebar( chatView_->sidebar_, "CustomEmoticonSidebar", true ); - - // Connect up the emoticon chooser - connect( standardEmoticonSidebar_, SIGNAL( insertEmoticon( QString ) ), - chatView_, SLOT ( insertEmoticon( QString ) ) ); - connect( customEmoticonSidebar_, SIGNAL( insertEmoticon( QString ) ), - chatView_, SLOT ( insertEmoticon( QString ) ) ); - - chatView_->sidebar_->addItem( standardEmoticonSidebar_, i18n( "Emoticons" ) ); - chatView_->sidebar_->addItem( customEmoticonSidebar_, i18n( "My emoticons" ) ); - - return true; -} - - - -// Set up the web sidebar -bool ChatWindow::initializeWebSidebar() -{ -#ifdef KMESSTEST - ASSERT( webSidebar_ == 0 ); -#endif - if ( chatView_ == 0 ) - { - kdDebug() << "ChatWindow - The chatview widget needs to be created before the web sidebar." << endl; - return false; - } - - /* - // This sidebar needs to be improved more - - - // Create the sidebar - webSidebar_ = new WebSidebar( chatView_->sidebar_, "WebSidebar" ); - - // Initialize the sidebar - if ( ! webSidebar_->initialize() ) - { - kdDebug() << "ChatWindow - Couldn't initialize the web sidebar." << endl; - return false; - } - - chatView_->sidebar_->addItem( webSidebar_, i18n("Activities") ); - - -#ifdef KMESSTEST - ASSERT( webSidebar_ != 0 ); -#endif - - */ - return true; -} - - - -// Invite a contact to the chat -void ChatWindow::inviteContact( QString handle ) -{ - if( msnSwitchboardConnection_ == 0 ) - { - return; - } - - msnSwitchboardConnection_->inviteContact( handle ); -} - - - -// The application is exiting -bool ChatWindow::queryExit() -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::queryClose: saving chatlog" << endl; -#endif - - // Save the chat before going down! - saveChatAutomatically(); - - return true; -} - - - -// The chat window is closing -bool ChatWindow::queryClose() -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::queryClose: saving chatlog" << endl; -#endif - - // Save the chat - saveChatAutomatically(); - - /** - * TODO: Uncomment this part: it needs a _reliable_ method to check whether there are running file - * transfers. The commented part uses "ApplicationList::isEmpty()" which I've removed, the new - * method to check will probably be elsewhere. The main code of that method was this: - * - // check if there are active applications - if ( mimeApplications_.count() + - p2pApplications_.count() - - abortingApplications_.count() == 0) - return true; else return false; - * - */ - /* - // If there are active applications show a warning to the user - if( participants_.count() == 1 ) // Transfers are not possibile in multiple chats - { - // Check if there are active applications - ContactBase *contact = currentAccount_->getContactByHandle( participants_.first() ); - if( contact != 0 && contact->getApplicationList() != 0 - && ! contact->getApplicationList()->isEmpty() ) - { - int choice = KMessageBox::warningContinueCancel( this, i18n("Continue closing the chat window?\nActive transfers will be aborted!")); - if( choice == KMessageBox::Cancel ) - { - return false; - } - } - } - */ - - // Notify ChatMaster - emit closing(this); - - // Delete the contact actions - // Avoid crashing when the switchboard/contact fires a "contactLeftChat" signal. - while( ! contactActions_.isEmpty() ) - { - ContactAction *action = contactActions_.first(); - if( contactActions_.removeFirst() ) - { - delete action; - } - } - // Delete the contact frames - // Avoid crashing when the switchboard/contact fires a "contactTyping" signal. - // Don't delete this in the destructor, QObject will already do this. - delete contactSidebar_; - contactSidebar_ = 0; - - // If the main window is not visible, make sure only this window closes - if( ! kapp->mainWidget()->isVisible() ) - { - hide(); - deleteLater(); - return false; - } - else - { - // Normal procedure is ok - return true; - } -} - - - -// Return whether or not the contact is in this chat. -bool ChatWindow::isContactInChat( const QString &handle ) -{ -#ifdef KMESSDEBUG_CHATWINDOW_CONTACTS - kdDebug() << "ChatWindow::isContactInChat() - Checking handle " << handle << " - participants: " << participants_.join(",") << " - lastContact: " << lastContact_ << endl; -#endif - - if( participants_.isEmpty() ) - { -#ifdef KMESSDEBUG_CHATWINDOW_CONTACTS - kdDebug() << "ChatWindow::isContactInChat() - returning " << ( lastContact_ == handle ? "true" : "false" ) << endl; -#endif - return ( lastContact_ == handle ); - } - -#ifdef KMESSDEBUG_CHATWINDOW_CONTACTS - kdDebug() << "ChatWindow::isContactInChat() - returning " << ( participants_.contains( handle ) ? "true" : "false" ) << endl; -#endif - return participants_.contains( handle ); -} - - - -// Return whether or not this is an exclusive chat with the given contact -bool ChatWindow::isExclusiveChatWithContact( const QString& handle ) -{ -#ifdef KMESSDEBUG_CHATWINDOW_CONTACTS - kdDebug() << "ChatWindow::isExclusiveChatWithContact() - Checking handle " << handle << " - participants: " << participants_.join(",") << " - lastContact: " << lastContact_ << endl; -#endif - if( participants_.isEmpty() ) - { -#ifdef KMESSDEBUG_CHATWINDOW_CONTACTS - kdDebug() << "ChatWindow::isExclusiveChatWithContact() - returning " << ( lastContact_ == handle ? "true" : "false" ) << endl; -#endif - return ( lastContact_ == handle ); - } - -#ifdef KMESSDEBUG_CHATWINDOW_CONTACTS - kdDebug() << "ChatWindow::isExclusiveChatWithContact() - returning " << ( participants_.contains(handle) && participants_.count() < 2 ? "true" : "false" ) << endl; -#endif - return ( participants_.contains(handle) && participants_.count() < 2 ); -} - - - -// Return whether or not the chat is at its first incoming message -bool ChatWindow::isChatFirstMessage() -{ - return firstMessage_; -} - - - -// Change the switchboard connection used by the chat window. -void ChatWindow::setSwitchboardConnection( MsnSwitchboardConnection *newConnection ) -{ - if( KMESS_NULL(chatView_ ) ) return; - if( KMESS_NULL(contactSidebar_) ) return; - - QStringList participants; - QStringList::Iterator it; - - // Everything is connected already. -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - if( msnSwitchboardConnection_ == 0 ) - { - kdDebug() << "ChatWindow::setSwitchboardConnection() - Switchboard was not set up." << endl; - } - else - { - kdDebug() << "ChatWindow::setSwitchboardConnection() - Switchboard was " - << ( msnSwitchboardConnection_ == newConnection ? "already set" : "different" ) << "." << endl; - } -#endif - - if( msnSwitchboardConnection_ != 0 ) - { - // Notify that all contacts have left the chat - participants = msnSwitchboardConnection_->getContactsInChat(); - for( it = participants.begin(); it != participants.end(); ++it ) - { - contactSidebar_->contactLeft( *it, false ); - } - - // Delete all signals between us and the old switchboard - disconnect( chatView_, 0, msnSwitchboardConnection_, 0 ); - disconnect( msnSwitchboardConnection_, 0, contactSidebar_, 0 ); - disconnect( msnSwitchboardConnection_, 0, this, 0 ); - - // Also delete the old connection, if we're setting up a new one - if( msnSwitchboardConnection_ != newConnection ) - { - msnSwitchboardConnection_->deleteLater(); - } - } - - msnSwitchboardConnection_ = newConnection; - - if( newConnection == 0 ) - { - connect( chatView_, SIGNAL( sendMessageToContact(QString) ), - this, SLOT ( slotSendingFailed(QString) ) ); - return; - } - else - { - disconnect( chatView_, 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(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( 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( deleteMe(MsnSwitchboardConnection*) ), - this, SLOT ( setSwitchboardConnection() ) ); - - connect( chatView_, SIGNAL( sendMessageToContact(QString) ), - msnSwitchboardConnection_, SLOT ( sendChatMessage(QString) ) ); - connect( chatView_, SIGNAL( userIsTyping() ), - msnSwitchboardConnection_, SLOT ( sendTypingMessage() ) ); - - - // Add to the sidebar all the contacts that are present in the new switchboard - participants = msnSwitchboardConnection_->getContactsInChat(); - for( it = participants.begin(); it != participants.end(); ++it ) - { - contactSidebar_->contactJoined( *it, QString::null ); - } -} - - - -// Restore the window properties (called by KMainWindow) -void ChatWindow::readProperties( KConfig *config ) -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::readProperties() - Reading saved properties." << endl; -#endif - - // First save the general interface settings - ChatWindowInterface::readProperties( config ); - - // Start saving our stuff - config->setGroup( "Chat Window" ); - - // Save the spell checking preference - toggleSpellCheck( config->readBoolEntry("UseSpellCheck", false) ); - -} - - - -// A message was received from a contact. -void ChatWindow::receivedMessage(const ChatMessage &message) -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::receivedMessage() - Displaying message, internal type=" << message.getType() << endl; - kdDebug() << "ChatWindow::receivedMessage() - First message = " << firstMessage_ << "." << endl; -#endif - - if( KMESS_NULL(chatView_) ) return; - - // Find if it's the first message of the chat - bool isFirstMessage = chatView_->isEmpty(); - - chatView_->showMessage( message ); - - // If the window doesn't have focus... - if( ! isActiveWindow() || ! hasFocus() ) - { - // Start the caption blinking - startBlink(); - } - - // If this is the first message received... - if( firstMessage_ ) - { - // 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; - } - - // It's the first message now - if( isFirstMessage ) - { - // Update the sidebar - checkSidebarPreferences(); - - // Check if we should autoreply the chat message - if( currentAccount_ != 0 && - msnSwitchboardConnection_ != 0 && - currentAccount_->getAutoreply() ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - Sending auto reply to chat message." << endl; -#endif - // Send the autoreply message - QString awayMessage = currentAccount_->getAutoreplyMessage(); - awayMessage += i18n(" (This message was sent automatically)"); - msnSwitchboardConnection_->sendChatMessage( awayMessage ); - - // Show the autoreply message - ChatMessage autoMessage = ChatMessage( ChatMessage::TYPE_OUTGOING, - ChatMessage::CONTENT_MESSAGE, - false, - awayMessage, - currentAccount_->getHandle(), - currentAccount_->getFriendlyName(), - currentAccount_->getImagePath(), - currentAccount_->getFont(), - currentAccount_->getFontColor() ); - chatView_->showMessage( autoMessage ); - } - } - - - // Emit the new message signal so that the user will receive a notification - if( currentAccount_ != 0 && ! isActiveWindow() ) - { - emit newChatMessage( message, this ); - } - - // Notify the sidebar, so the contact frame can update itself - if( ! KMESS_NULL(contactSidebar_) ) // TODO: likely not needed, won't remove it so close before a release. - { - contactSidebar_->messageReceived( message.getContactHandle() ); - } - - // Stop the "user is typing" message - statusLabel_->setText( QString::null ); - statusTimer_.stop(); - - // Put back the focus to the message edit box - chatView_->messageEdit_->setFocus(); -} - - - -// Save the chat according to the user's request -void ChatWindow::saveChat() -{ - chatView_->showSaveChatDialog(); -} - - - -// Save the chat if necessary -void ChatWindow::saveChatAutomatically() -{ - 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() ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - User has save chats disabled, not saving chat." << endl; -#endif - return; - } - - - // Check if the message area is not empty - if(chatView_->isEmpty() ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - Message area is empty, not saving chat." << endl; -#endif - 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). - kdWarning() << "ChatWindow - Base directory '" << basePath << "' doesn't exist. Check your settings." << endl; - return; - } - -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - Automatically saving the chat." << endl; -#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_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - Date is " << year << "/" << month << "/" << day << " " << hour << ":" << minute << "." << endl; -#endif - - // Determine the path to save - saveStructure = currentAccount_->getSavedChatDirectoryStructure(); - - switch(saveStructure) - { - 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.absPath() + file + time + " "; - if( participants_.isEmpty() ) - { - savePath += lastContact_; - } - else - { - savePath += participants_.first(); - } - - - // Make sure chat logs are not automatically overwritten. - if( QFile::exists( savePath + ".html" ) ) - { - kdWarning() << "Chat log " << savePath << ".html already exists!" << endl; - for( int i = 1; i < 100; i++ ) - { - if( ! QFile::exists(savePath + "." + QString::number(i) + ".html") ) - { - savePath += "." + QString::number(i); - break; - } - } - } - - // Save the chat - chatView_->saveChatToFile( savePath + ".html" ); -} - - - -// Save the window properties (called by KMainWindow) -void ChatWindow::saveProperties( KConfig *config ) -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - Saving properties." << endl; -#endif - - // First save the general interface settings - ChatWindowInterface::saveProperties( config ); - - - // Start saving our stuff - config->setGroup( "Chat Window" ); - - // Save the spell checking preference - config->writeEntry( "UseSpellCheck", chatView_->messageEdit_->checkSpellingEnabled() ); - - // Also save ChatView's settings - chatView_->saveProperties( config ); -} - - - -// Shake the window, for nudge/buzzer effect. -void ChatWindow::shakeWindow() -{ - QTime t; - - // avoid shaking again in a short period. - if( lastShake_.secsTo( QTime::currentTime() ) < 15 ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::shakeWindow: Not shaking the window after " - << lastShake_.secsTo(QTime::currentTime()) << " seconds." << endl; -#endif - return; - } - lastShake_ = QTime::currentTime(); - - // Shake the window. - // Code example from: http://ariya.blogspot.com/2005/12/buzz-or-shake-my-window.html - int xp = x(); - int yp = y(); - t.start(); - for ( int i = 16; i > 0; ) - { - kapp->processEvents(); - if ( t.elapsed() >= 50 ) - { - int delta = i >> 2; - int dir = i & 3; - int dx = (dir == 1 || dir == 2) ? delta : -delta; - int dy = (dir < 2) ? delta : -delta; - move( xp+dx, yp+dy ); - t.restart(); - i--; - } - } - - // Move to start again - move( xp, yp ); -} - - - -// "Show status bar" was toggled. -void ChatWindow::showStatusBar() -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - Checking the status bar. showStatusBar_->isChecked() = " << showStatusBar_->isChecked() << "." << endl; -#endif - - // We initialite the chatview later, so ignore the first call from readProperties() - if ( chatView_ == 0 ) return; - - - if( showStatusBar_->isChecked() ) - { - statusBar()->show(); - } - else - { - statusBar()->hide(); - } -} - - - -// Show a status message for some seconds in the status dialog -void ChatWindow::showStatusMessage( QString message, int duration ) -{ - // Avoid newlines which cause problems to the UI layout. - message = message.replace( "\n", " " ); - - statusLabel_->setText( message ); - - if( message.isEmpty() ) - { - statusTimer_.stop(); - } - else - { - statusTimer_.stop(); - - if( duration > 0 ) - { - statusTimer_.start( duration * 1000, true ); - } - } -} - - - -// Show a wink received by a contact -void ChatWindow::showWink( const QString &handle, const QString &filename, const QString &/*animationName*/ ) -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow: Processing received wink data." << endl; -#endif - - // TODO: move the processing of wink files to a special "WinkArchive" class. - - // Test whether the file exists, before cabextract fails. - if( ! QFile::exists(filename) ) - { - kdWarning() << "ChatWindow::showWink: file not found: " << filename << "!" << endl; - return; - } - - // Remove extension - QString dirName = QString(filename).remove( QRegExp("\\.[a-z]+$") ); - - QFile metaFile(dirName + "/content.xml"); - - // See if the file was extracted already - if( ! metaFile.exists() ) - { - // 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.closeStdout(); - cabextract << "cabextract" << "-q" << "-d" << dirName << filename; - bool started = cabextract.start( KProcess::Block ); - // TODO: capture `cabextract` error messages, display nicely. - - if( ! started ) - { - chatView_->showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n("The wink could not be displayed. Make sure you have 'cabextract' installed."), - handle ) ); - return; - } - if( ! cabextract.normalExit() || ! metaFile.exists() ) - { - chatView_->showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n("The wink could not be displayed. The data could not be read."), - handle ) ); - return; - } - } - - // Open the file - if( ! metaFile.open( IO_ReadOnly ) ) - { - kdWarning() << "ChatWindow::showWink: file could not be opened: " << metaFile.name() << "!" << endl; - return; - } - - // Parse the XML - QString xmlErrorMessage; - QDomDocument xml; - if( ! xml.setContent(&metaFile, true, &xmlErrorMessage) ) - { - kdWarning() << "ChatWindow::showWink: parsing of wink XML failed: " << xmlErrorMessage << "!" << endl; - return; - } - - // Get the package nodes - QDomElement packageNode = xml.namedItem("package").toElement(); - if( packageNode.isNull() ) - { - kdWarning() << "ChatWindow::showWink: XML element /package not found!" << endl; - return; - } - - if( packageNode.attribute("type") != "wink" ) - { - kdWarning() << "ChatWindow::showWink: XML element /package/@type is not 'wink'!" << endl; - return; - } - - if( packageNode.attribute("contenttype") != "D" ) - { - kdWarning() << "ChatWindow::showWink: XML element /package/@contenttype is not 'D'!" << endl; - } - - // Get the child nodes - QString thumbnail; - QString animation; - QString animationType; - QDomNodeList packageItems = packageNode.childNodes(); - for(uint 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" ) - { - thumbnail = child.attribute("file"); - // Type not stored. There are winks with mimetype="image/png" while they're sending a JPG. - } - else - { - kdWarning() << "ChatWindow::showWink: unknown wink element type: '" << type << "'!" << endl; - } - } - } - - // TODO: clean up weird characters from wink file name. - - if( thumbnail.isEmpty() || animation.isEmpty() || animationType.isEmpty() ) - { - kdWarning() << "ChatWindow::showWink: XML elements are missing, could not play wink!" << endl; - return; - } - - // Escape data for inclusion in HTML. - animation = QStyleSheet::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 - QString friendlyName = currentAccount_->getContactFriendlyNameByHandle(handle); - receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_WINK, - true, - i18n("You have received a wink from %1").arg(friendlyName) + html, - handle, - friendlyName ) ); - // TODO: include contact meta data in ChatMessage() constructor to show wink nicer -} - - -// Start blinking the caption -void ChatWindow::startBlink() -{ - setCaption( caption_.upper() ); - blinkToUpper_ = false; - blinkTimer_.start( 2000, false ); -} - - - -// Start a chat -void ChatWindow::startChat() -{ - if( KMESS_NULL(msnSwitchboardConnection_) ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdWarning() << "ChatWindow::startChat() - Tried to open a chat without a switchboard!" << endl; -#endif - return; - } - - if( ! msnSwitchboardConnection_->isInactive() ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::startChat() - Opening a normal chat." << endl; -#endif - // Initialize an online chat - - // Create the contact actions if they haven't already been created - if ( contactActions_.count() == 0 ) - { - createContactActions(); - } - } - else - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::startChat() - Opening an offline chat." << endl; -#endif - // Initialize an offline chat - QString handle = msnSwitchboardConnection_->getLastContact(); - } - - // Add the participant contacts to the chat, even if they're offline - if( ! KMESS_NULL( contactSidebar_ ) ) - { - QStringList participants = msnSwitchboardConnection_->getContactsInChat(); - QStringList::Iterator it = participants.begin(); - for( ; it != participants.end(); ++it ) - { - contactSidebar_->contactJoined( *it, QString::null ); // The sidebar slot doesn't use the second parameter - } - } - - chatView_->messageEdit_->setFocus(); - checkSidebarPreferences(); -} - - - -// Start GnomeMeeting with a contact. -void ChatWindow::startMeeting() -{ - // Choose the contact. - QString handle = chooseContact(); - - if( KMESS_NULL(msnSwitchboardConnection_) ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdWarning() << "ChatWindow::startMeeting() - Tried to open a meeting with \'" << handle << "\' without a switchboard!" << endl; -#endif - return; - } - - emit requestNetMeeting(handle); -} - - - -//Start voice conversation -void ChatWindow::startConversation() -{ - if( KMESS_NULL(msnSwitchboardConnection_) ) - { -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdWarning() << "ChatWindow::startConversation() - Tried to open a conversation without a switchboard!" << endl; -#endif - return; - } - - kdWarning() << "ChatWindow::startConversation: not implemented!" << endl; - // msnSwitchboardConnection_->startApp( MsnSwitchboardConnection::VOICECONVERSATION ); -} - - - -// Change the status bar message. -void ChatWindow::statusMessage(QString /*message*/) -{ -} - - - -// 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 spell checking" action is called. -void ChatWindow::toggleSpellCheck( bool useSpellCheck ) -{ - // Don't crash if the chat view isn't available - if( KMESS_NULL(chatView_) ) return; - -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow::toggleSpellCheck() - Spell checking is now " << useSpellCheck << endl; -#endif - - // Access the spell checker - QSyntaxHighlighter *syntax = chatView_->messageEdit_->syntaxHighlighter(); - KDictSpellingHighlighter *spell = dynamic_cast( syntax ); - - if( spell ) - { - // Put it to work - spell->setAutomatic( useSpellCheck ); - spell->setActive( useSpellCheck ); - } -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - else - { - kdDebug() << "ChatWindow::toggleSpellCheck() - Spell checking unavailable." << endl; - } -#endif - - // Enable the spell check for the message editor - chatView_->messageEdit_->setCheckSpellingEnabled( useSpellCheck ); -} - - - -// Called when the "show sidebar" action is called. -void ChatWindow::toggleSidebar() -{ - chatView_->scrollChatToBottom(); - - if( chatView_->sidebarContainer_->isVisible() ) - { - chatView_->sidebarContainer_->hide(); - } - else - { - chatView_->sidebarContainer_->show(); - } - - // Toggle the current account's setting. - if ( currentAccount_ != 0 ) - { - currentAccount_->setShowSidebar( chatView_->sidebarContainer_->isVisible() ); - -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow - Set 'show sidebar' to " << currentAccount_->getShowSidebar() << "." << endl; -#endif - } -} - - - -// Signal that a message could not be sent to the switchboard -void ChatWindow::slotSendingFailed( QString message ) -{ - message = ( message.length() > 16 ) ? ( message.left( 16 ) + "..." ) : message; - - // We're assuming the chat is empty or broken, so we won't query the switchboard for the contact handle - chatView_->showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n("The message '%1' could not be sent.").arg( message ), - lastContact_ ) ); - -} - - - -// Send a file to a contact. -void ChatWindow::slotStartFileTransfer( QStringList fileList ) -{ -#ifdef KMESSDEBUG_CHATWINDOW_FILETRANSFER - kdDebug() << "ChatWindow:::slotStartFileTransfer()" << endl; -#endif - if( KMESS_NULL(msnSwitchboardConnection_) ) return; - - // Ask for a contact - QString handle = chooseContact(); - - if( fileList.empty() ) - { -#ifdef KMESSDEBUG_CHATWINDOW_FILETRANSFER - kdDebug() << "ChatWindow:::slotStartFileTransfer() - asking for a file to send" << endl; -#endif - - // If no file names were given, ask for a filename - QString recentTag = ":fileupload"; - KURL startDir = KFileDialog::getStartURL(QString::null, recentTag); - QString filename = KFileDialog::getOpenFileName(startDir.url()); - - // Stop if no file was selected - 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 ); - } - else - { - for( QStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it ) - { -#ifdef KMESSDEBUG_CHATWINDOW_FILETRANSFER - kdDebug() << "ChatWindow:::slotStartFileTransfer() - Sending file " << *it << endl; -#endif - emit requestFileTransfer( handle, *it ); - } - } -} - - - -// Notify the user of a received nudge -void ChatWindow::slotReceivedNudge(const QString &handle) -{ -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "ChatWindow: Received a nudge." << endl; -#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!").arg(friendlyName), - handle, - friendlyName ) ); - - // Start the buzz effect. - if( currentAccount_->getShakeNudge() ) - { - shakeWindow(); - } -} - - - -// Send a nudge to a contact -void ChatWindow::slotSendNudge() -{ - if( msnSwitchboardConnection_ == 0 ) - { - return; - } - - // Display message - const QStringList &contactsInChat = msnSwitchboardConnection_->getContactsInChat(); - QString message; - if( contactsInChat.count() == 1 && msnSwitchboardConnection_->isConnected() ) - { - message = i18n( "You've sent a nudge to %1!" ) - .arg( currentAccount_->getContactFriendlyNameByHandle( contactsInChat.first() ) ); - } - else - { - // Chat is either empty (should resume), or a multi-chat - message = i18n( "You've sent a nudge!" ); - } - - chatView_->showMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_NUDGE, - false, - message, - QString::null ) ); - - // Send nudge - msnSwitchboardConnection_->sendNudge(); - - // Shake the window - if( currentAccount_->getShakeNudge() ) - { - shakeWindow(); - } -} - - - -// An event requires the window to update its properties -void ChatWindow::update() -{ - caption_ = getCaption().replace( "\n", " " ); - setCaption( caption_ ); -} - - - -// Update the messages which contain custom emoticons -void ChatWindow::updateCustomEmoticon( const QString &handle, const QString &code ) -{ - // Relay to chat view. - chatView_->updateCustomEmoticon(handle, code); -} - - - -// Update the contact typing messages in the status bar -void ChatWindow::updateTypingMessage() -{ - // Allow a maximum number of seconds between each update. - int nextUpdate = MAXIMUM_TYPING_TIME; - - int secsTo; - QStringList typingContactsList; - QMap::Iterator it; - - for( it = typingContacts_.begin(); it != typingContacts_.end(); ++it ) - { - secsTo = (int) ( it.data().elapsed() * .001 ); // Only keep the seconds - - // If the typing event has expired, stop displaying it - if( secsTo >= MAXIMUM_TYPING_TIME ) - { - typingContacts_.remove( it.key() ); - } - else - { - // Find the typing event which will expire first, so we can remove that - if( secsTo && secsTo < nextUpdate ) - { - nextUpdate = secsTo; - } - - typingContactsList << it.key(); - } - } - - // The more time passes from the last update, the more we get close to the next update - if( nextUpdate < 5 ) - { - nextUpdate = MAXIMUM_TYPING_TIME - nextUpdate; - } - - // If no one is typing anymore, clean up the status bar - if( typingContacts_.count() == 0 ) - { - statusLabel_->setText( QString::null ); - return; - } - - QString statusString; - - // Decide what string will be used depending on how many contacts are typing - if( typingContacts_.count() == 1 ) - { - statusString = i18n("%1 is typing.").arg( typingContactsList.first() ); - } - else - { - QString first = typingContactsList[0], second = typingContactsList[1]; - int count = typingContactsList.count() - 2; - - if( typingContacts_.count() == 2 ) - { - statusString = i18n("%1 and %2 are typing.").arg( first ).arg( second ); - } - else - { - statusString = i18n("%1, %2 and %3 others are typing.").arg( first ).arg( second ).arg( count ); - } - } - - // Set the newly built message to the status bar - showStatusMessage( statusString, nextUpdate ); -} - - - -// The user sent a new message -void ChatWindow::userSentMessage() -{ - // If an emoticon sidebar is still visible, show the contact bar again. - if( chatView_->sidebar_->currentItem() != contactSidebar_ ) - { - chatView_->sidebar_->setCurrentItem( contactSidebar_ ); - } - - // When the sidebar was only temporary visible, hide it again - if( temporarySidebar_ && ! currentAccount_->getShowSidebar() ) - { - chatView_->sidebarContainer_->hide(); - } -} - - - -#include "chatwindow.moc" diff --git a/kmess/chat/chatwindow.h b/kmess/chat/chatwindow.h deleted file mode 100644 index dfd0c34..0000000 --- a/kmess/chat/chatwindow.h +++ /dev/null @@ -1,263 +0,0 @@ -/*************************************************************************** - chatwindow.h - description - ------------------- - begin : Wed Jan 15 22:41:32 CST 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 CHATWINDOW_H -#define CHATWINDOW_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include - -#include - -#include "chatmessage.h" -#include "chatmaster.h" -#include "chatwindowinterface.h" - -// Forward declarations -class ChatInformation; -class ChatView; -class ChatMessage; -class ContactBase; -class ContactAction; -class ContactSidebar; -class CurrentAccount; -class EmoticonSidebar; -class KMessTest; -class MsnSwitchboardConnection; -class QDir; -class QLabel; -class WebSidebar; - -/* ChatWindow is the main window for a chat with one or more contacts */ -class ChatWindow : public ChatWindowInterface -{ - Q_OBJECT - - friend class KMessTest; - - public: - // The construtor - ChatWindow( QWidget* parent=0, const char *name=0 ); - // The destructor - ~ChatWindow(); - // Disable the parts of the window which allow user interaction, to allow viewing conversations from disconnected accounts - void disable(); - // Filter to catch window activation events - bool eventFilter( QObject *obj, QEvent *event ); - // Initialize the object - bool initialize( QString handle ); - // 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 ); - // Return whether or not the chat is at its first incoming message - bool isChatFirstMessage(); - // Start a chat - void startChat(); - // Show a status message temporary in the status dialog - void showStatusMessage( QString message, int duration = 5000 ); - // Show a wink received by a contact - void showWink( const QString &handle, const QString &filename, const QString &animationName ); - // Update the messages which contain custom emoticons - void updateCustomEmoticon( const QString &handle, const QString &code ); - - public slots: - // A message was received from a contact. - void receivedMessage(const ChatMessage &message); - // Change the switchboard connection used by the chat window. - void setSwitchboardConnection( MsnSwitchboardConnection *newConnection = 0 ); - // An event requires the window to update its properties - void update(); - - protected: - // Restore the window properties (called by KMainWindow) - virtual void readProperties(KConfig *config); - // Save the window properties (called by KMainWindow) - virtual void saveProperties(KConfig *config); - - protected slots: - // put the marked text/object into the clipboard and remove - // it from the document - void editCut(); - // put the marked text/object into the clipboard - void editCopy(); - // Bring up a dialog to change the message font color. - void editFontColor(); - // Bring up a dialog to change the message font color. - void editFont(); - // paste the clipboard into the document - void editPaste(); - // enlarge the font size - void editZoomIn(); - // decrease the font size - void editZoomOut(); - // "Show status bar" was toggled. - void showStatusBar(); - // Send a nudge - void slotSendNudge(); - // Send a file to a contact. - void slotStartFileTransfer( QStringList fileList = QStringList() ); - //Voice conversation - void startConversation(); - // Start GnomeMeeting with a contact. - void startMeeting(); - // Change the status bar message. - void statusMessage(QString message); - // 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 "use spell checking" action is called. - void toggleSpellCheck( bool useSpellCheck ); - - private: // Private methods - // Check if the user enabled an auto-reply, and send it - void checkAutoReply(); - // Toggle the sidebar based on account preferences - void checkSidebarPreferences(); - // Choose the contact to start an invitation with. - const QString & chooseContact(); - // Create the contact actions - void createContactActions(); - // Return the contact action with the given handle - ContactAction* getContactActionByHandle(const QString& handle); - // Set up the main chat view - bool initializeChatView(); - // Set up the contact sidebar - bool initializeContactSidebar(); - // Set up the current account - bool initializeCurrentAccount(); - // Initialize the emoticon chooser - bool initializeEmoticonSidebar(); - // Set up the switchboard connection - bool initializeSwitchboardConnection(); - // Set up the contact sidebar - bool initializeWebSidebar(); - // The application is exiting - bool queryExit(); - // The chat window is closing - bool queryClose(); - // Save the chat if necessary - void saveChatAutomatically(); - // Shake the window, for nudge/buzzer effect. - void shakeWindow(); - // Start blinking the caption - void startBlink(); - - private slots: // Private slots - // Make the caption blink if the window still doesn't have focus - void blinkCaption(); - // A contact joined the chat - void contactJoined(QString handle, QString friendlyName); - // A contact left the chat - void contactLeft(QString handle, bool isChatIdle); - // A contact is typing - void contactTyping(QString handle, QString friendlyName); - // The emoticon button was pressed. - void emoticonButtonPressed(); - // Forward the application command to the ChatMaster - void forwardAppCommand(QString cookie, QString contact, QString command); - // Return a list of the contacts in the chat to be used as window caption - QString getCaption(); - // Invite a contact to the chat - void inviteContact(QString handle); - // Notify the user of a received nudge - void slotReceivedNudge(const QString &handle); - // Save the chat according to the user's request - void saveChat(); - // Signal that a message could not be sent to the switchboard - void slotSendingFailed( QString message ); - // Update the status label text - void updateTypingMessage(); - // The user sent a new message - void userSentMessage(); - - private: // Private attributes - // A timer used to make the caption blink on new messages. - QTimer blinkTimer_; - // Whether to blink to upper (true) or lower (false) case - bool blinkToUpper_; - // The stored window caption - QString caption_; - // The chat view widget - ChatView *chatView_; - // The contact actions in the invite menu - QPtrList contactActions_; - // The contact sidebar, which goes in the qtoolbox widget - ContactSidebar *contactSidebar_; - // A pointer to the instance of the current account - CurrentAccount *currentAccount_; - // The custom emoticons sidebar - EmoticonSidebar *customEmoticonSidebar_; - // 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 time the window was shaked - QTime lastShake_; - // The object that connects to the switchboard server. - MsnSwitchboardConnection *msnSwitchboardConnection_; - // The list of participants to this chat - QStringList participants_; - // The standard emoticons sidebar - EmoticonSidebar *standardEmoticonSidebar_; - // The date/time the chat started - QDate startDate_; - QTime startTime_; - // The status label - QLabel *statusLabel_; - // A timer to time the duration that a status message is shown - QTimer statusTimer_; - // Whether the sidebar should only be temporary visible - bool temporarySidebar_; - // The list of users which are currently typing - QMap typingContacts_; - // The web sidebar, which goes in the qtoolbox widget - WebSidebar *webSidebar_; - - - signals: // Public signals - // Signal that there's an application command - void appCommand(QString cookie, QString contact, QString method); - // Signal that the window is about to close. - void closing(QObject *object); - // Signal the presence of a new incoming chat message - void newChatMessage( const ChatMessage &message, ChatWindow *chatWindow ); - // Signal that the ChatMaster should start a filetransfer. - void requestFileTransfer(const QString &handle, const QString &filename); - // Signal that the ChatMaster should start a newmeeting session. - void requestNetMeeting(const QString &handle); - // The user wants to add or remove a contact. - void setContactAdded( 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 ); -}; - -#endif diff --git a/kmess/chat/chatwindowinterface.cpp b/kmess/chat/chatwindowinterface.cpp deleted file mode 100644 index b64c217..0000000 --- a/kmess/chat/chatwindowinterface.cpp +++ /dev/null @@ -1,488 +0,0 @@ -/*************************************************************************** - chatwindowinterface.cpp - description - ------------------- - begin : Tue Apr 23 2002 - copyright : (C) 2002 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 "chatwindowinterface.h" - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -// The constructor -ChatWindowInterface::ChatWindowInterface(QWidget *parent, const char *name ) - : KMainWindow(parent,name) -{ - // Create the menus - initMenus(); -} - - - -// The destructor -ChatWindowInterface::~ChatWindowInterface() -{ -} - - - -// Show the "about KDE" message. -void ChatWindowInterface::aboutKDE() -{ - helpMenu_->aboutKDE(); -} - - - -// Show the "about KMess" message. -void ChatWindowInterface::aboutKMess() -{ - helpMenu_->aboutApplication(); -} - - - -// put the marked text/object into the clipboard and remove -// it from the document -void ChatWindowInterface::editCut() -{ - kdDebug() << "ChatWindowInterface::editCut not implemented" << endl; -} - - - -// put the marked text/object into the clipboard -void ChatWindowInterface::editCopy() -{ - kdDebug() << "ChatWindowInterface::editCopy not implemented" << endl; -} - - - -// Bring up a dialog to change the message font. -void ChatWindowInterface::editFont() -{ - kdDebug() << "ChatWindowInterface::editFont not implemented" << endl; -} - - - -// Bring up a dialog to change the message font color. -void ChatWindowInterface::editFontColor() -{ - kdDebug() << "ChatWindowInterface::editFontColor implemented" << endl; -} - - - -// paste the clipboard into the document -void ChatWindowInterface::editPaste() -{ - kdDebug() << "ChatWindowInterface::editFontParse implemented" << endl; -} - - - -// enlarge the text size -void ChatWindowInterface::editZoomIn() -{ - kdDebug() << "ChatWindowInterface::editZoomIn() implemented" << endl; -} - - - -// decrease the text size -void ChatWindowInterface::editZoomOut() -{ - kdDebug() << "ChatWindowInterface::editZoomOut() implemented" << endl; -} - - - -// The emoticon button was pressed. -void ChatWindowInterface::emoticonButtonPressed() -{ - kdDebug() << "ChatWindowInterface::emoticonButtonPressed implemented" << endl; -} - - - -// close the chat window -void ChatWindowInterface::fileClose() -{ - close(); -} - - - - -// Show the user manual for KMess. -void ChatWindowInterface::helpContents() -{ - kapp->invokeHelp("kmess/index"); -} - - - - -// Create the chat menu -void ChatWindowInterface::initChatMenu() -{ - KAction *close, *save, *send, *meeting, *nudge; -#ifdef HAS_KPHONE - KAction *conversation; -#endif - KPopupMenu *chatMenu; - - // Create the menu - chatMenu = new KPopupMenu( this, "chatmenu" ); - - // Create the "chat" menus - inviteMenu_ = new KPopupMenu( this, "connect"); - send = new KAction( i18n("Send a &File"), "folder_open", KShortcut(), this, SLOT( slotStartFileTransfer() ), actionCollection(), "sendfile"); - meeting = new KAction( i18n("Start a &Meeting"), "gnomemeeting", KShortcut(), this, SLOT( startMeeting() ), actionCollection(), "startmeeting"); - nudge = new KAction( i18n("Send a &Nudge!"), "bell", KShortcut(), this, SLOT( slotSendNudge() ),actionCollection(), "sendnudge"); -#ifdef HAS_KPHONE //If KPhone is not enable than don't support voice conversation - conversation = new KAction( i18n("Start or Stop a &Conversation"), "kphone", KShortcut(), this, SLOT( startConversation() ), actionCollection(), "startconversation"); -#endif - - - - save = new KAction( i18n("Save chat"), "filesave", KShortcut(), this, SLOT( saveChat() ), actionCollection(), "savelog"); - close = KStdAction::close( this, SLOT( fileClose() ), actionCollection() ); - - // Plug the items into "chat" - chatMenu->insertItem( i18n("&Invite"), inviteMenu_ ); - chatMenu->insertSeparator(); - send-> plug( chatMenu ); - meeting-> plug( chatMenu ); -#ifdef HAS_KPHONE //If KPhone is not enable than don't support voice conversation - conversation->plug( chatMenu ); -#endif - chatMenu->insertSeparator(); - nudge-> plug( chatMenu ); - chatMenu->insertSeparator(); - save-> plug( chatMenu ); - close-> plug( chatMenu ); - - // Also plug the icons into the toolbar - close-> plug( toolBar("mainToolBar") ); - send-> plug( toolBar("mainToolBar") ); - nudge-> plug( toolBar("mainToolBar") ); - - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&Chat"), chatMenu ); -} - - - -// Create the edit menu -void ChatWindowInterface::initEditMenu() -{ - KAction *changeFont, *changeFontColor; - KAction *cut, *copy, *paste, *zoomIn, *zoomOut; - KPopupMenu *editMenu; - - // Create the menu - editMenu = new KPopupMenu( this, "editmenu" ); - - // Create the "edit" menus - changeFont = new KAction( i18n("Change &Font"), "fonts", KShortcut(), this, SLOT( editFont() ), actionCollection(), "font"); - changeFontColor = new KAction( i18n("Change Font &Color"), "colors", KShortcut(), this, SLOT( editFontColor() ), actionCollection(), "fontcolor"); - cut = KStdAction::cut( this, SLOT( editCut() ), actionCollection() ); - copy = KStdAction::copy( this, SLOT( editCopy() ), actionCollection() ); - paste = KStdAction::paste( this, SLOT( editPaste() ), actionCollection() ); - zoomIn = KStdAction::zoomIn( this, SLOT( editZoomIn() ), actionCollection() ); - zoomOut = KStdAction::zoomOut( this, SLOT( editZoomOut() ), actionCollection() ); - - // Plug the items into "edit" - cut-> plug( editMenu ); - copy-> plug( editMenu ); - paste-> plug( editMenu ); - editMenu->insertSeparator(); - changeFont-> plug( editMenu ); - changeFontColor->plug( editMenu ); - editMenu->insertSeparator(); - zoomIn-> plug( editMenu ); - zoomOut-> plug( editMenu ); - - // Plug the icons to the toolbar. - KToolBar *mainToolBar = toolBar("mainToolBar"); - mainToolBar->insertLineSeparator(); - cut-> plug( mainToolBar ); - copy-> plug( mainToolBar ); - paste-> plug( mainToolBar ); - changeFont-> plug( mainToolBar ); - changeFontColor->plug( mainToolBar ); - mainToolBar->insertLineSeparator(); - zoomIn-> plug( mainToolBar ); - zoomOut-> plug( mainToolBar ); - mainToolBar->insertLineSeparator(); - - - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&Edit"), editMenu ); -} - - - -// Create the help menu -void ChatWindowInterface::initHelpMenu() -{ - KAction *aboutKDE, *aboutKMess, *helpContents; - KPopupMenu *helpMenu; - - // Create the menu - helpMenu = new KPopupMenu( this, "helpmenu" ); - - // Create the help menu. - helpMenu_ = new KHelpMenu(this, KGlobal::instance()->aboutData()); - - // Create the help menu items - helpContents = KStdAction::helpContents(this, SLOT( helpContents() ), actionCollection() ); - aboutKMess = KStdAction::aboutApp(this, SLOT( aboutKMess() ), actionCollection() ); - aboutKDE = KStdAction::aboutKDE(this, SLOT( aboutKDE() ), actionCollection() ); - - // Plug the items into "help" - helpContents->plug( helpMenu ); - helpMenu->insertSeparator(); - aboutKMess ->plug( helpMenu ); - aboutKDE ->plug( helpMenu ); - - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&Help"), helpMenu ); -} - - - -// Create the menus. -void ChatWindowInterface::initMenus() -{ - // Initialize the menus with their separate functions - initChatMenu(); - initEditMenu(); - initSettingsMenu(); - initHelpMenu(); - - // Create the emoticons button - KToolBar *mainToolBar = toolBar("mainToolBar"); - emoticonButton_ = new KToolBarButton( "emoticons", 0, mainToolBar, "emoticonchooser"); - emoticonButton_->setText( i18n("Insert an emoticon") ); - connect( emoticonButton_, SIGNAL( pressed() ), this, SLOT( emoticonButtonPressed() )); - - // Plug the sidebar button in after the emoticon button. - sidebarAction_-> plug( mainToolBar ); -} - - - -// Create the settings menu -void ChatWindowInterface::initSettingsMenu() -{ - KPopupMenu *settingsMenu; - - // Create the menu - settingsMenu = new KPopupMenu( this, "settingsmenu" ); - - // Create the "settings" menus - spellCheckAction_ = new KToggleAction( i18n("Use &Spell Checking"), "spellcheck", KShortcut(), this, "spellcheck" ); - emoticonAction_ = new KToggleAction( i18n("Show &Emoticons"), "services", KShortcut(), this, "emoticons" ); - sidebarAction_ = new KAction ( i18n("Show/Hide &Contact Sidebar"), "fonts", KShortcut( QKeySequence( "Ctrl+T" ) ), this, "sidebar" ); - showToolBar_ = KStdAction::showToolbar ( this, SLOT( showToolBar() ), actionCollection() ); - showStatusBar_ = KStdAction::showStatusbar( this, SLOT( showStatusBar() ), actionCollection() ); - - connect ( emoticonAction_, SIGNAL( toggled(bool) ), - this, SLOT ( toggleEmoticons(bool) ) ); - connect ( sidebarAction_, SIGNAL( activated() ), - this, SLOT ( toggleSidebar() ) ); - connect ( spellCheckAction_, SIGNAL( toggled(bool) ), - this, SLOT ( toggleSpellCheck(bool) ) ); - - // Give the sidebar action a tool tip like the standard actions - sidebarAction_ ->setToolTip( i18n("Show or hide the contact sidebar") ); - - sidebarAction_->setIcon( "view_right" ); - - // Plug the items into "settings" - spellCheckAction_->plug( settingsMenu ); - settingsMenu->insertSeparator(); - emoticonAction_ ->plug( settingsMenu ); - showToolBar_ ->plug( settingsMenu ); - showStatusBar_ ->plug( settingsMenu ); - sidebarAction_ ->plug( settingsMenu ); - - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&Settings"), settingsMenu ); -} - - - -// Restore the window properties (called by KMainWindow) -void ChatWindowInterface::readProperties(KConfig *config) -{ - // Pull in the window size and position - config->setGroup("Chat Window"); - - QSize size = config->readSizeEntry("Size"); - if(! size.isEmpty()) - { - resize(size); - } - - QPoint pos = config->readPointEntry("Position"); - if(! pos.isNull()) - { - move(pos); - } - - // bar status settings - showToolBar_ -> setChecked( config->readBoolEntry("Show Toolbar", true) ); - showStatusBar_ -> setChecked( config->readBoolEntry("Show Statusbar", true) ); - - showToolBar(); - showStatusBar(); - - // bar position settings - int toolBarPos = config->readNumEntry("ToolBarPos", KToolBar::Top); - toolBar("mainToolBar")->setBarPos( (KToolBar::BarPosition) toolBarPos ); -} - - - -// Save the chat according to the user's request -void ChatWindowInterface::saveChat() -{ - kdDebug() << "ChatWindowInterface::saveChat not implemented" << endl; -} - - - -// Save the window properties (called by KMainWindow) -void ChatWindowInterface::saveProperties(KConfig *config) -{ - // Save the window geometry - config->setGroup("Chat Window"); - config->writeEntry("Size", size() ); - config->writeEntry("Position", pos() ); - config->writeEntry("Show Toolbar", showToolBar_->isChecked() ); - config->writeEntry("Show Statusbar", showStatusBar_->isChecked() ); - config->writeEntry("ToolBarPos", toolBar("mainToolBar")->barPos() ); -} - - - -// "Show status bar" was toggled. -void ChatWindowInterface::showStatusBar() -{ - kdDebug() << "ChatWindowInterface::showStatusBar not implemented" << endl; -} - - - -// "Show toolbar" was toggled. -void ChatWindowInterface::showToolBar() -{ - if(!showToolBar_->isChecked()) - { - toolBar("mainToolBar")->hide(); - } - else - { - toolBar("mainToolBar")->show(); - } -} - - - -// Start GnomeMeeting with a contact. -void ChatWindowInterface::startMeeting() -{ - kdDebug() << "ChatWindowInterface::startMeeting not implemented" << endl; -} - - - -void ChatWindowInterface::startConversation() -{ - kdDebug() << "ChatWindowInterface::startConversation not implemented" << endl; -} - - - -void ChatWindowInterface::slotSendNudge() -{ - kdDebug() << "ChatWindowInterface::slotSendNudge not implemented" << endl; -} - - - -// Send a file to a contact. -void ChatWindowInterface::slotStartFileTransfer( QStringList /*uriList*/ ) -{ - kdDebug() << "ChatWindowInterface::slotStartFileTransfer not implemented" << endl; -} - - -// Change the status bar message. -void ChatWindowInterface::statusMessage(QString /*message*/) -{ - kdDebug() << "ChatWindowInterface::statusMessage not implemented" << endl; -} - - - -// Called when the "use emoticons" action is called. -void ChatWindowInterface::toggleEmoticons(bool /*useEmoticons*/) -{ - kdDebug() << "ChatWindowInterface::toggleEmoticons not implemented" << endl; -} - - - -// Called when the "show sidebar" action is called. -void ChatWindowInterface::toggleSidebar() -{ - kdDebug() << "ChatWindowInterface::toggleSidebar not implemented" << endl; -} - - - -// Called when the "use spell checking" action is called. -void ChatWindowInterface::toggleSpellCheck( bool /*useSpellCheck*/ ) -{ - kdDebug() << "ChatWindowInterface::toggleSpellCheck not implemented" << endl; -} - - -#include "chatwindowinterface.moc" diff --git a/kmess/chat/chatwindowinterface.h b/kmess/chat/chatwindowinterface.h deleted file mode 100644 index 914e4f4..0000000 --- a/kmess/chat/chatwindowinterface.h +++ /dev/null @@ -1,137 +0,0 @@ -/*************************************************************************** - chatwindowinterface.h - description - ------------------- - begin : Tue Apr 23 2002 - copyright : (C) 2002 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 CHATWINDOWINTERFACE_H -#define CHATWINDOWINTERFACE_H - -#include -#include - -// forward declarations -class KActionMenu; -class KConfig; -class KHelpMenu; -class KPopupMenu; -class KToggleAction; -class KToolBarButton; -class KToolBarPopupAction; - - -/**The interface for the chat window, defining the menus. - *@author Mike K. Bennett - */ - -class ChatWindowInterface : public KMainWindow -{ - Q_OBJECT - - public: - // The constructor - ChatWindowInterface(QWidget *parent=0, const char *name=0); - // The destructor - ~ChatWindowInterface(); - - protected: // Protected methods - // Restore the window properties (called by KMainWindow) - virtual void readProperties(KConfig *config); - // Save the window properties (called by KMainWindow) - virtual void saveProperties(KConfig *config); - - protected slots: // Protected slots - // put the marked text/object into the clipboard and remove - // it from the document - virtual void editCut(); - // put the marked text/object into the clipboard - virtual void editCopy(); - // Bring up a dialog to change the message font color. - virtual void editFontColor(); - // Bring up a dialog to change the message font color. - virtual void editFont(); - // paste the clipboard into the document - virtual void editPaste(); - // enlarge the text size - virtual void editZoomIn(); - // decrease the text size - virtual void editZoomOut(); - // The emoticon button was pressed. - virtual void emoticonButtonPressed(); - // "Show status bar" was toggled. - virtual void showStatusBar(); - // Start GnomeMeeting with a contact. - virtual void startMeeting(); - // Change the status bar message. - virtual void statusMessage(QString message); - // Called when the "use emoticons" action is called. - virtual void toggleEmoticons(bool useEmoticons); - // Called when the "show sidebar" action is called. - virtual void toggleSidebar(); - // Called when the "use spell checking" action is called. - virtual void toggleSpellCheck(bool useSpellCheck); - // Send a nudge - virtual void slotSendNudge(); - // Send a file to a contact. - virtual void slotStartFileTransfer( QStringList uriList = QStringList() ); - // Save the chat according to the user's request - virtual void saveChat(); - //Voice conversation - virtual void startConversation(); - - protected: // Protected attributes - // The list of invitable contacts - KPopupMenu *inviteMenu_; - // The emoticon toggle - KToggleAction *emoticonAction_; - // The emoticon chooser button - KToolBarButton *emoticonButton_; - // Toggle actions for showing and hiding the toolbars and statusbars. - KToggleAction *showStatusBar_, *showToolBar_; - // The sidebar toggle - KAction *sidebarAction_; - // The spell checking toggle - KToggleAction *spellCheckAction_; - - - private: // Private methods - // Initialize the connect menu. - void initChatMenu(); - // Initialize the settings menu. - void initEditMenu(); - // Initialize the help menu. - void initHelpMenu(); - // Create the menus. - void initMenus(); - // Initialize the settings menu. - void initSettingsMenu(); - - private slots: // Private slots - // Show the "about KMess" message. - void aboutKMess(); - // Show the "about KDE" message. - void aboutKDE(); - // Close the chat window - void fileClose(); - // Show the user manual for KMess. - void helpContents(); - // "Show toolbar" was toggled. - void showToolBar(); - - private: // private attributes - // The help menu launcher - KHelpMenu *helpMenu_; - -}; -#endif diff --git a/kmess/chat/configure.in.in b/kmess/chat/configure.in.in deleted file mode 100644 index b25dd89..0000000 --- a/kmess/chat/configure.in.in +++ /dev/null @@ -1,75 +0,0 @@ -# -- Check for libxml ----------------------------------------- - -XML_CONFIG= - -KDE_FIND_PATH(xml2-config, XML_CONFIG, [${exec_prefix}/bin ${prefix}/bin], - [AC_MSG_ERROR([libxml2 not found, please install libxml2 and libxml2-devel first (at least version 2.4.8) and run configure again.])] -) - -if test -n "$XML_CONFIG"; then - vers=`$XML_CONFIG --version 2>/dev/null | sed -e 's/libxml //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'` - if test -n "$vers" && test "$vers" -ge 2004008 - then - LIBXML_LIBS="`$XML_CONFIG --libs`" - LIBXML_RPATH= - for args in $LIBXML_LIBS - do - case $args in - -L*) - LIBXML_RPATH="$LIBXML_RPATH $args" - ;; - esac - done - LIBXML_RPATH=`echo $LIBXML_RPATH | sed -e "s/-L/-R/g"` - LIBXML_CFLAGS="`$XML_CONFIG --cflags`" - AC_DEFINE(HAVE_LIBXML2, 1, [Define if you have libxml2 libraries and header files]) - else - AC_MSG_ERROR([You need at least libxml 2.4.8, please upgrade your libxml packages and run configure again.]) - fi -fi - -if test -z "$XML_CONFIG"; then - all_tests="bad" - echo "" - echo "Please fix the problems, and run ./configure again." - echo "" - exit 1 -fi - -AC_SUBST(LIBXML_LIBS) -AC_SUBST(LIBXML_CFLAGS) -AC_SUBST(LIBXML_RPATH) - - -# -- Check for libxslt ----------------------------------------- - -KDE_FIND_PATH(xslt-config, XSLT_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/local/bin /opt/local/bin /usr/bin], - [AC_MSG_ERROR([libxslt not found, please install libxslt and libxslt-devel first (at least version 1.0.7) and run configure again.])] -) - -if test -n "$XSLT_CONFIG"; then - vers=`$XSLT_CONFIG --version 2>/dev/null | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'` - if test -n "$vers" && test "$vers" -ge 1000007 - then - LIBXSLT_LIBS="`$XSLT_CONFIG --libs`" - LIBXSLT_RPATH= - for args in $LIBXSLT_LIBS - do - case $args in - -L*) - LIBXSLT_RPATH="$LIBXSLT_RPATH $args" - ;; - esac - done - LIBXSLT_RPATH=`echo $LIBXSLT_RPATH | sed -e "s/-L/-R/g"` - LIBXSLT_CFLAGS="`$XSLT_CONFIG --cflags`" - AC_DEFINE(HAVE_LIBXSLT, 1, [Define if you have libxslt libraries and header files]) - else - AC_MSG_ERROR([You need at least libxslt 1.0.7, please upgrade your libxslt packages and run configure again.]) - fi -fi - -AC_SUBST(LIBXSLT_LIBS) -AC_SUBST(LIBXSLT_CFLAGS) -AC_SUBST(LIBXSLT_RPATH) - diff --git a/kmess/chat/contactaction.cpp b/kmess/chat/contactaction.cpp deleted file mode 100644 index e58c66b..0000000 --- a/kmess/chat/contactaction.cpp +++ /dev/null @@ -1,124 +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 -#include - -#include "../contact/contact.h" -#include "../kmessdebug.h" - -// The constructor -ContactAction::ContactAction(const Contact *contact, KPopupMenu *menu, QWidget *parent, const char *name ) - : KAction(parent,name), - contact_(contact), - inChat_(false), - menu_(menu), - plugged_(false) -{ -#ifdef KMESSTEST - ASSERT( menu_ != 0 ); - ASSERT( contact_ != 0 ); -#endif - // Connect the action to its own activated signal - connect( this, SIGNAL( activated() ), - 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 shouldBePlugged; - -#ifdef KMESSDEBUG_CONTACTACTION - kdDebug() << "ContactAction - Checking visibility for " << contact_->getHandle() << "." << endl; -#endif - - shouldBePlugged = ( ! inChat_ && contact_->isOnline() && contact_->isFriend() ); - -#ifdef KMESSDEBUG_CONTACTACTION - kdDebug() << "ContactAction - Should be plugged = " << shouldBePlugged << "." << endl; -#endif - - // Plug the contact in if it should be plugged and it's not - if ( shouldBePlugged && ! plugged_ ) - { - plug( menu_ ); - plugged_ = true; - } - else if ( ! shouldBePlugged && plugged_ ) - { // Unplug the contact if it's plugged but shouldn't be - unplug( menu_ ); - plugged_ = false; - } -} - -#include "contactaction.moc" diff --git a/kmess/chat/contactaction.h b/kmess/chat/contactaction.h deleted file mode 100644 index ba5372b..0000000 --- a/kmess/chat/contactaction.h +++ /dev/null @@ -1,72 +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 -#include - -// Forward declarations -class Contact; -class KPopupMenu; - -/** - * @brief Menu actions to invite contacts. - * @author Mike K. Bennett - */ -class ContactAction : public KAction -{ - Q_OBJECT - - public: - // The constructor - ContactAction(const Contact *contact, KPopupMenu *menu, QWidget *parent=0, const char *name=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 - KPopupMenu *menu_; - // Whether or not the contact has been plugged into the menu - bool plugged_; - - signals: // Public signals - // Signal the contact's friendly name when the action is selected - void activated(QString handle); - -}; - -#endif diff --git a/kmess/chat/contactframe.cpp b/kmess/chat/contactframe.cpp deleted file mode 100644 index 32a6608..0000000 --- a/kmess/chat/contactframe.cpp +++ /dev/null @@ -1,603 +0,0 @@ -/*************************************************************************** - contactframe.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 "contactframe.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../contact/contact.h" -#include "../contact/contactlist.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" - -// The constructor -ContactFrame::ContactFrame(QWidget *parent, const char *name ) - : ContactFrameInterface(parent,name) - , activated_(false) - , contact_(0) - , detailedContact_(0) - , handle_(QString::null) -{ - KStandardDirs *dirs = KGlobal::dirs(); - QPixmap pixmap; - QString path; - - // Just for show - path = dirs->findResource( "data", "kmess/pics/unknown.png" ); - pixmap.load( path ); - contactPixmapLabel_->setPixmap( pixmap ); - contactPixmapLabel_->setMinimumSize( pixmap.width(), pixmap.height() ); - nowListeningPixmapLabel_->setPixmap( KGlobal::iconLoader()->loadIcon("knotify", KIcon::NoGroup, KIcon::SizeSmall ) ); - nowListeningPixmapLabel_->hide(); - - handleLabel_ ->installEventFilter( this ); - contactPixmapLabel_->installEventFilter( this ); - installEventFilter( this ); - - // Connect up the typing timer - connect( &typingTimer_, SIGNAL( timeout() ), - this, SLOT ( stopTyping() ) ); -} - - - -ContactFrame::~ContactFrame() -{ -} - - - -// Activate the frame by giving it a contact -void ContactFrame::activate( ContactBase *contact ) -{ - if ( contact_ != 0 ) - { - kdWarning() << "ContactFrame::activate() - Already got a contact (" << contact_->getHandle() << "), refusing new one (" << contact->getHandle() << ")." << endl; - return; - } - - 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() ) ); - - if( detailedContact_ ) - { - connect( detailedContact_, SIGNAL( changedPersonalMessage(Contact*) ), - this, SLOT ( updateStatusWidgets() ) ); - connect( detailedContact_, SIGNAL( changedList(Contact*) ), - this, SLOT ( updateStatusWidgets() ) ); - } - - activated_ = true; - show(); - - // Update the widget based on the contact's settings - updateWidgets(); - - // Activate the right-click context menu - initContactPopup(); -} - - - -// Allow this contact to see our MSN status -void ContactFrame::allowContact() -{ - if ( detailedContact_ == 0 ) - { - return; - } - - emit setContactAllowed( handle_ ); - - updateStatusWidgets(); -} - - - -// Copy some details of the contact to the clipboard. -// Only one method is used to copy all different details, and that's to avoid having three identical methods which only copy different -// text bits on the clipboard. -void ContactFrame::copyText() -{ - // Get the signal sender to find out who called us - KAction *action = static_cast( const_cast( sender() ) ); - if(KMESS_NULL(action)) return; - - if( action == popupCopyFriendlyName_ ) - { - kapp->clipboard()->setText( contact_->getFriendlyName() ); - } - else if( action == popupCopyHandle_ ) - { - kapp->clipboard()->setText( handle_ ); - } - else if( action == popupCopyPersonalMessage_ && detailedContact_ ) - { - kapp->clipboard()->setText( detailedContact_->getPersonalMessage() ); - } -} - - - -// Deactivate (grey-out) the frame when a contact leaves the chat -void ContactFrame::deactivate() -{ - enableWidgets( false ); -} - - - -// Set whether or not the widgets are enabled or disabled -void ContactFrame::enableWidgets(bool doEnable) -{ - contactPixmapLabel_ ->setEnabled( doEnable ); - handleLabel_ ->setEnabled( doEnable ); - statusPixmapLabel_ ->setEnabled( doEnable ); - statusLabel_ ->setEnabled( doEnable ); - personalMessageLabel_ ->setEnabled( doEnable ); - nowListeningPixmapLabel_ ->setEnabled( doEnable ); -} - - - -// The personal status message received an event. -bool ContactFrame::eventFilter( QObject *obj, QEvent *event ) -{ - if( event->type() != QEvent::MouseButtonRelease ) - { - return false; // don't stop processing. - } - - QMouseEvent *mouseEvent = static_cast( event ); - - if( mouseEvent->button() == Qt::RightButton ) - { - showContactPopup( mouseEvent->globalPos() ); - } - else if( obj == handleLabel_ ) - { - sendEmail(); - } - else if( obj == contactPixmapLabel_ ) - { - showProfile(); - } - - return false; // don't stop processing. -} - - - -// Return the handle of this frame's contact -QString ContactFrame::getHandle() const -{ - return handle_; -} - - - -// Initialize the contact popup -bool ContactFrame::initContactPopup() -{ - if ( contact_ == 0 ) - { - return false; - } - - // Initialize context popup actions - popupEmailContact_ = new KAction( i18n("&Send email"), "mail_generic", 0, this, "email" ); - popupMsnProfile_ = new KAction( i18n("&View Profile"), "identity", 0, this, "profile" ); - - popupAddContact_ = new KAction( i18n("&Add Contact"), "add", 0, this, "add" ); - popupAllowContact_ = new KAction( i18n("A&llow Contact"), "apply", 0, this, "allow" ); - popupRemoveContact_ = new KAction( i18n("&Delete Contact"), "delete_user", 0, this, "remove" ); - - popupBlockContact_ = new KAction( i18n("&Block Contact"), "button_cancel", 0, this, "block" ); - popupUnblockContact_ = new KAction( i18n("&Unblock Contact"), "button_ok", 0, this, "unblock" ); - - popupCopyFriendlyName_ = new KAction( i18n("&Friendly Name"), "", 0, this, "copyfriendly" ); - popupCopyPersonalMessage_ = new KAction( i18n("&Personal Message"), "", 0, this, "copypm" ); - popupCopyHandle_ = new KAction( i18n("&Email Address"), "", 0, this, "copyemail" ); - - - // Connect the actions - connect( popupEmailContact_, SIGNAL(activated()), this, SLOT( sendEmail() ) ); - connect( popupMsnProfile_, SIGNAL(activated()), this, SLOT( showProfile() ) ); - - connect( popupAddContact_, SIGNAL(activated()), this, SLOT( toggleContactAdded() ) ); - connect( popupAllowContact_, SIGNAL(activated()), this, SLOT( allowContact() ) ); - connect( popupRemoveContact_, SIGNAL(activated()), this, SLOT( toggleContactAdded() ) ); - - connect( popupBlockContact_, SIGNAL(activated()), this, SLOT( toggleContactBlocked() ) ); - connect( popupUnblockContact_, SIGNAL(activated()), this, SLOT( toggleContactBlocked() ) ); - - connect( popupCopyFriendlyName_, SIGNAL(activated()), this, SLOT( copyText() ) ); - connect( popupCopyPersonalMessage_, SIGNAL(activated()), this, SLOT( copyText() ) ); - connect( popupCopyHandle_, SIGNAL(activated()), this, SLOT( copyText() ) ); - - - // Initialize sub popups - popupCopyMenu_ = new KActionMenu( i18n("&Copy..."), 0, 0, "copy" ); - popupCopyMenu_ ->insert( popupCopyFriendlyName_ ); - popupCopyMenu_ ->insert( popupCopyPersonalMessage_ ); - popupCopyMenu_ ->insert( popupCopyHandle_ ); - - // Initialize the popup popup - contactActionPopup_ = new KPopupMenu( this ); - contactActionPopup_->insertTitle( contact_->getHandle(), 0 ); - - // Attach the actions to the menu - popupEmailContact_ ->plug( contactActionPopup_ ); - popupMsnProfile_ ->plug( contactActionPopup_ ); - contactActionPopup_ ->insertSeparator(); - popupAddContact_ ->plug( contactActionPopup_ ); - popupAllowContact_ ->plug( contactActionPopup_ ); - popupRemoveContact_ ->plug( contactActionPopup_ ); - contactActionPopup_ ->insertSeparator(); - popupBlockContact_ ->plug( contactActionPopup_ ); - popupUnblockContact_ ->plug( contactActionPopup_ ); - contactActionPopup_ ->insertSeparator(); - popupCopyMenu_ ->plug( contactActionPopup_ ); - - return true; -} - - - -// Whether or not the frame has been activated -bool ContactFrame::isActivated() const -{ - return activated_; -} - - - -// The user received a message from this contact -void ContactFrame::messageReceived() -{ - // Stop the "user is typing" glow - typingTimer_.stop(); - stopTyping(); - -} - - - -// Reactivate the frame when a contact rejoins the chat -void ContactFrame::reactivate() -{ - enableWidgets( true ); -} - - - -// Email the contact -void ContactFrame::sendEmail() -{ - if ( contact_ != 0 ) - { - CurrentAccount::instance()->openMailAtCompose( handle_ ); - } -} - - - -// Update and show the contact popup menu -void ContactFrame::showContactPopup( const QPoint &point ) -{ - if ( contact_ == 0 ) - { - return; - } - - bool isAdded = false; - bool isAddable = false; - bool isAllowed = false; - bool isBlocked = false; - bool isBlockable = false; - bool hasPersonalMessage = false; - - if( detailedContact_ ) - { - isAddable = true; - isBlockable = true; - - isAdded = detailedContact_->isFriend(); - isAllowed = detailedContact_->isAllowed(); - isBlocked = detailedContact_->isBlocked(); - hasPersonalMessage = ! detailedContact_->getPersonalMessage().isEmpty(); - } - - popupAllowContact_ ->setEnabled( ! isAllowed ); - popupCopyPersonalMessage_->setEnabled( hasPersonalMessage ); - - popupAddContact_ ->setEnabled( isAddable && ! isAdded ); - popupRemoveContact_ ->setEnabled( isAddable && isAdded ); - - popupBlockContact_ ->setEnabled( isBlockable && ! isBlocked ); - popupUnblockContact_ ->setEnabled( isBlockable && isBlocked ); - - contactActionPopup_->popup( point ); -} - - - -// Show the contact's profile -void ContactFrame::showProfile() -{ - if ( contact_ != 0 ) - { - // Set a path to the msn profile page. Unfortunately, this isn't internationalized. - kapp->invokeBrowser( "http://members.msn.com/default.msnw?mem=" + handle_ ); - } -} - - - -// Receive notice that the contact is typing -void ContactFrame::startTyping() -{ - contactPixmapLabel_->setPixmap( contactTypingPicture_ ); - - // Make the contact picture glow - // Start the timer to disable the label - typingTimer_.start(5000, true); -} - - - -// Disable the typing label when the timer has timed out -void ContactFrame::stopTyping() -{ - contactPixmapLabel_->setPixmap( contactPicture_ ); -} - - - -// Add or remove the contact from the contact list -void ContactFrame::toggleContactAdded() -{ - if ( detailedContact_ == 0 ) - { - return; - } - - emit setContactAdded( handle_, ! detailedContact_->isFriend() ); - - updateStatusWidgets(); -} - - - -// Change the contact's blocked/unblocked status -void ContactFrame::toggleContactBlocked() -{ - if ( detailedContact_ == 0 ) - { - return; - } - - emit setContactBlocked( handle_, ! detailedContact_->isBlocked() ); - - updateStatusWidgets(); -} - - - -// Update the contact picture -void ContactFrame::updatePicture() -{ - if ( contact_ == 0 ) - { - return; - } - -#ifdef KMESSDEBUG_CONTACTFRAME - kdDebug() << "ContactFrame::UpdatePicture(): Contact picture path is " << contact_->getContactPicturePath() << endl; -#endif - - // See if the contact picture is not updated. Avoid Qt 3.3 GUI flash. - QString contactPicturePath = contact_->getContactPicturePath(); - QFileInfo contactPictureInfo( contactPicturePath ); - QDateTime contactPictureDate = contactPictureInfo.lastModified(); - - if( contactPicturePath == contactPicturePath_ - && contactPictureDate == contactPictureDate_ ) - { -#ifdef KMESSDEBUG_CONTACTFRAME - kdDebug() << "ContactFrame::UpdatePicture(): image is already loaded, avoiding GUI flashing." << endl; -#endif - return; - } - - QImage contactImage; - bool loaded = contactImage.load( contactPicturePath ); - if( loaded ) - { - // Loaded - contactPicturePath_ = contactPicturePath; - contactPictureDate_ = contactPictureDate; - } - else - { - // Not laoded (PNG error?). load default if custom image could not be loaded - loaded = contactImage.load( contact_->getContactDefaultPicturePath() ); - - if( ! loaded ) - { - return; - } - } - - // Setup the normal and typing pixmaps - contactPicture_.convertFromImage( contactImage ); - KIconEffect::toGamma( contactImage, 0.8 ); - contactTypingPicture_.convertFromImage( contactImage ); - - // Display the image - contactPixmapLabel_->setPixmap( contactPicture_ ); - contactPixmapLabel_->setMinimumSize( contactImage.width(), contactImage.height() ); -} - - - -// Update the status widgets -void ContactFrame::updateStatusWidgets() -{ - KIconLoader *loader = KGlobal::iconLoader(); - QString label, statusIdentifier, iconName; - QString status; - - if ( contact_ == 0 ) - { - return; - } - - status = contact_->getStatus(); - - if(detailedContact_ && detailedContact_->isBlocked()) - { - // Show blocked regardless of status - statusIdentifier = i18n( "Blocked" ); - iconName = "blocked"; - } - else if ( status == "AWY" ) - { - statusIdentifier = i18n( "Away" ); - iconName = "away"; - } - else if ( status == "BRB" ) - { - statusIdentifier = i18n( "Be Right Back" ); - iconName = "berightback"; - } - else if ( status == "BSY" ) - { - statusIdentifier = i18n( "Busy" ); - iconName = "busy"; - } - else if ( status == "FLN" ) - { - statusIdentifier = i18n("Offline"); - iconName = "offline"; - } - else if ( status == "IDL" ) - { - statusIdentifier = i18n( "Away - Idle" ); - iconName = "away"; - } - else if ( status == "LUN" ) - { - statusIdentifier = i18n( "Out to Lunch" ); - iconName = "lunch"; - } - else if ( status == "NLN" ) - { - statusIdentifier = i18n( "Online" ); - iconName = "online"; - } - else if ( status == "PHN" ) - { - statusIdentifier = i18n( "On the Phone" ); - iconName = "onthephone"; - } - - statusLabel_->setText( contact_->getFriendlyName() ); - QToolTip::add( statusPixmapLabel_, i18n( "The contact is %1" ).arg( statusIdentifier ) ); - statusPixmapLabel_->setPixmap( loader->loadIcon( iconName, KIcon::User ) ); - - // Update the detailed info widgets, if available - if( detailedContact_ == 0 ) - { - 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(); - label = detailedContact_->getPersonalMessage(); - } - else - { - nowListeningPixmapLabel_->show(); - } - - // If neither the media nor the message are available, hide the label - if( ! label.isEmpty() ) - { - - personalMessageLabel_->show(); - personalMessageLabel_->setText( label ); - } - else - { - personalMessageLabel_->hide(); - } -} - - - -// Update all the widgets based on the given contact -void ContactFrame::updateWidgets() -{ - - if ( contact_ == 0 ) - { - kdDebug() << "ContactFrame::updateWidgets() - This contact frame hasn't been activated properly." << endl; - return; - } - - updatePicture(); - updateStatusWidgets(); - handleLabel_->setText( handle_ ); - -} - -#include "contactframe.moc" diff --git a/kmess/chat/contactframeinterface.ui b/kmess/chat/contactframeinterface.ui deleted file mode 100644 index e4cab9f..0000000 --- a/kmess/chat/contactframeinterface.ui +++ /dev/null @@ -1,288 +0,0 @@ - -ContactFrameInterface - - - ContactFrameInterface - - - - 0 - 0 - 124 - 156 - - - - - 3 - 3 - 0 - 0 - - - - - 48 - 0 - - - - ContactFrameInterface - - - - unnamed - - - - unnamed - - - - unnamed - - - 0 - - - 0 - - - - statusPixmapLabel_ - - - - 20 - 20 - - - - - 20 - 20 - - - - false - - - AlignVCenter|AlignLeft - - - - - statusLabel_ - - - - 76 - 0 - - - - - - - true - - - AlignVCenter|AlignLeft - - - - - - - unnamed_2 - - - - unnamed_3 - - - 0 - - - 0 - - - - nowListeningPixmapLabel_ - - - - 20 - 20 - - - - - 20 - 20 - - - - false - - - AlignVCenter|AlignLeft - - - The contact is listening to music - - - - - personalMessageLabel_ - - - - 76 - 0 - - - - - - - true - - - AlignVCenter|AlignLeft - - - - - - - layout27 - - - - unnamed - - - 0 - - - 0 - - - - contactPixmapLabel_ - - - - 0 - 0 - 0 - 0 - - - - - 48 - 48 - - - - 13 - - - ClickFocus - - - StyledPanel - - - Raised - - - true - - - Click here to display this contact's profile. - - - - - spacer1 - - - Horizontal - - - Expanding - - - - 68 - 20 - - - - - - - - handleLabel_ - - - - 5 - 0 - 0 - 0 - - - - - 96 - 0 - - - - - 0 - 0 - 127 - - - - - 1 - - - - 13 - - - Click to send an email to this contact. - - - - - spacer2 - - - Vertical - - - Expanding - - - - 10 - 10 - - - - - - - - ksqueezedtextlabel.h - ksqueezedtextlabel.h - - diff --git a/kmess/chat/contactsidebar.cpp b/kmess/chat/contactsidebar.cpp deleted file mode 100644 index 373f48f..0000000 --- a/kmess/chat/contactsidebar.cpp +++ /dev/null @@ -1,234 +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 -#include -#include - -#include - -#include "../contact/contactbase.h" -#include "../contact/contactdrag.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" -#include "contactframe.h" - -// The constructor -ContactSidebar::ContactSidebar(QWidget *parent, const char *name ) - : QWidget(parent, name) -{ - contactFrames_.setAutoDelete( true ); - - setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding, false); // Stretch widget - - // Create a layout within the scrollview so that added widgets are laid out nicely - viewBox_ = new QVBoxLayout( this, 0, -1, "viewBox" ); -// viewBox_->setResizeMode( QLayout::Minimum ); - - // Configure this QScrollView - setAcceptDrops( true ); // Allow drag&drop - - // put the viewBoxHolder (and hence the layout holding the frames) into the viewport - viewBox_->addItem( new QSpacerItem(20, 20, QSizePolicy::Ignored, QSizePolicy::Expanding) ); -} - - - -// The destructor -ContactSidebar::~ContactSidebar() -{ -} - - - -// A contact joined the chat -void ContactSidebar::contactJoined( QString handle, QString ) -{ - ContactBase *contact; - ContactFrame *contactFrame; - // See if the contact already has a frame - contactFrame = getContactFrameByHandle( handle ); - if ( contactFrame != 0 ) - { - // Reactivate the contact's frame - contactFrame->reactivate(); - 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 ); -} - - - -// A contact left the chat -void ContactSidebar::contactLeft( QString handle, bool /*isChatIdle*/ ) -{ - ContactFrame *contactFrame = getContactFrameByHandle( handle ); - - if ( contactFrame == 0 ) - { - return; - } - - // Delete the frames whenever there is more than one; when only one is left, grey it out instead. - if( contactFrames_.count() > 1 ) - { - contactFrames_.remove( contactFrame ); - return; - } - - // deactivate (grey out) the contact frame - contactFrame->deactivate(); -} - - - -// A contact is typing -void ContactSidebar::contactTyping(QString handle, QString) -{ - ContactFrame *contactFrame = getContactFrameByHandle( handle ); - if ( contactFrame != 0 ) - { - contactFrame->startTyping(); - } -} - - - -// do we want this drop? -void ContactSidebar::contentsDropEvent( QDropEvent *event ) -{ - if ( event->provides( ContactDragInfo::mimeType ) ) - { - const ContactBase *contact = CurrentAccount::instance()->getContactLastDragged(); - if(contact != 0) - { - emit inviteContact( contact->getHandle() ); - } - } - - event->ignore(); -} - - - -// something being dragged has entered our widget -void ContactSidebar::contentsDragEnterEvent( QDragEnterEvent *event ) -{ - if ( event->provides( ContactDragInfo::mimeType ) ) - { - event->accept( true ); - } -} - - - -// something being dragged has been moved in our widget -void ContactSidebar::contentsDragMoveEvent( QDragMoveEvent *event ) -{ - if ( event->provides( ContactDragInfo::mimeType ) ) - { - event->acceptAction( true ); - } -} - - - -// Find the contact frame with the given handle -ContactFrame* ContactSidebar::getContactFrameByHandle(const QString& handle) -{ - for ( ContactFrame *contactFrame = contactFrames_.first(); contactFrame; contactFrame = contactFrames_.next() ) - { - if ( contactFrame->getHandle() == handle ) - { - return contactFrame; - } - } - return 0; -} - - - -// Return the first inactive contact frame -ContactFrame* ContactSidebar::getFirstInactiveContactFrame() -{ - ContactFrame *contactFrame; - for ( ContactFrame *contactFrame = contactFrames_.first(); contactFrame; contactFrame = contactFrames_.next() ) - { - if ( !contactFrame->isActivated() ) - { - return contactFrame; - } - } - - // Well we don't have any more, so make another. - contactFrame = new ContactFrame( this, "ContactFrame" ); - - 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, false); - 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(); - } -} - - -#include "contactsidebar.moc" diff --git a/kmess/chat/contactsidebar.h b/kmess/chat/contactsidebar.h deleted file mode 100644 index 8751a0b..0000000 --- a/kmess/chat/contactsidebar.h +++ /dev/null @@ -1,87 +0,0 @@ -/*************************************************************************** - contactsidebar.h - 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. * - * * - ***************************************************************************/ - -#ifndef CONTACTSIDEBAR_H -#define CONTACTSIDEBAR_H - -#include -#include - -// Forward declarations -class ContactBase; -class ContactFrame; -class ContactList; -class QVBoxLayout; - -/**The sidebar in a chat that contains the little contact information frames. - *@author Mike K. Bennett - */ - -class ContactSidebar : public QWidget -{ - Q_OBJECT - - public: - // The constructor - ContactSidebar(QWidget *parent=0, const char *name=0); - // The destructor - virtual ~ContactSidebar(); - // Initialize the object - bool initialize(); - // A message was received from one of the contacts... notify its frame - void messageReceived(const QString& handle); - - protected: - // do we want this drop? - void contentsDropEvent( QDropEvent *event ); - // something being dragged has entered our widget - void contentsDragEnterEvent( QDragEnterEvent *event ); - // something being dragged has been moved in our widget - void contentsDragMoveEvent( QDragMoveEvent *event ); - - public slots: // Public slots - // A contact joined the chat - void contactJoined(QString handle, QString friendlyName); - // A contact left the chat - void contactLeft( QString handle, bool isChatIdle ); - // A contact is typing - void contactTyping(QString handle, QString friendlyName); - - signals: - // invite a contact to a chat (result of a drag and drop operation) - void inviteContact( QString handle ); - // The user wants to add or remove a contact. - void setContactAdded( QString handle, bool isAdded ); - // The user wants to allow a contact to see hi/hers online status. - void setContactAllowed( QString handle ); - // Toggle blocked status for a contact - void setContactBlocked( QString handle, bool isBlocked ); - - private: // Private methods - // Find the contact frame with the given handle - ContactFrame* getContactFrameByHandle(const QString& handle); - // Return the first inactive contact frame - ContactFrame* getFirstInactiveContactFrame(); - - private: // Private attributes - // The list of pointers to the frames in the sidebar - QPtrList contactFrames_; - // the box to put contact frames into - QVBoxLayout *viewBox_; -}; - -#endif diff --git a/kmess/chat/emoticonbutton.cpp b/kmess/chat/emoticonbutton.cpp deleted file mode 100644 index 7d88395..0000000 --- a/kmess/chat/emoticonbutton.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - emoticonbutton.cpp - description - ------------------- - begin : Mon May 6 2002 - copyright : (C) 2002 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 "emoticonbutton.h" - -#include -#include -#include -#include -#include -#include - -#include - -#include "../emoticon.h" -#include "../kmessdebug.h" - -EmoticonButton::EmoticonButton(const Emoticon *emoticon, QWidget *parent, const char *name ) - : QToolButton(parent,name), - emoticon_(emoticon) -{ - QString emoticonFile = emoticon_->getPicturePath(); - - // Set the pixmap - QPixmap emoticonPixmap(emoticonFile); - setPixmap( emoticonPixmap ); - setFixedSize( EMOTICON_BUTTON_SIZE, EMOTICON_BUTTON_SIZE ); - - // Set other properties. - setAutoRaise(true); // flat, only show border on mouse over - setUsesTextLabel(false); - - // Add the emoticon tooltip - QToolTip::add( this, emoticon_->getTooltip() ); - - // Connect the button's own clicked signal to the clicked slot - connect( this, SIGNAL( clicked() ), - this, SLOT ( slotClicked() ) ); - // Connect to the emoticon to receive updates. - connect( emoticon, SIGNAL( changed() ), - this, SLOT ( slotPixmapChanged() ) ); -} - - - -EmoticonButton::~EmoticonButton() -{ -} - - - -// The button was clicked. -void EmoticonButton::slotClicked() -{ - emit insertEmoticon( emoticon_->getShortcut() ); -} - - -// The pixmap changed -void EmoticonButton::slotPixmapChanged() -{ -kdDebug() << "EmoticonButton::slotPixmapChanged() - Emoticon has changed!" << endl; - QPixmap emoticonPixmap( emoticon_->getPicturePath() ); - setPixmap( emoticonPixmap ); -} - - -#include "emoticonbutton.moc" diff --git a/kmess/chat/emoticonbutton.h b/kmess/chat/emoticonbutton.h deleted file mode 100644 index af1aef7..0000000 --- a/kmess/chat/emoticonbutton.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - emoticonbutton.h - description - ------------------- - begin : Mon May 6 2002 - copyright : (C) 2002 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 EMOTICONBUTTON_H -#define EMOTICONBUTTON_H - -#include -#include - - - -/** - * Emoticon buttons size - * - * Force all the buttons to be 32x32 pixels sized. This define's value should be equal to the one in - * the EmoticonButton class. - */ -#define EMOTICON_BUTTON_SIZE 32 - - -// forward declarations -class Emoticon; - -/**A button displaying an emoticon for easy insertion into a message. - Also stores emoticon data for parsing. - *@author Mike K. Bennett - */ - -class EmoticonButton : public QToolButton -{ - Q_OBJECT - - public: - EmoticonButton(const Emoticon *emoticon, QWidget *parent, const char *name=0); - ~EmoticonButton(); - - private slots: // Private slots - // The button was clicked. - void slotClicked(); - // The pixmap changed - void slotPixmapChanged(); - - private: // Private attributes - // The emoticon represented by this button. - const Emoticon *emoticon_; - - signals: // Signals - // Request that the emoticon's html code be inserted in the message. - void insertEmoticon(QString html); -}; - -#endif diff --git a/kmess/chat/emoticonsidebar.cpp b/kmess/chat/emoticonsidebar.cpp deleted file mode 100644 index d7a614e..0000000 --- a/kmess/chat/emoticonsidebar.cpp +++ /dev/null @@ -1,204 +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 -#include -#include - -#include "emoticonsidebar.h" -#include "emoticonbutton.h" - -#include "../emoticonmanager.h" -#include "../emoticontheme.h" -#include "../kmessdebug.h" - - - -// The constructor -EmoticonSidebar::EmoticonSidebar( QWidget *parent, const char *name, bool useCustomTheme ) - : QVBox(parent, name) - , cols_(3) // Bogus minimum value, the grid will be redrawn later on anyways - , isCustom_(useCustomTheme) -{ - // Create the grid to lay the buttons into, and a spacer to keep the grid on top of the sidebar - grid_ = new QGrid( cols_, Horizontal, this ); - spacer_ = new QSpacerItem( 20, 0, QSizePolicy::Ignored, QSizePolicy::Ignored ); - - // 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() ) ); - - // Force adding the theme's emoticons - slotThemeUpdated(); -} - - - -// The destructor -EmoticonSidebar::~EmoticonSidebar() -{ -} - - - -// Create an emoticon button on the grid -void EmoticonSidebar::createEmoticonButton(const Emoticon *emoticon) -{ - EmoticonButton *button; - - // Create the button - // Use a separate EmoticonButton, so we can also include the - // emoticon code in the button signal. - button = new EmoticonButton( emoticon, grid_, "EmoticonButton" ); - - // Connect the button's insertEmoticon signal - connect( button, SIGNAL( insertEmoticon(QString) ) , - this, SLOT ( slotInsertEmoticon(QString) ) ); -} - - - -// Overwritten method to detect resizes -void EmoticonSidebar::resizeEvent(QResizeEvent *event) -{ -#ifdef KMESSDEBUG_EMOTICONSIDEBAR - kdDebug() << "EmoticonSidebar::resizeEvent() - Resizing from " << event->oldSize() << " to " << size() << endl; -#endif - - // Update emoticon layout only if the sidebar size has changed - if( event->oldSize().width() != width() ) - { - updateEmoticonLayout(); - } - - // Call the parent - QWidget::resizeEvent( event ); -} - - - -// Layout the emoticon buttons -void EmoticonSidebar::updateEmoticonLayout() -{ - // Insert the button to the layout - QObjectList *childWidgets = grid_->queryList( "EmoticonButton" ); - - // The list is null if there aren't any children. - if( childWidgets == 0 ) - { - return; - } - - // Calculate the number of button columns that will fit in the new sidebar size - cols_ = width() / EMOTICON_BUTTON_SIZE; - // Create a new grid with the new size - QGrid *newGrid = new QGrid( cols_, Horizontal, this ); - -#ifdef KMESSDEBUG_EMOTICONSIDEBAR - kdDebug() << "EmoticonSidebar::updateEmoticonLayout() - Changing grid to " << cols_ << " columns, totally " << childWidgets->count() << " buttons." << endl; -#endif - - QWidget *obj; - QObjectListIt it( *childWidgets ); - - // Transfer all buttons from the old and now misshaped grid to the new one - while( it.current() != 0 ) - { - obj = static_cast( it.current() ); - // Using QPoint with zeros because the old pos will be ignored anyways. And it avoids a call to QWidget::pos(). - obj->reparent( newGrid, QPoint(0,0), true ); - ++it; - } - // We're finished using the list, we can delete it - delete childWidgets; - - // Replace the old grid with the updated one - delete grid_; - grid_ = newGrid; - - // Set some attributes to it, to make it display correctly - grid_->setMargin(0); - grid_->setSpacing(0); - grid_->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); - grid_->setMaximumWidth( parentWidget()->width() ); - grid_->show(); - - // Also readd the spacer to the bottom of the layout, to always have on top the grid and on bottom the spacer. - // This is needed because new items are added to the layout bottom, so we would get the spacer on top after an update. - layout()->removeItem( spacer_ ); - layout()->addItem( spacer_ ); -} - - - -// A button was clicked -void EmoticonSidebar::slotInsertEmoticon(QString html) -{ - emit insertEmoticon(html); -} - - -// The theme has changed, we need to reload it -void EmoticonSidebar::slotThemeUpdated() -{ -#ifdef KMESSDEBUG_EMOTICONSIDEBAR - kdDebug() << "EmoticonSidebar::slotThemeUpdated() - Removing old theme from the sidebar." << endl; -#endif - - // Find the existing buttons in the sidebar - QObjectList *childWidgets = grid_->queryList( "EmoticonButton" ); - - // The list is null if there aren't any children. - if( childWidgets != 0 ) - { - QObjectListIt it( *childWidgets ); - - // Delete them - while( it.current() != 0 ) - { - delete it.current(); - ++it; - } - } - // We're finished using the list, we can delete it - delete childWidgets; - -#ifdef KMESSDEBUG_EMOTICONSIDEBAR - kdDebug() << "EmoticonSidebar::slotThemeUpdated() - Updating sidebar with current emoticons." << endl; -#endif - - Emoticon *emoticon; - EmoticonTheme *theme = manager_->getTheme( isCustom_ ); - - // Add all theme emoticons to the list - for(emoticon = theme->first(); emoticon != 0; emoticon = theme->next() ) - { - if( emoticon->isValid() ) - { - createEmoticonButton( emoticon ); - } - } - - // Update the buttons layout to fit the current number of buttons and sidebar size - updateEmoticonLayout(); -} - - - -#include "emoticonsidebar.moc" diff --git a/kmess/chat/emoticonsidebar.h b/kmess/chat/emoticonsidebar.h deleted file mode 100644 index d24af8e..0000000 --- a/kmess/chat/emoticonsidebar.h +++ /dev/null @@ -1,77 +0,0 @@ -/*************************************************************************** - emoticonsidebar.h - 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. * - * * - ***************************************************************************/ - -#ifndef EMOTICONSIDEBAR_H -#define EMOTICONSIDEBAR_H - -#include -#include - -class Emoticon; -class EmoticonManager; -class QResizeEvent; -class QSpacerItem; - -/** - * Implements an emoticon chooser as sidebar tab. - * - * @author Diederik van der Boor, Valerio Pilo - */ -class EmoticonSidebar : public QVBox -{ - Q_OBJECT - - public: - // The constructor - EmoticonSidebar( QWidget *parent, const char *name, bool useCustomTheme ); - // The destructor - virtual ~EmoticonSidebar(); - - protected slots: - // Overwritten method to detect resizes - virtual void resizeEvent(QResizeEvent*); - - private slots: - // A button was clicked - void slotInsertEmoticon(QString html); - // The theme has changed, we need to reload it - void slotThemeUpdated(); - - private: // private methods - // Create an emoticon button on the grid - void createEmoticonButton(const Emoticon *emoticon); - // Layout the emoticon buttons - void updateEmoticonLayout(); - - private: // private properties - // Current number of columns used by the grid - int cols_; - // Grid which will lay our emoticon buttons out - QGrid *grid_; - // Whether the sidebar contains a standard or custom theme - bool isCustom_; - // Reference to the emoticon manager, to update the emoticon buttons - EmoticonManager *manager_; - // A spacer used to keep the emoticons grid at the top of the sidebar - QSpacerItem *spacer_; - - signals: // Signals - // Request that the emoticon's html code should be inserted in the message. - void insertEmoticon(QString html); -}; - -#endif diff --git a/kmess/chat/websidebar.cpp b/kmess/chat/websidebar.cpp deleted file mode 100644 index 017f83f..0000000 --- a/kmess/chat/websidebar.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** - websidebar.cpp - description - ------------------- - begin : Sat Oct 8 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 "websidebar.h" - -#include - -#include -#include -#include - -#include "../kmessdebug.h" -#include "../network/soap/msnappdirectoryservice.h" - - -WebSidebar::WebSidebar(QWidget *parent, const char *name) - : QWidget(parent, name) - , appdirService_(0) - , khtml_(0) -{ - setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred, false); // Stretch widget - QBoxLayout *layout = new QHBoxLayout( this ); - - khtml_ = new KHTMLPart(this, "KHTMLPart"); - layout->addWidget( khtml_->view() ); // Stretches widget - - // Enable all features msn games might use - khtml_->setJScriptEnabled(true); - khtml_->setJavaEnabled(true); - khtml_->setMetaRefreshEnabled(true); - khtml_->setOnlyLocalReferences(false); - khtml_->setPluginsEnabled(true); - - // Connect signals for browsing - connect( khtml_->browserExtension(), SIGNAL( openURLRequest(const KURL&, const KParts::URLArgs&) ) , - this, SLOT( slotOpenURLRequest(const KURL&, const KParts::URLArgs&) ) ); -} - - -WebSidebar::~WebSidebar() -{ - -} - - - -// Initialize the sidebar -bool WebSidebar::initialize() -{ - requestGameList(); - return true; -} - - - -// Request the list of games from the msn server -void WebSidebar::requestGameList() -{ - if(appdirService_ == 0) - { - appdirService_ = new MsnAppDirectoryService(); - connect(appdirService_, SIGNAL( requestFinished() ) , - this, SLOT( slotRequestFinished() ) ); - } - - // TODO: handle some caching/singleton stuff somewhere so we only have to request this once - appdirService_->queryServiceList( MsnAppDirectoryService::GAMES ); -} - - - -// Open a new url in the khtml widget -void WebSidebar::slotOpenURLRequest(const KURL &url, const KParts::URLArgs & /* args */) -{ - khtml_->openURL(url); -} - - - -// A request to the msn appdir finished -void WebSidebar::slotRequestFinished() -{ - kdDebug() << "WebSidebar::slotRequestFinished" << endl; - if(KMESS_NULL(appdirService_)) return; - - khtml_->begin(); - - khtml_->write("" - "MSN Activities" - "

Games

"); - - - QPtrListIterator it( appdirService_->getEntries() ); - while(! it.atLast()) - { - MsnAppDirectoryService::Entry *entry = it.current(); - - khtml_->write("
" + entry->name + "
"); - khtml_->write("
" + entry->description + "
"); - ++it; - - kdDebug() << entry->appIconUrl << endl; - kdDebug() << entry->url << endl; - } - - khtml_->write("
"); - khtml_->end(); -} - - -#include "websidebar.moc" diff --git a/kmess/chat/websidebar.h b/kmess/chat/websidebar.h deleted file mode 100644 index 99e4603..0000000 --- a/kmess/chat/websidebar.h +++ /dev/null @@ -1,61 +0,0 @@ -/*************************************************************************** - websidebar.h - description - ------------------- - begin : Sat Oct 8 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. * - * * - ***************************************************************************/ - -#ifndef WEBSIDEBAR_H -#define WEBSIDEBAR_H - -#include -#include - -class KHTMLPart; -class KURL; -class MsnAppDirectoryService; - -/** - * A sidebar with web-based content. - * @author Diederik van der Boor - */ -class WebSidebar : public QWidget -{ - Q_OBJECT - - public: - // The constructor - WebSidebar(QWidget *parent=0, const char *name=0); - // The destructor - virtual ~WebSidebar(); - // Initialize the sidebar - bool initialize(); - - private slots: - // Open a new url in the khtml widget - void slotOpenURLRequest(const KURL &url, const KParts::URLArgs &args); - // A request to the msn appdir finished - void slotRequestFinished(); - - private: - // Request the list of games from the msn server - void requestGameList(); - - private: - // The connection to the appdir server - MsnAppDirectoryService *appdirService_; - // The embedded khtml part - KHTMLPart *khtml_; -}; - -#endif diff --git a/kmess/configure.in.in b/kmess/configure.in.in deleted file mode 100644 index 5f031c9..0000000 --- a/kmess/configure.in.in +++ /dev/null @@ -1,173 +0,0 @@ -# -- Check for XScreenSaver ----------------------------------------- - -# This is based on libkopete/configure.in.in and karm/configure.in.in - -# backup old flags (are changed by the tests) -ac_LDFLAGS_save="$LDFLAGS" -ac_CPPFLAGS_save="$CPPFLAGS" -ac_LIBS_save="$LIBS" -ac_APBUILD_STATIC_save="$APBUILD_STATIC" -ac_APBUILD_BOGUS_DEPS_save="$APBUILD_BOGUS_DEPS" - -LIB_XSCREENSAVER= - -# # run the test -# LIBS="-lXext -lX11 $X_LDFLAGS" -# AC_CHECK_LIB(Xss, XScreenSaverAllocInfo, -# [ -# LIB_XSCREENSAVER="-lXext -lXss" -# AC_DEFINE(HAVE_XSCREENSAVER, 1, [Define if you have the XScreenSaver installed]) -# ], -# [ -# AC_WARN(XScreenSaver extension not found. Auto-away feature will not work) -# ]) - - -# The syntax is: AC_TRY_COMPILE(header, [if true do], [if false do], [(code)]) -# -# Check for the scrnsaver.h header -KDE_CHECK_HEADERS(X11/extensions/scrnsaver.h, - [ - # Check if libXext has XScreenSaverQueryInfo() - # Disable bogus dependencies for apg++ (autopackage) - APBUILD_STATIC="" - APBUILD_BOGUS_DEPS="" - LIBS="$X_PRE_LIBS -lX11 $X_LDFLAGS $X_EXTRA_LIBS" - AC_CHECK_LIB(Xext,XScreenSaverQueryInfo, - [ - # Success, use "-lXext" - AC_DEFINE(HAVE_XSCREENSAVER, 1, [Define if you have the XScreenSaver extension]) - LIB_XSCREENSAVER="-lXext" - ], - - [ - # else: - - # Check if libXss has XScreenSaverQueryInfo() - LIBS="-lXext -lX11 $X_LDFLAGS" - AC_CHECK_LIB(Xss,XScreenSaverQueryInfo, - [ - # Success, use "-lXss" - AC_DEFINE(HAVE_XSCREENSAVER, 1, [Define if you have the XScreenSaver extension]) - LIB_XSCREENSAVER="-lXext -lXss" - ], - [ - # Library not found, disabling idle timer code. - AC_WARN(XScreenSaver extension not found. Auto-away feature will not work) - ] - ) - ] - ) - ], - [ - # Header not found, disabling idle timer code. - AC_WARN(XScreenSaver header not found. Auto-away feature will not work) - ], - [ - #include - ] -) - -# restore old flags (changed by the tests) -CPPFLAGS="$ac_CPPFLAGS_save" -LDFLAGS="$ac_LDFLAGS_save" -LIBS="$ac_LIBS_save" -APBUILD_STATIC="$ac_APBUILD_STATIC_save" -APBUILD_BOGUS_DEPS="$ac_APBUILD_BOGUS_DEPS_save" - -# Export the LIB_XSCREENSAVER to Makefile.am -AC_SUBST(LIB_XSCREENSAVER) - - - -# -- Check for BinReloc ----------------------------------------- - -# Check for binary relocation support -# Hongli Lai -# http://autopackage.org/ - -# New configure arguments -AC_ARG_ENABLE(binreloc, -[ --enable-binreloc compile with binary relocation support - (default=enable when available)], -enable_binreloc=$enableval,enable_binreloc=auto) - -AC_ARG_ENABLE(binreloc-threads, -[ --enable-binreloc-threads compile binary relocation with threads support - (default=yes)], -enable_binreloc_threads=$enableval,enable_binreloc_threads=yes) - - -# checking code -BINRELOC_CFLAGS= -BINRELOC_LIBS= - -if test "x$enable_binreloc" = "xauto"; then - AC_CHECK_FILE([/proc/self/maps]) - AC_CACHE_CHECK([whether everything is installed to the same prefix], - [br_cv_valid_prefixes], [ - if test "$bindir" = '${exec_prefix}/bin' -a "$sbindir" = '${exec_prefix}/sbin' -a \ - "$datadir" = '${prefix}/share' -a "$libdir" = '${exec_prefix}/lib' -a \ - "$libexecdir" = '${exec_prefix}/libexec' -a "$sysconfdir" = '${prefix}/etc' - then - br_cv_valid_prefixes=yes - else - br_cv_valid_prefixes=no - fi - ]) -fi - -AC_CACHE_CHECK([whether binary relocation support should be enabled], - [br_cv_binreloc], - [if test "x$enable_binreloc" = "xyes"; then - br_cv_binreloc=yes - elif test "x$enable_binreloc" = "xauto"; then - if test "x$br_cv_valid_prefixes" = "xyes" -a \ - "x$ac_cv_file__proc_self_maps" = "xyes"; then - br_cv_binreloc=yes - else - br_cv_binreloc=no - fi - else - br_cv_binreloc=no - fi - ]) - -if test "x$br_cv_binreloc" = "xyes"; then - # using both -DENABLE_BINRELOC and AC_DEFINE(ENABLE_BINRELOC) produces - # a ENABLE_BINRELOC redefined warning. Disable one. - BINRELOC_CFLAGS="-DENABLE_BINRELOC" - ### AC_DEFINE(ENABLE_BINRELOC,,[Use binary relocation?]) - if test "x$enable_binreloc_threads" = "xyes"; then - AC_CHECK_LIB([pthread], [pthread_getspecific]) - fi - - AC_CACHE_CHECK([whether binary relocation should use threads], - [br_cv_binreloc_threads], - [if test "x$enable_binreloc_threads" = "xyes"; then - if test "x$ac_cv_lib_pthread_pthread_getspecific" = "xyes"; then - br_cv_binreloc_threads=yes - else - br_cv_binreloc_threads=no - fi - else - br_cv_binreloc_threads=no - fi - ]) - - if test "x$br_cv_binreloc_threads" = "xyes"; then - BINRELOC_LIBS="-lpthread" - AC_DEFINE(BR_PTHREAD,1,[Include pthread support for binary relocation?]) - else - BINRELOC_CFLAGS="$BINRELOC_CFLAGS -DBR_PTHREADS=0" - AC_DEFINE(BR_PTHREAD,0,[Include pthread support for binary relocation?]) - fi -fi - -AC_SUBST(BINRELOC_CFLAGS) -AC_SUBST(BINRELOC_LIBS) - - -# also export detected prefixes as fallback -AC_DEFINE_UNQUOTED(KMESS_PREFIX, "$prefix", [Define the default fallback prefix when binreloc fails]) - diff --git a/kmess/contact/.cvsignore b/kmess/contact/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/contact/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/contact/Makefile.am b/kmess/contact/Makefile.am deleted file mode 100644 index 9769588..0000000 --- a/kmess/contact/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -noinst_LIBRARIES = libcontact.a -INCLUDES = $(all_includes) -libcontact_a_METASOURCES = AUTO -libcontact_a_SOURCES = contactbase.cpp contact.cpp contactextension.cpp contactlist.cpp contactdrag.cpp group.cpp invitedcontact.cpp -noinst_HEADERS = contactbase.h contact.h contactextension.h contactlist.h contactdrag.h group.h invitedcontact.h diff --git a/kmess/contact/Makefile.in b/kmess/contact/Makefile.in deleted file mode 100644 index 3d758cb..0000000 --- a/kmess/contact/Makefile.in +++ /dev/null @@ -1,802 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libcontact_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/contact -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libcontact_a_AR = $(AR) $(ARFLAGS) -libcontact_a_LIBADD = -am_libcontact_a_OBJECTS = contactbase.$(OBJEXT) contact.$(OBJEXT) \ - contactextension.$(OBJEXT) contactlist.$(OBJEXT) \ - contactdrag.$(OBJEXT) group.$(OBJEXT) invitedcontact.$(OBJEXT) -#>- libcontact_a_OBJECTS = $(am_libcontact_a_OBJECTS) -#>+ 6 -libcontact_a_final_OBJECTS = libcontact_a.all_cpp.o -libcontact_a_nofinal_OBJECTS = contactbase.$(OBJEXT) contact.$(OBJEXT) \ - contactextension.$(OBJEXT) contactlist.$(OBJEXT) \ - contactdrag.$(OBJEXT) group.$(OBJEXT) invitedcontact.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libcontact_a_OBJECTS = $(libcontact_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libcontact_a_OBJECTS = $(libcontact_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/contact.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactbase.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactdrag.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactextension.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactlist.Po ./$(DEPDIR)/group.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/invitedcontact.Po -#>+ 12 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/libcontact_a.all_cpp.P ./$(DEPDIR)/contact.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactbase.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactdrag.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactextension.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactlist.Po ./$(DEPDIR)/group.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/invitedcontact.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = ./$(DEPDIR)/contact.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactbase.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactdrag.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactextension.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactlist.Po ./$(DEPDIR)/group.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/invitedcontact.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libcontact_a_SOURCES) -DIST_SOURCES = $(libcontact_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -noinst_LIBRARIES = libcontact.a -INCLUDES = $(all_includes) -#>- libcontact_a_METASOURCES = AUTO -libcontact_a_SOURCES = contactbase.cpp contact.cpp contactextension.cpp contactlist.cpp contactdrag.cpp group.cpp invitedcontact.cpp -noinst_HEADERS = contactbase.h contact.h contactextension.h contactlist.h contactdrag.h group.h invitedcontact.h -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/contact/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/contact/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/contact/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/contact/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/contact/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libcontact.a: $(libcontact_a_OBJECTS) $(libcontact_a_DEPENDENCIES) - -rm -f libcontact.a - $(libcontact_a_AR) libcontact.a $(libcontact_a_OBJECTS) $(libcontact_a_LIBADD) - $(RANLIB) libcontact.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contact.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactbase.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactdrag.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactextension.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactlist.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/group.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invitedcontact.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -group.moc: $(srcdir)/group.h - $(MOC) $(srcdir)/group.h -o group.moc - -#>+ 2 -mocs: group.moc - -#>+ 3 -contactbase.moc: $(srcdir)/contactbase.h - $(MOC) $(srcdir)/contactbase.h -o contactbase.moc - -#>+ 2 -mocs: contactbase.moc - -#>+ 3 -contactlist.moc: $(srcdir)/contactlist.h - $(MOC) $(srcdir)/contactlist.h -o contactlist.moc - -#>+ 2 -mocs: contactlist.moc - -#>+ 3 -invitedcontact.moc: $(srcdir)/invitedcontact.h - $(MOC) $(srcdir)/invitedcontact.h -o invitedcontact.moc - -#>+ 2 -mocs: invitedcontact.moc - -#>+ 3 -contact.moc: $(srcdir)/contact.h - $(MOC) $(srcdir)/contact.h -o contact.moc - -#>+ 2 -mocs: contact.moc - -#>+ 3 -contactextension.moc: $(srcdir)/contactextension.h - $(MOC) $(srcdir)/contactextension.h -o contactextension.moc - -#>+ 2 -mocs: contactextension.moc - -#>+ 3 -clean-metasources: - -rm -f group.moc contactbase.moc contactlist.moc invitedcontact.moc contact.moc contactextension.moc - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/contact/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/contact/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/contact/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libcontact_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/contactbase.cpp $(srcdir)/contact.cpp $(srcdir)/contactextension.cpp $(srcdir)/contactlist.cpp $(srcdir)/contactdrag.cpp $(srcdir)/group.cpp $(srcdir)/invitedcontact.cpp contactbase.moc group.moc contactlist.moc invitedcontact.moc contact.moc contactextension.moc - @echo 'creating libcontact_a.all_cpp.cpp ...'; \ - rm -f libcontact_a.all_cpp.files libcontact_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libcontact_a.all_cpp.final; \ - for file in contactbase.cpp contact.cpp contactextension.cpp contactlist.cpp contactdrag.cpp group.cpp invitedcontact.cpp ; do \ - echo "#include \"$$file\"" >> libcontact_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libcontact_a.all_cpp.final; \ - done; \ - cat libcontact_a.all_cpp.final libcontact_a.all_cpp.files > libcontact_a.all_cpp.cpp; \ - rm -f libcontact_a.all_cpp.final libcontact_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libcontact_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libcontact_a_OBJECTS="$(libcontact_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libcontact_a_OBJECTS="$(libcontact_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libcontact_a_OBJECTS="$(libcontact_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libcontact_a_OBJECTS="$(libcontact_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 15 -contactlist.lo: contactlist.moc -contactextension.lo: contactextension.moc -contactextension.o: contactextension.moc -contactlist.o: contactlist.moc -contact.o: contact.moc -contactbase.lo: contactbase.moc -invitedcontact.lo: invitedcontact.moc -nmcheck: -contact.lo: contact.moc -contactbase.o: contactbase.moc -nmcheck-am: nmcheck -group.lo: group.moc -invitedcontact.o: invitedcontact.moc -group.o: group.moc diff --git a/kmess/contact/contact.cpp b/kmess/contact/contact.cpp deleted file mode 100644 index 4eb3dcc..0000000 --- a/kmess/contact/contact.cpp +++ /dev/null @@ -1,574 +0,0 @@ -/*************************************************************************** - contact.cpp - description - ------------------- - begin : Sun Jan 5 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 "contact.h" - -#include -#include -#include - -#include -#include -#include -#include - -#include "contactextension.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" -#include "../msnobject.h" -#include "../specialgroups.h" - -#ifdef KMESSDEBUG_CONTACT - #define KMESSDEBUG_CONTACT_GENERAL -#endif - - - -// The constructor -Contact::Contact(QString handle, QString friendlyName, int lists, QStringList groupIds, QString guid) - : ContactBase(handle, friendlyName), - allowed_(false), - blocked_(false), - friend_(false), - groupIds_(groupIds), - guid_(guid), - lastStatus_("FLN"), - movingFrom_(""), - msnObject_(0), - pending_(false), - reverse_(false), - status_("FLN") -{ -#ifdef KMESSTEST - ASSERT( ! handle_.isEmpty() ); - ASSERT( ! friendlyName_.isEmpty() ); - ASSERT( lists != 0 ); -#endif - - if(lists & MSN_LIST_FRIEND) friend_ = true; - if(lists & MSN_LIST_ALLOWED) allowed_ = true; - if(lists & MSN_LIST_BLOCKED) blocked_ = true; - if(lists & MSN_LIST_REVERSE) reverse_ = true; - if(lists & MSN_LIST_PENDING) pending_ = true; - - - // The extension stores additional properties not found in - // the official client/protocol, but only found in KMess. - // Pictures are stored there because you can assign one - // (KMess implemented this before the official client supported - // picture transfers). Names can be aliased, which is why there're - // also there. - extension_ = new ContactExtension( handle ); - - connect ( extension_, SIGNAL( changedFriendlyName() ), - this, SLOT( forwardChangedFriendlyName() ) ); - connect ( extension_, SIGNAL( changedPicture() ), - this, SLOT( forwardChangedPicture() ) ); -} - - - -// The destructor -Contact::~Contact() -{ -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "DESTROYED Contact [handle=" << handle_ << "]" << endl; -#endif - - delete extension_; - if(msnObject_) delete msnObject_; -} - - - -// Add the groupID to the list of current groups -void Contact::addGroupId(const QString &groupId) -{ - // Check whether contact is already added to the group. - if( groupIds_.contains(groupId) ) - { - kdWarning() << "Contact::addGroupId: " << handle_ << " is already a member of group " << groupId << "." << endl; - return; - } - // Protect against invalid use, causes problems in KMessView. - if( groupId.isEmpty() ) - { - kdWarning() << "Contact::addGroupId: Group-ID is empty (contact=" << getHandle() << ")!" << endl; - return; - } - - // Append to groups - groupIds_.append(groupId); - -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact::addGroupId: groups of " << handle_ << " are '" << groupIds_.join(",") << "'" << endl; -#endif - - emit changedGroup(this); -} - - -// Check if this is a new contact -bool Contact::checkIfContactAddedUser() -{ -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact " << handle_ << " - Check if new." << endl; -#endif - - // Check if the contact is a new contact - return ( reverse_ && ! (friend_ || blocked_ || allowed_ ) ); -} - - - -// Slot to pass on the changedFriendlyName() -void Contact::forwardChangedFriendlyName() -{ - emit changedFriendlyName(); -} - - - -// Forward the "changed picture" signal -void Contact::forwardChangedPicture() -{ - emit changedPicture(); -} - - - -// Return the path to the contact's picture -QString Contact::getContactPicturePath() const -{ - QString picturePath = extension_->getContactPicturePath(); - - if( picturePath.isEmpty() ) - { - return getContactDefaultPicturePath(); - } - else - { - return picturePath; - } -} - - - -// Return the current media type -const QString & Contact::getCurrentMediaType() const -{ - return currentMediaType_; -} - - - -// Return the current media type -const QString & Contact::getCurrentMediaString() const -{ - return currentMediaString_; -} - - - -// Return a pointer to the extension class -ContactExtension *Contact::getExtension() const -{ - return extension_; -} - - -// Return the contact's friendly name -QString Contact::getFriendlyName() const -{ - if ( extension_->getUseAlternativeName() ) - { - return extension_->getAlternativeName(); - } - else - { - return friendlyName_; - } -} - - - -// Return the contact's previous status -const QString &Contact::getLastStatus() const -{ - return lastStatus_; -} - - - -// Return the contact's globally unique identifier -const QString &Contact::getGuid() const -{ - return guid_; -} - - - -// Return the group ID's the contact is added to -QStringList Contact::getGroupIds() const -{ - return groupIds_; -} - - -// Return the MSNObject -const MsnObject* Contact::getMsnObject() const -{ - return msnObject_; -} - - - -// Return the contact's personal message -const QString & Contact::getPersonalMessage() const -{ - return personalMessage_; -} - - - -// Get the source group for an imminent move operation -const QString & Contact::getPrepareMove() const -{ - return movingFrom_; -} - - - -// Return the contact's status -QString Contact::getStatus() const -{ - return status_; -} - - - -// Return the contact's true friendly name, regardless of extension -QString Contact::getTrueFriendlyName() const -{ - return friendlyName_; -} - - - -// Whether or not the contact is allowed -bool Contact::isAllowed() const -{ - return allowed_; -} - - - -// Whether or not the contact is blocked -bool Contact::isBlocked() const -{ - return blocked_; -} - - - -// Whether or not the contact is on the friends list -bool Contact::isFriend() const -{ - return friend_; -} - - - -// Whether or not the contact is on the pending list -bool Contact::isPending() const -{ - return pending_; -} - - - -// Whether or not the contact is on the reverse list -bool Contact::isReverse() const -{ - return reverse_; -} - - - -// Setup and load an MSN Object -void Contact::loadMsnObject( QString msnObject ) -{ - if( ! msnObject ) - { - return; - } - - // Contact removed his picture. - if( msnObject.isEmpty() ) - { -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact " << getHandle() << " - MSN Object Removed!" << endl; -#endif - - delete msnObject_; - msnObject_ = 0; - emit changedMsnObject( this ); - } - - // Contact set his picture, or changed it. - if( msnObject_ ) - { - // Actually not changed... - if( ! msnObject_->hasChanged( msnObject ) ) - { - return; - } - - // Delete previous object. - delete msnObject_; - msnObject_= 0; - } - -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact " << getHandle() << " - MSN Object Changed!" << endl; -#endif - - msnObject_ = new MsnObject( msnObject ); - emit changedMsnObject( this ); -} - - - -// Remove the group from the list of group IDs -void Contact::removeGroupId(const QString &groupId) -{ - int removeCount = groupIds_.remove(groupId); - if(removeCount == 0) - { - kdWarning() << "Contact::addGroupId: " << handle_ << " was not registered to group " << groupId << "." << endl; - } - -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact::removeGroupId: groups of " << handle_ << " are '" << groupIds_.join(",") << "'" << endl; -#endif - - emit changedGroup(this); -} - - - -// Set whether or not the contact is allowed -void Contact::setAllowed(bool allowed) -{ - if( allowed_ != allowed ) - { - allowed_ = allowed; - emit changedList(this); - } -} - - - -// Set whether or not the contact is blocked -void Contact::setBlocked(bool blocked) -{ - if( blocked_ != blocked ) - { - blocked_ = blocked; - emit changedList(this); - } -} - - - -// Set whether or not the contact is on the friends list -void Contact::setFriend(bool isFriend) -{ - if( friend_ != isFriend ) - { - friend_ = isFriend; - - // If the contact is no longer at the FL, remove from all groups - if(! isFriend) - { - groupIds_.clear(); - setStatus("FLN", false); - } - - emit changedList(this); - } -} - - - -// Change the contact's friendly name -void Contact::setFriendlyName(QString newName) -{ - if( ! newName.isEmpty() ) - { - friendlyName_ = newName; -// updateItemIdentifierAndPixmap(); - emit changedFriendlyName(); - } -} - - - -// 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) -{ - guid_ = guid; -} - - - -// Set whether or not the user is on a given list -void Contact::setList(const QString list, bool isMember) -{ -#ifdef KMESSTEST - ASSERT( ( list == "FL" ) || ( list == "AL" ) || ( list == "BL" ) || ( list == "RL" ) ); -#endif -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact::setList: old =" << (allowed_ ? " AL" : "") - << (blocked_ ? " BL" : "") - << (friend_ ? " FL" : "") - << (reverse_ ? " RL" : "") << endl; -#endif - - 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 - kdDebug() << "Contact::setList: new =" << (allowed_ ? " AL" : "") - << (blocked_ ? " BL" : "") - << (friend_ ? " FL" : "") - << (reverse_ ? " RL" : "") << endl; -#endif -} - - - -// Set the personal message of the contact -void Contact::setPersonalStatus( const QString &message, const QString &mediaType, const QString &mediaString ) -{ - if( personalMessage_ != message - || currentMediaType_ != mediaType - || currentMediaString_ != mediaString ) - { - personalMessage_ = message; - currentMediaType_ = mediaType; - currentMediaString_ = mediaString; - emit changedPersonalMessage(this); - } -} - - - -// 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) -{ - if( reverse_ != reverse ) - { - reverse_ = reverse; - emit changedList(this); - } -} - - - -// Set the contact's status -void Contact::setStatus(const QString status, bool showBaloon) -{ - bool isValidStatus = ( status == "AWY" ) || - ( status == "BRB" ) || - ( status == "BSY" ) || - ( status == "FLN" ) || - ( status == "IDL" ) || - ( status == "LUN" ) || - ( status == "NLN" ) || - ( status == "PHN" ); - -#ifdef KMESSTEST - ASSERT( isValidStatus ); -#endif - - if(isValidStatus) - { - lastStatus_ = status_; - status_ = status; - -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact " << handle_ << " went from " << lastStatus_ << " to " << status_ << "." << endl; -#endif - - // Signal the UI - emit changedStatus(); - - // Check if the contact went offline - if( status_ == "FLN" && lastStatus_ != "FLN" ) - { -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact went offline." << endl; -#endif - emit contactOffline( this, showBaloon ); - } - // Check if the contact went online - else if( status_ != "FLN" && lastStatus_ == "FLN" ) - { - // showBaloon is here to avoid showing notification when we connect -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact went online." << endl; -#endif - emit contactOnline( this, showBaloon ); - } - } -} - -#include "contact.moc" diff --git a/kmess/contact/contactbase.cpp b/kmess/contact/contactbase.cpp deleted file mode 100644 index 3061dcc..0000000 --- a/kmess/contact/contactbase.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/*************************************************************************** - contactbase.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 "contactbase.h" - -#include -#include - -#include -#include -#include - -#include "../emoticon.h" -#include "../kmessdebug.h" -#include "../network/applications/applicationlist.h" - -// The constructor -ContactBase::ContactBase(QString handle, QString friendlyName, uint capabilities) - : capabilities_(capabilities) - , friendlyName_(friendlyName) - , handle_(handle) - , applicationList_(0) -{ -} - - - -// The destructor -ContactBase::~ContactBase() -{ - delete applicationList_; -} - - - -// Add a custom emoticon definition -void ContactBase::addEmoticonDefinition(const QString &emoticonCode, const QString &msnObjectDataHash ) -{ -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::addEmoticonDefinition() - adding '" << emoticonCode << "' to pending replacements" << endl; -#endif - - // Escape the code so the HTML parser won't be fooled. - QString shortcut = emoticonCode; - shortcut.replace( "&", "&" ) - .replace( "<", "<" ) - .replace( ">", ">" ) - .replace( "'", "'" ) - .replace( '"', """ ); - - // Add emoticon to pending list, until Msn object is received. - pendingEmoticons_.insert(msnObjectDataHash, shortcut, true); - - // Escape the code to insert it safely into a regular expression - QString escapedCode = QRegExp::escape( shortcut ); - - // Update regexp pattern - if( pendingRegExp_.isEmpty() ) - { - pendingRegExp_ = QRegExp( escapedCode ); - } - else - { - pendingRegExp_ = QRegExp( pendingRegExp_.pattern() + "|" + escapedCode ); - } - -#ifdef KMESSTEST - ASSERT( pendingRegExp_.isValid() ); -#endif -} - - - -// Add a custom emoticon file -void ContactBase::addEmoticonFile(const QString &msnObjectDataHash, const QString &filename) -{ - // Check whether the mapping is available. - if( ! pendingEmoticons_.contains(msnObjectDataHash) ) - { - kdWarning() << "Contact::addEmoticonFile: Received an custom emoticon, but no emoticon code found!" << endl; - return; - } - - // Get the emoticon code from pending list, remove it - QString emoticonCode = pendingEmoticons_[msnObjectDataHash]; // no QString& because record gets removed. - pendingEmoticons_.remove(msnObjectDataHash); - -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::addEmoticonFile() - linking '" << emoticonCode << "' to received file." << endl; -#endif - - // Check if filename exists, attempt to read it. - if( ! QFile::exists(filename) ) - { - kdWarning() << "Contact::addEmoticonFile: Could not read emoticon file: file not found!" << endl; - return; - } - QImage emoticonData(filename); - if( emoticonData.isNull() ) - { - kdWarning() << "Contact::addEmoticonFile: Could not read emoticon file!" << endl; - return; - } - -#ifdef KMESSDEBUG_CONTACT_GENERAL - kdDebug() << "Contact::addEmoticonFile: Setting image for '" << emoticonCode << " to " << filename << endl; -#endif - - // Escape the code to insert it safely into a regular expression - QString escapedCode = QRegExp::escape( emoticonCode ); - - // Update regexp pattern - if( emoticonRegExp_.isEmpty() ) - { - emoticonRegExp_ = QRegExp( escapedCode ); - } - else - { - emoticonRegExp_ = QRegExp( emoticonRegExp_.pattern() + "|" + escapedCode ); - } - - - // Update pending regexp pattern. - pendingRegExp_ = QRegExp(pendingRegExp_.pattern().remove( QRegExp("(^|\\|)" + escapedCode) )); - -#ifdef KMESSTEST - ASSERT( emoticonRegExp_.isValid() ); - ASSERT( pendingRegExp_.isValid() ); -#endif - - - // Get the image dimensions from the file - int originalWidth = emoticonData.width(); - int originalHeight = emoticonData.height(); - - // Resize the displayed image to match KMess' maximum emoticon size - int width = originalWidth; // QMIN( EMOTICONS_MAX_SIZE, originalWidth ); // Require only a max height - int height = QMIN( EMOTICONS_MAX_SIZE, originalHeight ); - - if( originalWidth > originalHeight ) - { - height = ( width * originalHeight ) / originalWidth; - } - else - { - width = ( height * originalWidth ) / originalHeight; - } - - // Add replacement. - QString replacement = "" + emoticonCode
-                      + ""; - customEmoticons_.insert(emoticonCode, replacement); -} - - - -// Register the contact as participant in the chat session -void ContactBase::addSwitchboardConnection( const MsnSwitchboardConnection *connection ) -{ -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::addSwitchboardConnection() - adding connection to list." << endl; -#endif - - if( chatSessions_.contains(connection) ) - { - kdWarning() << "ContactBase::addSwitchboardConnection: chat session is already added." << endl; - return; - } - - chatSessions_.append( connection ); -} - - - -// Initialize an application list for the contact. -ApplicationList * ContactBase::createApplicationList() -{ - if( applicationList_ != 0 ) - { - kdWarning() << "ContactBase::createApplicationList: application list already created for contact '" << handle_ << "'." << endl; - } - else - { - applicationList_ = new ApplicationList( handle_ ); - - connect( applicationList_, SIGNAL( applicationsAborted(const QString &) ), - this, SLOT ( slotApplicationListAborted() ) ); - } - - return applicationList_; -} - - - -// Return the application list of the contact -ApplicationList * ContactBase::getApplicationList() const -{ - return applicationList_; -} - - - -// The capabilities of the client -uint ContactBase::getCapabilities() const -{ - return capabilities_; -} - - - -// Return the default contact picture path -QString ContactBase::getContactDefaultPicturePath() const -{ - KStandardDirs *dirs = KGlobal::dirs(); - return dirs->findResource( "data", "kmess/pics/unknown.png" ); -} - - - -// Return the custom emoticon code for an msn object -const QString & ContactBase::getEmoticonCode(const QString &msnObjectDataHash) const -{ - return pendingEmoticons_[msnObjectDataHash]; -} - - - -// Return the custom emoticon search pattern. -const QRegExp & ContactBase::getEmoticonPattern() const -{ - return emoticonRegExp_; -} - - - -// Return the custom emoticon replacements. -const QMap& ContactBase::getEmoticonReplacements() const -{ - return customEmoticons_; -} - - - -// Return the contact's friendly name -QString ContactBase::getFriendlyName() const -{ - return friendlyName_; -} - - - -// Return the contact's handle -QString ContactBase::getHandle() const -{ - return handle_; -} - - - -// Return the search pattern for pending custom emoticons. -const QRegExp & ContactBase::getPendingEmoticonPattern() const -{ - return pendingRegExp_; -} - - - -// Return the list of switchboard connections -const QPtrList ContactBase::getSwitchboardConnections() const -{ - return chatSessions_; -} - - - -// Returns whether the contact has an application list initialized. -bool ContactBase::hasApplicationList() const -{ - return (applicationList_ != 0); -} - - - -// Returns whether the contact's client supports the given MSNP2P version -bool ContactBase::hasP2PSupport( MsnClientCapabilities minimalVersion ) const -{ -#ifdef KMESSTEST - ASSERT( minimalVersion != 0 && (minimalVersion & 0x0fffffff) == 0 ); // don't pass some other capability. -#endif - - return capabilities_ >= (uint) minimalVersion; -} - - - -// Return true if the contact is offline -bool ContactBase::isOffline() const -{ - return getStatus() == "FLN"; -} - - - -// Return true if the contact is online -bool ContactBase::isOnline() const -{ - return getStatus() != "FLN"; -} - - - -// Unregister the contact as participant, contact has left the chat. -void ContactBase::removeSwitchboardConnection( const MsnSwitchboardConnection *connection, bool userInitiated ) -{ -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::removeSwitchboardConnection() - removing connection, userInitiated=" << userInitiated << endl; -#endif - - bool found = chatSessions_.remove( connection ); - if( ! found ) - { - kdWarning() << "ContactBase::removeChatSession: chat session not found." << endl; - } - - if( chatSessions_.isEmpty() ) - { -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::removeSwitchboardConnection() - " << handle_ << " is no longer in any other chat conversation, cleaning up." << endl; -#endif - - // Inform the ApplicationList if we have one. - // It's possible some sessions need to be terminated now. - if( applicationList_ != 0 ) - { - bool hasAbortingApps = applicationList_->contactLeftChat( userInitiated ); - - // If there aren't any applications aborting, the object can be deleted now. - // Also avoid deleting the object if there is still a direct connection. - // It's possible a switchboard is replaced with another one (with WLM -> background chat -> normal chat). - // Note the object could be destroyed from slotApplicationListAborted() too. - if( ! hasAbortingApps && applicationList_ != 0 && ! applicationList_->hasAuthorizedDirectConnection() ) - { -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::removeSwitchboardConnection() - no applications to abort, deleting ApplicationList object." << endl; -#endif - - delete applicationList_; - applicationList_ = 0; - } - } - - // This will be used by CurrentAccount to clean up temporary InvitedContact objects. - emit leftAllChats( this ); - } -} - - - -// Set the client capabilities -void ContactBase::setCapabilities(uint capabilities) -{ - capabilities_ = capabilities; -} - - -// The application list completed aborting it's applications. -void ContactBase::slotApplicationListAborted() -{ - // Avoid killing an object if it was filled with new entries again - if( ! applicationList_->isEmpty() || applicationList_->hasAuthorizedDirectConnection() ) - { -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::slotApplicationListAborted() - requested abortion completed, but ApplicationList object has object references: not deleting object." << endl; -#endif - return; - } - -#ifdef KMESSDEBUG_CONTACTBASE - kdDebug() << "ContactBase::slotApplicationListAborted() - requested abortion completed, deleting ApplicationList object." << endl; -#endif - - - // Use deleteLater() because this is called from the signal loop. - applicationList_->deleteLater(); - applicationList_ = 0; -} - - - -#include "contactbase.moc" diff --git a/kmess/contact/contactdrag.cpp b/kmess/contact/contactdrag.cpp deleted file mode 100644 index 8c00cb8..0000000 --- a/kmess/contact/contactdrag.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/*************************************************************************** - contactdrag.cpp - description - ------------------- - begin : Sat 22 Mar 2003 - copyright : (C) 2003 by Michael Curtis. - email : mdcurtis@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "contactdrag.h" - -#include -#include - -#include - -// the constructor -ContactDragObject::ContactDragObject( QWidget *dragSource, const char * name ) - : QDragObject( dragSource, name ) -{ - KStandardDirs *dirs = KGlobal::dirs(); - QPixmap pixmap; - QString path; - - path = dirs->findResource( "data", "kmess/pics/online.png" ); - pixmap.load( path ); - - setPixmap( pixmap ); -} - - - -// the destructor -ContactDragObject::~ContactDragObject() -{ -} - - - -// return the mimetype provided by its index number -const char * ContactDragObject::format( int index ) const -{ - if ( index == 0) - { - return ContactDragInfo::mimeType; - } - - return 0; -} - - - -// return a boolean value indicating whether we can return this mimetype -bool ContactDragObject::provides( const char * mimeType ) const -{ - if ( strcmp( mimeType, ContactDragInfo::mimeType) == 0 ) - { - return true; - } - - return false; -} - - - -// decodes the mime data in the format given -QByteArray ContactDragObject::encodedData ( const char * /*mimeType*/ ) const -{ - QByteArray byte; - - return byte; -} diff --git a/kmess/contact/contactdrag.h b/kmess/contact/contactdrag.h deleted file mode 100644 index 87fa59a..0000000 --- a/kmess/contact/contactdrag.h +++ /dev/null @@ -1,50 +0,0 @@ -/*************************************************************************** - contactdrag.cpp - description - ------------------- - begin : Sat 22 Mar 2003 - copyright : (C) 2003 by Michael Curtis. - email : mdcurtis@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 CONTACTDRAG_H -#define CONTACTDRAG_H - -#include - -namespace ContactDragInfo -{ - const char mimeType[] = "application/x-kmess-contact"; -} - - -/** - * @brief Currently unused. - * - * @ingroup Contact - */ -class ContactDragObject : public QDragObject -{ - public: - // the constructor - ContactDragObject( QWidget *dragSource = 0, const char * name = 0 ); - // the destructor - ~ContactDragObject(); - - // return the mimetype provided by its index number - const char * format ( int index = 0 ) const; - // return a boolean value indicating whether we can return this mimetype - bool provides ( const char * mimeType ) const; - // decodes the mime data in the format given - QByteArray encodedData ( const char * mimeType ) const; -}; - -#endif diff --git a/kmess/contact/contactextension.cpp b/kmess/contact/contactextension.cpp deleted file mode 100644 index 50dfc15..0000000 --- a/kmess/contact/contactextension.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/*************************************************************************** - contactextension.cpp - description - ------------------- - begin : Fri 13 Dec 2002 - copyright : (C) 2003 by Michael Curtis. - email : mdcurtis@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "contactextension.h" - -#include -#include - -#include -#include -#include - -#include "contact.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" - - -// The constructor with specified contact handle -ContactExtension::ContactExtension(QString handle ) - : QObject(), - alternativeName_(""), - clientName_(""), - handle_(handle), - notifyOnline_(true), - pictureFile_(""), - soundFile_(""), - useAlternativeName_(false) -{ - // Automatically try to read properties we've saved. - readProperties( kapp->config() ); -} - - -// The destructor -ContactExtension::~ContactExtension() -{ - -} - - - -// Read property of QString alternativeName_. -const QString & ContactExtension::getAlternativeName() const -{ - return alternativeName_; -} - - - -// Read property of QString PictureFile_. -const QString ContactExtension::getContactPicturePath() const -{ - if(QFile::exists(pictureFile_)) - { - return pictureFile_; - } - else - { - return QString::null; - } -} - - - -// Read property of QString SoundFile_. -const QString ContactExtension::getContactSoundPath() const -{ - if(QFile::exists(soundFile_)) - { - return soundFile_; - } - else - { - return QString::null; - } -} - - - -// Read property of QString clientName_ -const QString ContactExtension::getClientName() const -{ - return clientName_; -} - - - -// Read property of bool notifyOnline_ -bool ContactExtension::getNotifyOnline() const -{ - return notifyOnline_; -} - - - -// Read property of bool useAlternativeName_. -bool ContactExtension::getUseAlternativeName() const -{ - return useAlternativeName_; -} - - - -// Load extension settings for a contact -void ContactExtension::readProperties( KConfig *config ) -{ - QString groupName; - - // Do not read properties when it's a temporary login account - // because these properties simply shouldn't be there. - if( CurrentAccount::instance()->isGuestAccount() ) - { - return; - } - - groupName = "Contact_" + CurrentAccount::instance()->getHandle() + "/" + handle_; - -#ifdef KMESSDEBUG_CONTACTEXTENSION - kdDebug() << "COE - loadContact - finding group " << groupName << endl; -#endif - - if ( config->hasGroup( groupName ) == true ) - { -#ifdef KMESSDEBUG_CONTACTEXTENSION - kdDebug() << "COE - group exists" << endl; -#endif - config->setGroup( groupName ); - - // When changing any of those default values, also change the saving condition - // in saveProperties() ! - alternativeName_ = config->readEntry("alternativeName", ""); - // We use the accessor function here because it handles the update, if required - setUseAlternativeName ( config->readBoolEntry("useAlternativeName", false) ); - - clientName_ = config->readEntry("clientName", ""); - - notifyOnline_ = config->readBoolEntry("notifyOnline", true); - - pictureFile_ = config->readEntry("pictureFile", ""); - soundFile_ = config->readEntry("soundFile", ""); - } -} - - - -// Save extension settings for a contact -void ContactExtension::saveProperties(KConfig *config) -{ - if( CurrentAccount::instance()->isGuestAccount() ) - { -#ifdef KMESSDEBUG_CONTACTEXTENSION - kdWarning() << "ContactExtension::saveProperties() - This is a guest account, skipping save." << endl; -#endif - return; - } - - QString groupName = "Contact_" + CurrentAccount::instance()->getHandle() + "/" + handle_; - - // If no info have been changed, don't bother writing anything, and better, delete the entry - // (which is wasted space) - if( notifyOnline_ - && ! useAlternativeName_ - && alternativeName_ == "" - && clientName_ == "" - && pictureFile_ == "" - && soundFile_ == "" ) - { -#ifdef KMESSDEBUG_CONTACTEXTENSION - if( config->hasGroup( groupName ) ) - { - kdDebug() << "ContactExtension::saveProperties() - Deleting unused contact info: " << handle_ << endl; - } - else - { - kdDebug() << "ContactExtension::saveProperties() - Not creating unused contact info: " << handle_ << endl; - } -#endif - config->deleteGroup( groupName, true ); - return; - } - -#ifdef KMESSDEBUG_CONTACTEXTENSION - kdDebug() << "ContactExtension::saveProperties() - Saving contact info: " << handle_ << endl; -#endif - - config->setGroup( groupName ); - - config->writeEntry( "useAlternativeName", useAlternativeName_ ); - config->writeEntry( "alternativeName", alternativeName_ ); - config->writeEntry( "clientName", clientName_ ); - config->writeEntry( "notifyOnline", notifyOnline_ ); - config->writeEntry( "pictureFile", pictureFile_ ); - config->writeEntry( "soundFile", soundFile_ ); -} - - - -// Write property of QString alternativeName_. -void ContactExtension::setAlternativeName( const QString& _newVal ) -{ - if ( _newVal != "" ) - { - alternativeName_ = _newVal; - - if (getUseAlternativeName() == true) emit changedFriendlyName(); - } -} - - - -// Write property of QString clientName_ -void ContactExtension::setClientName( const QString& _newVal ) -{ - clientName_ = _newVal; -} - - - -// Write property of QString pictureFile_. -void ContactExtension::setContactPicturePath( const QString & _newVal) -{ - pictureFile_ = _newVal; - emit changedPicture(); -} - - - -// Write property of QString soundFile_. -void ContactExtension::setContactSoundPath( const QString & _newVal) -{ - soundFile_ = _newVal; -} - - - -// Write propety of bool notifyOnline_ -void ContactExtension::setNotifyOnline( bool _newVal ) -{ - notifyOnline_ = _newVal; -} - - - -// Write property of bool useAlternativeName_ -void ContactExtension::setUseAlternativeName( bool _newVal) -{ - bool needUpdate; - - needUpdate = ( useAlternativeName_ != _newVal); - - useAlternativeName_ = _newVal; - - if ( needUpdate == true ) emit changedFriendlyName(); -} - - - -#include "contactextension.moc" diff --git a/kmess/contact/contactlist.cpp b/kmess/contact/contactlist.cpp deleted file mode 100644 index f1807f7..0000000 --- a/kmess/contact/contactlist.cpp +++ /dev/null @@ -1,588 +0,0 @@ -/*************************************************************************** - contactlist.cpp - description - ------------------- - begin : Sun Jan 5 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - 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 "contactlist.h" - -#include - -#include -#include -#include - -#include "contact.h" -#include "contactextension.h" -#include "group.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" -#include "../specialgroups.h" -#include "../msnobject.h" - -#ifdef KMESSDEBUG_CONTACTLIST - #define KMESSDEBUG_CONTACTLIST_GENERAL - #define KMESSDEBUG_CONTACTLIST_TOOLTIP - #define KMESSDEBUG_CONTACTLIST_DISCONNECTION -#endif - - - -// The constructor -ContactList::ContactList() -{ -#ifdef KMESSTEST - ASSERT( contacts_.count() == 0 ); - ASSERT( groups_.count() == 0 ); -#endif -} - - - -// The destructor -ContactList::~ContactList() -{ - Group *group; - - // Delete all contacts - QDictIterator contactIt( contacts_ ); - while( contactIt.current() != 0 ) - { - delete contactIt.current(); - ++contactIt; - } - contacts_.clear(); - - // Delete all groups - for ( group = groups_.first(); group; group = groups_.next() ) - { - delete group; - } - groups_.clear(); - -#ifdef KMESSTEST - ASSERT( contacts_.count() == 0 ); - ASSERT( groups_.count() == 0 ); -#endif - -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "DESTROYED ContactList " << endl; -#endif -} - - - -// Add a contact to the contact list -Contact * ContactList::addContact( QString handle, QString friendlyName, int lists, QStringList groupIds, QString guid ) -{ -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "ContactList::addContact " << handle << endl; -#endif -#ifdef KMESSTEST - ASSERT( ! handle.isEmpty() ); -#endif - - if(getContactByHandle(handle) != 0) - { - kdDebug () << "ContactList::addContact - WARNING - attempted to add contact " << handle << " twice." << endl; - return 0; - } - - Contact *contact; - - if(handle.isEmpty()) - { - return 0; - } - - // Create the contact - contact = new Contact( handle, friendlyName, lists, groupIds, guid ); - contacts_.insert( handle, contact ); - - - // Attach the signals - connect( contact, SIGNAL( changedMsnObject(Contact*) ), // Contact changed msnobject. - this, SLOT ( slotForwardContactChangedMsnObject(Contact*) )); - connect( contact, SIGNAL( contactOffline(Contact*,bool) ), // Contact went offline - this, SLOT ( slotForwardContactOffline(Contact*,bool) )); - connect( contact, SIGNAL( contactOnline(Contact*,bool) ), // Contact went online - this, SLOT ( slotForwardContactOnline(Contact*,bool) )); - connect( contact, SIGNAL( changedGroup(Contact*) ), // Contact moved - this, SLOT ( slotForwardContactMoved(Contact*) )); - connect( contact, SIGNAL( changedList(Contact*) ), // Contact was added/removed from certain lists - this, SLOT ( slotForwardContactMoved(Contact*) )); - - // HACK: It would be nicer if the GUI desided whether a contact-item should be moved if it's lists changed. - // Currently these signal connection of changedList() assumes the GUI uses "groups to sort various lists". - - // Signal the UI - emit contactAdded(contact); - - return contact; -} - - - -// Add a group to the contact list -Group * ContactList::addGroup( QString groupId, QString groupName ) -{ -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "ContactList::addGroup " << groupId << " " << groupName << endl; -#endif - - Group *group; - - // Check if the group already exists - if ( groupExists( groupId ) ) - { - kdDebug() << "ContactList - addGroup - Group " << groupId << " already exists." << endl; - return 0; - } - - // Create the group - group = new Group( groupId, groupName ); - groups_.append( group ); - - // Signal the UI - emit groupAdded(group); - - return group; -} - - - -// Change a contact's status (and update the friendly name) -void ContactList::changeContactStatus( QString handle, QString friendlyName, QString status, - uint capabilities, QString msnObject, bool showBaloon ) -{ - // Get the contact - Contact *contact; - bool wasOnline; - QString oldStatus; - - contact = getContactByHandle( handle ); - if ( contact == 0 ) - { - kdDebug() << "ContactList - changeContactStatus - Couldn't find contact " << handle << " in the contact list." << endl; - return; - } - - // Store the old online state to detect a change - wasOnline = contact->isOnline(); - oldStatus = contact->getStatus(); - - // Update the settings - contact->setFriendlyName( friendlyName ); - contact->setStatus( status, showBaloon ); - contact->setCapabilities( capabilities ); - contact->loadMsnObject( msnObject ); - - if( wasOnline && oldStatus != status ) - { - emit contactChangeStatus( contact, showBaloon ); - } -} - - - -// Return whether or not the contact with the given handle exists -bool ContactList::contactExists( QString handle ) -{ - return getContactByHandle( handle ) != 0; -} - - - -// Delete all the contacts -void ContactList::deleteAllContacts() -{ -#ifdef KMESSDEBUG_CONTACTLIST_DISCONNECTION - kdDebug() << "ContactList - Deleting all contacts." << endl; -#endif - - // Delete all contacts - QDictIterator it( contacts_ ); - while( it.current() != 0 ) - { - delete it.current(); - ++it; - } - contacts_.clear(); -} - - - -// Delete all non-special groups -void ContactList::deleteNonSpecialGroups() -{ - Group *group; - QString id; - QPtrList groupsToDelete; - -#ifdef KMESSDEBUG_CONTACTLIST_DISCONNECTION - kdDebug() << "ContactList - Deleting non-special groups." << endl; -#endif - - // Delete all groups - for ( group = groups_.first(); group; group = groups_.next() ) - { - id = group->getId(); - if ( ( id != SpecialGroups::ONLINE ) - && ( id != SpecialGroups::OFFLINE ) - && ( id != SpecialGroups::ALLOWED ) - && ( id != SpecialGroups::REMOVED ) ) -// && ( id != SpecialGroups::INDIVIDUALS ) ) // Also not added persistently, so I don't keep it either. - { - groupsToDelete.append( group ); - } - } - - // Remove the groups to delete from the groups - for ( group = groupsToDelete.first(); group; group = groupsToDelete.next() ) - { - groups_.remove( group ); - emit groupRemoved( group ); - delete group; - } - -#ifdef KMESSTEST - ASSERT( groups_.count() == 4 ); -#endif -} - - - -// Return the contact with the given guid -Contact* ContactList::getContactByGuid( QString guid ) const -{ - // No need to optimize, only called for ADC en REM now. - QDictIterator iterator(contacts_); - Contact *contact; - - while(iterator.current() != 0) - { - contact = iterator.current(); - if(contact->getGuid() == guid) - { - return contact; - } - ++iterator; - } - - return 0; -} - - - -// Return the contact with the given handle -Contact* ContactList::getContactByHandle( QString handle ) const -{ - // Optimized with hashing because it's called a lot - return contacts_[handle]; -} - - - -// Return the list of contacts -const QDict& ContactList::getContactList() const -{ - return contacts_; -} - - - -// Return the group with the given id -Group* ContactList::getGroupById( QString groupId ) const -{ -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "ContactList::getGroupById(" << groupId << ")" << endl; -#endif - - QPtrListIterator iterator(groups_); - Group *group; - - while(iterator.current() != 0) - { - group = iterator.current(); - if ( group->getId() == groupId ) - { - return group; - } - ++iterator; - } - - return 0; -} - - - -// Return the group with the given sort position -Group* ContactList::getGroupBySortPosition(int sortPosition) const -{ - QPtrListIterator iterator(groups_); - Group *group; - - while(iterator.current() != 0) - { - group = iterator.current(); - if ( group->getSortPosition() == sortPosition ) - { - return group; - } - ++iterator; - } - - return 0; -} - - - -// Return the list of groups -const QPtrList& ContactList::getGroupList() const -{ - return groups_; -} - - - -// Return whether or not a group with the given id exists -bool ContactList::groupExists( QString groupId ) -{ - return getGroupById( groupId ) != 0; -} - - - -// Forward from a contact that it's msn object changed -void ContactList::slotForwardContactChangedMsnObject(Contact *contact) -{ - emit contactChangedMsnObject( contact ); -} - - - -// Forward from a contact that is has moved -void ContactList::slotForwardContactMoved(Contact *contact) -{ - emit contactMoved(contact); -} - - - -// Forward from a contact that it is offline -void ContactList::slotForwardContactOffline(Contact *contact, bool showBaloon) -{ -#ifdef KMESSTEST - ASSERT( contact != 0 ); -#endif - -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - if ( contact != 0 ) - { - kdDebug() << "ContactList - Forwarding that " << contact->getHandle() << " went offline." << endl; - } -#endif - - emit contactOffline( contact, showBaloon ); -} - - - -// Forward from a contact that it is online -void ContactList::slotForwardContactOnline(Contact *contact, bool showBaloon) -{ -#ifdef KMESSTEST - ASSERT( contact != 0 ); -#endif - -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - if ( contact != 0 ) - { - kdDebug() << "ContactList - Forwarding that " << contact->getHandle() << " went online." << endl; - } -#endif - - emit contactOnline( contact, showBaloon ); -} - - - -// Read in account and other properties -void ContactList::readProperties(KConfig */*config*/) -{ -} - - - -// Remove a group -void ContactList::removeGroup( QString groupId ) -{ - Group *group; - - group = getGroupById( groupId ); - if ( group == 0 ) - { - kdDebug() << "ContactList - removeGroup - Group " << groupId << " doesn't exist in the contact list." << endl; - return; - } - - // Remove the group - groups_.remove(group); - emit groupRemoved(group); // Signal the UI - - delete group; -} - - - -// Change a contact's name -void ContactList::renameContact( QString handle, QString newName ) -{ - Contact *contact; - - contact = getContactByHandle( handle ); - if ( contact == 0 ) - { - kdDebug() << "ContactList - renameContact - Couldn't find contact " << handle << " in the contact list." << endl; - return; - } - - contact->setFriendlyName( newName ); -} - - - -// Change a group's name -void ContactList::renameGroup( QString groupId, QString groupName ) -{ - Group *group = getGroupById( groupId ); - if( group == 0 ) - { - kdWarning() << "ContactList::renameGroup: Group '" << groupId << "' " - << "not found in the contact list." << endl; - return; - } - - group->setName( groupName ); -} - - -// Restore the orginal state of the contact list (empty it) -void ContactList::reset() -{ - deleteAllContacts(); - deleteNonSpecialGroups(); -} - - -// Save group properties -void ContactList::saveProperties(KConfig *config) -{ -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "ContactList::saveProperties() - Saving groups and contacts info..." << endl; -#endif - if( CurrentAccount::instance()->isGuestAccount() ) - { - kdWarning() << "ContactList::saveProperties() - This is a guest account, skipping save." << endl; - } - - // Check if there already are some groups to save (we didn't receive them from the server yet) - if( groups_.count() > 0 ) - { - Group *group; - - // Save all groups - for ( group = groups_.first(); group; group = groups_.next() ) - { -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "ContactList::saveProperties() - Saving group info: " << group->getName() << endl; -#endif - - group->saveProperties( config ); - } - } -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - else - { - kdDebug() << "ContactList::saveProperties() - No groups to save." << endl; - } -#endif - - // If there are no contacts there's nothing left to do (same as above) - if( contacts_.count() > 0 ) - { - // Before saving the contact extensions data, delete any value about contacts which aren't in list anymore - QString groupsName = "Contact_" + CurrentAccount::instance()->getHandle() + "/"; - QStringList pendingRemoval = config->groupList().grep( groupsName ); - - // Save contact extensions - QDictIterator it( contacts_ ); - while( it.current() != 0 ) - { - #ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "ContactList::saveProperties() - Saving contact info: " << it.current()->getHandle() << endl; - #endif - pendingRemoval.remove( groupsName + it.current()->getHandle() ); - it.current()->getExtension()->saveProperties( config ); - ++it; - } - - // Delete the remaining contacts info, which at this point are only old contacts not in list anymore - QFile picture; - QStringList::Iterator rit = pendingRemoval.begin(); - for ( ; rit != pendingRemoval.end(); ++rit ) - { - #ifdef KMESSDEBUG_CONTACTLIST_GENERAL - kdDebug() << "ContactList::saveProperties() - Deleting unused contact info: " << *rit << endl; - #endif - config->setGroup( *rit ); - picture.setName( config->readEntry( "pictureFile", "" ) ); - if( picture.exists() ) - { - picture.remove(); - } - config->deleteGroup( *rit, true ); - } - } -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - else - { - kdDebug() << "ContactList::saveProperties() - No contacts to save." << endl; - } -#endif - - // Write the data now! - config->sync(); - -} - - - -// Set a contact to offline -void ContactList::setContactOffline( QString handle ) -{ - Contact *contact; - - contact = getContactByHandle( handle ); - if ( contact == 0 ) - { - kdDebug() << "ContactList - contactOffline - Couldn't find contact " << handle << " in the contact list." << endl; - return; - } - - contact->setStatus( "FLN" ); -} - -#include "contactlist.moc" diff --git a/kmess/contact/contactlist.h b/kmess/contact/contactlist.h deleted file mode 100644 index c29cb68..0000000 --- a/kmess/contact/contactlist.h +++ /dev/null @@ -1,145 +0,0 @@ -/*************************************************************************** - contactlist.h - description - ------------------- - begin : Sun Jan 5 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - 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 CONTACTLIST_H -#define CONTACTLIST_H - -#include -#include -#include - -// Forward declarations -class Contact; -class CurrentAccount; -class Group; -class KConfig; -class KMessTest; - - -/** - * @brief Data class for the contact list. - * - * This class stores the state of the current contact list, it does not update the server. - * The MsnNotificationConnection class sends update requests to the server. - * When the server acknowledges the change, it will be updated here. - * The user interface classes repond to the signals of this class to update their view. - * - * The instance of this class is shared between the MsnNotificationConnection class, - * and re-used when the user connects with a different account. - * After the MsnNotificationConnection class is initialized, a pointer - * to the ContactList is set in the CurrentAccount class too. - * The CurrentAccount class is only used to provide access to the current contact list, - * the administration of the contacts is still done through the MsnNotificationConnection class, - * - * @author Mike K. Bennett - * @ingroup Contact - */ -class ContactList : public QObject -{ - Q_OBJECT - - friend class KMessTest; - - public: // Public methods - // The constructor - ContactList(); - // The destructor - ~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, QString friendlyName, QString status, - uint capabilities = 0, QString msnObject = 0, bool showBaloon = true ); - // Return the contact with the given guid - Contact* getContactByGuid( QString guid ) const; - // Return the contact with the given handle - Contact* getContactByHandle( QString handle ) const; - // Return the list of contacts - const QDict& getContactList() const; - // Return the group with the given id - Group* getGroupById( QString groupId ) const; - // Return the group with the given sort position - Group* getGroupBySortPosition(int sortPosition) const; - // Return the list of groups - const QPtrList& getGroupList() const; - // Read in account and other properties - void readProperties(KConfig *config); - // 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(); - // Save account and other properties - void saveProperties(KConfig *config); - // Set a contact to offline - void setContactOffline( QString handle ); - - private: // Private methods - // Return whether or not the contact with the given handle exists - bool contactExists( QString handle ); - // Delete all the contacts - void deleteAllContacts(); - // Delete all non-special groups - void deleteNonSpecialGroups(); - // Return whether or not a group with the given id exists - bool groupExists( QString groupId ); - - private slots: // Private slots - // Forward from a contact that it's msn object changed - void slotForwardContactChangedMsnObject(Contact *contact); - // Forward from a contact that is has moved - void slotForwardContactMoved(Contact *contact); - // Forward from a contact that it is offline - void slotForwardContactOffline(Contact *contact, bool showBaloon); - // Forward from a contact that it is contact is online - void slotForwardContactOnline(Contact *contact, bool showBaloon); - - - private: // Private attributes - // The list of contacts - QDict contacts_; - // The list of groups - QPtrList groups_; - - signals: // Signals - // Signal that a contact has been added. - void contactAdded(Contact *contact); - // Signal that a contact changed it's status. - void contactChangeStatus( Contact *contact, bool showBaloon ); - // Signal that a contact changed it's msnobject. - void contactChangedMsnObject(Contact *contact); - // Signal that a contact has moved to a different position in the group list - void contactMoved( Contact *contact ); - // Signal that a contact is offline - void contactOffline( Contact *contact, bool showBaloon ); - // Signal that a contact is online - void contactOnline( Contact *contact, bool showBaloon ); - // Signal that a contact has been removed. - void contactRemoved(const Contact *contact); - // Signal that a group has been added - void groupAdded(Group *group); - // Signal that a group has been added - void groupRemoved(const Group *group); -}; - -#endif diff --git a/kmess/contactlistviewitem.cpp b/kmess/contactlistviewitem.cpp deleted file mode 100644 index 4907724..0000000 --- a/kmess/contactlistviewitem.cpp +++ /dev/null @@ -1,528 +0,0 @@ -/*************************************************************************** - contactlistviewitem.cpp - description - ------------------- - begin : Fri Mar 28 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 "contactlistviewitem.h" - -#include -#include -#include - -#include -#include -#include -#include - -#include "kmessdebug.h" -#include "currentaccount.h" -#include "contact/contact.h" -#include "emoticonmanager.h" - -#ifdef KMESSDEBUG_CONTACTLISTVIEWITEM -#define KMESSDEBUG_CONTACTLISTVIEWITEM_GENERAL -#endif - - -// The constructor -ContactListViewItem::ContactListViewItem(QListView *parent, Contact *contact) - : QObject(0, "listItem"), - KMessListViewItem( parent ), - contact_(contact), - onlineStatus_(0) -{ - // Do general construction - construct(); -} - - - -// The constructor -ContactListViewItem::ContactListViewItem(QListViewItem *parent, Contact *contact) - : QObject(0, "listItem"), - KMessListViewItem( parent ), - contact_(contact), - onlineStatus_(0) -{ - // Do general construction - construct(); -} - - - -// // Compare -// int ContactListViewItem::compare( QListViewItem *item, int col, bool asc) const -// { -// #ifdef KMESSTEST -// ASSERT( dynamic_cast(item) != 0 ); -// #endif -// -// ContactListViewItem *that; -// -// int thatType = static_cast(item) -> getType(); -// int result = 0; -// int first = 0; -// int second = 0; -// -// -// // Determine the sorting based on the object type. -// if(thatType == LISTTYPE_CONTACT) -// { -// #ifdef KMESSTEST -// ASSERT( dynamic_cast(item) != 0 ); -// #endif -// -// that = static_cast(item); -// -// QString thisId = this->identifier_.lower(); -// QString thatId = that->identifier_.lower(); -// -// first = that->onlineStatus_ - this->onlineStatus_; -// second = thisId.localeAwareCompare( thatId ); -// -// // Determine the sorting -// result = first; -// if(result == 0) result = second; -// } -// else -// { -// // Groups -// result = KMessListViewItem::compare(item, col, asc); -// } -// -// -// -// // Return the correct value for the sorting algorithm. -// if(result < 0) return -1; // "this" is smaller then "that" -// if(result > 0) return 1; // "this" is greater then "that" -// return 0; // "this" and "that" are equal. -// } - - - -// Do general construction -void ContactListViewItem::construct() -{ - emoticons_ = EmoticonManager::instance(); - - // Visibility depends on whether or not allowed and removed contacts are shown. - CurrentAccount *currentAccount = CurrentAccount::instance(); - - // Connect account signals - connect(currentAccount, SIGNAL(changedViewMode()), this, SLOT(slotUpdateVisiblity()) ); - connect(currentAccount, SIGNAL(changedDisplaySettings()), this, SLOT(slotUpdateVisiblity()) ); - - // Connect contact signals - connect(contact_, SIGNAL(changedFriendlyName()), this, SLOT(slotUpdateFriendlyName()) ); - connect(contact_, SIGNAL(changedStatus()), this, SLOT(slotUpdateStatus()) ); - connect(contact_, SIGNAL(changedList(Contact*)), this, SLOT(slotUpdateStatus()) ); - connect(contact_, SIGNAL(changedPersonalMessage(Contact*)), this, SLOT(slotUpdatePersonalStatus()) ); - connect(contact_, SIGNAL(changedPicture()), this, SLOT(slotUpdatePicture()) ); - // changedList() is not connected to slotUpdateVisibility because the "blocked" icon should also appear. - - // Call the event manually this time, to update the appearance. - slotUpdateStatus(); - slotUpdateVisiblity(); -} - - - -// Return the contact -Contact * ContactListViewItem::getContact() const -{ - return contact_; -} - - - -// Return the tooltip text. -QString ContactListViewItem::getToolTipText() const -{ - QString handle = QStyleSheet::escape(contact_->getHandle()); - QString realName = QStyleSheet::escape(contact_->getTrueFriendlyName()); - QString iconPath = contact_->getContactPicturePath(); - - QString tipText = ""; - - // Add icon - if( ! iconPath.isEmpty() ) - { - tipText += ""; - } - - // Add realname - tipText += " " + realName + ""; - - // Add status - if( ! statusIdentifier_.isEmpty() ) - { - tipText += " (" + statusIdentifier_ + ")"; - } - - // Add personal status on new line - if( ! personalStatusTip_.isEmpty() ) - { - tipText += "
" + personalStatusTip_; - } - - // Add handle on new line - tipText += "
" + handle; - - // Add client identifier - // @note If you want to add new client identifiers here's the right place - QString clientIdentifier = contact_->getExtension()->getClientName(); // Contains the client identifier with full information - if ( ! clientIdentifier.isEmpty() ) - { - QString clientName; - - if ( clientIdentifier.find("KMess") != -1 ) - { - clientName = "KMess"; - } - else if ( clientIdentifier.find("Mercury") != -1 ) - { - clientName = "Mercury"; - } - else if ( clientIdentifier.find("Kopete") != -1 ) - { - clientName = "Kopete"; - } - else if ( clientIdentifier.find("Purple") != -1 ) - { - clientName = "Pidgin"; - } - else - { - // Just report as-is if it's not been identified - clientName = clientIdentifier; - } - - tipText += "
" + i18n("Client: %1").arg(clientName); - } - - // Return - tipText += "
"; - return tipText; -} - - -// Return the type ID -int ContactListViewItem::getType() const -{ - return LISTTYPE_CONTACT; -} - - - -// Update the friendly name -void ContactListViewItem::slotUpdateFriendlyName() -{ - updateItemText(); -} - - -// Create the HTML code for the personal status message -void ContactListViewItem::slotUpdatePersonalStatus() -{ - QString newText; - QString newTextTip; // Same mesage but without emoticons in the personal status (for tooltip). - - // Personal status message - QString statusMessage = contact_->getPersonalMessage(); - QString statusMessageTip = statusMessage; - const QString &mediaType = contact_->getCurrentMediaType(); - const QString &mediaString = contact_->getCurrentMediaString(); - QString mediaEmoticon; - - if( ! statusMessage.isEmpty() - || ! mediaString.isEmpty() ) - { - // Escape HTML add emoticons, and font color - statusMessage = QStyleSheet::escape(statusMessage); - statusMessageTip = statusMessage; - emoticons_->parseEmoticons(statusMessage, true); - newText += "" + statusMessage; - newTextTip += "" + statusMessageTip; - - if( ! mediaString.isEmpty() ) - { - // Spacing for media if needed - if( ! statusMessage.isEmpty() ) - { - newText += " - "; - newTextTip += "
"; - } - - // Determine icon for special media types - if( mediaType == "Music" ) - { - mediaEmoticon = "(8)"; - } - else if( mediaType == "Gaming" ) - { - mediaEmoticon = "(xx)"; - } - - // Set the icon if it's found in the emoticon theme. - if( ! mediaEmoticon.isNull() ) - { - const QString &replacement = emoticons_->getReplacement(mediaEmoticon, true); - if( ! replacement.isNull() ) - { - newText += replacement + " "; // nbsp so it also works in the tooltip text. - newTextTip += replacement + " "; - } - } - - // Add final text, HTML escaped. - newText += QStyleSheet::escape( mediaString ); - newTextTip += QStyleSheet::escape( mediaString ); - } - - newText += "
"; - newTextTip += "
"; - } - - // Update the text with the new message - personalStatus_ = newText; - personalStatusTip_ = newTextTip; - updateItemText(); -} - - - -// Update the appearance of the contact as it's status changes -void ContactListViewItem::slotUpdateStatus() -{ - KIconLoader *loader = KGlobal::iconLoader(); - KStandardDirs *dirs = KGlobal::dirs(); - - QString msnStatus = contact_->getStatus(); - QString iconName = "online"; - QString iconPath; - - - // Update the status identifier. - if(contact_->isBlocked()) - { - // Show blocked regardless of status - statusIdentifier_ = i18n( "Blocked" ); - iconName = "blocked"; - onlineStatus_ = ( msnStatus != "FLN" ) ? 2 : 0; - } - else if(msnStatus == "AWY") - { - statusIdentifier_ = i18n( "Away" ); - iconName = "away"; - onlineStatus_ = 1; - } - else if(msnStatus == "BRB") - { - statusIdentifier_ = i18n( "Be Right Back" ); - iconName = "berightback"; - onlineStatus_ = 1; - } - else if(msnStatus == "BSY") - { - statusIdentifier_ = i18n( "Busy" ); - iconName = "busy"; - onlineStatus_ = 1; - } - else if( msnStatus == "HDN" ) // likely never found, just in case - { - statusIdentifier_ = i18n( "Invisible" ); - iconName = "offline"; - onlineStatus_ = 2; - } - else if(msnStatus == "FLN") - { - statusIdentifier_ = ""; - iconName = "offline"; - onlineStatus_ = 3; - } - else if(msnStatus == "IDL") - { - statusIdentifier_ = i18n( "Away - Idle" ); - iconName = "away"; - onlineStatus_ = 1; - } - else if(msnStatus == "LUN") - { - statusIdentifier_ = i18n( "Out to Lunch" ); - iconName = "lunch"; - onlineStatus_ = 1; - } - else if(msnStatus == "NLN") - { - statusIdentifier_ = ""; - iconName = "online"; - onlineStatus_ = 0; - } - else if(msnStatus == "PHN") - { - statusIdentifier_ = i18n( "On the Phone" ); - iconName = "onthephone"; - onlineStatus_ = 1; - } - else - { - statusIdentifier_ = ""; - onlineStatus_ = 2; - kdWarning() << "Contact - '" << msnStatus << "' is not a valid status for contact " << contact_->getHandle() << "." << endl; - } - - - // Find the path to the given icon - iconPath = dirs->findResource("data", "kmess/pics/" + iconName + ".png"); - if(iconPath.isEmpty()) - { - // Not found? Try KDE standard icons - iconPath = loader->iconPath(iconName, KIcon::Small, false); - } - - - // Update vars - iconTag_ = ""; - - - // Set the sort text - // FIXME: remove this if the "QListViewItem::compare" method works. - setKey( QString::number(onlineStatus_) + " " + contact_->getFriendlyName() ); - - // Ask parent to re-run the sorting algorithm - resortParent(); - - // Update our appearance. - updateItemText(); - - // Also update the visibility - slotUpdateVisiblity(); -} - - - -// Update the display picture of the contact -void ContactListViewItem::slotUpdatePicture() -{ - updateItemText(); -} - -// Update the visibility of the contact -void ContactListViewItem::slotUpdateVisiblity() -{ - // Visibility depends on whether or not allowed and removed contacts are shown. - CurrentAccount *currentAccount = CurrentAccount::instance(); - - if(QListViewItem::parent() == 0 && ! currentAccount->getShowContactsByGroup()) - { - // Hide root items if contacts are shown in online/offline groups. - setVisible(false); - } - else if(contact_->isOffline() && ! currentAccount->getShowOfflineContacts()) - { - // Hide if online contacts are not shown - setVisible(false); - } - else - { - if(contact_->isFriend()) - { - // Friends should always be visible - setVisible(true); - } - else if(contact_->isAllowed()) - { - // Whether or not allowed contacts are visible depends on the contact setting - setVisible( currentAccount->getShowAllowedContacts() ); - } - else - { - // Whether or not removed contacts are visible depends on the contact setting - setVisible( currentAccount->getShowRemovedContacts() ); - } - } - updateItemText(); -} - - - -// Update the item's text -void ContactListViewItem::updateItemText() -{ - QString newIdentifier; - QString friendlyName; - QString newText; - QString sortText; - QString contactPic = contact_->getContactPicturePath(); - QString picTag = ""; - - // Parse the emoticons - newIdentifier = QStyleSheet::escape( contact_->getFriendlyName() ); - emoticons_->parseEmoticons(newIdentifier, true); - - // Display the nickname in italics if the contact has deleted us from its list. - if( ! contact_->isReverse() ) - { - friendlyName = "" + newIdentifier + ""; - } - else - { - friendlyName = newIdentifier; - } - - // Build the HTML code for the Contact List visualizations - if( ! contactPic.isEmpty() && - CurrentAccount::instance()->getShowListPictures() ) - { - // new visualization (Display Pictures) - newText = picTag + " " + iconTag_ + " " + friendlyName; - - // Status identifier - if( ! statusIdentifier_.isEmpty() ) - { - newText += " (" + statusIdentifier_ + ")"; - } - - // Add personal status message (already HTML escaped) - if( ! personalStatus_.isEmpty() ) - { - newText += "
 " + personalStatus_; - } - } - else - { - // old visualization (only status icon) - newText = iconTag_ + " " + friendlyName; - - // Add personal status message (already HTML escaped) - if( ! personalStatus_.isEmpty() ) - { - // NOTE: MSN Adds a "-" as seperator here, but smaller font + color makes it cleaner. - newText += " " + personalStatus_; - } - - // Status identifier - if( ! statusIdentifier_.isEmpty() ) - { - newText += " (" + statusIdentifier_ + ")"; - } - } - - setText( newText ); -} - -#include "contactlistviewitem.moc" diff --git a/kmess/contactlistviewitem.h b/kmess/contactlistviewitem.h deleted file mode 100644 index 4fe731b..0000000 --- a/kmess/contactlistviewitem.h +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - contactlistviewitem.h - description - ------------------- - begin : Fri Mar 28 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 CONTACTLISTVIEWITEM_H -#define CONTACTLISTVIEWITEM_H - -#include "kmesslistviewitem.h" -#include - -// Forward declarations -class Contact; -class EmoticonManager; -class QString; -class QListView; -class QListViewItem; - -/** - * @brief Contact node of the contact list window. - * - * The contact list uses a Model-Viewer-Controller model. - * The Contact class signals what something has changed, this view updates itself in the slots. - * A contact may appear multiple times in the tree view, - * so multiple ContactListViewItem objects may be created for the same contact. - * - * @author Mike K. Bennett, Diederik van der Boor - * @ingroup Root - */ -class ContactListViewItem : public QObject, public KMessListViewItem -{ - Q_OBJECT - - public: - // The constructor - ContactListViewItem(QListView *parent, Contact *contact); - // The constructor - ContactListViewItem(QListViewItem *parent, Contact *contact); - // Compare -// virtual int compare( QListViewItem *item, int column, bool ascending ) const; - // Return the contact - Contact * getContact() const; - // Get whether the contact is online or not - unsigned int getOnlineStatus() const; - // Return the tooltip text. - QString getToolTipText() const; - // Return the type of the item - int getType() const; - - private: // Private methods - // Do general construction - void construct(); - // Update the item's text - void updateItemText(); - - private slots: - // Update the friendly name of the contact - void slotUpdateFriendlyName(); - // Update the friendly name of the contact - void slotUpdatePersonalStatus(); - // Update the status icon of the contact - void slotUpdateStatus(); - // Update the display picture of the contact - void slotUpdatePicture(); - // Update the visibility of the contact - void slotUpdateVisiblity(); - - private: // Private attributes - - // The contact to embed. - Contact *contact_; - // The emoticon parser - EmoticonManager *emoticons_; - // The url tag t othe contact or group's icon - QString iconTag_; - // Whether the contact is online or offline - unsigned int onlineStatus_; - // The personal status message - QString personalStatus_; - // The personal status message without emoticons - QString personalStatusTip_; - // The contact or group's status identifier - QString statusIdentifier_; -}; - -#endif diff --git a/kmess/crypt/.cvsignore b/kmess/crypt/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/crypt/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/crypt/Makefile.am b/kmess/crypt/Makefile.am deleted file mode 100644 index 6d33e0d..0000000 --- a/kmess/crypt/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -noinst_LIBRARIES = libmsncrypt.a - -INCLUDES = $(all_includes) - -libmsncrypt_a_SOURCES = sha1.cpp - -EXTRA_DIST = sha1.cpp sha1.h globalstuff.h bithelp.h - diff --git a/kmess/crypt/Makefile.in b/kmess/crypt/Makefile.in deleted file mode 100644 index 22a9504..0000000 --- a/kmess/crypt/Makefile.in +++ /dev/null @@ -1,695 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -SOURCES = $(libmsncrypt_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/crypt -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libmsncrypt_a_AR = $(AR) $(ARFLAGS) -libmsncrypt_a_LIBADD = -am_libmsncrypt_a_OBJECTS = sha1.$(OBJEXT) -#>- libmsncrypt_a_OBJECTS = $(am_libmsncrypt_a_OBJECTS) -#>+ 1 -libmsncrypt_a_OBJECTS = sha1.$(OBJEXT) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/sha1.Po -#>+ 1 -@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/sha1.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libmsncrypt_a_SOURCES) -DIST_SOURCES = $(libmsncrypt_a_SOURCES) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -noinst_LIBRARIES = libmsncrypt.a -INCLUDES = $(all_includes) -libmsncrypt_a_SOURCES = sha1.cpp -EXTRA_DIST = sha1.cpp sha1.h globalstuff.h bithelp.h -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/crypt/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/crypt/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/crypt/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/crypt/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/crypt/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libmsncrypt.a: $(libmsncrypt_a_OBJECTS) $(libmsncrypt_a_DEPENDENCIES) - -rm -f libmsncrypt.a - $(libmsncrypt_a_AR) libmsncrypt.a $(libmsncrypt_a_OBJECTS) $(libmsncrypt_a_LIBADD) - $(RANLIB) libmsncrypt.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-bcheck clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/crypt/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/crypt/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/crypt/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/crypt/bithelp.h b/kmess/crypt/bithelp.h deleted file mode 100644 index 6360b35..0000000 --- a/kmess/crypt/bithelp.h +++ /dev/null @@ -1,55 +0,0 @@ -/* bithelp.h - Some bit manipulation helpers - * Copyright (C) 1999, 2002 Free Software Foundation, Inc. - * - * This file is part of Libgcrypt. - * - * Libgcrypt is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser general Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * Libgcrypt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#ifndef G10_BITHELP_H -#define G10_BITHELP_H - -#include - -/**************** - * Rotate the 32 bit unsigned integer X by N bits left/right - */ -#if defined(__GNUC__) && defined(__i386__) -static inline uint32_t -rol(uint32_t x, int n) -{ - __asm__("roll %%cl,%0" - :"=r" (x) - :"0" (x),"c" (n)); - return x; -} -#else -#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) -#endif - -#if defined(__GNUC__) && defined(__i386__) -static inline uint32_t -ror(uint32_t x, int n) -{ - __asm__("rorl %%cl,%0" - :"=r" (x) - :"0" (x),"c" (n)); - return x; -} -#else -#define ror(x,n) ( ((x) >> (n)) | ((x) << (32-(n))) ) -#endif - - -#endif /*G10_BITHELP_H*/ diff --git a/kmess/crypt/globalstuff.h b/kmess/crypt/globalstuff.h deleted file mode 100644 index 0e221d8..0000000 --- a/kmess/crypt/globalstuff.h +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************** - * * - * copyright (C) 2003, 2004 by Michael Buesch * - * email: mbuesch@freenet.de * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2 * - * as published by the Free Software Foundation. * - * * - ***************************************************************************/ - -/** here is some useful stuff used globaly */ - -#ifndef GLOBALSTUFF_H -#define GLOBALSTUFF_H - -#include "config.h" - -#include -#include -#include - -/** convert something to string using ostringstream */ -template inline -std::string tostr(const T &t) -{ - std::ostringstream s; - s << t; - return s.str(); -} - -/** convert a char (array) to hex notation and return it as string. */ -extern std::string charToHex(const char *buf, unsigned int len); -/** calculate the buffer-size for reading - * if the "struct stat" of the file is given - */ -extern unsigned int calcBufSize(struct stat file_stat); - -typedef uint8_t byte; - -#ifdef CONFIG_DEBUG -# define CALCCHECKSUM_DEBUG -#else -# undef CALCCHECKSUM_DEBUG -#endif - -/** define likely() and unlikely() */ -#if !defined(__GNUC__) || !defined(__GNUC_MINOR__) \ - || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) -# define __builtin_expect(x, expected_value) (x) -#endif -#define likely(x) __builtin_expect((x),1) -#define unlikely(x) __builtin_expect((x),0) - -/** delete the memory and NULL the pointer */ -#define delete_and_null(x) do { \ - delete (x); \ - (x) = 0; \ - } while (0) -/** delete the memory if the pointer isn't a NULL pointer */ -#define delete_ifnot_null(x) do { \ - if (x) \ - delete_and_null(x); \ - } while (0) - -#define delete_and_null_array(x) do { \ - delete [] (x); \ - (x) = 0; \ - } while (0) - -#define delete_ifnot_null_array(x) do { \ - if (x) \ - delete_and_null_array(x); \ - } while (0) - -/** return the number of elements in an array */ -#define array_size(x) (sizeof(x) / sizeof((x)[0])) - -#endif // GLOBALSTUFF_H diff --git a/kmess/crypt/sha1.cpp b/kmess/crypt/sha1.cpp deleted file mode 100644 index 1d33a50..0000000 --- a/kmess/crypt/sha1.cpp +++ /dev/null @@ -1,339 +0,0 @@ -/* sha1.c - SHA1 hash function - * Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc. - * - * This file is part of Libgcrypt. - * - * Libgcrypt is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * Libgcrypt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -/* (C) 2002, 2003, 2004 Michael Buesch : - * Modified/deleted/added some functions. - * 2004 further modifications by Michael Jarrett (JudgeBeavis@hotmail.com) - */ - -/* SHA1 Test vectors: - * - * "abc" - * A999 3E36 4706 816A BA3E 2571 7850 C26C 9CD0 D89D - * - * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - * 8498 3E44 1C3B D26E BAAE 4AA1 F951 29E5 E546 70F1 - */ - -#include "sha1.h" -#include "bithelp.h" - -#include -#include -#include - -Sha1::Sha1() -{ - context = new SHA1_CONTEXT; -} - -Sha1::~Sha1() -{ - delete context; -} - -void Sha1::burn_stack(int bytes) -{ - char buf[128]; - memset(buf, 0, sizeof buf); - bytes -= sizeof buf; - if (bytes > 0) - burn_stack(bytes); -} - -void Sha1::sha1_init() -{ - context->h0 = 0x67452301; - context->h1 = 0xefcdab89; - context->h2 = 0x98badcfe; - context->h3 = 0x10325476; - context->h4 = 0xc3d2e1f0; - context->nblocks = 0; - context->count = 0; -} - -/**************** - * Transform the message X which consists of 16 32-bit-words - */ -void Sha1::transform(const byte *data) -{ - uint32_t a, b, c, d, e, tm; - uint32_t x[16]; - - /* get values from the chaining vars */ - a = context->h0; - b = context->h1; - c = context->h2; - d = context->h3; - e = context->h4; - -#ifdef BIG_ENDIAN_HOST - memcpy(x, data, 64); -#else - { - int i; - byte *p2; - for (i = 0, p2 = (byte *) x; i < 16; i++, p2 += 4) { - p2[3] = *data++; - p2[2] = *data++; - p2[1] = *data++; - p2[0] = *data++; - } - } -#endif - -#define SHA1_K1 0x5A827999L -#define SHA1_K2 0x6ED9EBA1L -#define SHA1_K3 0x8F1BBCDCL -#define SHA1_K4 0xCA62C1D6L -#define SHA1_F1(x,y,z) ( z ^ ( x & ( y ^ z ) ) ) -#define SHA1_F2(x,y,z) ( x ^ y ^ z ) -#define SHA1_F3(x,y,z) ( ( x & y ) | ( z & ( x | y ) ) ) -#define SHA1_F4(x,y,z) ( x ^ y ^ z ) - -#define M(i) ( tm = x[i&0x0f] ^ x[(i-14)&0x0f] \ - ^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f] \ - , (x[i&0x0f] = rol(tm, 1)) ) - -#define SHA1_R(a,b,c,d,e,f,k,m) do { e += rol( a, 5 ) \ - + f( b, c, d ) \ - + k \ - + m; \ - b = rol( b, 30 ); \ - } while(0) - SHA1_R(a, b, c, d, e, SHA1_F1, SHA1_K1, x[0]); - SHA1_R(e, a, b, c, d, SHA1_F1, SHA1_K1, x[1]); - SHA1_R(d, e, a, b, c, SHA1_F1, SHA1_K1, x[2]); - SHA1_R(c, d, e, a, b, SHA1_F1, SHA1_K1, x[3]); - SHA1_R(b, c, d, e, a, SHA1_F1, SHA1_K1, x[4]); - SHA1_R(a, b, c, d, e, SHA1_F1, SHA1_K1, x[5]); - SHA1_R(e, a, b, c, d, SHA1_F1, SHA1_K1, x[6]); - SHA1_R(d, e, a, b, c, SHA1_F1, SHA1_K1, x[7]); - SHA1_R(c, d, e, a, b, SHA1_F1, SHA1_K1, x[8]); - SHA1_R(b, c, d, e, a, SHA1_F1, SHA1_K1, x[9]); - SHA1_R(a, b, c, d, e, SHA1_F1, SHA1_K1, x[10]); - SHA1_R(e, a, b, c, d, SHA1_F1, SHA1_K1, x[11]); - SHA1_R(d, e, a, b, c, SHA1_F1, SHA1_K1, x[12]); - SHA1_R(c, d, e, a, b, SHA1_F1, SHA1_K1, x[13]); - SHA1_R(b, c, d, e, a, SHA1_F1, SHA1_K1, x[14]); - SHA1_R(a, b, c, d, e, SHA1_F1, SHA1_K1, x[15]); - SHA1_R(e, a, b, c, d, SHA1_F1, SHA1_K1, M(16)); - SHA1_R(d, e, a, b, c, SHA1_F1, SHA1_K1, M(17)); - SHA1_R(c, d, e, a, b, SHA1_F1, SHA1_K1, M(18)); - SHA1_R(b, c, d, e, a, SHA1_F1, SHA1_K1, M(19)); - SHA1_R(a, b, c, d, e, SHA1_F2, SHA1_K2, M(20)); - SHA1_R(e, a, b, c, d, SHA1_F2, SHA1_K2, M(21)); - SHA1_R(d, e, a, b, c, SHA1_F2, SHA1_K2, M(22)); - SHA1_R(c, d, e, a, b, SHA1_F2, SHA1_K2, M(23)); - SHA1_R(b, c, d, e, a, SHA1_F2, SHA1_K2, M(24)); - SHA1_R(a, b, c, d, e, SHA1_F2, SHA1_K2, M(25)); - SHA1_R(e, a, b, c, d, SHA1_F2, SHA1_K2, M(26)); - SHA1_R(d, e, a, b, c, SHA1_F2, SHA1_K2, M(27)); - SHA1_R(c, d, e, a, b, SHA1_F2, SHA1_K2, M(28)); - SHA1_R(b, c, d, e, a, SHA1_F2, SHA1_K2, M(29)); - SHA1_R(a, b, c, d, e, SHA1_F2, SHA1_K2, M(30)); - SHA1_R(e, a, b, c, d, SHA1_F2, SHA1_K2, M(31)); - SHA1_R(d, e, a, b, c, SHA1_F2, SHA1_K2, M(32)); - SHA1_R(c, d, e, a, b, SHA1_F2, SHA1_K2, M(33)); - SHA1_R(b, c, d, e, a, SHA1_F2, SHA1_K2, M(34)); - SHA1_R(a, b, c, d, e, SHA1_F2, SHA1_K2, M(35)); - SHA1_R(e, a, b, c, d, SHA1_F2, SHA1_K2, M(36)); - SHA1_R(d, e, a, b, c, SHA1_F2, SHA1_K2, M(37)); - SHA1_R(c, d, e, a, b, SHA1_F2, SHA1_K2, M(38)); - SHA1_R(b, c, d, e, a, SHA1_F2, SHA1_K2, M(39)); - SHA1_R(a, b, c, d, e, SHA1_F3, SHA1_K3, M(40)); - SHA1_R(e, a, b, c, d, SHA1_F3, SHA1_K3, M(41)); - SHA1_R(d, e, a, b, c, SHA1_F3, SHA1_K3, M(42)); - SHA1_R(c, d, e, a, b, SHA1_F3, SHA1_K3, M(43)); - SHA1_R(b, c, d, e, a, SHA1_F3, SHA1_K3, M(44)); - SHA1_R(a, b, c, d, e, SHA1_F3, SHA1_K3, M(45)); - SHA1_R(e, a, b, c, d, SHA1_F3, SHA1_K3, M(46)); - SHA1_R(d, e, a, b, c, SHA1_F3, SHA1_K3, M(47)); - SHA1_R(c, d, e, a, b, SHA1_F3, SHA1_K3, M(48)); - SHA1_R(b, c, d, e, a, SHA1_F3, SHA1_K3, M(49)); - SHA1_R(a, b, c, d, e, SHA1_F3, SHA1_K3, M(50)); - SHA1_R(e, a, b, c, d, SHA1_F3, SHA1_K3, M(51)); - SHA1_R(d, e, a, b, c, SHA1_F3, SHA1_K3, M(52)); - SHA1_R(c, d, e, a, b, SHA1_F3, SHA1_K3, M(53)); - SHA1_R(b, c, d, e, a, SHA1_F3, SHA1_K3, M(54)); - SHA1_R(a, b, c, d, e, SHA1_F3, SHA1_K3, M(55)); - SHA1_R(e, a, b, c, d, SHA1_F3, SHA1_K3, M(56)); - SHA1_R(d, e, a, b, c, SHA1_F3, SHA1_K3, M(57)); - SHA1_R(c, d, e, a, b, SHA1_F3, SHA1_K3, M(58)); - SHA1_R(b, c, d, e, a, SHA1_F3, SHA1_K3, M(59)); - SHA1_R(a, b, c, d, e, SHA1_F4, SHA1_K4, M(60)); - SHA1_R(e, a, b, c, d, SHA1_F4, SHA1_K4, M(61)); - SHA1_R(d, e, a, b, c, SHA1_F4, SHA1_K4, M(62)); - SHA1_R(c, d, e, a, b, SHA1_F4, SHA1_K4, M(63)); - SHA1_R(b, c, d, e, a, SHA1_F4, SHA1_K4, M(64)); - SHA1_R(a, b, c, d, e, SHA1_F4, SHA1_K4, M(65)); - SHA1_R(e, a, b, c, d, SHA1_F4, SHA1_K4, M(66)); - SHA1_R(d, e, a, b, c, SHA1_F4, SHA1_K4, M(67)); - SHA1_R(c, d, e, a, b, SHA1_F4, SHA1_K4, M(68)); - SHA1_R(b, c, d, e, a, SHA1_F4, SHA1_K4, M(69)); - SHA1_R(a, b, c, d, e, SHA1_F4, SHA1_K4, M(70)); - SHA1_R(e, a, b, c, d, SHA1_F4, SHA1_K4, M(71)); - SHA1_R(d, e, a, b, c, SHA1_F4, SHA1_K4, M(72)); - SHA1_R(c, d, e, a, b, SHA1_F4, SHA1_K4, M(73)); - SHA1_R(b, c, d, e, a, SHA1_F4, SHA1_K4, M(74)); - SHA1_R(a, b, c, d, e, SHA1_F4, SHA1_K4, M(75)); - SHA1_R(e, a, b, c, d, SHA1_F4, SHA1_K4, M(76)); - SHA1_R(d, e, a, b, c, SHA1_F4, SHA1_K4, M(77)); - SHA1_R(c, d, e, a, b, SHA1_F4, SHA1_K4, M(78)); - SHA1_R(b, c, d, e, a, SHA1_F4, SHA1_K4, M(79)); - - /* update chainig vars */ - context->h0 += a; - context->h1 += b; - context->h2 += c; - context->h3 += d; - context->h4 += e; -} - -/* Update the message digest with the contents - * of INBUF with length INLEN. - */ -void Sha1::sha1_write(const byte *inbuf, size_t inlen) -{ - if (context->count == 64) { /* flush the buffer */ - transform(context->buf); - burn_stack(88 + 4 * sizeof(void *)); - context->count = 0; - context->nblocks++; - } - if (unlikely(!inbuf)) - return; - if (context->count) { - for (; inlen && context->count < 64; inlen--) - context->buf[context->count++] = *inbuf++; - sha1_write(NULL, 0); - if (!inlen) - return; - } - - while (inlen >= 64) { - transform(inbuf); - context->count = 0; - context->nblocks++; - inlen -= 64; - inbuf += 64; - } - burn_stack(88 + 4 * sizeof(void *)); - for (; inlen && context->count < 64; inlen--) - context->buf[context->count++] = *inbuf++; -} - -/* The routine final terminates the computation and - * returns the digest. - * The handle is prepared for a new cycle, but adding bytes to the - * handle will the destroy the returned buffer. - * Returns: 20 bytes representing the digest. - */ -byte * Sha1::sha1_final() -{ - uint32_t t, msb, lsb; - byte *p; - - sha1_write(NULL, 0); /* flush */ - - t = context->nblocks; - /* multiply by 64 to make a byte count */ - lsb = t << 6; - msb = t >> 26; - /* add the count */ - t = lsb; - if ((lsb += context->count) < t) - msb++; - /* multiply by 8 to make a bit count */ - t = lsb; - lsb <<= 3; - msb <<= 3; - msb |= t >> 29; - - if (context->count < 56) { /* enough room */ - context->buf[context->count++] = 0x80; /* pad */ - while (context->count < 56) - context->buf[context->count++] = 0; /* pad */ - } else { /* need one extra block */ - context->buf[context->count++] = 0x80; /* pad character */ - while (context->count < 64) - context->buf[context->count++] = 0; - sha1_write(NULL, 0); /* flush */ - memset(context->buf, 0, 56); /* fill next block with zeroes */ - } - /* append the 64 bit count */ - context->buf[56] = msb >> 24; - context->buf[57] = msb >> 16; - context->buf[58] = msb >> 8; - context->buf[59] = msb; - context->buf[60] = lsb >> 24; - context->buf[61] = lsb >> 16; - context->buf[62] = lsb >> 8; - context->buf[63] = lsb; - transform(context->buf); - burn_stack(88 + 4 * sizeof(void *)); - - p = context->buf; -#ifdef BIG_ENDIAN_HOST -#define X(a) do { *(uint32_t*)p = context->h##a ; p += 4; } while(0) -#else /* little endian */ -#define X(a) do { *p++ = context->h##a >> 24; *p++ = context->h##a >> 16; \ - *p++ = context->h##a >> 8; *p++ = context->h##a; } while(0) -#endif - X(0); - X(1); - X(2); - X(3); - X(4); -#undef X - return context->buf; -} - -bool Sha1::selfTest() -{ -// TODO: Remove me proper -/* - string test1("abc"); - string test1_md("A9993E364706816ABA3E25717850C26C9CD0D89D"); - string test2("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"); - string test2_md("84983E441C3BD26EBAAE4AA1F95129E5E54670F1"); - string test3; - test3.assign(1000000, 'a'); - string test3_md("34AA973CD4C4DAA4F61EEB2BDBAD27316534016F"); - - Sha1 sha1; - - if (unlikely(sha1.calcSha1(test1) != test1_md)) - return false; - if (unlikely(sha1.calcSha1(test2) != test2_md)) - return false; - if (unlikely(sha1.calcSha1(test3) != test3_md)) - return false; -*/ - return true; -} - -byte *Sha1::calcSha1(const byte *buf, int len) -{ - sha1_init(); - sha1_write(buf, len); - return sha1_final(); -} - diff --git a/kmess/crypt/sha1.h b/kmess/crypt/sha1.h deleted file mode 100644 index d2798bc..0000000 --- a/kmess/crypt/sha1.h +++ /dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - * * - * copyright (C) 2002, 2003, 2004 by Michael Buesch * - * email: mbuesch@freenet.de * - * * - * sha1.c - SHA1 hash function * - * Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc. * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2 * - * as published by the Free Software Foundation. * - * * - ***************************************************************************/ - -// Modifications 2004: Michael Jarrett (JudgeBeavis@hotmail.com) - -#ifndef SHA1_H -#define SHA1_H - -#include "globalstuff.h" - -#include -using std::string; - -#define SHA1_HASHLEN_BYTE (160 / 8) - -class Sha1 -{ - struct SHA1_CONTEXT - { - uint32_t h0,h1,h2,h3,h4; - uint32_t nblocks; - byte buf[64]; - int count; - }; - -public: - Sha1(); - virtual ~Sha1(); - static bool selfTest(); - - byte *calcSha1(const byte *buf, int len); - -protected: - void burn_stack(int bytes); - void sha1_init(); - void transform(const byte *data); - void sha1_write(const byte *inbuf, size_t inlen); - byte * sha1_final(); - -protected: - SHA1_CONTEXT *context; -}; - -#endif diff --git a/kmess/dialogs/.cvsignore b/kmess/dialogs/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/dialogs/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/dialogs/Makefile.am b/kmess/dialogs/Makefile.am deleted file mode 100644 index f163ccc..0000000 --- a/kmess/dialogs/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libdialogs.a - -INCLUDES = $(all_includes) - -libdialogs_a_METASOURCES = AUTO - -libdialogs_a_SOURCES = addcontactdialog.cpp addemoticondialog.cpp \ - addemoticondialoginterface.ui awaymessagedialog.cpp contactaddeduserdialog.cpp \ - contactaddeduserdialoginterface.ui contactpropertiesdialog.cpp networkwindow.cpp transferentry.cpp \ - transferentryinterface.ui transferwindow.cpp transferwindowinterface.ui - -noinst_HEADERS = addemoticondialog.h transferentry.h transferwindow.h - -####### kdevelop will overwrite this part!!! (end)############ - diff --git a/kmess/dialogs/Makefile.in b/kmess/dialogs/Makefile.in deleted file mode 100644 index 055f06a..0000000 --- a/kmess/dialogs/Makefile.in +++ /dev/null @@ -1,912 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libdialogs_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/dialogs -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libdialogs_a_AR = $(AR) $(ARFLAGS) -libdialogs_a_LIBADD = -am_libdialogs_a_OBJECTS = addcontactdialog.$(OBJEXT) \ - addemoticondialog.$(OBJEXT) awaymessagedialog.$(OBJEXT) \ - contactaddeduserdialog.$(OBJEXT) \ - contactpropertiesdialog.$(OBJEXT) networkwindow.$(OBJEXT) \ - transferentry.$(OBJEXT) transferwindow.$(OBJEXT) -#>- libdialogs_a_OBJECTS = $(am_libdialogs_a_OBJECTS) -#>+ 8 -libdialogs_a_final_OBJECTS = libdialogs_a.all_cpp.o -libdialogs_a_nofinal_OBJECTS = addcontactdialog.$(OBJEXT) \ - addemoticondialog.$(OBJEXT) awaymessagedialog.$(OBJEXT) \ - contactaddeduserdialog.$(OBJEXT) \ - contactpropertiesdialog.$(OBJEXT) networkwindow.$(OBJEXT) \ - transferentry.$(OBJEXT) transferwindow.$(OBJEXT) addemoticondialoginterface.$(OBJEXT) contactaddeduserdialoginterface.$(OBJEXT) transferentryinterface.$(OBJEXT) transferwindowinterface.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libdialogs_a_OBJECTS = $(libdialogs_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libdialogs_a_OBJECTS = $(libdialogs_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/addcontactdialog.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/addemoticondialog.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/awaymessagedialog.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactaddeduserdialog.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/contactpropertiesdialog.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/networkwindow.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/transferentry.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/transferwindow.Po -#>+ 16 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/addemoticondialoginterface.P $(DEPDIR)/contactaddeduserdialoginterface.P $(DEPDIR)/transferentryinterface.P $(DEPDIR)/transferwindowinterface.P $(DEPDIR)/libdialogs_a.all_cpp.P ./$(DEPDIR)/addcontactdialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/addemoticondialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/awaymessagedialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactaddeduserdialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactpropertiesdialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/networkwindow.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/transferentry.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/transferwindow.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/addemoticondialoginterface.P $(DEPDIR)/contactaddeduserdialoginterface.P $(DEPDIR)/transferentryinterface.P $(DEPDIR)/transferwindowinterface.P ./$(DEPDIR)/addcontactdialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/addemoticondialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/awaymessagedialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactaddeduserdialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/contactpropertiesdialog.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/networkwindow.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/transferentry.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/transferwindow.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libdialogs_a_SOURCES) -DIST_SOURCES = $(libdialogs_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libdialogs.a -INCLUDES = $(all_includes) -#>- libdialogs_a_METASOURCES = AUTO -#>- libdialogs_a_SOURCES = addcontactdialog.cpp addemoticondialog.cpp \ -#>- addemoticondialoginterface.ui awaymessagedialog.cpp contactaddeduserdialog.cpp \ -#>- contactaddeduserdialoginterface.ui contactpropertiesdialog.cpp networkwindow.cpp transferentry.cpp \ -#>- transferentryinterface.ui transferwindow.cpp transferwindowinterface.ui -#>+ 4 -libdialogs_a_SOURCES=addcontactdialog.cpp addemoticondialog.cpp \ - awaymessagedialog.cpp contactaddeduserdialog.cpp \ - contactpropertiesdialog.cpp networkwindow.cpp transferentry.cpp \ - transferwindow.cpp addemoticondialoginterface.cpp contactaddeduserdialoginterface.cpp transferentryinterface.cpp transferwindowinterface.cpp - -noinst_HEADERS = addemoticondialog.h transferentry.h transferwindow.h -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/dialogs/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/dialogs/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/dialogs/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/dialogs/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/dialogs/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libdialogs.a: $(libdialogs_a_OBJECTS) $(libdialogs_a_DEPENDENCIES) - -rm -f libdialogs.a - $(libdialogs_a_AR) libdialogs.a $(libdialogs_a_OBJECTS) $(libdialogs_a_LIBADD) - $(RANLIB) libdialogs.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addcontactdialog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addemoticondialog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awaymessagedialog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactaddeduserdialog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contactpropertiesdialog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/networkwindow.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transferentry.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transferwindow.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-ui clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - - -####### kdevelop will overwrite this part!!! (end)############ -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -addcontactdialog.moc: $(srcdir)/addcontactdialog.h - $(MOC) $(srcdir)/addcontactdialog.h -o addcontactdialog.moc - -#>+ 2 -mocs: addcontactdialog.moc - -#>+ 3 -awaymessagedialog.moc: $(srcdir)/awaymessagedialog.h - $(MOC) $(srcdir)/awaymessagedialog.h -o awaymessagedialog.moc - -#>+ 2 -mocs: awaymessagedialog.moc - -#>+ 3 -addemoticondialog.moc: $(srcdir)/addemoticondialog.h - $(MOC) $(srcdir)/addemoticondialog.h -o addemoticondialog.moc - -#>+ 2 -mocs: addemoticondialog.moc - -#>+ 3 -transferwindow.moc: $(srcdir)/transferwindow.h - $(MOC) $(srcdir)/transferwindow.h -o transferwindow.moc - -#>+ 2 -mocs: transferwindow.moc - -#>+ 3 -contactpropertiesdialog.moc: $(srcdir)/contactpropertiesdialog.h - $(MOC) $(srcdir)/contactpropertiesdialog.h -o contactpropertiesdialog.moc - -#>+ 2 -mocs: contactpropertiesdialog.moc - -#>+ 3 -contactaddeduserdialog.moc: $(srcdir)/contactaddeduserdialog.h - $(MOC) $(srcdir)/contactaddeduserdialog.h -o contactaddeduserdialog.moc - -#>+ 2 -mocs: contactaddeduserdialog.moc - -#>+ 3 -transferentry.moc: $(srcdir)/transferentry.h - $(MOC) $(srcdir)/transferentry.h -o transferentry.moc - -#>+ 2 -mocs: transferentry.moc - -#>+ 3 -clean-metasources: - -rm -f addcontactdialog.moc awaymessagedialog.moc addemoticondialog.moc transferwindow.moc contactpropertiesdialog.moc contactaddeduserdialog.moc transferentry.moc - -#>+ 2 -KDE_DIST=addemoticondialoginterface.ui awaymessagedialog.h contactaddeduserdialoginterface.ui addcontactdialog.h transferwindowinterface.ui contactpropertiesdialog.h networkwindow.h transferentryinterface.ui Makefile.in contactaddeduserdialog.h Makefile.am - -#>+ 7 -clean-ui: - -rm -f \ - addemoticondialoginterface.cpp addemoticondialoginterface.h addemoticondialoginterface.moc \ - contactaddeduserdialoginterface.cpp contactaddeduserdialoginterface.h contactaddeduserdialoginterface.moc \ - transferentryinterface.cpp transferentryinterface.h transferentryinterface.moc \ - transferwindowinterface.cpp transferwindowinterface.h transferwindowinterface.moc - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/dialogs/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/dialogs/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/dialogs/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libdialogs_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/addcontactdialog.cpp $(srcdir)/addemoticondialog.cpp $(srcdir)/awaymessagedialog.cpp $(srcdir)/contactaddeduserdialog.cpp $(srcdir)/contactpropertiesdialog.cpp $(srcdir)/networkwindow.cpp $(srcdir)/transferentry.cpp $(srcdir)/transferwindow.cpp addemoticondialoginterface.cpp contactaddeduserdialoginterface.cpp transferentryinterface.cpp transferwindowinterface.cpp awaymessagedialog.moc addemoticondialog.moc addemoticondialoginterface.moc transferentry.moc contactaddeduserdialog.moc transferwindowinterface.moc transferentryinterface.moc addcontactdialog.moc transferwindow.moc contactpropertiesdialog.moc contactaddeduserdialoginterface.moc - @echo 'creating libdialogs_a.all_cpp.cpp ...'; \ - rm -f libdialogs_a.all_cpp.files libdialogs_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libdialogs_a.all_cpp.final; \ - for file in addcontactdialog.cpp addemoticondialog.cpp awaymessagedialog.cpp contactaddeduserdialog.cpp contactpropertiesdialog.cpp networkwindow.cpp transferentry.cpp transferwindow.cpp addemoticondialoginterface.cpp contactaddeduserdialoginterface.cpp transferentryinterface.cpp transferwindowinterface.cpp ; do \ - echo "#include \"$$file\"" >> libdialogs_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libdialogs_a.all_cpp.final; \ - done; \ - cat libdialogs_a.all_cpp.final libdialogs_a.all_cpp.files > libdialogs_a.all_cpp.cpp; \ - rm -f libdialogs_a.all_cpp.final libdialogs_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libdialogs_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libdialogs_a_OBJECTS="$(libdialogs_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libdialogs_a_OBJECTS="$(libdialogs_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libdialogs_a_OBJECTS="$(libdialogs_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libdialogs_a_OBJECTS="$(libdialogs_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 25 -$(srcdir)/addcontactdialog.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -awaymessagedialog.lo: awaymessagedialog.moc -transferentry.o: transferentry.moc -transferwindow.lo: transferwindow.moc -$(srcdir)/addemoticondialog.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -$(srcdir)/networkwindow.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -transferentry.lo: transferentry.moc -transferwindow.o: transferwindow.moc -awaymessagedialog.o: awaymessagedialog.moc -addemoticondialog.o: addemoticondialog.moc -nmcheck: -$(srcdir)/transferwindow.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -addcontactdialog.o: addcontactdialog.moc -$(srcdir)/transferentry.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -$(srcdir)/contactpropertiesdialog.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -contactpropertiesdialog.lo: contactpropertiesdialog.moc -nmcheck-am: nmcheck -$(srcdir)/awaymessagedialog.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -contactaddeduserdialog.o: contactaddeduserdialog.moc -$(srcdir)/contactaddeduserdialog.cpp: addemoticondialoginterface.h contactaddeduserdialoginterface.h transferentryinterface.h transferwindowinterface.h -contactaddeduserdialog.lo: contactaddeduserdialog.moc -addcontactdialog.lo: addcontactdialog.moc -addemoticondialog.lo: addemoticondialog.moc -contactpropertiesdialog.o: contactpropertiesdialog.moc - -#>+ 60 -transferentryinterface.cpp: $(srcdir)/transferentryinterface.ui transferentryinterface.h transferentryinterface.moc - rm -f transferentryinterface.cpp - echo '#include ' > transferentryinterface.cpp - echo '#include ' >> transferentryinterface.cpp - $(UIC) -tr ${UIC_TR} -i transferentryinterface.h $(srcdir)/transferentryinterface.ui > transferentryinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" transferentryinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_transferentryinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> transferentryinterface.cpp ;\ - rm -f transferentryinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "transferentryinterface.moc"' >> transferentryinterface.cpp; else rm -f transferentryinterface.cpp ; exit $$ret ; fi - -transferentryinterface.h: $(srcdir)/transferentryinterface.ui - rm -rf transferentryinterface.h; - $(UIC) $(srcdir)/transferentryinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> transferentryinterface.h ; -transferentryinterface.moc: transferentryinterface.h - $(MOC) transferentryinterface.h -o transferentryinterface.moc - -transferwindowinterface.cpp: $(srcdir)/transferwindowinterface.ui transferwindowinterface.h transferwindowinterface.moc - rm -f transferwindowinterface.cpp - echo '#include ' > transferwindowinterface.cpp - echo '#include ' >> transferwindowinterface.cpp - $(UIC) -tr ${UIC_TR} -i transferwindowinterface.h $(srcdir)/transferwindowinterface.ui > transferwindowinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" transferwindowinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_transferwindowinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> transferwindowinterface.cpp ;\ - rm -f transferwindowinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "transferwindowinterface.moc"' >> transferwindowinterface.cpp; else rm -f transferwindowinterface.cpp ; exit $$ret ; fi - -transferwindowinterface.h: $(srcdir)/transferwindowinterface.ui - rm -rf transferwindowinterface.h; - $(UIC) $(srcdir)/transferwindowinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> transferwindowinterface.h ; -transferwindowinterface.moc: transferwindowinterface.h - $(MOC) transferwindowinterface.h -o transferwindowinterface.moc - -contactaddeduserdialoginterface.cpp: $(srcdir)/contactaddeduserdialoginterface.ui contactaddeduserdialoginterface.h contactaddeduserdialoginterface.moc - rm -f contactaddeduserdialoginterface.cpp - echo '#include ' > contactaddeduserdialoginterface.cpp - echo '#include ' >> contactaddeduserdialoginterface.cpp - $(UIC) -tr ${UIC_TR} -i contactaddeduserdialoginterface.h $(srcdir)/contactaddeduserdialoginterface.ui > contactaddeduserdialoginterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" contactaddeduserdialoginterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_contactaddeduserdialoginterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> contactaddeduserdialoginterface.cpp ;\ - rm -f contactaddeduserdialoginterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "contactaddeduserdialoginterface.moc"' >> contactaddeduserdialoginterface.cpp; else rm -f contactaddeduserdialoginterface.cpp ; exit $$ret ; fi - -contactaddeduserdialoginterface.h: $(srcdir)/contactaddeduserdialoginterface.ui - rm -rf contactaddeduserdialoginterface.h; - $(UIC) $(srcdir)/contactaddeduserdialoginterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> contactaddeduserdialoginterface.h ; -contactaddeduserdialoginterface.moc: contactaddeduserdialoginterface.h - $(MOC) contactaddeduserdialoginterface.h -o contactaddeduserdialoginterface.moc - -addemoticondialoginterface.cpp: $(srcdir)/addemoticondialoginterface.ui addemoticondialoginterface.h addemoticondialoginterface.moc - rm -f addemoticondialoginterface.cpp - echo '#include ' > addemoticondialoginterface.cpp - echo '#include ' >> addemoticondialoginterface.cpp - $(UIC) -tr ${UIC_TR} -i addemoticondialoginterface.h $(srcdir)/addemoticondialoginterface.ui > addemoticondialoginterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" addemoticondialoginterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_addemoticondialoginterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> addemoticondialoginterface.cpp ;\ - rm -f addemoticondialoginterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "addemoticondialoginterface.moc"' >> addemoticondialoginterface.cpp; else rm -f addemoticondialoginterface.cpp ; exit $$ret ; fi - -addemoticondialoginterface.h: $(srcdir)/addemoticondialoginterface.ui - rm -rf addemoticondialoginterface.h; - $(UIC) $(srcdir)/addemoticondialoginterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> addemoticondialoginterface.h ; -addemoticondialoginterface.moc: addemoticondialoginterface.h - $(MOC) addemoticondialoginterface.h -o addemoticondialoginterface.moc diff --git a/kmess/dialogs/addcontactdialog.cpp b/kmess/dialogs/addcontactdialog.cpp deleted file mode 100644 index 93504bc..0000000 --- a/kmess/dialogs/addcontactdialog.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/*************************************************************************** - addcontactdialog.cpp - description - ------------------- - begin : Sun Apr 14 2002 - copyright : (C) 2002 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 "addcontactdialog.h" - -#include -#include -#include - -#include -#include -#include -#include - -AddContactDialog::AddContactDialog(QWidget *parent, const char *name ) - : KDialogBase( parent, name, false, i18n("Add a contact"), Ok | Cancel, Ok, true ) -{ - setInitialSize( configDialogSize("AddContactDialog") ); - - QWidget *page = new QWidget( this ); - setMainWidget( page ); - - QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); - - QLabel *infoLabel = new QLabel( i18n("Enter the email address of the person you wish to add:"), page, "info" ); - topLayout->addWidget( infoLabel ); - - handleEdit_ = new KLineEdit( page, "handleedit" ); - handleEdit_->setMinimumWidth( fontMetrics().maxWidth()*20 ); - topLayout->addWidget( handleEdit_ ); - - topLayout->addStretch( 10 ); - - adjustSize(); -} - - - -AddContactDialog::~AddContactDialog() -{ -} - - - -// Show the dialog and obtain the contact handle. -bool AddContactDialog::launch(QString &contactHandle) -{ - // Reset the contact handle edit - handleEdit_->setText(""); - // Reset the "ok" - ok_ = false; - // Show the dialog modally - exec(); - // If the ok button was pressed.. - if ( ok_ ) - { - QString emailAddress = handleEdit_->text(); - if ( ! emailAddress.isEmpty() ) - { - // The MSN Servers send a "dot net" message if you try to add a contact like "me@hotmail.co". - // This "dot net" message caused KMess to disconnect..! Fortunately, this basic test should be - // more then enough, because stuff like test@test.test passes through the server-side tests. - bool tooShort = (emailAddress.length() < 6); // shortest: a@b.cd - bool hasAt = (emailAddress.find('@') != -1); - bool hasDot = (emailAddress.find('.') != -1 && (int) emailAddress.findRev('.') < ((int)emailAddress.length() - 2)); - bool hasCo = (emailAddress.endsWith(".co")); // strange, 2 random chars for country code are accepted, but .co isn't. - if(hasAt && hasDot && ! tooShort && ! hasCo) - { - // Get the contact handle from the edit. - contactHandle = handleEdit_->text(); - } - else - { - KMessageBox::error(0, i18n("The e-mail address given was invalid!")); - ok_ = false; - } - } - } - return ok_; -} - - - -// The Cancel button was pressed. -void AddContactDialog::slotCancel() -{ - saveDialogSize("AddContactDialog"); - reject(); -} - - - -// The OK button was pressed. -void AddContactDialog::slotOk() -{ - saveDialogSize("AddContactDialog"); - ok_ = true; - accept(); -} - -#include "addcontactdialog.moc" diff --git a/kmess/dialogs/addemoticondialog.cpp b/kmess/dialogs/addemoticondialog.cpp deleted file mode 100644 index 4d27d83..0000000 --- a/kmess/dialogs/addemoticondialog.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/*************************************************************************** - addemoticondialog.cpp - shows a dialog to add a custom emoticon - ------------------- - begin : Tue April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "addemoticondialog.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "../emoticonmanager.h" -#include "addemoticondialoginterface.h" - - - -#ifdef KMESSDEBUG_EMOTICONS -#define KMESSDEBUG_EMOTICONS_ADDING -#endif - - - -/** - * Constructor - * - * The dialog is instantly shown as non-modal when the class is instantiated. - * - * @param theme Theme to add the new emoticon to - * @param parent Parent widget - * @param name Qt object name - */ -AddEmoticonDialog::AddEmoticonDialog( EmoticonTheme *theme, QWidget *parent, const char *name ) - : KDialogBase( parent, name, // parent, qobject name - false, i18n("Add New Emoticon"), // modal, caption - ( Help | Ok | Cancel ), Ok, // buttons, defaultbutton - false ) // bottom separator - , theme_(theme) -{ - // Create a new dialog interface - interface_ = new AddEmoticonDialogInterface( this, "AddEmoticonDialogInterface" ); - setMainWidget( interface_ ); - - // Connect the interface's signals to manage its events - connect( interface_->browseButton_, SIGNAL( clicked() ), - this, SLOT( choosePicture() ) ); - connect( interface_->pictureEdit_, SIGNAL( textChanged(const QString&) ), - this, SLOT( interfaceChanged() ) ); - connect( interface_->shortcutEdit_, SIGNAL( textChanged(const QString&) ), - this, SLOT( interfaceChanged() ) ); - - // Force an update of the widgets (mainly to show the KMess logo as - // the preview and to disable the Ok button) - interfaceChanged(); - - // Show the dialog, as small as possible - setInitialSize( minimumSizeHint(), true ); - show(); -} - - - -/** - * Destructor - */ -AddEmoticonDialog::~AddEmoticonDialog() -{ -#ifdef KMESSDEBUG_EMOTICONS_ADDING - kdDebug() << "AddEmoticonDialog::~AddEmoticonDialog() - DESTROYED AddEmoticonDialog." << endl; -#endif -} - - - -/** - * Shows a File Selection dialog to choose an image for the new emoticon - * - * Gets the emoticon picture location from the user, using a KFile dialog, putting the pictureEdit_ widget contents - * as a default, and then replaces the contents of said widget with the result of the file selection dialog. - */ -void AddEmoticonDialog::choosePicture() -{ - QString file; - QImage emoticonData; - - // Choose a file, filtering out all files but the preselected image types - file = KFileDialog::getOpenFileName( interface_->pictureEdit_->text(), "image/png image/mng image/gif image/jpeg", this ); - - if( file.isEmpty() ) - { - return; - } - - // Update the text widget, so an update will be issued and the preview will be updated. - interface_->pictureEdit_->setText( file ); -} - - - -/** - * Controls the OK button by checking the dialog's widgets - * - * It's called everytime that a change is made to one of the dialog's widgets, and checks if their contents are valid. - * Then enables or disables the OK button accordingly. - */ -void AddEmoticonDialog::interfaceChanged() -{ - QImage emoticonData; - emoticonData.load( interface_->pictureEdit_->text() ); - - if( ! emoticonData.isNull() ) - { - // The chosen file is valid, update the preview. - -#ifdef KMESSDEBUG_EMOTICONS_ADDING - kdDebug() << "AddEmoticonDialog::interfaceChanged() - Updated preview." << endl; -#endif - - interface_->emoticonPreview_->setPixmap( emoticonData ); - } - else if( interface_->emoticonPreview_->pixmap() == 0 - || QPixmap( emoticonData ).serialNumber() != interface_->emoticonPreview_->pixmap()->serialNumber() ) - { - // The chosen file is not valid, reset the preview to the KMess logo. - -#ifdef KMESSDEBUG_EMOTICONS_ADDING - kdDebug() << "AddEmoticonDialog::interfaceChanged() - Resetting preview." << endl; -#endif - - interface_->emoticonPreview_->setPixmap( KGlobal::iconLoader()->loadIcon( "kmess", KIcon::Desktop, KIcon::SizeHuge ) ); - } - - // Enable the OK button only if both fields have valid contents - enableButtonOK( ! emoticonData.isNull() && ! interface_->shortcutEdit_->text().isEmpty() ); -} - - - -/** - * Preselects a file name and an emoticon shortcut in the dialog - * - * @param pictureName Full path to the file that will be added - * @param code Emoticon shortcut to preselect - */ -void AddEmoticonDialog::preSelect( QString pictureName, QString shortcut ) -{ - // Select the image. Disable the field also to avoid messing up with the name. - interface_->pictureEdit_->setText( pictureName ); - interface_->pictureEdit_->setEnabled( false ); - interface_->browseButton_->setEnabled( false ); - - // Select the shortcut, and save it so later we can tell everyone we've added this particular emoticon - preselectedShortcut_ = shortcut; - - // HTML-Decode the shortcut, more thoroughly as possible, to show it to the user like the original one was. - // Neither KDE nor Qt have HTML to text decoding methods. Annoying. - shortcut.replace( """, "\"" ) - .replace( "'", "'" ) - .replace( ">", ">" ) - .replace( "<", "<" ) - .replace( "&", "&" ); - - // Select the shortcut - interface_->shortcutEdit_->setText( shortcut ); -} - - - - -/** - * Adds the new emoticon to the theme - * - * First it copies the user-selected picture to the custom theme's folder, then adds it to the theme itself; - * finally it closes the dialog. - */ -void AddEmoticonDialog::slotOk() -{ - QImage emoticonData; - QString shortcut, pictureName; - -#ifdef KMESSDEBUG_EMOTICONS_ADDING - kdDebug() << "AddEmoticonDialog::slotOk() - OK button was pressed!" << endl; -#endif - - shortcut = interface_->shortcutEdit_->text(); - pictureName = interface_->pictureEdit_->text(); - - emoticonData.load( pictureName ); - - if( emoticonData.isNull() || shortcut.isEmpty() ) - { - kdWarning() << "AddEmoticonDialog::slotOk() - Shortcut or picture is not valid!" << endl; - return; - } - - // If the emoticon does already exist in the theme, ask if you want to replace it. - if( theme_->contains( shortcut ) ) - { - int result = KMessageBox::questionYesNo( 0, - i18n("The emoticon \"%1\" already exists, do you want to replace it?").arg( shortcut ), - i18n("Add New Emoticon") ); - if ( result == KMessageBox::Yes ) - { - theme_->removeEmoticon( shortcut ); - } - else - { - return; - } - } - - // Get handles for the original picture and the new emoticon - QFileInfo pictureInfo( pictureName ); - QFile originalPicture( pictureName ); - QFile newThemePicture( theme_->getThemePath() + pictureInfo.fileName() ); - - // Open the two images - if( ! originalPicture.open( IO_ReadOnly ) ) - { - kdWarning() << "AddEmoticonDialog::slotOk() - Couldn't open source file: " << originalPicture.name() << endl; - return; - } - - if( ! newThemePicture.open( IO_WriteOnly ) ) - { - kdWarning() << "AddEmoticonDialog::slotOk() - Couldn't open destination file: " << newThemePicture.name() << endl; - return; - } - - // Copy the file contents - newThemePicture.writeBlock( originalPicture.readAll() ); - newThemePicture.close(); - originalPicture.close(); - - // Quick validity check - if( newThemePicture.size() != originalPicture.size() ) - { - kdWarning() << "AddEmoticonDialog::slotOk() - File sizes do not match: " - << originalPicture.name() << " (" << originalPicture.size() << ")" - << " != " << newThemePicture.name() << " (" << newThemePicture.size() << ")" << endl; - return; - } - - -#ifdef KMESSDEBUG_EMOTICONS_ADDING - kdDebug() << "AddEmoticonDialog::slotOk() - Adding new emoticon: " << shortcut << "." << endl; -#endif - - // We've just created a file whose name is like "file.name.png", so give to the theme a name "file.name" so it can guess - // the file type on its own. - theme_->addEmoticon( pictureInfo.baseName( true ), QStringList( shortcut ) ); - theme_->saveTheme(); - - // If a shortcut has been preselected, signal that we've added that emoticon. - // If it hasn't, just send the new shortcut. - if( ! preselectedShortcut_.isEmpty() ) - { - shortcut = preselectedShortcut_; - } - - // Signal to anyone interested that we've added this emoticon - emit addedEmoticon( shortcut ); - - KDialogBase::slotOk(); -} - - - -#include "addemoticondialog.moc" diff --git a/kmess/dialogs/addemoticondialoginterface.ui b/kmess/dialogs/addemoticondialoginterface.ui deleted file mode 100644 index 2ca4b0e..0000000 --- a/kmess/dialogs/addemoticondialoginterface.ui +++ /dev/null @@ -1,220 +0,0 @@ - -AddEmoticonDialogInterface - - - AddEmoticonDialogInterface - - - - 0 - 0 - 400 - 150 - - - - - 7 - 7 - 0 - 0 - - - - - 400 - 150 - - - - AddEmoticonDialogInterface - - - - unnamed - - - 0 - - - 6 - - - - layout7 - - - - unnamed - - - - emoticonPreview_ - - - - 0 - 0 - 0 - 0 - - - - - 64 - 64 - - - - - 64 - 64 - - - - StyledPanel - - - Raised - - - - - - true - - - AlignCenter - - - - - spacer36 - - - Vertical - - - Expanding - - - - 21 - 75 - - - - - - - - layout25 - - - - unnamed - - - - textLabel1 - - - Enter a shortcut for this emoticon: - - - - - shortcutEdit_ - - - 7 - - - - - spacer39_2 - - - Vertical - - - Fixed - - - - 16 - 16 - - - - - - textLabel2 - - - Select an image file: - - - - - layout35 - - - - unnamed - - - - pictureEdit_ - - - - - browseButton_ - - - - 1 - 1 - 0 - 0 - - - - - 22 - 0 - - - - ... - - - - - - - - - - spacer39 - - - Vertical - - - Expanding - - - - 16 - 16 - - - - - - - - - diff --git a/kmess/dialogs/contactaddeduserdialog.cpp b/kmess/dialogs/contactaddeduserdialog.cpp deleted file mode 100644 index 5051812..0000000 --- a/kmess/dialogs/contactaddeduserdialog.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - contactaddeduserdialog.cpp - description - ------------------- - begin : Sun Apr 14 2002 - copyright : (C) 2002 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 "contactaddeduserdialog.h" - -#include -#include - -ContactAddedUserDialog::ContactAddedUserDialog( const QString &contactHandle, const QString &contactFriendlyName ) -: contactHandle_( contactHandle ) -{ - // Let the dialog destroy itself when it's done - setWFlags( Qt::WDestructiveClose ); - - messageLabel_->setText( messageLabel_->text().arg( contactFriendlyName + " (" + contactHandle + ")" ) ); -} - - - -ContactAddedUserDialog::~ContactAddedUserDialog() -{ -} - - - -// The user picked "add contact to the friends list". -void ContactAddedUserDialog::addContactPressed() -{ - emit userChoice( contactHandle_, ADD ); - close(); -} - - - -// The user chose to let the contact view his or her online state, but -// not to add the contact. -void ContactAddedUserDialog::allowContactPressed() -{ - emit userChoice( contactHandle_, ALLOW ); - close(); -} - - - -// The user chose to block the contact. -void ContactAddedUserDialog::blockContactPressed() -{ - emit userChoice( contactHandle_, BLOCK ); - close(); -} - -#include "contactaddeduserdialog.moc" diff --git a/kmess/dialogs/contactaddeduserdialoginterface.ui b/kmess/dialogs/contactaddeduserdialoginterface.ui deleted file mode 100644 index 52154fe..0000000 --- a/kmess/dialogs/contactaddeduserdialoginterface.ui +++ /dev/null @@ -1,86 +0,0 @@ - -ContactAddedUserDialogInterface - - - ContactAddedUserDialogInterface - - - - 0 - 0 - 551 - 165 - - - - Add contact - - - - unnamed - - - - messageLabel_ - - - %1 -has added you to his or her contact list. Do you want to: - - - AlignTop|AlignHCenter - - - - - addContactButton_ - - - &Add this contact to your "Friends" list - - - - - allowContactButton_ - - - &Not add this contact, but let them see your online state - - - - - blockContactButton_ - - - Block this person from contacting &you or seeing your online state - - - - - - - addContactButton_ - clicked() - ContactAddedUserDialogInterface - addContactPressed() - - - allowContactButton_ - clicked() - ContactAddedUserDialogInterface - allowContactPressed() - - - blockContactButton_ - clicked() - ContactAddedUserDialogInterface - blockContactPressed() - - - - addContactPressed() - allowContactPressed() - blockContactPressed() - - - diff --git a/kmess/dialogs/contactpropertiesdialog.cpp b/kmess/dialogs/contactpropertiesdialog.cpp deleted file mode 100644 index efa11af..0000000 --- a/kmess/dialogs/contactpropertiesdialog.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/*************************************************************************** - contactpropertiesdialog.cpp - description - ------------------- - begin : Sun Dec 15 2002 - copyright : (C) 2002 by Michael Curtis - email : magnalium@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 -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "../contact/contact.h" -#include "../network/applications/picturetransferp2p.h" -#include "../kmessdebug.h" -#include "contactpropertiesdialog.h" - - - -ContactPropertiesDialog::ContactPropertiesDialog(QWidget *parent, const char *name ) - : KDialogBase( parent, name, false, QString::null, Ok | Cancel , Ok, true ) -{ - KIconLoader *loader = KGlobal::iconLoader(); - QSize size; - - // Set the dialog size - size = configDialogSize("ContactPropertiesDialog"); - if ( ( size.height() == 0 ) && ( size.width() == 0 ) ) - { - size.setWidth(450); - size.setHeight(220); - } - - // Create the widgets - QWidget *page = new QWidget( this ); - setMainWidget( page ); - - QVBoxLayout *mainLayout = new QVBoxLayout( page, 0, spacingHint() ); - - // Create the email address: line - emailLabel_ = new QLabel( page, "emailLabel" ); - mainLayout->addWidget( emailLabel_ ); - - // Create the "Current Name: blah*#89!" line - trueNameLabel_ = new QLabel( page, "trueNameLabel" ); - mainLayout->addWidget( trueNameLabel_ ); - - // Create the "[X] Use alternative name" line - alternativeNameCheckBox_ = new QCheckBox( i18n( "Use an alternative name for this person" ), page, "alternativeNameCheckBox" ); - mainLayout->addWidget( alternativeNameCheckBox_ ); - - // Create the " ____name____" line - nameEdit_ = new KLineEdit( page, "nameEdit" ); - mainLayout->addWidget( nameEdit_ ); - - // Create the "[X] Show a notification" line - notifyOnlineCheckBox_ = new QCheckBox( i18n( "Show a popup balloon when this person goes online or offline" ), page, "notifyOnlineCheckBox" ); - mainLayout->addWidget( notifyOnlineCheckBox_ ); - - // Create a grid layout for the " Picture: __blah.png___ [...] " line - // and the " Sound: __blah.ogg___ [...] " line - QGridLayout *fileLayout = new QGridLayout( 0, 3, 3, 0, 0, "fileLayout" ); - - QLabel *pictureLabel = new QLabel( i18n("Picture:"), page, "pictureLabel" ); - pictureLabel->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); - fileLayout->addWidget( pictureLabel, 0, 0 ); - - pictureEdit_ = new KLineEdit( page, "pictureEdit" ); - fileLayout->addWidget( pictureEdit_, 0, 1 ); - - QToolButton *pictureButton = new QToolButton( page, "pictureButton" ); - pictureButton->setPixmap( loader->loadIcon( "fileopen", KIcon::Small ) ); - fileLayout->addWidget( pictureButton, 0, 2 ); - - QLabel *soundLabel = new QLabel( i18n("Sound:"), page, "soundLabel" ); - soundLabel->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); - fileLayout->addWidget( soundLabel, 1, 0 ); - - soundEdit_ = new KLineEdit( page, "soundEdit" ); - fileLayout->addWidget( soundEdit_, 1, 1 ); - - QToolButton *soundButton = new QToolButton( page, "soundButton" ); - soundButton->setPixmap( loader->loadIcon( "fileopen", KIcon::Small ) ); - fileLayout->addWidget( soundButton, 1, 2 ); - - mainLayout->addLayout( fileLayout ); - - connect( alternativeNameCheckBox_, SIGNAL( toggled(bool) ), - this, SLOT ( alternativeNameCheckBoxToggled(bool) ) ); - connect( notifyOnlineCheckBox_, SIGNAL( toggled(bool) ), - this, SLOT ( notifyOnlineCheckBoxToggled(bool) ) ); - connect( pictureButton, SIGNAL( clicked() ), - this, SLOT ( choosePicture() ) ); - connect( soundButton, SIGNAL( clicked() ), - this, SLOT ( chooseSound() ) ); -} - - - -ContactPropertiesDialog::~ContactPropertiesDialog() -{ -#ifdef KMESSDEBUG_CONTACTPROPERTIES - kdDebug() << "DESTROYED ContactPropertiesDialog" << endl; -#endif -} - - -// The alt name checkbox was toggled. -void ContactPropertiesDialog::alternativeNameCheckBoxToggled(bool checked) -{ - nameEdit_->setEnabled( checked ); -} - - - -// Apply all values in the widgets to the contact extension. -void ContactPropertiesDialog::applyChanges() -{ - ContactExtension *extension; - - 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. - if ( nameEdit_->text().isEmpty() ) - { - extension->setUseAlternativeName( false ); - } - else - { - extension->setUseAlternativeName( alternativeNameCheckBox_->isChecked() ); - } - extension->setAlternativeName( nameEdit_->text() ); - - extension->setNotifyOnline( notifyOnlineCheckBox_->isChecked() ); - extension->setContactSoundPath ( soundEdit_->text() ); - - // If the user doesn't want to use the custom picture anymore, replace it with the contact's one. - if( pictureEdit_->text().isEmpty() ) - { - const MsnObject *msnObject = contact_->getMsnObject(); - if( msnObject == 0 ) - { - extension->setContactPicturePath( QString::null ); - } - else - { - extension->setContactPicturePath( PictureTransferP2P::getPictureFileName( * msnObject ) ); - } - } - else - { - extension->setContactPicturePath( pictureEdit_->text() ); - } -} - - - -// Get the location of a file from the user, using a KFile dialog -// Uses the contents of the KLineEdit as a default, and replaces the contents -// of said widget with the result of the file selection dialog. -void ContactPropertiesDialog::chooseFile(KLineEdit *edit, QString wildcard) -{ - QString file; - - file = edit->text(); - - file = KFileDialog::getOpenFileName( file, wildcard, this ); - - if ( !file.isEmpty() ) - { - edit->setText( file ); - } - -} - - - -// Choose a picture file (KFile dialog) -void ContactPropertiesDialog::choosePicture() -{ - // TODO: Replace this with a KFileDialog::getImageOpenURL() to natively filter for images - chooseFile( pictureEdit_, "*.png *.xpm *.jpg *.gif" ); -} - - - -// Choose a sound file (KFile dialog) -void ContactPropertiesDialog::chooseSound() -{ - chooseFile( soundEdit_, "*.ogg *.wav" ); -} - - - -// Show the dialog and obtain the contact handle. -bool ContactPropertiesDialog::launch(Contact *contact) -{ -#ifdef KMESSDEBUG_CONTACTPROPERTIES - kdDebug() << "ContactPropertiesDialog - Launch with contact " << contact->getHandle() << endl; -#endif - QString dialogCaption; - - // Reset the "ok" - ok_ = false; - - // Copy the pointer to the contact class - contact_ = contact; - - // Set the dialog title - dialogCaption = i18n("Contact Properties for %1").arg( contact->getHandle() ); - setCaption( dialogCaption ); - - // Setup the dialog - setupWidgets(); - - // Show the dialog modally - exec(); - - // If the ok button was pressed.. - if ( ok_ ) - { - applyChanges(); - } - - return ok_; -} - - - -// The online notification checkbox was toggled -void ContactPropertiesDialog::notifyOnlineCheckBoxToggled(bool checked) -{ - pictureEdit_->setEnabled( checked ); - soundEdit_->setEnabled( checked ); -} - - - -// Setup the dialog's widgets -void ContactPropertiesDialog::setupWidgets() -{ - emailLabel_->setText( i18n("Email address: ") + contact_->getHandle() ); - trueNameLabel_->setText( i18n("Current name: ") + contact_->getTrueFriendlyName() ); - alternativeNameCheckBox_->setChecked( contact_->getExtension()->getUseAlternativeName() ); - alternativeNameCheckBoxToggled( contact_->getExtension()->getUseAlternativeName() ); - nameEdit_->setText( contact_->getExtension()->getAlternativeName() ); - notifyOnlineCheckBox_->setChecked( contact_->getExtension()->getNotifyOnline() ); - notifyOnlineCheckBoxToggled( contact_->getExtension()->getNotifyOnline() ); - pictureEdit_->setText( contact_->getExtension()->getContactPicturePath() ); - soundEdit_ ->setText( contact_->getExtension()->getContactSoundPath() ); -} - - - -// The Cancel button was pressed. -void ContactPropertiesDialog::slotCancel() -{ - saveDialogSize("ContactPropertiesDialog"); - reject(); -} - - - -// The OK button was pressed. -void ContactPropertiesDialog::slotOk() -{ - saveDialogSize("ContactPropertiesDialog"); - ok_ = true; - accept(); -} - - -#include "contactpropertiesdialog.moc" diff --git a/kmess/dialogs/contactpropertiesdialog.h b/kmess/dialogs/contactpropertiesdialog.h deleted file mode 100644 index 9bafe3f..0000000 --- a/kmess/dialogs/contactpropertiesdialog.h +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************** - contactpropertiesdialog.h - description - ------------------- - begin : Sun Dec 15 2002 - copyright : (C) 2002 by Michael Curtis - email : magnalium@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 CONTACTPROPERTIESDIALOG_H -#define CONTACTPROPERTIESDIALOG_H - -#include -#include -#include - -// Forward declarations -class Contact; -class KLineEdit; -class QCheckBox; -class QLabel; - -/**The dialog for modifying contact properties (ContactExtension). - *@author Michael Curtis - */ - -class ContactPropertiesDialog : public KDialogBase -{ - Q_OBJECT - - public: - ContactPropertiesDialog(QWidget *parent=0, const char *name=0); - ~ContactPropertiesDialog(); - // Show the dialog and obtain the contact handle. - bool launch(Contact *contact); - - protected slots: // Protected slots - // The Cancel button was pressed. - void slotCancel(); - // The OK button was pressed. - void slotOk(); - - private: // Private methods - void applyChanges(); - void setupWidgets(); - // Get the location of a file from the user, using a KFile dialog - void chooseFile(KLineEdit *edit, QString wildcard); - - private slots: - // The alt name checkbox was toggled. - void alternativeNameCheckBoxToggled(bool checked); - // Choose a picture file (KFile dialog) - void choosePicture(); - // Choose a sound file (KFile dialog) - void chooseSound(); - // The online notification checkbox was toggled - void notifyOnlineCheckBoxToggled(bool checked); - - private: // Private attributes - // The checkbox showing whether or not to use the contact's alternative name - QCheckBox *alternativeNameCheckBox_; - // The contact to operate on - Contact *contact_; - // A label showing the contact's email address - QLabel *emailLabel_; - // The contact name line edit - KLineEdit *nameEdit_; - // The contact's true name label - QLabel *trueNameLabel_; - // The checkbox showing whether or not to notify this user if the contact goes on or offline - QCheckBox *notifyOnlineCheckBox_; - // Whether or not OK was pressed. - bool ok_; - // The picture file line edit - KLineEdit *pictureEdit_; - // The sound file line edit - KLineEdit *soundEdit_; - -}; - -#endif diff --git a/kmess/dialogs/transferentryinterface.ui b/kmess/dialogs/transferentryinterface.ui deleted file mode 100644 index 08bc246..0000000 --- a/kmess/dialogs/transferentryinterface.ui +++ /dev/null @@ -1,268 +0,0 @@ - -TransferEntryInterface - - - TransferEntryInterface - - - - 0 - 2 - 339 - 91 - - - - - 3 - 0 - 0 - 0 - - - - TransferEntryInterface - - - - unnamed - - - - layout8 - - - - unnamed - - - - iconLabel_ - - - - 0 - 0 - 0 - 0 - - - - - 48 - 48 - - - - - 48 - 48 - - - - AlignCenter - - - - - spacer2 - - - Vertical - - - MinimumExpanding - - - - 20 - 0 - - - - - - - - layout9 - - - - unnamed - - - - filenameLabel_ - - - - 2 - 5 - 0 - 0 - - - - - 200 - 0 - - - - - - progressBar_ - - - - 7 - 0 - 0 - 0 - - - - - 200 - 0 - - - - - 32767 - 18 - - - - 1000 - - - - - statusLabel_ - - - - 2 - 0 - 0 - 0 - - - - - - spacer3 - - - Vertical - - - MinimumExpanding - - - - 20 - 0 - - - - - - - - layout7 - - - - unnamed - - - - openLabel_ - - - - 1 - 5 - 0 - 0 - - - - Open - - - - - - - - - - - cancelLabel_ - - - - 1 - 5 - 0 - 0 - - - - Cancel - - - - - - - - spacer1 - - - Vertical - - - MinimumExpanding - - - - 20 - 0 - - - - - - - - - - openLabel_ - leftClickedURL() - TransferEntryInterface - openClicked() - - - cancelLabel_ - leftClickedURL() - TransferEntryInterface - cancelClicked() - - - - openClicked() - cancelClicked() - - - - ksqueezedtextlabel.h - kprogress.h - ksqueezedtextlabel.h - kurllabel.h - kurllabel.h - - diff --git a/kmess/dialogs/transferwindowinterface.ui b/kmess/dialogs/transferwindowinterface.ui deleted file mode 100644 index 2a7fb04..0000000 --- a/kmess/dialogs/transferwindowinterface.ui +++ /dev/null @@ -1,107 +0,0 @@ - -TransferWindowInterface - - - TransferWindowInterface - - - - 0 - 0 - 402 - 155 - - - - - 3 - 3 - 0 - 0 - - - - TransferWindowInterface - - - - unnamed - - - - frame_ - - - - 3 - 3 - 0 - 0 - - - - - 380 - 100 - - - - - - layout6 - - - - unnamed - - - - spacer5 - - - Horizontal - - - Expanding - - - - 91 - 21 - - - - - - cleanUpButton_ - - - Cl&ean up - - - Alt+E - - - - - closeButton_ - - - &Close - - - Alt+C - - - true - - - true - - - - - - - - diff --git a/kmess/eventsrc b/kmess/eventsrc deleted file mode 100644 index ddab872..0000000 --- a/kmess/eventsrc +++ /dev/null @@ -1,41 +0,0 @@ -[!Global!] -Name=kmess -IconName=kmess -Comment=KMess Messenger Client - -[contact online] -Name=Contact Online -Comment=A contact has come online -default_sound=kmess_logon.ogg -default_presentation=1 - -[contact status] -Name=Contact Status -Comment=A contact has changed its MSN status -default_sound=kmess_logon.ogg -default_presentation=0 - -[contact offline] -Name=Contact Offline -Comment=A contact has gone offline -default_sound=kmess_logoff.ogg -default_presentation=1 - -[chat start] -Name=Chat Start -Comment=A contact has started a chat with you -default_sound=kmess_chat.ogg -default_presentation=65 - - -[new message] -Name=New Message -Comment=You received a message from a contact -default_sound=kmess_chat.ogg -default_presentation=65 - -[new email] -Name=New Email -Comment=You have received a new email -default_sound=kmess_msg.ogg -default_presentation=1 diff --git a/kmess/grouplistviewitem.cpp b/kmess/grouplistviewitem.cpp deleted file mode 100644 index 187611e..0000000 --- a/kmess/grouplistviewitem.cpp +++ /dev/null @@ -1,440 +0,0 @@ -/*************************************************************************** - grouplistviewitem.cpp - description - ------------------- - begin : Fri Mar 28 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 "grouplistviewitem.h" - -#include -#include -#include - -#include -#include -#include -#include - - -#include "contactlistviewitem.h" -#include "kmessdebug.h" -#include "specialgroups.h" -#include "contact/contact.h" -#include "contact/group.h" - -#ifdef KMESSDEBUG_GROUPLISTVIEWITEM -#define KMESSDEBUG_GROUPLISTVIEWITEM_GENERAL -#endif - - -// The constructor -GroupListViewItem::GroupListViewItem(QListView *parent, Group *group) - : QObject(0, "listItem"), - KMessListViewItem( parent ), - group_(group), - moveAction_(0), - copyAction_(0), - noContactsOnline_(0) -{ - // Do general construction - construct(); -} - - - -// The constructor -GroupListViewItem::GroupListViewItem(QListViewItem *parent, Group *group) - : QObject(0, "listItem"), - KMessListViewItem( parent ), - group_(group), - moveAction_(0), - copyAction_(0), - noContactsOnline_(0) -{ - // Do general construction - construct(); -} - - - -// The destructor -GroupListViewItem::~GroupListViewItem() -{ - if(moveAction_ != 0) - { - moveAction_->unplugAll(); - delete moveAction_; - } - if(copyAction_ != 0) - { - copyAction_->unplugAll(); - delete copyAction_; - } -} - - - -// Add a new contact item -ContactListViewItem * GroupListViewItem::addContactItem(Contact *contact) -{ - ContactListViewItem *item = new ContactListViewItem(this, contact); - - if(! group_->isSpecialGroup()) - { - // Update counters - if(item->getContact()->isOnline()) - { - noContactsOnline_++; - } - - // Attach to signals to update the counters - connect(contact, SIGNAL(contactOffline(Contact*,bool)), this, SLOT(slotContactOffline())); - connect(contact, SIGNAL(contactOnline(Contact*,bool)), this, SLOT(slotContactOnline())); - } - - // Update the counter text - slotUpdateAppearance(); - - // Return for further processing - return item; -} - - - -// // Compare -// int GroupListViewItem::compare( QListViewItem *item, int col, bool asc) const -// { -// #ifdef KMESSTEST -// ASSERT( dynamic_cast(item) != 0 ); -// #endif -// -// GroupListViewItem *that; -// -// int thatType = static_cast(item) -> getType(); -// int result; -// -// -// // Determine the sorting based on the object type. -// if(thatType == LISTTYPE_GROUP) -// { -// return 0; // FIXME -// that = static_cast(item); -// -// #ifdef KMESSTEST -// ASSERT( dynamic_cast(item) != 0 ); -// ASSERT( this->group_ != 0 ); -// ASSERT( that->group_ != 0 ); -// #endif -// -// if(this->group_ == 0 && that->group_ == 0) return 0; -// if(this->group_ == 0) return -1; -// if(that->group_ == 0) return 1; -// -// result = that->group_->getSortPosition() - this->group_->getSortPosition(); -// } -// else -// { -// // Groups -// result = KMessListViewItem::compare(item, col, asc); -// } -// -// -// // Return the correct value for the sorting algorithm. -// if(result < 0) return -1; // "this" is smaller then "that" -// if(result > 0) return 1; // "this" is greater then "that" -// return 0; // "this" and "that" are equal. -// } - - - -// Do general construction -void GroupListViewItem::construct() -{ - // Set default settings - setExpandable(true); - - // Create the popupmenu action - if(! group_->isSpecialGroup()) - { - moveAction_ = new KAction(); - connect(moveAction_, SIGNAL(activated()), this, SLOT(slotForwardActivated())); - copyAction_ = new KAction(); - connect(copyAction_, SIGNAL(activated()), this, SLOT(slotForwardCopyActivated())); - } - - // Attach group signals - connect( group_, SIGNAL(nameChanged() ), // The name changed - this, SLOT(slotUpdateAppearance() ) ); - connect( group_, SIGNAL(sortPositionChanged() ), // The sort position changed - this, SLOT(slotUpdateAppearance() ) ); - connect( group_, SIGNAL(expandedStateChanged() ), // The expanded state changed - this, SLOT(slotUpdateAppearance() ) ); - - // Call the event manually this time, to update the appearance. - slotUpdateAppearance(); -} - - - -// Called to signal that the contactitem will be removed from this group. -void GroupListViewItem::detachContactItem(ContactListViewItem *item) -{ - Contact *contact; - - if(! group_->isSpecialGroup()) - { -#ifdef KMESSDEBUG_GROUPLISTVIEWITEM_GENERAL - kdDebug() << "GroupListViewItem::detachContactItem: is online: " << item->getContact()->isOnline() << endl; -#endif - - contact = item->getContact(); - if(contact->isOnline()) - { - noContactsOnline_--; - } - - // Detach to signals that update the counters - disconnect(contact, SIGNAL(contactOffline(Contact*,bool)), this, SLOT(slotContactOffline())); - disconnect(contact, SIGNAL(contactOnline(Contact*,bool)), this, SLOT(slotContactOnline())); - } - - // Update the item count text - slotUpdateAppearance(); -} - - - -// Return the group -Group * GroupListViewItem::getGroup() const -{ - return group_; -} - - - -// Return the KAction object to be used in the move-contact menu (and null if it's not possible) -KAction * GroupListViewItem::getMoveAction() const -{ - return moveAction_; -} - - - -// Return the KAction object to be used in the copy-contact-to-group menu -KAction * GroupListViewItem::getCopyAction() const -{ - return copyAction_; -} - - - -// Return the tooltip text. -QString GroupListViewItem::getToolTipText() const -{ - return QString::null; -} - - - -// Return the type ID -int GroupListViewItem::getType() const -{ - return LISTTYPE_GROUP; -} - - - -// Update the contacts online/offline count -void GroupListViewItem::recountContacts() -{ -#ifdef KMESSDEBUG_GROUPLISTVIEWITEM_GENERAL - kdDebug() << "GroupListViewItem: Recounting contacts of group " << group_->getId() << endl; -#endif - - /* - * The slotContactOffline/slotContactOnline slots are - * not activated when a contact is removed from the friends-list. - * Before they receive their signals, they are already - * detached using detachContactItem(). - * That's why this code is required. - */ - - if(! group_->isSpecialGroup()) - { - QListViewItem *item = firstChild(); - ContactListViewItem *contactItem; - int type; - - noContactsOnline_ = 0; - - while(item != 0) - { - // Check for the given type - type = static_cast( item )->getType(); - if(type == KMessListViewItem::LISTTYPE_CONTACT) - { - // Check whether the object references the contact. - contactItem = static_cast( item ); - - if(contactItem->getContact()->isOnline()) - { - noContactsOnline_++; - } - } - item = item->nextSibling(); - } - } - - slotUpdateAppearance(); -} - - - -// Update the online/offline counters -void GroupListViewItem::slotContactOffline() -{ -#ifdef KMESSDEBUG_GROUPLISTVIEWITEM_GENERAL - kdDebug() << "GroupListViewItem: contact went offline in group " << group_->getId() << endl; -#endif - - noContactsOnline_--; - slotUpdateAppearance(); -} - - - -// Update the online/offline counters -void GroupListViewItem::slotContactOnline() -{ -#ifdef KMESSDEBUG_GROUPLISTVIEWITEM_GENERAL - kdDebug() << "GroupListViewItem: contact went online in group " << group_->getId() << endl; -#endif - - noContactsOnline_++; - slotUpdateAppearance(); -} - - - -// Forward when moveAction_ is activated -void GroupListViewItem::slotForwardActivated() -{ - emit moveToGroup(group_); -} - - -void GroupListViewItem::slotForwardCopyActivated() -{ - emit copyToGroup(group_); -} - - -// Update the appearance of the item -void GroupListViewItem::slotUpdateAppearance() -{ - KIconLoader *loader = KGlobal::iconLoader(); - QString sortPrefix; - QString iconName; - QString imageFile; - int imageSize; - QString name = group_->getName(); - QString htmlName = QStyleSheet::escape(name); - QString fullText; - bool isExpanded = group_->isExpanded(); - - // Set the KAction text - if(moveAction_ != 0) - { - moveAction_->setText(group_->getName()); - } - if(copyAction_ != 0) - { - copyAction_->setText(group_->getName()); - } - - // Determine the icon and sorting index - if(group_->getId() == SpecialGroups::ONLINE) - { - sortPrefix = "bb "; - iconName = "folder_green"; - } - else if(group_->getId() == SpecialGroups::OFFLINE) - { - sortPrefix = "cc "; - iconName = "folder_green"; - } - else if(group_->getId() == SpecialGroups::ALLOWED) - { - sortPrefix = "dd "; - iconName = "folder_orange"; - } - else if(group_->getId() == SpecialGroups::REMOVED) - { - sortPrefix = "ee "; - iconName = "folder_orange"; - } - else - { - // Normal group - sortPrefix.sprintf("aa%02d ", group_->getSortPosition()); - iconName = "folder_green"; - } - - - // Open for expanded items - if(isExpanded && childCount() > 0) - { - iconName += "_open"; - } - - - // Include the image to the text - imageFile = loader->iconPath(iconName, KIcon::Small, false); - imageSize = loader->currentSize(KIcon::Small); - - if(! imageFile.isEmpty()) - { - fullText = QString(" ") - .arg(imageFile).arg(imageSize).append(htmlName); - } - else - { - fullText = htmlName; - } - - // Append the contact online/offline count status. - if(group_->isSpecialGroup()) - { - fullText += " (" + QString::number(childCount()) + ")"; - } - else - { - fullText += " (" + QString::number(noContactsOnline_) + "/" + QString::number(childCount()) + ")"; - } - - setText( fullText ); - - - // Set the sort text - // FIXME: remove this if the "QListViewItem::compare" method works. - setKey( sortPrefix + name ); - resortParent(); - - setOpen(isExpanded); -} - - -#include "grouplistviewitem.moc" diff --git a/kmess/grouplistviewitem.h b/kmess/grouplistviewitem.h deleted file mode 100644 index bcf2fc9..0000000 --- a/kmess/grouplistviewitem.h +++ /dev/null @@ -1,108 +0,0 @@ -/*************************************************************************** - grouplistviewitem.h - description - ------------------- - begin : Fri Mar 28 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 GroupListViewItem_H -#define GroupListViewItem_H - -#include "kmesslistviewitem.h" - -#include - - -// Forward declarations -class Contact; -class Group; -class QString; -class QListView; -class QListViewItem; -class ContactListViewItem; -class KAction; - - -/** - * @brief Group node of the contact list window - * - * The contact list uses a Model-Viewer-Controller model. - * The Group class signals what something has changed, this view updates itself in the slots. - * - * @author Mike K. Bennett - * @ingroup Root - */ -class GroupListViewItem : public QObject, public KMessListViewItem -{ - Q_OBJECT - - public: - // The constructor - GroupListViewItem(QListView *parent, Group *group); - // The constructor - GroupListViewItem(QListViewItem *parent, Group *group); - // The destructor - virtual ~GroupListViewItem(); - - // Add a new contact item - ContactListViewItem *addContactItem(Contact *contact); -// // Compare -// virtual int compare( QListViewItem *item, int column, bool ascending ) const; - // Called to signal that the contactitem will be removed from this group. - void detachContactItem(ContactListViewItem *item); - // Return the group - Group * getGroup() const; - // Return the KAction object to be used in the copy-contact-to-group menu - KAction *getCopyAction() const; - // Return the KAction object to be used in the move-contact menu (and null if it's not possible) - KAction *getMoveAction() const; - // Return the tooltip text. - QString getToolTipText() const; - // Return the type of the item - int getType() const; - // Update the contacts online/offline count - void recountContacts(); - - private: // Private methods - // Do general construction - void construct(); - - private slots: - // Update the online/offline counters - void slotContactOffline(); - // Update the online/offline counters - void slotContactOnline(); - // Forward when moveAction_ is activated - void slotForwardActivated(); - // Forward when copyAction_ is activated - void slotForwardCopyActivated(); - // Update the appearance of the item - void slotUpdateAppearance(); - - private: // Private attributes - // The group to embed. - Group *group_; - // The action to handle - KAction *moveAction_; - KAction *copyAction_; - // The number of contacts online - int noContactsOnline_; - - signals: - void moveToGroup(Group *group); - void copyToGroup(Group* group); -}; - -#endif diff --git a/kmess/hi128-app-kmess.png b/kmess/hi128-app-kmess.png deleted file mode 100644 index ea267dd..0000000 Binary files a/kmess/hi128-app-kmess.png and /dev/null differ diff --git a/kmess/hi16-app-kmess.png b/kmess/hi16-app-kmess.png deleted file mode 100644 index bb8c43e..0000000 Binary files a/kmess/hi16-app-kmess.png and /dev/null differ diff --git a/kmess/hi22-app-kmess.png b/kmess/hi22-app-kmess.png deleted file mode 100644 index add9672..0000000 Binary files a/kmess/hi22-app-kmess.png and /dev/null differ diff --git a/kmess/hi32-app-kmess.png b/kmess/hi32-app-kmess.png deleted file mode 100644 index eba5574..0000000 Binary files a/kmess/hi32-app-kmess.png and /dev/null differ diff --git a/kmess/hi48-app-kmess.png b/kmess/hi48-app-kmess.png deleted file mode 100644 index 00d52ed..0000000 Binary files a/kmess/hi48-app-kmess.png and /dev/null differ diff --git a/kmess/hi64-app-kmess.png b/kmess/hi64-app-kmess.png deleted file mode 100644 index ce3257a..0000000 Binary files a/kmess/hi64-app-kmess.png and /dev/null differ diff --git a/kmess/initialview.cpp b/kmess/initialview.cpp deleted file mode 100644 index 8a40b6a..0000000 --- a/kmess/initialview.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/*************************************************************************** - initialview.cpp - description - ------------------- - begin : Sun Jan 12 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 "initialview.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "account.h" -#include "kmessdebug.h" - - -// The constructor -InitialView::InitialView(QWidget *parent, const char *name ) - : InitialViewInterface(parent, name) -{ - // Set the username box with the last used email address - config_ = kapp->config(); - config_->setGroup( "InitialView" ); - defaultHandle_ = config_->readEntry( "defaultHandle", "me@hotmail.com" ); - - // Enable auto completion - handleCombobox_->setCompletionMode( KGlobalSettings::CompletionPopup ); - - // Select an image to load into the main screen.. mmmm, eggs! - // Applied both in InitialView and AutologinView. - QString imageName; - QDate currentDate = QDate::currentDate(); - if( currentDate.month() == 12 && currentDate.day() > 15 ) - { - imageName = "kmesslogo2"; - } - else - { - imageName = "kmesslogo"; - } - - // Load the chosen icon - KIconLoader *loader = KGlobal::iconLoader(); - QPixmap icon = loader->loadIcon( imageName, KIcon::User ); - kmessLogo_->setPixmap( icon ); - kmessLogo_->setMinimumSize( icon.width(), icon.height() ); - - connectButton_->setIconSet( QIconSet( loader->loadIcon( "connect_creating", KIcon::NoGroup, KIcon::SizeMedium ) ) ); - - // Add the items to the initial status combo box - QStringList statuses; - statuses << i18n("Online") - << i18n("Away") - << i18n("Be Right Back") - << i18n("Busy") - << i18n("Out to Lunch") - << i18n("On the Phone") - << i18n("Invisible"); - initialStatus_->insertStringList( statuses ); -} - - - -// The destructor -InitialView::~InitialView() -{ -#ifdef KMESSDEBUG_INITIALVIEW - kdDebug() << "DESTROYED InitialView" << endl; -#endif -} - - - -// Add an account to the list of displayed accounts from which the user can choose -void InitialView::addAccount(Account *account) -{ - const QString &handle = account->getHandle(); - - // Add account to internal list - accounts_.insert( handle, account ); - - // Add an entry for the account to the dropdown list - handleCombobox_->insertItem( handle ); // + " (" + account->getFriendlyName() + ")" ); - handleCombobox_->completionObject()->addItem( handle ); - - // Select the account in the combobox if it's the default account. - if( handle == defaultHandle_ ) - { - handleCombobox_->setCurrentItem( defaultHandle_ ); - updateView(); - } -} - - - -// Modify an account in the list of displayed accounts from which the user can choose -void InitialView::changedAccount( QString oldName, QString newName ) -{ - if( accounts_[ oldName ] == 0 ) - { - return; - } - - Account *account = accounts_[ oldName ]; - accounts_.remove( oldName ); - accounts_.insert( newName, account ); - - // Change completion box entry - handleCombobox_->completionObject()->removeItem( oldName ); - handleCombobox_->completionObject()->addItem( newName ); - - // Remove account from qcombobox - bool foundItem = false; - for( int i = 0; i < handleCombobox_->count(); i++ ) - { - if( handleCombobox_->text(i).lower() == oldName.lower() ) - { - handleCombobox_->removeItem(i); - foundItem = true; - break; - } - } - handleCombobox_->insertItem( newName ); - - if( ! foundItem ) - { - kdWarning() << "InitialView::changedAccount() - Account not found in pulldown list!" << endl; - } -} - - - -// The "connect" button was pressed. -void InitialView::connectToMsn() -{ - QString handle = getSelectedHandle(); - - // Avoid connecting with empty fields - if( handle.isEmpty() || passwordEdit_->text().isEmpty() ) - { - return; - } - - // Save the entered text - config_->setGroup( "InitialView" ); - config_->writeEntry( "defaultHandle", handle ); - - // Update the initial status - QString initialStatus = initialStatus_->currentText(); - if( initialStatus == i18n("Away") ) - { // Change status to AWAY - initialStatus = "AWY"; - } - else if( initialStatus == i18n("Be Right Back") ) - { // Change status to BE RIGHT BACK - initialStatus = "BRB"; - } - else if( initialStatus == i18n("Busy") ) - { // Change status to BUSY - initialStatus = "BSY"; - } - else if( initialStatus == i18n("Invisible") ) - { // Change status to INVISIBLE - initialStatus = "HDN"; - } - else if( initialStatus == i18n("Out to Lunch") ) - { // Change status to OUT TO LUNCH - initialStatus = "LUN"; - } - else if( initialStatus == i18n("On the Phone") ) - { // Change status to ON THE PHONE - initialStatus = "PHN"; - } - else - { // Change status to ONLINE - initialStatus = "NLN"; - } - - // Inform parent with the account information - emit connectWithAccount( handle, passwordEdit_->text(), rememberCheckBox_->isChecked(), initialStatus ); -} - - - -// The account was deleted -void InitialView::deleteAccount(Account *account) -{ - // Remove account from hashmap. - QString handle = account->getHandle(); - accounts_.remove(handle); - - // Remove account from completionbox (extended qlistbox) - handleCombobox_->completionObject()->removeItem( handle ); - - // Remove account from qcombobox - bool foundItem = false; - for( int i = 0; i < handleCombobox_->count(); i++ ) - { - if( handleCombobox_->text(i).lower() == handle.lower() ) - { - handleCombobox_->removeItem(i); - foundItem = true; - break; - } - } - - if( ! foundItem ) - { - kdWarning() << "InitialView::deleteAccount: Account not found in pulldown list!" << endl; - } -} - - - -// Get the currently selected handle -QString InitialView::getSelectedHandle() const -{ - // Get handle, remove appended friendlyname if present - QString handle = handleCombobox_->currentText(); - if( handle.contains(' ') ) - { - handle = handle.section(' ', 0, 0); - } - return handle.lower(); -} - - - -// A profile was selected from the drop-down list, or written manually. -void InitialView::updateView() -{ - Account *account = accounts_[ getSelectedHandle() ]; - if( account != 0 ) - { - // User typed the full account name without using autocompletion. - passwordEdit_->setText( account->getPassword() ); - rememberCheckBox_->setChecked( ! account->isGuestAccount() ); - - // Make sure the drop down list matches the user's initial status - int item; - QString status = account->getInitialStatus(); - if ( status == "AWY" ) - { // Change status to AWAY - item = 1; - } - else if( status == "BRB" ) - { // Change status to BE RIGHT BACK - item = 2; - } - else if( status == "BSY" ) - { // Change status to BUSY - item = 3; - } - else if( status == "LUN" ) - { // Change status to OUT TO LUNCH - item = 4; - } - else if( status == "PHN" ) - { // Change status to ON THE PHONE - item = 5; - } - else if( status == "HDN" ) - { // Change status to INVISIBLE - item = 6; - } - else - { // Change status to ONLINE - item = 0; - } - initialStatus_->setCurrentItem( item ); - } - else - { - // User typed a new account name - // Clear password again - passwordEdit_->setText( QString::null ); - rememberCheckBox_->setChecked( false ); - initialStatus_->setCurrentItem( 0 ); - } - - // Put the attention back to the email field - handleCombobox_->setFocus(); -} - - -#include "initialview.moc" diff --git a/kmess/initialview.h b/kmess/initialview.h deleted file mode 100644 index b216fda..0000000 --- a/kmess/initialview.h +++ /dev/null @@ -1,80 +0,0 @@ -/*************************************************************************** - initialview.h - description - ------------------- - begin : Sun Jan 12 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 INITIALVIEW_H -#define INITIALVIEW_H - -#include -#include - -#include "initialviewinterface.h" - -// Forward declarations -class Account; -class KConfig; - -/** - * @brief The login widget. - * - * Users can login by selecting an existing account, or entering their username/password directly. - * When the login starts, the AutoLoginView widget is displayed in the main window. - * This class implements the events defined in the inherited user interface class. - * - * @author Mike K. Bennett - * @ingroup Root - */ -class InitialView : public InitialViewInterface -{ - Q_OBJECT - - public: - // The constructor - InitialView(QWidget *parent=0, const char *name=0); - // The destructor - ~InitialView(); - // Add an account to the list of displayed accounts from which the user can choose - void addAccount(Account *account); - // Modify an account in the list of displayed accounts from which the user can choose - void changedAccount( QString oldName, QString newName ); - // The account was deleted - void deleteAccount(Account *account); - - public slots: // Public slots - // A profile was selected from the drop-down list, or written manually. - void updateView(); - - private slots: - // The "connect" button was pressed. - void connectToMsn(); - // Get the currently selected handle - QString getSelectedHandle() const; - - - private: // Private attributes - // The list of accounts to choose from - QDict accounts_; // QString keys, Account* values - // The application's configuration file - KConfig *config_; - // The default handle to display - QString defaultHandle_; - - signals: // Public signals - // Connect with the given account - void connectWithAccount( QString handle, QString password, bool rememberAccount, QString initialStatus ); -}; - -#endif diff --git a/kmess/initialviewinterface.ui b/kmess/initialviewinterface.ui deleted file mode 100644 index 9a4f77f..0000000 --- a/kmess/initialviewinterface.ui +++ /dev/null @@ -1,1478 +0,0 @@ - -InitialViewInterface - - - InitialViewInterface - - - - 0 - 0 - 421 - 517 - - - - - 85 - 170 - 255 - - - - InitialViewInterface - - - - unnamed - - - - Layout26 - - - - unnamed - - - 0 - - - 6 - - - - Spacer22 - - - Vertical - - - Fixed - - - - 20 - 10 - - - - - - Spacer23 - - - Vertical - - - Fixed - - - - 20 - 10 - - - - - - Spacer25 - - - Horizontal - - - Expanding - - - - 20 - 0 - - - - - - kmessLogo_ - - - - 0 - 0 - 0 - 0 - - - - - 64 - 64 - - - - false - - - AlignVCenter - - - - - Spacer24 - - - Horizontal - - - Expanding - - - - 20 - 0 - - - - - - - - Frame5 - - - - 0 - 0 - - - - - 255 - 255 - 255 - - - - StyledPanel - - - Sunken - - - 2 - - - 6 - - - - unnamed - - - - TextLabel3_2 - - - - 0 - 0 - 0 - - - - Enter your login information: - - - - - Spacer1_2 - - - Vertical - - - Fixed - - - - 16 - 16 - - - - - - TextLabel2 - - - - 0 - 0 - 0 - - - - Email address - - - - - handleCombobox_ - - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 229 - 229 - 229 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - - true - - - false - - - - - TextLabel3 - - - - 0 - 0 - 0 - - - - Password - - - - - passwordEdit_ - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 229 - 229 - 229 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - - Password - - - - - spacer9 - - - Vertical - - - Fixed - - - - 16 - 16 - - - - - - TextLabel3_3 - - - - 0 - 0 - 0 - - - - Status at login - - - - - initialStatus_ - - - - - rememberCheckBox_ - - - - 0 - 0 - 0 - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 229 - 229 - 229 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 58 - 137 - 201 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - - Remem&ber this profile - - - Alt+B - - - - - spacer10 - - - Vertical - - - Fixed - - - - 16 - 16 - - - - - - layout20 - - - - unnamed - - - - Spacer20 - - - Horizontal - - - Expanding - - - - 60 - 16 - - - - - - connectButton_ - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 229 - 229 - 229 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 85 - 170 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 128 - 128 - 128 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 85 - 170 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - 204 - 204 - 204 - - - 255 - 255 - 255 - - - 234 - 234 - 234 - - - 102 - 102 - 102 - - - 136 - 136 - 136 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 85 - 170 - 255 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - - TabFocus - - - - - - false - - - true - - - Connect - - - - - Spacer21 - - - Horizontal - - - Expanding - - - - 60 - 16 - - - - - - - - Spacer13 - - - Vertical - - - Expanding - - - - 20 - 70 - - - - - - - - - - connectButton_ - clicked() - InitialViewInterface - connectToMsn() - - - handleCombobox_ - textChanged(const QString&) - InitialViewInterface - updateView() - - - passwordEdit_ - returnPressed() - InitialViewInterface - connectToMsn() - - - handleCombobox_ - returnPressed() - passwordEdit_ - setFocus() - - - handleCombobox_ - returnPressed() - InitialViewInterface - connectToMsn() - - - - handleCombobox_ - passwordEdit_ - initialStatus_ - rememberCheckBox_ - connectButton_ - - - connectToMsn() - updateView() - - - - kcombobox.h - klineedit.h - - diff --git a/kmess/kmess.cpp b/kmess/kmess.cpp deleted file mode 100644 index fbd1cb1..0000000 --- a/kmess/kmess.cpp +++ /dev/null @@ -1,2067 +0,0 @@ -/*************************************************************************** - kmess.cpp - description - ------------------- - begin : Sun Jan 5 15:18:36 CST 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 "kmess.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if KDE_IS_VERSION(3,2,0) -#include -#else -#include -#endif - -#include "actions/accountaction.h" -#include "chat/chatmaster.h" -#include "chat/chatwindow.h" -#include "contact/contact.h" -#include "contact/contactlist.h" -#include "contact/group.h" -#include "dialogs/contactaddeduserdialoginterface.h" -#include "dialogs/contactaddeduserdialog.h" -#include "dialogs/awaymessagedialog.h" -#include "dialogs/networkwindow.h" -#include "dialogs/transferwindow.h" -#include "network/msnnotificationconnection.h" -#include "notification/passivepopupinterface.h" -#include "notification/notificationmanager.h" -#include "notification/notificationchat.h" -#include "notification/notificationcontactstatus.h" -#include "notification/notificationnewemail.h" -#include "settings/settingsdialog.h" -#include "account.h" -#include "autologinview.h" -#include "currentaccount.h" -#include "emoticonmanager.h" -#include "idletimer.h" -#include "initialview.h" -#include "kmessdebug.h" -#include "kmessinterface.h" -#include "kmessview.h" -#include "nowlisteningclient.h" -#include "systemtraywidget.h" - - - -// The constructor -KMess::KMess(QWidget *parent, const char *name) - : KMessInterface(parent, name), - autologinView_(0), - chatMaster_(0), - notificationChat_(0), - notificationContactStatus_(0), - notificationNewEmail_(0), - currentStatus_("FLN"), - idleTimer_(0), - initialized_(false), - initialView_(0), - nowListeningClient_(0), - msnNotificationConnection_(0), - view_(0) -{ - -} - - - -// The destructor -KMess::~KMess() -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess destructor: shutting down KMess..." << endl; -#endif - - Account *account; - - /* - * The destructor is called after closeEvent(), - * when KMess is quit by the user. - * - * If the KDE session ends, the destructor won't be called. - * only saveProperties() will be called, and the execution ends. - */ - - - // Saving properties manually. - saveProperties( kapp->config() ); - - // Delete all chat windows - if(chatMaster_ != 0) - { - chatMaster_->disconnected(); - chatMaster_->deleteLater(); - chatMaster_ = 0; - } - - // Disconnect main connection so views can clean up/save properties. - if(msnNotificationConnection_->isConnected()) - { - // Make sure KMess::disconnected() does attempt to update - // the user interface when we're trying to kill it - disconnect(msnNotificationConnection_, SIGNAL(disconnected()), this, SLOT(disconnected()) ); - - // This also destroys all contacts - msnNotificationConnection_->closeConnection(); - } - - // Delete other created objects - delete idleTimer_; - delete view_; - delete initialView_; - delete autologinView_; - delete notificationChat_; - delete notificationContactStatus_; - delete notificationNewEmail_; - delete nowListeningClient_; - delete msnNotificationConnection_; - CurrentAccount::destroy(); - TransferWindow::destroy(); - - // Delete the accounts - for ( account = accounts_.first(); account; account = accounts_.next() ) - { - delete account; - } -#ifdef KMESSDEBUG_KMESS - kdDebug() << "DESTROYED KMess" << endl; -#endif -} - - - -// The account changed it's status to invisible -void KMess::accountInvisible() -{ - // Disable the now listening detection - nowListeningClient_->setEnabled( false ); - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess: account went invisible, disabled now listening detection." << endl; -#endif -} - - - -// The account changed it's status to offline -void KMess::accountOffline() -{ - // Disable the now listening detection - nowListeningClient_->setEnabled( false ); - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess: account went offline, disabled now listening detection." << endl; -#endif -} - - - -// The account changed it's status to online -void KMess::accountOnline() -{ - // Enable the now listening detection if needed. - nowListeningClient_->setEnabled( currentAccount_->getShowNowListening() ); - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess: account went online. Now listening is " - << ( currentAccount_->getShowNowListening() ? "enabled" : "disabled") << "." << endl; -#endif -} - - - -// Add the account and create the GUI elements -void KMess::addAccount(Account *account) -{ - AccountAction *accountAction; - QString handle = account->getHandle(); - - // Append account - accounts_.append(account); - - // Make the action for the "Connect..." menu - accountAction = new AccountAction( account, this, account->getHandle() ); - connectActionMenu_->insert( accountAction ); - connectMenuItems_.insert( handle, accountAction ); - - connect( accountAction, SIGNAL( activated(Account*) ), - this, SLOT ( connectWithAccount(Account*) ) ); - - - // Make the action for the "Settings..." menu - accountAction = new AccountAction( account, this, account->getHandle() ); - settingsActionMenu_->insert( accountAction ); - settingsMenuItems_.insert( handle, accountAction ); - - connect( accountAction, SIGNAL( activated(Account*) ), - this, SLOT ( showSettingsForAccount(Account*) ) ); - - - // Add the account to the initial view's dropdown list. - initialView_->addAccount( account ); -} - - - -// "Add a new contact" was selected from the menu. -void KMess::addNewContact() -{ -#ifdef KMESSTEST - ASSERT( msnNotificationConnection_ != 0 ); -#endif -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::addNewContact()" << endl; -#endif - QString newHandle; - bool okPressed = false; - - // Launch a dialog to get a new group name -#if KDE_IS_VERSION(3,2,0) - newHandle = KInputDialog::getText(i18n("Add a contact"), - i18n("Enter the email address of the person you wish to add:"), - newHandle, &okPressed, this); -#else - newHandle = KLineEditDlg::getText(i18n("Add a contact"), - i18n("Enter the email address of the person you wish to add:"), - newHandle, &okPressed, this); -#endif - - if( ! okPressed ) - { - return; - } - - // Check if the handle is valid, or we'll get server errors. - if( ! isValidEmail( newHandle ) ) - { - KMessageBox::error( 0, i18n( "The contact address you have entered is not valid: '%1'").arg( newHandle ) ); - return; - } - - // Ask the server to add the contact - msnNotificationConnection_->addNewContact(newHandle); -} - - - -// "Add a new group" was selected from the menu. -void KMess::addNewGroup() -{ -#ifdef KMESSTEST - ASSERT( msnNotificationConnection_ != 0 ); -#endif -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::addNewGroup()" << endl; -#endif - QString newGroupName; - bool okPressed = false; - - // Set a default group name - newGroupName = "New Group"; - - // Launch a dialog to get a new group name -#if KDE_IS_VERSION(3,2,0) - newGroupName = KInputDialog::getText(i18n("Add a group"), - i18n("Enter the new name for this group:"), - newGroupName, &okPressed, this); -#else - newGroupName = KLineEditDlg::getText(i18n("Add a group"), - i18n("Enter the new name for this group:"), - newGroupName, &okPressed, this); -#endif - - if(okPressed) - { - // Ask the server to add the group - msnNotificationConnection_->addGroup( newGroupName ); - } -} - - - -// The application is closing, after queryExit() was approved -void KMess::applicationClosing() -{ - if(chatMaster_ != 0) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::applicationClosing: destroying chat master" << endl; -#endif - - // Close the chat windows earlier, so logs are saved. - chatMaster_->disconnected(); - chatMaster_->deleteLater(); - chatMaster_ = 0; - } - - // Save the account settings before exiting - if( msnNotificationConnection_->isConnected() ) - { - currentAccount_->saveProperties( kapp->config() ); - } -} - - - -// An account's settings have been changed -void KMess::changedAccountSettings( Account *account, QString oldHandle, QString oldFriendlyName ) -{ - QString newHandle = account->getHandle(); - - // We're saving settings for a new account - if( accounts_.contains( account ) == 0 ) - { - - // Make sure the account handle was changed off the default - if( ! newHandle.isEmpty() && newHandle != i18n( "you@hotmail.com" ) && isValidEmail( newHandle ) ) - { - // Avoid recognizing the new account handle and friendly name as changed, - // since that would mean changing an entry which doesn't exists yet. - oldHandle = newHandle; - oldFriendlyName = account->getFriendlyName(); - - // Add the account to the account list. - addAccount(account); - } - else if( ! newHandle.isEmpty() && ! isValidEmail( newHandle ) ) - { - KMessageBox::error( 0, i18n( "The contact address you have entered is not valid: '%1'").arg( newHandle ) ); - delete account; - return; - } - else - { - // The account wasn't changed, so delete it. - delete account; - return; - } - } - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::changedAccountSettings() - Saving settings for " << account->getHandle() << endl; -#endif -#ifdef KMESSTEST - ASSERT( msnNotificationConnection_ != 0 ); -#endif - - bool isCurrentAccount = false; - bool isConnectedCurrentAccount = false; - - if ( msnNotificationConnection_ != 0 ) - { - isCurrentAccount = ( oldHandle == currentAccount_->getHandle() ); - isConnectedCurrentAccount = ( isCurrentAccount && msnNotificationConnection_->isConnected() ); - } - - // If the account matches the current account.. - if( isCurrentAccount ) - { - // If the friendly name was changed, ask the server to change it - if ( account->isVerified() && account->getFriendlyName() != oldFriendlyName ) - { - msnNotificationConnection_->changeFriendlyName( account->getFriendlyName() ); - } - - // Copy the account settings to the current account -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::changedAccountSettings() - Copying modified Account settings to CurrentAccount." << endl; -#endif - currentAccount_->copyAccount( account ); - } - - // If the account is set to use autologin, make sure that all other accounts are not - if( ! account->isDeleted() && account->getUseAutologin() ) - { - QPtrListIterator it(accounts_); - while ( it.current() != 0 ) - { - // For each account that is not the account just changed... - if ( it.current() != account ) - { - it.current()->setUseAutologin( false ); - } - ++it; - } - } - - // Change the account name in the UI when it's been changed - if( oldHandle != newHandle ) - { - // Remove from connect menu. - connectActionMenu_->remove( connectMenuItems_[ oldHandle ] ); - connectMenuItems_.remove( oldHandle ); - - // Remove from settings menu. - settingsActionMenu_->remove( settingsMenuItems_[ oldHandle ] ); - settingsMenuItems_.remove( oldHandle ); - - // Make the action for the "Connect..." menu - AccountAction *accountAction; - accountAction = new AccountAction( account, this, newHandle ); - connectActionMenu_->insert( accountAction ); - connectMenuItems_.insert( newHandle, accountAction ); - connect( accountAction, SIGNAL( activated(Account*) ), - this, SLOT ( connectWithAccount(Account*) ) ); - - // Make the action for the "Settings..." menu - accountAction = new AccountAction( account, this, newHandle ); - settingsActionMenu_->insert( accountAction ); - settingsMenuItems_.insert( newHandle, accountAction ); - connect( accountAction, SIGNAL( activated(Account*) ), - this, SLOT ( showSettingsForAccount(Account*) ) ); - - // Notify the initial view when the account handle has changed. - initialView_->changedAccount( oldHandle, newHandle ); - } -} - - - -// A status was selected from the menu. -void KMess::changeStatus(const QString &statusName) -{ - QString newStatus = ""; - bool useAutoreply; - AwayMessageDialog *awayMessageDialog; - QString awayMessage; - - isIdleForced_ = false; - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "Selected status " << statusName << endl; -#endif - currentAccount_->setAutoreply( false ); - if ( statusName == i18n("Away") ) - { // Change status to AWAY - newStatus = "AWY"; - } - else if ( statusName == i18n("Away with auto-reply") ) - { // Change status to AWAY - newStatus = "AWY"; - // Create the away message dialog - awayMessageDialog = new AwayMessageDialog( this, "awaymessagedialog" ); - // 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; - } - else if ( statusName == i18n("Idle") ) - { // Change status to IDLE - newStatus = "IDL"; - isIdleForced_ = true; - } - else if ( statusName == i18n("Be Right Back") ) - { // Change status to BE RIGHT BACK - newStatus = "BRB"; - } - else if ( statusName == i18n("Busy") ) - { // Change status to BUSY - newStatus = "BSY"; - } - else if ( statusName == i18n("Invisible") ) - { // Change status to INVISIBLE - newStatus = "HDN"; - } - else if ( statusName == i18n("Out to Lunch") ) - { // Change status to OUT TO LUNCH - newStatus = "LUN"; - } - else if ( statusName == i18n("Online") ) - { // Change status to ONLINE - newStatus = "NLN"; - } - else if ( statusName == i18n("On the Phone") ) - { // Change status to ON THE PHONE - newStatus = "PHN"; - } - if ( newStatus != "" ) - { - msnNotificationConnection_->changeStatus( newStatus ); - } -} - - - -// Tray notifications settings were changed -void KMess::changedNotificationsSettings() -{ - notificationChat_->setEnabled( currentAccount_->getNotifyContactsChatStart(), currentAccount_->getNotifyContactsChatMessages() ); - notificationContactStatus_->setEnabled( currentAccount_->getNotifyContactsOnline(), currentAccount_->getNotifyContactsOffline(), currentAccount_->getNotifyContactsStatus() ); - notificationNewEmail_->setEnabled( currentAccount_->getNotifyEmails() ); -} - - - -// The current now listening settings have changed. -void KMess::changedNowListeningSettings() -{ - // Enable now listening if current account is online and likes to enable now listening. - QString status = currentAccount_->getStatus(); - bool isOnline = status != "FLN" && status != "HDN"; // not offline or invisible. - nowListeningClient_->setEnabled( currentAccount_->getShowNowListening() && isOnline ); - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess: now listening settings changed. Now listening is " - << ( currentAccount_->getShowNowListening() ? "enabled" : "disabled") << endl; -#endif -} - - - -// The currently playing song was changed. -void KMess::changedSong( const QString &artist, const QString &album, const QString &track, bool playing ) -{ - if( msnNotificationConnection_->isConnected() ) - { - if( ! playing ) - { - // Update notification connection and KMessView. - msnNotificationConnection_->removeCurrentMedia(); - } - else - { - // Update notification connection. - QStringList arguments; - arguments << track << artist << album << "" << ""; - msnNotificationConnection_->changeCurrentMedia( "", "Music", true, "{0} - {1}", arguments ); - } - - // Update KMessView - view_->changedSong( artist, album, track, playing ); - } -} - - - -// The status was changed -void KMess::changedStatus( Account *account ) -{ - int item = -1; - QString newStatus; - - if( account != 0 ) - { - newStatus = account->getInitialStatus(); - } - else if ( currentAccount_ != 0 ) - { - newStatus = currentAccount_->getStatus(); - } - else - { - kdWarning() << "KMess::changedStatus() - Changed status dropdown without an account set!" << endl; - return; - } - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Changed status to " << newStatus << " from " << currentStatus_ << ". " - << "Autoreply is " << currentAccount_->getAutoreply() << endl; -#endif - - // Make sure the drop down list matches the user's status - if ( newStatus == "AWY" ) - { - if ( !currentAccount_->getAutoreply() ) - { - // Change status to AWAY - item = 1; - } - else - { - // Change status to AWAY with autoreply - item = 2; - } - } - else if ( newStatus == "IDL" ) - { // Change status to IDLE - item = 3; - } - else if ( newStatus == "BRB" ) - { // Change status to BE RIGHT BACK - item = 4; - } - else if ( newStatus == "BSY" ) - { // Change status to BUSY - item = 5; - } - else if ( newStatus == "HDN" ) - { // Change status to INVISIBLE - item = 8; - } - else if ( newStatus == "LUN" ) - { // Change status to OUT TO LUNCH - item = 6; - } - else if ( newStatus == "NLN" ) - { // Change status to ONLINE - item = 0; - } - else if ( newStatus == "PHN" ) - { // Change status to ON THE PHONE - item = 7; - } - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Changed the select status to item " << item << endl; -#endif - - if ( item >= 0 ) - { - status_->setCurrentItem( item ); - } -} - - - -// A view mode has been selected from the menu. -void KMess::changeViewMode(int mode) -{ -#ifdef KMESSTEST - ASSERT( ( mode == 0 ) || ( mode == 1 ) ); -#endif - if ( mode == 0 ) - { - CurrentAccount::instance()->setShowContactsByGroup( true ); - } - else if ( mode == 1 ) - { - CurrentAccount::instance()->setShowContactsByGroup( false ); - } - else - { - kdDebug() << "KMess - changeViewMode() - WARNING - Invalid view mode = " << mode << endl; - } -} - - - -// Show a "Contact added you" dialog -void KMess::showContactAddedUserDialog(const Contact *contact) -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "Contact added user" << endl; -#endif - - ContactAddedUserDialog *dialog = new ContactAddedUserDialog( contact->getHandle(), contact->getFriendlyName() ); - - connect( dialog, SIGNAL( userChoice(const QString&, const int) ), - this, SLOT ( slotContactAddedUserDialogChoice(const QString&, const int) ) ); - - dialog->show(); -} - - -#ifdef KMESS_NETWORK_WINDOW -// Opens the network window -void KMess::showNetworkWindow() -{ - NetworkWindow::instance()->show(); -} -#endif - - -// 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?" ) - .arg(handle); - - int result = KMessageBox::warningYesNoCancel( this, message, i18n( "Remove contact" ) - , KGuiItem(i18n("Remove"), "editdelete") // Yes - , KGuiItem(i18n("Remove and block"), "remove") // No - , 0 -#if KDE_IS_VERSION(3,2,0) - , KMessageBox::Dangerous -#endif - ); - - switch( result ) - { - // User has pressed "Remove and block" - case KMessageBox::No : - msnNotificationConnection_->removeContact( handle, true ); - break; - - // User has pressed "Remove only" - case KMessageBox::Yes : - msnNotificationConnection_->removeContact( handle, false ); - break; - - // User has canceled the action, no nothing - case KMessageBox::Cancel : - default: - break; - } - -} - - -// Show a dialog before removing the group -void KMess::showRemoveGroupDialog(QString groupId) -{ - Group *group = currentAccount_->getContactList()->getGroupById(groupId); - - // If the group was found - if(group == 0) - { - kdDebug() << "KMess::showRemoveGroupDialog() - Couldn't find a matching group." << endl; - return; - } - - QString message = i18n( "Are you sure you want to remove the group %1 from your contact list?" ) - .arg(group->getName()); - - int result = KMessageBox::warningContinueCancel( this, message, i18n( "Remove group" ), - KGuiItem(i18n("Remove"), "editdelete"), 0 -#if KDE_IS_VERSION(3,2,0) - , KMessageBox::Dangerous -#endif - ); - - if(result == KMessageBox::Continue) - { - msnNotificationConnection_->removeGroup(groupId); - } -} - - -// Show a "Rename group" dialog -void KMess::showRenameGroupDialog(QString groupId) -{ - Group *group = currentAccount_->getContactList()->getGroupById(groupId); - QString newGroupName; - bool okPressed = false; - - // If the group was found - if ( group == 0 ) - { - kdDebug() << "KMess::showRenameGroupDialog() - Couldn't find a matching group." << endl; - return; - } - - // If the group is not a special group... - if(group->isSpecialGroup()) - { - // Show a message that it can't be deleted - KMessageBox::error( 0, i18n("This is a special group and can't be changed.") ); - return; - } - else - { - // Otherwise, get the new group name.. - newGroupName = group->getName(); - - // Launch a dialog to get a new group name -#if KDE_IS_VERSION(3,2,0) - newGroupName = KInputDialog::getText(i18n("Rename group"), - i18n("Enter the new name for this group:"), - newGroupName, &okPressed, this); -#else - newGroupName = KLineEditDlg::getText(i18n("Rename group"), - i18n("Enter the new name for this group:"), - newGroupName, &okPressed, this); -#endif - - if(okPressed) - { - // Request that the group be renamed - msnNotificationConnection_->renameGroup(groupId, newGroupName); - } - } -} - - -// Opens the transfer manager -void KMess::showTransferWindow() -{ - TransferWindow *transferWindow = TransferWindow::getInstance(); - transferWindow->show(); -} - - -// Autologin with the first account that has autologin enabled -void KMess::checkAutologin(QString handle) -{ - Account *loginAccount = 0; - - // If no handle was given... - if ( handle.isEmpty() ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::checkAutologin: No handle was given, find an account that uses autologin." << endl; -#endif - for ( Account *account = accounts_.first(); account; account = accounts_.next() ) - { - // For completeness, also test for guest accounts. - if( account->isGuestAccount() ) - { - continue; - } - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess: Account " << account->getHandle() - << " useAutologin = " << account->getUseAutologin() << "." << endl; -#endif - if ( account->getUseAutologin() ) - { - loginAccount = account; - break; - } - } - } - else - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::checkAutologin finding account: " << handle << "." << endl; -#endif - loginAccount = getAccountByHandle(handle); - } - - if ( loginAccount != 0 ) - { - // Use the autologin view as the main view - //initialView_->hide(); - //autologinView_->show(); - - autologinView_->setEnabled( true ); - setCentralWidget( autologinView_ ); - connectWithAccount( loginAccount ); - } -} - - - -// A connection has been made with the notification server. -void KMess::connected() -{ -#ifdef KMESSTEST - ASSERT( view_ != 0 ); - ASSERT( initialView_ != 0 ); - ASSERT( autologinView_ != 0 ); -#endif - - // Enable/disable the menus - enableMenus( true ); - - // Set up the toggle and view mode tools to match the account settings - showAllowedAction_->setChecked( currentAccount_->getShowAllowedContacts() ); - showOfflineAction_->setChecked( currentAccount_->getShowOfflineContacts() ); - showRemovedAction_->setChecked( currentAccount_->getShowRemovedContacts() ); - showPicturesAction_->setChecked( currentAccount_->getShowListPictures() ); - if ( currentAccount_->getShowContactsByGroup() ) - { - viewMode_->setCurrentItem( 0 ); - } - else - { - viewMode_->setCurrentItem( 1 ); - } - // Show the connected message - statusMessage( i18n("Connected"), TYPE_MESSAGE ); - - // Swap the initial and main views - initialView_->setEnabled( false ); - initialView_->hide(); - - autologinView_->setEnabled( false ); - autologinView_->hide(); - - // Give the view widget some info - view_->connected(); - - view_->setEnabled( true ); - view_->show(); - - // Set it as the application's main widget - setCentralWidget( view_ ); - - // Set the caption - setCaptionToUser(); - - // The connection was successful, this means the supplied - // email and password were correct: save the KMess settings now - KConfig *config = kapp->config(); - saveProperties( config ); -} - - - -// Connect to the server with the given account -void KMess::connectWithAccount(Account *account) -{ - if(KMESS_NULL(account)) return; - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::connectWithAccount: " << account->getHandle() << "." << endl; -#endif - - // First disconnect, to unregister all contacts - if(msnNotificationConnection_->isConnected()) - { - msnNotificationConnection_->closeConnection(); - } - - // Update the main view's controls to match this account's details. - changedStatus( account ); - - // Swap widget. - initialView_->setEnabled( false ); - initialView_->hide(); - - autologinView_->setEnabled( true ); - autologinView_->show(); - - setCentralWidget( autologinView_ ); - - // Copy the account to the current account -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess: copying account data for '" << account->getHandle() << "' to the CurrentAccount object." << endl; -#endif - currentAccount_->copyAccount( account ); - - // Allow users to cancel the login attempt - disconnect_->setEnabled( true ); - - // Connect to the server. - msnNotificationConnection_->openConnection(); -} - - - -// Connect to the server with the given account, possibly temporary or new. -void KMess::connectWithAccount(QString handle, QString password, bool rememberMe, QString initialStatus ) -{ - // Try to find an existing account - Account *account = getAccountByHandle(handle); - if( account != 0 ) - { - // Found an existing account. - // The user may enter a new password at the login dialog. - // When the login succeeds, save the new temporary password as new account password. - account->setTemporaryPassword( password ); - account->setInitialStatus( initialStatus ); - connectWithAccount( account ); - return; - } - - // No account found, create a new account. - account = new Account(); - account->setLoginInformation( handle, handle, password ); - account->setGuestAccount( ! rememberMe ); - account->setInitialStatus( initialStatus ); - addAccount( account ); - - // Connect - connectWithAccount( account ); -} - - - -// Create the program's default directories in .kde/share/apps/ -bool KMess::createDirectories() -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Creating default directories." << endl; -#endif - KStandardDirs *dirs = KGlobal::dirs(); - QString localKdeDir; - QDir appsDir, kmessDir, emoticonsDir, picsDir; - - localKdeDir = dirs->localkdedir(); -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Local KDE dir is " << localKdeDir << "." << endl; -#endif - appsDir.setPath( localKdeDir + "/share/apps" ); - - if ( appsDir.exists() ) - { - kmessDir.setPath( appsDir.absPath() + "/kmess" ); -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - kmess dir should be at " << kmessDir.absPath() << "." << endl; -#endif - if ( !kmessDir.exists() ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Creating kmess dir." << endl; -#endif - appsDir.mkdir( kmessDir.absPath(), true ); - } - // Create the pics and emoticons directories - emoticonsDir.setPath( kmessDir.absPath() + "/emoticons" ); -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - emoticons dir should be at " << emoticonsDir.absPath() << "." << endl; -#endif - if ( !emoticonsDir.exists() ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Creating emoticons dir." << endl; -#endif - kmessDir.mkdir( emoticonsDir.absPath(), true ); - } - picsDir.setPath( kmessDir.absPath() + "/pics" ); -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - pics dir should be at " << picsDir.absPath() << "." << endl; -#endif - if ( !picsDir.exists() ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Creating pics dir." << endl; -#endif - kmessDir.mkdir( picsDir.absPath(), true ); - } - } -#ifdef KMESSDEBUG_KMESS - else - { - kdDebug() << "KMess - " << appsDir.absPath() << " doesn't exist!" << endl; - } -#endif -#ifdef KMESSTEST - ASSERT( kmessDir.exists() ); - ASSERT( emoticonsDir.exists() ); - ASSERT( picsDir.exists() ); -#endif - return true; -} - - - -// "Add new account" has been selected from the menu. -void KMess::createNewAccount() -{ - Account *account; - // If there are no profiles, create a "default" account - // Create an account to store the profile information - account = new Account(); - - // Assume the user *does* want to save it's settings, - // otherwise he/she would have used the main login dialog. - account->setGuestAccount(false); - - // Show the settings dialog for the new account - showSettingsForAccount( account ); -} - - - -// The current account changed its name, so set the corresponding account's name -void KMess::currentAccountChangedName() -{ - Account *account = getAccountByHandle( currentAccount_->getHandle() ); - if( account != 0 ) - { - // Set the account's name to the current account's name - account->setFriendlyName( currentAccount_->getFriendlyName() ); - } - - // Set the caption to the account's new name - setCaptionToUser(); -} - - - -// Delete the given account -void KMess::deleteAccount(Account *account) -{ - AccountAction *accountAction; - if( KMESS_NULL(account) ) return; - - QString handle = account->getHandle(); - if( handle == currentAccount_->getHandle() && msnNotificationConnection_->isConnected() ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::deleteAccount: Not deleting account " << account->getHandle() << " yet." << endl; -#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->deleteAccountData(); - return; - } - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess: Deleting account for " << handle << "." << endl; -#endif - - // Remove the account from the list of accounts - if( ! accounts_.remove( account ) ) - { - kdWarning() << "KMess::deleteAccount: account not found in collection!" << endl; - } - - // Remove from other GUI parts - initialView_->deleteAccount(account); - - // Remove from connect menu. - accountAction = connectMenuItems_[handle]; - if( ! KMESS_NULL(accountAction) ) - { - connectActionMenu_->remove(accountAction); - connectMenuItems_.remove(handle); - } - - // 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_[handle]; - if( ! KMESS_NULL(accountAction) ) - { - settingsActionMenu_->remove(accountAction); - settingsMenuItems_.remove(handle); - } - - // Delete here as this class maintains the collection. - // No need to call deleteAccountData(), it triggered this slot. - account->deleteAccountData(); - account->deleteLater(); -} - - - -// Disconnect was selected from the menu. -void KMess::disconnectClicked() -{ -#ifdef KMESSTEST - ASSERT( msnNotificationConnection_ != 0 ); -#endif -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMess: Disconnecting." << endl; -#endif - msnNotificationConnection_->closeConnection(); -} - - - -// The program is not connected (initially) or no longer connected (after a disconnect) to the notification server. -void KMess::disconnected() -{ -#ifdef KMESSTEST - ASSERT( view_ != 0 ); - ASSERT( chatMaster_ != 0 ); - ASSERT( initialView_ != 0 ); - ASSERT( autologinView_ != 0 ); -#endif -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Disconnected." << endl; -#endif - - // this method is also called when initializing the GUI, avoid manging the settings at that point. - if( initialized_ ) - { - // ContactList is saved by the MsnNotificationConnection already. - // A nice alternative would be currentAccount_->disconnected() saving the list, - // however CurrentAccount has a const reference to the list - // because MsnNotificationConnection maintains the list instead. - - // Transfer account settings that are made in the GUI. - Account *account = getAccountByHandle(currentAccount_->getHandle()); - if( ! KMESS_NULL(account) ) - { - if( account->isDeleted() ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::disconnected: account was deleted, removing menu items." << endl; -#endif - deleteAccount(account); - } - else - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::disconnected: copying global user-interface settings from CurrentAccount to the Account object." << endl; -#endif - - account->copyAccount( currentAccount_ ); - account->copyAccountUISettings( currentAccount_ ); - } - } - } - - // Update the GUI - disconnect_->setEnabled( false ); - enableMenus(false); - statusMessage( i18n("Disconnected"), TYPE_ERROR ); - - // Inform other classes we're disconnected - view_->disconnected(); - chatMaster_->disconnected(); - - // Update the current account - currentAccount_->setStatus( "FLN" ); - currentAccount_->setAutoreply( false ); -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Swap views." << endl; -#endif - - // Swap the initial and main views - view_->setEnabled( false ); - view_->hide(); - - autologinView_->setEnabled( false ); - autologinView_->hide(); - initialView_->setEnabled( true ); - initialView_->show(); - initialView_->updateView(); - // Set it as the application's main widget - setCentralWidget( initialView_ ); - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - Blank the caption." << endl; -#endif - // Set the caption - setCaption( QString::null ); -} - - - -// Initialize the class -bool KMess::initialize() -{ - if ( initialized_ ) - { - kdDebug() << "KMess - Already initialized." << endl; - return false; - } - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::initialize: initializing main class." << endl; -#endif - - // Create current account instance - currentAccount_ = CurrentAccount::instance(); - if ( currentAccount_ == 0 ) - { - kdDebug() << "KMess - Couldn't get a pointer to the instance of the current account." << endl; - return false; - } - if ( !KMessInterface::initialize() ) - { - kdDebug() << "KMess - Couldn't initialize ancestor." << endl; - return false; - } - if ( !initMsnNotificationConnection() ) - { - kdDebug() << "KMess - Couldn't initialize the MsnNotificationConnection class." << endl; - return false; - } - if ( !initIdleTimer() ) - { - kdDebug() << "KMess - Couldn't initialize the IdleTimer class." << endl; - return false; - } - if ( !initAutologinView() ) - { - kdDebug() << "KMess - Couldn't initialize the AutologinView widget." << endl; - return false; - } - if ( !initInitialView() ) - { - kdDebug() << "KMess - Couldn't initialize the InitialView widget." << endl; - return false; - } - if ( !initChatMaster() ) - { - kdDebug() << "KMess - Couldn't initialize the Chat master." << endl; - return false; - } - if ( !initKMessView() ) - { - kdDebug() << "KMess - Couldn't initialize the KMessView widget." << endl; - return false; - } - if ( !initNotifications() ) - { - kdDebug() << "KMess - Couldn't initialize the notifications." << endl; - return false; - } - if ( !initNowListening() ) - { - kdDebug() << "KMess - Couldn't initialize the now listening support." << endl; - return false; - } - if ( !initEmoticonManager() ) - { - kdDebug() << "KMess - Couldn't initialize the emoticon manager." << endl; - return false; - } - if ( !createDirectories() ) - { - kdDebug() << "KMess - Couldn't create local KDE directories." << endl; - return false; - } - - - // Start reading the properties - readProperties( kapp->config() ); - - - // Connect current account - connect( currentAccount_, SIGNAL( accountInvisible() ), - this, SLOT ( accountInvisible() )); - connect( currentAccount_, SIGNAL( accountOffline() ), - this, SLOT ( accountOffline() )); - connect( currentAccount_, SIGNAL( accountOnline() ), - this, SLOT ( accountOnline() )); - connect( currentAccount_, SIGNAL( changedFriendlyName() ), - this, SLOT ( currentAccountChangedName() )); - 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() ), - msnNotificationConnection_, SLOT( changedMsnObject() )); - - // connect a shutDown() signal - connect( KApplication::kApplication(), SIGNAL( shutDown() ), - this, SLOT ( shutDown() ) ); - - - // Start disconnected. - // Added debug here because this has a potential to cause problems.. - // It would be better if each class got things right from it's construtor or initialize method. -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::initialize: faking disconnect signal." << endl; -#endif - disconnected(); - - - // All done, mark as initialized -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::initialize: main class is initialized." << endl; -#endif - - initialized_ = true; - return true; -} - - - -// Return the account for a given handle -Account * KMess::getAccountByHandle( const QString &handle ) -{ - Account *account = 0; - QPtrListIterator it( accounts_ ); - while( it.current() != 0 ) - { - account = it.current(); - if( account->getHandle() == handle ) - { - return account; - } - - ++it; - } - - return 0; -} - - -// Initialize the autologin view -bool KMess::initAutologinView() -{ - autologinView_ = new AutologinView( this, "autologinView" ); - if ( autologinView_ == 0 ) - { - kdDebug() << "KMess - Couldn't create the autologin view" << endl; - return false; - } - autologinView_->setEnabled( false ); - autologinView_->hide(); - return true; -} - - - -// Initialize the chat master -bool KMess::initChatMaster() -{ -#ifdef KMESSTEST - ASSERT( chatMaster_ == 0 ); -#endif - if ( msnNotificationConnection_ == 0 ) - { - kdDebug() << "KMess - The notification connection must be initialized before the chat master." << endl; - return false; - } - chatMaster_ = new ChatMaster( this ); - if ( chatMaster_ == 0 ) - { - kdDebug() << "KMess - Couldn't create the chat master." << endl; - return false; - } - if ( !chatMaster_->initialize() ) - { - kdDebug() << "KMess - Couldn't initialize the chat master." << endl; - return false; - } - - // Make the chat master's connections - connect( chatMaster_, SIGNAL( requestSwitchboard(QString,ChatInformation::ConnectionType) ), - msnNotificationConnection_, SLOT ( requestSwitchboard(QString,ChatInformation::ConnectionType) )); - connect( chatMaster_, SIGNAL( blockContact(QString) ), - msnNotificationConnection_, SLOT ( blockContact(QString) ) ); - connect( chatMaster_, SIGNAL( unblockContact(QString) ), - msnNotificationConnection_, SLOT ( unblockContact(QString) ) ); - connect( chatMaster_, SIGNAL( addContact(QString) ), - msnNotificationConnection_, SLOT ( addNewContact(QString) ) ); - connect( chatMaster_, SIGNAL( removeContact(QString,bool) ), - msnNotificationConnection_, SLOT ( removeContact(QString,bool) ) ); - connect( chatMaster_, SIGNAL( allowContact(QString) ), - msnNotificationConnection_, SLOT ( allowContact(QString) ) ); - - connect( msnNotificationConnection_, SIGNAL( startedSwitchboard(const ChatInformation&) ), - chatMaster_, SLOT ( startSwitchboard(const ChatInformation&) ) ); - connect( msnNotificationConnection_, SIGNAL( offlineMessage(const ChatMessage&) ), - chatMaster_, SLOT ( showSpecialMessage(const ChatMessage&) )); - connect( msnNotificationConnection_, SIGNAL( pingSent() ), - chatMaster_, SLOT ( timedUpdate() )); - -#ifdef KMESSTEST - ASSERT( chatMaster_ != 0 ); -#endif - return true; -} - - - -// Initialize the emoticon manager -bool KMess::initEmoticonManager() -{ - if ( msnNotificationConnection_ == 0 ) - { - kdDebug() << "KMess - MsnNotificationConnection must be initialized before EmoticonManager" << endl; - return false; - } - - EmoticonManager *manager = EmoticonManager::instance(); - - connect( msnNotificationConnection_, SIGNAL( connected() ), - manager, SLOT ( connected() ) ); - connect( msnNotificationConnection_, SIGNAL( disconnected() ), - manager, SLOT ( disconnected() ) ); - - return true; -} - - - -// Initialize the idle timer -bool KMess::initIdleTimer() -{ -#ifdef KMESSTEST - ASSERT( idleTimer_ == 0 ); -#endif - idleTimer_ = new IdleTimer(); - if ( idleTimer_ == 0 ) - { - kdDebug() << "KMess - Couldn't create the idle timer." << endl; - return false; - } - // Connect the timer to signal when the user is away. - connect( idleTimer_, SIGNAL( timeout() ), - this, SLOT ( userIsIdle() ) ); - connect( idleTimer_, SIGNAL( activity() ), - this, SLOT ( userIsNotIdle() ) ); -#ifdef KMESSTEST - ASSERT( idleTimer_ != 0 ); -#endif - return true; -} - - - -// Initialize the initial view -bool KMess::initInitialView() -{ - initialView_ = new InitialView( this, "initialview" ); - initialView_->show(); - - connect( initialView_, SIGNAL( connectWithAccount(QString,QString,bool,QString) ), - this, SLOT ( connectWithAccount(QString,QString,bool,QString) ) ); - - return true; -} - - - -// Initialize the main view -bool KMess::initKMessView() -{ - bool initialized; - - if ( msnNotificationConnection_ == 0 ) - { - kdDebug() << "KMess - MsnNotificationConnection must be initialized before KMessView" << endl; - return false; - } - - view_ = new KMessView(this, "kmessview"); - view_->setEnabled( false ); - - initialized = view_->initialize(); - if ( !initialized ) - { - kdDebug() << "KMess - Couldn't initialize KMessView." << endl; - return false; - } - - - // Connect other signals to msnNotificationConnection - connect( view_, SIGNAL( addContact(QString) ), // Add a contact - msnNotificationConnection_, SLOT (addExistingContact(QString) ) ); - connect( view_, SIGNAL( allowContact(QString) ), // Allow the contact - msnNotificationConnection_, SLOT ( allowContact(QString) ) ); - connect( view_, SIGNAL( blockContact(QString) ), // Block the contact - msnNotificationConnection_, SLOT ( blockContact(QString) ) ); - connect( view_, SIGNAL( changePersonalMessage(QString) ), // Change the personal message. - msnNotificationConnection_, SLOT ( changePersonalMessage(QString) ) ); - connect( view_, SIGNAL( copyContact(QString, QString) ), - msnNotificationConnection_, SLOT ( addContactToGroup(QString, QString) ) ); - connect( view_, SIGNAL( moveContact(QString, QString, QString) ), // Move the contact - msnNotificationConnection_, SLOT ( moveContact(QString, QString, QString) ) ); - connect( view_, SIGNAL( showSettings() ), // Show settings - this, SLOT ( showSettingsForCurrentAccount() ) ); - connect( view_, SIGNAL(requestChat( QString ) ), // Start a chat - chatMaster_, SLOT (requestChat( QString ) ) ); - connect( view_, SIGNAL( removeContact(QString) ), // Remove the contact - this, SLOT ( showRemoveContactDialog(QString) ) ); - connect( view_, SIGNAL( removeContactFromGroup(QString, QString) ), - msnNotificationConnection_, SLOT ( removeContactFromGroup(QString, QString) ) ); - connect( view_, SIGNAL( removeGroup(QString) ), // Remove the group - this, SLOT ( showRemoveGroupDialog(QString) ) ); - connect( view_, SIGNAL( renameGroup(QString) ), // Rename the group - this, SLOT ( showRenameGroupDialog(QString) ) ); - connect( view_, SIGNAL( unblockContact(QString) ), // Unblock the contact - msnNotificationConnection_, SLOT ( unblockContact(QString) ) ); - - view_->hide(); - return true; -} - - - -// Initialize the MSN notification connection -bool KMess::initMsnNotificationConnection() -{ - bool initialized; - - msnNotificationConnection_ = new MsnNotificationConnection(); - - initialized = msnNotificationConnection_->initialize(); - if ( !initialized ) - { - kdDebug() << "KMess - Couldn't initialize MsnNotificationConnection." << endl; - return false; - } - - // Connect the signals - connect( msnNotificationConnection_, SIGNAL( connected() ), // Connected to msn - 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( statusMessage(QString, KMessInterface::ConnectionStatus) ), // Display a status message - this, SLOT ( statusMessage(QString, KMessInterface::ConnectionStatus) ) ); - - // Check the current Socks implementation. - // Some implementation do not support async connections, - // which will cauase KMess to freeze for 2 minutes if the connection can't be made. -#ifdef KMESSTEST - ASSERT( KSocks::activated() ); -#endif - - if( KSocks::self()->hasSocks() - && KSocks::self()->usingSocks() - && ! KSocks::self()->hasWorkingAsyncConnect() ) - { - // Always show warning at the console. - kdWarning() << "Your SOCKS implementation does not support asynchronous connections. Please disable SOCKS support in the KDE Control Center if you don't have to use a proxy server." << endl; - - // Show the message in the GUI as well. - // Allow to user to choose "don't show this message again", in case he/she can't fix it. - KMessageBox::information( this, i18n( "

Your SOCKS implementation does not support asynchronous connections.

" - "

This could cause KMess to freeze occasionally when it initiates a direct connection for file or picture transfers.

" - "

Please disable SOCKS support in the KDE Control Center if you don't have to use a proxy server to connect to the Internet.

" - "
" ), - i18n( "Error in SOCKS implementation" ), - "socksWithoutAsyncConnect" ); - } - - return true; -} - - - -// Initialize notification objects -bool KMess::initNotifications() -{ -#ifdef KMESSTEST - ASSERT( currentAccount_ != 0 ); - ASSERT( systemTrayWidget_ != 0 ); - ASSERT( msnNotificationConnection_ != 0 ); - - ASSERT( notificationChat_ == 0 ); - ASSERT( notificationContactStatus_ == 0 ); - ASSERT( notificationNewEmail_ == 0 ); -#endif - - const ContactList *contactList; - - if ( systemTrayWidget_ == 0 ) - { - kdDebug() << "KMess - The system tray widget must be initialized before the notifications!" << endl; - return false; - } - if ( msnNotificationConnection_ == 0 ) - { - kdDebug() << "KMess - The notification connection must be initialized before the notifications!" << endl; - return false; - } - - - // Add check whether the 'eventsrc' file can be found. - // The warning is a bit obtruisive, but should help to user to fix the problem. - if( KGlobal::dirs()->findResource( "data", "kmess/eventsrc" ).isNull() ) - { - QString dirs = KGlobal::dirs()->findDirs( "data", QString::null ).join("/kmess
- "); - if( dirs.isEmpty() ) - { - dirs = "(none)"; - } - else - { - dirs = "
- " + dirs + "/kmess"; - dirs = dirs.replace( "//kmess", "/kmess" ); // possibly added by /kmess suffix. - } - - // Always show warning at the console. - kdWarning() << "Sounds and notifications will not be available, the file 'kmess/eventsrc' could not be found." << endl; - - // 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 'eventsrc' 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.

" - "
" ).arg( dirs ), - i18n( "Error with notifications" ), - "eventsrcNotFound" ); - } - - - contactList = currentAccount_->getContactList(); - notificationManager_ = NotificationManager::instance(); - notificationManager_->setTrayWidget( systemTrayWidget_ ); - - // Create the notifiers - notificationChat_ = new NotificationChat ( notificationManager_ ); - notificationContactStatus_ = new NotificationContactStatus( notificationManager_ ); - notificationNewEmail_ = new NotificationNewEmail ( notificationManager_ ); - - // Connect the chat messages notification signals - connect( chatMaster_, SIGNAL( newChatMessage(const ChatMessage&, ChatWindow*) ), - notificationChat_, SLOT ( notify(const ChatMessage&, ChatWindow*) ) ); - connect( notificationChat_, SIGNAL( raiseChat(ChatWindow*,bool) ), - chatMaster_, SLOT ( raiseChat(ChatWindow*,bool) ) ); - - // Connect the status change notification signals - connect( contactList, SIGNAL( contactOnline(Contact*,bool) ), - notificationContactStatus_, SLOT ( notify(Contact*,bool) ) ); - connect( contactList, SIGNAL( contactOffline(Contact*,bool) ), - notificationContactStatus_, SLOT ( notify(Contact*,bool) ) ); - connect( contactList, SIGNAL( contactChangeStatus(Contact*,bool) ), - notificationContactStatus_, SLOT ( notify(Contact*,bool) ) ); - - // Connect the "Email notification" signals - connect( msnNotificationConnection_, SIGNAL( newEmail(QString, QString, bool, QString, QString, QString) ), - notificationNewEmail_, SLOT ( notify(QString, QString, bool, QString, QString, QString) ) ); - - // Connect the "Chat request" signals - connect( notificationContactStatus_, SIGNAL( startChat(QString,ChatInformation::ConnectionType) ), - msnNotificationConnection_, SLOT ( requestSwitchboard(QString,ChatInformation::ConnectionType) ) ); - - - // If specified in the settings, connect the relative signals - changedNotificationsSettings(); - - -#ifdef KMESSTEST - ASSERT( notificationChat_ != 0 ); - ASSERT( notificationContactStatus_ != 0 ); - ASSERT( notificationNewEmail_ != 0 ); -#endif - - return true; -} - - - -// Initialize the now listening support. -bool KMess::initNowListening() -{ - if ( msnNotificationConnection_ == 0 ) - { - kdDebug() << "KMess - The notification connection must be initialized before the now listening support!" << endl; - return false; - } - - // Create and connect client. - 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; -} - - - -// Validate a contact email -bool KMess::isValidEmail( QString email ) -{ - return email.contains( QRegExp( "^[A-Z0-9._%\\-]+@(?:[A-Z0-9\\-]+\\.)+[A-Z]{2,4}$", false ) ); -} - - - -// Read in account and other properties -void KMess::readProperties(KConfig *config) -{ - KMessInterface::readProperties(config); - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - reading properties" << endl; -#endif - - QStringList accountList; - Account *account; - - // Get a list of the profiles stored in the configuration file - config->setGroup("Profiles"); - accountList = config->readListEntry( "Profiles" ); - - // For each listed account, create an account and have it read in its settings - for ( unsigned int i = 0; i < accountList.count(); i++ ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::readProperties: initializing account " << accountList[i] << "." << endl; -#endif - - account = new Account(); - account->readProperties( config, accountList[i] ); - addAccount( account ); - } -} - - - -// Save account and other properties -void KMess::saveProperties(KConfig *config) -{ -#ifdef KMESSDEBUG_KMESS - if(config != kapp->config()) - { - kdDebug() << "For some reason saveProperties(config) != kapp->config(), using kapp->config()." << endl; - } -#endif - - config = kapp->config(); // Hack, but it seems to work - KMessInterface::saveProperties(config); - -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess - saving properties" << endl; -#endif - - QStringList accountList; - Account *account; - - // Have all the accounts save their properties - for ( account = accounts_.first(); account; account = accounts_.next() ) - { - // Avoid saving guest accounts - if( account->isGuestAccount() || account->isDeleted() ) - { - continue; - } - - // 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 -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::saveProperties: copying global user-interface settings from CurrentAccount to the Account object." << endl; -#endif - account->copyAccountUISettings( currentAccount_ ); - } - - // Save properties of accounts (also saves the contactlist for the current account). - account->saveProperties( config ); - accountList.append( account->getHandle() ); - } - - // Save the list of profiles - config->setGroup("Profiles"); - config->writeEntry( "Profiles", accountList ); - - // Write data now! - config->sync(); -} - - - -// Set the caption -void KMess::setCaptionToUser() -{ - if ( currentAccount_ != 0 ) - { - // Set the caption, avoiding newlines which cause problems to the titlebar layout. - setCaption( currentAccount_->getFriendlyName().replace( "\n", " " ) ); - } -} - - - -// Show the settings dialog for a given account -void KMess::showSettingsForAccount(Account *account) -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::showSettingsForAccount: opening settings for " << account->getHandle() << endl; -#endif -#ifdef KMESSTEST - ASSERT( msnNotificationConnection_ != 0 ); -#endif - - bool isCurrentAccount = false; - bool isConnectedCurrentAccount = false; - - if ( msnNotificationConnection_ != 0 ) - { - isCurrentAccount = ( account->getHandle() == currentAccount_->getHandle() ); - isConnectedCurrentAccount = isCurrentAccount && ( msnNotificationConnection_->isConnected() ); - } - - // Show the settings dialog - SettingsDialog *settingsDialog = SettingsDialog::instance( this ); - - // If a new dialog has not been created, because there already was one, raise that. - if( ! settingsDialog->isHidden() ) - { - settingsDialog->show(); - settingsDialog->raise(); - return; - } - - connect( settingsDialog, SIGNAL( deleteAccount(Account*) ), - this, SLOT ( deleteAccount(Account*) ) ); - connect( settingsDialog, SIGNAL( changedSettings(Account*,QString,QString) ), - this, SLOT ( changedAccountSettings(Account*,QString,QString) ) ); - - // If it's the current account, copy some UI settings from the current account to the account - if( isCurrentAccount ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::showSettingsForAccount: copying global user-interface settings from CurrentAccount to the Account object." << endl; -#endif - account->copyAccountUISettings( currentAccount_ ); - } - - settingsDialog->changeAccountSettings( account, isConnectedCurrentAccount ); - settingsDialog->show(); -} - - - -// Show the settings dialog for the current account. -void KMess::showSettingsForCurrentAccount() -{ - // Use the Account object so it's consistent with the other AccountAction events. - Account *accountData = getAccountByHandle( CurrentAccount::instance()->getHandle() ); - if( KMESS_NULL(accountData) ) return; - showSettingsForAccount( accountData ); -} - - - -// Show the user's MSN profile. -void KMess::showUserProfile() -{ - QString urlPath; - - if ( currentAccount_ != 0 ) - { - // Set a path to the msn profile page. - // Internationalization of the resulting page: code seems to be in the form "xx-yy" with - // xx = language and yy = country information. When there is no country information, yy = xx - // examples: generic english: en-en ... US english: en-us ... UK english: en-uk ... italian: it-it - KLocale loc( "kmess" ); - QString code( loc.language() + "-" + loc.country() ); - kapp->invokeBrowser( "http://members.msn.com/default.msnw?mkt=" + code.lower() + "&mem=" + currentAccount_->getHandle() ); - } -} - - - -// We're about to shutdown, apparently -// make sure we die, rather than just close the main window -void KMess::shutDown() -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::shutDown: forcing quit from shutdown signal." << endl; -#endif - - // Called when the app is killed with 'xkill' for example. - // No user-interaction is possible at this point. - - KApplication::kApplication()->quit(); -} - - - -// The user was presented the "contact added user" dialog and has made a choice -void KMess::slotContactAddedUserDialogChoice( const QString &handle, const int code ) -{ - switch( (ContactAddedUserDialog::ReturnCode) code ) - { - case ContactAddedUserDialog::ADD: - // Add the contact to the allowed and friends lists - msnNotificationConnection_->addNewContact( handle ); - 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; - } -} - - - - -// The "show display pictures" menu item has been toggled. -void KMess::toggleDisplayPictures(bool show) -{ - currentAccount_->setShowListPictures( show ); -} - - - -// The "show allowed contacts" menu item has been toggled. -void KMess::toggleShowAllowed(bool show) -{ - currentAccount_->setShowAllowedContacts( show ); -} - - - -// The "show offline contacts" menu item has been toggled. -void KMess::toggleShowOffline(bool show) -{ - currentAccount_->setShowOfflineContacts( show ); -} - - - -// The "show removed contacts" menu item has been toggled. -void KMess::toggleShowRemoved(bool show) -{ - currentAccount_->setShowRemovedContacts( show ); -} - - - -// The user has gone idle -void KMess::userIsIdle() -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::userIsIdle()" << endl; -#endif - if ( ( currentAccount_ != 0 ) && ( msnNotificationConnection_ != 0 ) ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KM: Current status is " << currentAccount_->getStatus() << "." << endl; -#endif - // Only change the state if the user is currently set as online - if ( currentAccount_->getStatus() == "NLN" ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KM: Change status to IDL." << endl; -#endif - // Request a status change to "IDL" - msnNotificationConnection_->changeStatus("IDL"); - isIdleForced_ = false; - } - } -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KM: Done userIsIdle()." << endl; -#endif -} - - - -// The user is no longer idle -void KMess::userIsNotIdle() -{ -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KMess::userIsNotIdle()" << endl; -#endif - if ( ( currentAccount_ != 0 ) && ( msnNotificationConnection_ != 0 ) ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KM: User is no longer idle, current status is " << currentAccount_->getStatus() << endl; -#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() == "IDL" && ! isIdleForced_ ) - { -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KM: Change status to NLN" << endl; -#endif - // Request a status change to "NLN" - msnNotificationConnection_->changeStatus("NLN"); - } - } -#ifdef KMESSDEBUG_KMESS - kdDebug() << "KM: Done userIsNotIdle()." << endl; -#endif -} - - -#include "kmess.moc" diff --git a/kmess/kmessapplication.cpp b/kmess/kmessapplication.cpp deleted file mode 100644 index bf455e3..0000000 --- a/kmess/kmessapplication.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*************************************************************************** - kmessapplication.cpp - description - ------------------- - begin : Wed 7 13 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 "kmessapplication.h" - - -// Constructor -KMessApplication::KMessApplication() - : KApplication() - , savingSession_(false) - , quitSelected_(false) -{ - // This class subclasses KApplication so we can - // add the sessionSaving() method for KDE 3.1 compatibility - - // KMessApplication is created from main.cpp, - // and the "KMess" class (inheriting KMessInterface, KMainWindow) - // is set as main widget. -} - - -// Destructor -KMessApplication::~KMessApplication() -{ - -} - - - -#if KDE_IS_VERSION(3,1,1) - // KDE has a sessionSaving() method -#else - - // QApplication wants to save the session - void KMessApplication::commitData(QSessionManager &sm) - { - // Set a boolean, just like the KApplication::commitData() source does as of KDE 3.1.1 - - // I've also attempted to use KSessionManaged::commitData(). While the KSessionManaged - // class is supposed eliminate the need to subclass KApplication, it can't be used here. - // Somehow KSessionManaged::commitData() is called after KMainWindow::queryExit() - // ..and the whole point of the sessionSaving() call is being called from queryExit() !! - savingSession_ = true; - - // Do the original commit - KApplication::commitData(sm); - - savingSession_ = false; - } - - - // Return true if we're saving the session (for queryExit()) - bool KMessApplication::sessionSaving() const - { - // This is called from KMess::queryExit() - return savingSession_; - } - -#endif - - - -// Return true if quit was selected -bool KMessApplication::quitSelected() const -{ - return quitSelected_; -} - - - -// Tell the application that quit was selected -void KMessApplication::setQuitSelected(bool quitSelected) -{ - quitSelected_ = quitSelected; -} - diff --git a/kmess/kmessinterface.cpp b/kmess/kmessinterface.cpp deleted file mode 100644 index 4a0e09c..0000000 --- a/kmess/kmessinterface.cpp +++ /dev/null @@ -1,756 +0,0 @@ -/*************************************************************************** - kmessinterface.cpp - description - ------------------- - begin : Sun Dec 29 2002 - copyright : (C) 2002 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 "kmessinterface.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kmessdebug.h" -#include "kmessapplication.h" -#include "systemtraywidget.h" - - -// The constructor -KMessInterface::KMessInterface(QWidget *parent, const char *name ) - : KMainWindow(parent,name) - , connectState_(TYPE_ERROR) - , initialized_(false) -{ - -} - - - -// The destructor -KMessInterface::~KMessInterface() -{ - delete systemTrayWidget_; - -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "DESTROYED KMessInterface " << endl; -#endif -} - - -// 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() -{ - kdDebug() << "addNewContact not implemented" << endl; -} - - - -// "Add a new group" was selected from the menu. -void KMessInterface::addNewGroup() -{ - kdDebug() << "addNewGroup not implemented" << endl; -} - - -// The application is closing, after queryExit() was approved -void KMessInterface::applicationClosing() -{ - kdDebug() << "applicationClosing not implemented" << endl; -} - - -// A status was selected from the menu. -void KMessInterface::changeStatus(const QString& /*statusName*/) -{ - kdDebug() << "changeStatus not implemented" << endl; -} - - - -// A view mode has been selected from the menu. -void KMessInterface::changeViewMode(int /*mode*/) -{ - kdDebug() << "changeViewMode not implemented" << endl; -} - - -void KMessInterface::showNetworkWindow() -{ - kdDebug() << "showNetworkWindow not implemented" << endl; -} - - -void KMessInterface::showTransferWindow() -{ - kdDebug() << "showTransferWindow not implemented" << endl; -} - - - -void KMessInterface::configureNotifications() -{ - KNotifyDialog::configure(this); -} - - - -// Create the "Actions" menu -void KMessInterface::createActionsMenu() -{ - KAction *newAccount, *searchForContact, *searchByInterest; - KPopupMenu *actionsMenu; - // Create the menu - actionsMenu = new KPopupMenu( this, "actionsmenu" ); - - // Create the "settings" menus - newAccount = new KAction( i18n("New &Account"), "filenew", 0, this, SLOT( createNewAccount() ), actionCollection(), "newaccount"); - newContact_ = new KAction( i18n("New &Contact"), "add_user", 0, this, SLOT( addNewContact() ), actionCollection(), "newcontact"); - newGroup_ = new KAction( i18n("New &Group"), "folder_new", 0, this, SLOT( addNewGroup() ), actionCollection(), "newgroup"); - searchForContact = new KAction( i18n("S&earch for Contact"), "search_user", 0, this, SLOT( searchForContact() ), actionCollection(), "searchforcontact"); - searchByInterest = new KAction( i18n("Search by &Interest"), "filefind", 0, this, SLOT( searchForContactByInterest() ), actionCollection(), "searchbyinterest"); - settingsActionMenu_ = new KActionMenu( i18n("Account &Settings"), "edit", this, "settings"); - configureNotifications_ = KStdAction::configureNotifications(this, SLOT(configureNotifications()), actionCollection()); - - // Plug the items into "settings" - newContact_ ->plug( actionsMenu ); - newGroup_ ->plug( actionsMenu ); - actionsMenu->insertSeparator(); - searchForContact ->plug( actionsMenu ); - searchByInterest ->plug( actionsMenu ); - actionsMenu->insertSeparator(); - newAccount ->plug( actionsMenu ); - settingsActionMenu_ ->plug( actionsMenu ); - actionsMenu->insertSeparator(); - configureNotifications_ ->plug( actionsMenu ); - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&Actions"), actionsMenu ); -} - - - -// Create the "Connect" menu -void KMessInterface::createConnectMenu() -{ - KAction *close, *quit; - KPopupMenu *connectMenu; - QStringList statuses; - - // Create the menu - connectMenu = new KPopupMenu( this, "connectmenu" ); - - // Create the "connect" menu items - connectActionMenu_ = new KActionMenu( i18n("Co&nnect"), "connect_creating", this, "connect"); - disconnect_ = new KAction( i18n("&Disconnect"), "connect_no", 0, this, SLOT( disconnectClicked() ), actionCollection(), "disconnect"); - showProfile_ = new KAction( i18n("Show My &Profile"), "identity", 0, this, SLOT( showUserProfile() ), actionCollection(), "showuserprofile"); - status_ = new KSelectAction( i18n("&My Status"), "goto", 0, this, "status"); - statuses << 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(statuses); - connect ( status_, SIGNAL( activated( const QString& ) ), this, SLOT( changeStatus( const QString& ) ) ); - close = KStdAction::close( this, SLOT( menuClose() ), actionCollection() ); - quit = KStdAction::quit( this, SLOT( menuQuit() ), actionCollection() ); - - // Plug the items into "connect" - connectActionMenu_->plug( connectMenu ); - disconnect_ ->plug( connectMenu ); - disconnect_ ->plug( toolBar("mainToolBar") ); - connectMenu->insertSeparator( ); - status_ ->plug( connectMenu ); - status_ ->plug( toolBar("mainToolBar") ); - showProfile_ ->plug( connectMenu ); - connectMenu->insertSeparator(); - close ->plug( connectMenu ); - close ->plug( toolBar("mainToolBar") ); - quit ->plug( connectMenu ); - quit ->plug( toolBar("mainToolBar") ); // temp - - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&Connect"), connectMenu ); -} - - - -// Create the "Help" menu -void KMessInterface::createHelpMenu() -{ - KAction *aboutKDE, *aboutKMess, *helpContents; - KPopupMenu *helpMenu; - - // Create the menu - helpMenu = new KPopupMenu( this, "helpmenu" ); - - // Create the help menu. - helpMenu_ = new KHelpMenu(this, KGlobal::instance()->aboutData()); - - // Create the help menu items - helpContents = KStdAction::helpContents(this, SLOT( helpContents() ), actionCollection() ); - aboutKMess = KStdAction::aboutApp(this, SLOT( aboutKMess() ), actionCollection() ); - aboutKDE = KStdAction::aboutKDE(this, SLOT( aboutKDE() ), actionCollection() ); - - // Plug the items into "help" - helpContents->plug( helpMenu ); - helpMenu->insertSeparator(); - aboutKMess ->plug( helpMenu ); - aboutKDE ->plug( helpMenu ); - - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&Help"), helpMenu ); -} - - - -// Create the menus -void KMessInterface::createMenus() -{ - // Create the 4 menus - createConnectMenu(); - createViewMenu(); - createActionsMenu(); - createHelpMenu(); -} - - - -// Create the "View" menu -void KMessInterface::createViewMenu() -{ - QStringList viewModes; - - // Create the menu - viewMenu_ = new KPopupMenu( this, "viewmenu" ); - - // Create the "view" menu items - showAllowedAction_ = new KToggleAction( i18n("Show &Allowed Contacts"), 0, KShortcut(), this, "allowed"); - showOfflineAction_ = new KToggleAction( i18n("Show &Offline Contacts"), 0, KShortcut(), this, "offline"); - showRemovedAction_ = new KToggleAction( i18n("Show &Removed Contacts"), 0, KShortcut(), this, "removed"); - showPicturesAction_= new KToggleAction( i18n("Show &Display Pictures"), 0, KShortcut(), this, "showpics"); - -#ifdef KMESS_NETWORK_WINDOW - showNetworkAction_ = new KAction(i18n("Show &Network Window"), "network_local", 0, - this, SLOT(showNetworkWindow()), actionCollection(), "shownetwork"); -#endif - - viewMode_ = new KSelectAction( i18n("&Sort Contacts by"), "view_tree", 0, this, "viewmode"); - viewModes << i18n("Group") << i18n("Online/Offline"); - viewMode_->setItems(viewModes); - connect ( viewMode_, SIGNAL( activated( int ) ), this, SLOT( changeViewMode( int ) ) ); - - showTransferAction_ = new KAction(i18n("Show &Transfer Window"), "cache", 0, - this, SLOT(showTransferWindow()), actionCollection(), "showtransfers"); - - showToolBar_ = KStdAction::showToolbar ( this, SLOT( showToolBar() ), actionCollection() ); - showStatusBar_ = KStdAction::showStatusbar( this, SLOT( showStatusBar() ), actionCollection() ); - - // Connect "showAllowed" and "showRemoved" - connect( showAllowedAction_, SIGNAL( toggled(bool) ), this, SLOT( toggleShowAllowed(bool) ) ); - connect( showOfflineAction_, SIGNAL( toggled(bool) ), this, SLOT( toggleShowOffline(bool) ) ); - connect( showRemovedAction_, SIGNAL( toggled(bool) ), this, SLOT( toggleShowRemoved(bool) ) ); - - // Connect "Show Display Pictures" setting - connect( showPicturesAction_, SIGNAL( toggled(bool) ), this, SLOT( toggleDisplayPictures(bool) ) ); - - // Plug the items into "view" - showAllowedAction_ ->plug( viewMenu_ ); - showRemovedAction_ ->plug( viewMenu_ ); - showOfflineAction_ ->plug( viewMenu_ ); - viewMenu_ ->insertSeparator(); - showPicturesAction_ ->plug( viewMenu_ ); - viewMenu_ ->insertSeparator(); - viewMode_ ->plug( viewMenu_ ); - viewMenu_ ->insertSeparator(); - showTransferAction_ ->plug( viewMenu_ ); - viewMenu_ ->insertSeparator(); - showToolBar_ ->plug( viewMenu_ ); - showStatusBar_ ->plug( viewMenu_ ); - -#ifdef KMESS_NETWORK_WINDOW - viewMenu_->insertSeparator(); - showNetworkAction_->plug( viewMenu_ ); -#endif - - // Plug the menu into the menubar - menuBar()->insertItem( i18n("&View"), viewMenu_ ); -} - - - -// "Add new account" has been selected from the menu. -void KMessInterface::createNewAccount() -{ - kdDebug() << "createNewAccount not implemented" << endl; -} - - - -// Disconnect was selected from the menu. -void KMessInterface::disconnectClicked() -{ - kdDebug() << "disconnectClicked not implemented" << endl; -} - - - -// Enable/disable menus based on whether or not the application is -// connected to the server. -void KMessInterface::enableMenus(bool connected) -{ - connectActionMenu_->setEnabled( !connected ); - disconnect_->setEnabled( connected ); - if ( connected ) - { - disconnect_->setIcon( "connect_established" ); - } - else - { - disconnect_->setIcon( "connect_no" ); - } - status_->setEnabled( connected ); - - newContact_-> setEnabled( connected ); - newGroup_-> setEnabled( connected ); - showAllowedAction_->setEnabled( connected ); - showOfflineAction_->setEnabled( connected ); - showRemovedAction_->setEnabled( connected ); - showPicturesAction_->setEnabled( connected ); - showProfile_-> setEnabled( connected ); - viewMode_-> setEnabled( connected ); - // showNetworkAction should ALWAYS be enabled! -} - - - -// Show the user manual for KMess. -void KMessInterface::helpContents() -{ - kapp->invokeHelp("kmess/index"); -} - - - -// Initialize the class -bool KMessInterface::initialize() -{ -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - initializing" << endl; -#endif - if ( initialized_ ) - { - kdDebug() << "KMessInterface was already initialized." << endl; - return false; - } - - // Initialize the status bar - statusLabel_ = new QLabel( this ); - statusBar()->addWidget( statusLabel_, 2 ); - - statusTimer_ = new QLabel( this ); - statusTimer_->setText( "00:00" ); - statusBar()->addWidget( statusTimer_, 0, true ); - - - // Create the online timer - onlineTimer_ = new QTimer( this ); - connect( onlineTimer_, SIGNAL( timeout() ), - this, SLOT( updateOnlineTimer() ) ); - - // Create the menus - createMenus(); - - if ( ! initSystemTrayWidget() ) - { - kdDebug() << "KMess - Couldn't initialize the system tray widget." << endl; - return false; - } - -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - initialized" << endl; -#endif - return true; -} - - -// Initialize the system tray widget -bool KMessInterface::initSystemTrayWidget() -{ - bool initialized; - - // Create the widget - systemTrayWidget_ = new SystemTrayWidget( this, "systemtraywidget" ) ; - if ( systemTrayWidget_ == 0 ) - { - kdDebug() << "KMessInterface - Couldn't create system tray widget." << endl; - return false; - } - - // Initialize the widget - initialized = systemTrayWidget_->initialize(); - if ( !initialized ) - { - kdDebug() << "KMessInterface - Couldn't initialize system tray widget." << endl; - return false; - } - - // Plug some of the menu actions into the system tray widget's menu. - connectActionMenu_-> plug( systemTrayWidget_->menu() ); - disconnect_-> plug( systemTrayWidget_->menu() ); - systemTrayWidget_-> menu()->insertSeparator(); - status_-> plug( systemTrayWidget_->menu() ); - systemTrayWidget_-> menu()->insertSeparator(); - settingsActionMenu_->plug( systemTrayWidget_->menu() ); - - // Make the connections for the system tray widget - connect( systemTrayWidget_, SIGNAL( quitSelected() ), - this, SLOT ( menuQuit() ) ); - - systemTrayWidget_->show(); -#ifdef KMESSTEST - ASSERT( systemTrayWidget_ != 0 ); - ASSERT( systemTrayWidget_->isVisible() ); -#endif - return true; -} - - -// Close has been selected from the menu. -void KMessInterface::menuClose() -{ -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - 'Close' was selected from the menu." << endl; -#endif - // Hide the window - queryClose(); // To show the KMessageBox too -#ifdef KMESSTEST - ASSERT( isHidden() ); -#endif -} - - - -// Quit was selected from the menu. -void KMessInterface::menuQuit() -{ -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - 'Quit' was selected from the menu." << endl; -#endif - - // Tell the application manager we want to quit - KMessApplication *app = static_cast(kapp); - app->setQuitSelected(true); - - close(); // Close this window, initiates quit -} - - - -// Reject quitting unless the quit menu was pressed Called automatically by KMainWindow::closeEvent -bool KMessInterface::queryExit() -{ -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface::queryExit: Accepting exit request." << endl; -#endif - - return true; -} - - - -// Tell the user that KMess hides in the systray Called automatically by KMainWindow::closeEvent -bool KMessInterface::queryClose() -{ - // KMessApplication also defines sessionSaving() for KDE 3.1 - KMessApplication *app = static_cast(kapp); - - - // Only allow KMess to quit if: - // - the "quit" option was used from the menu - // - the session manager wants to quit (we're called from KApplication::commitData()) - if( app->quitSelected() || - app->sessionSaving() ) - { -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface::queryClose: Accepting quit request." << endl; -#endif - - // Make sure that substituent also return true - app->setQuitSelected(true); - - // Make sure some stuff can be cleaned up when leaving kde. - applicationClosing(); - return true; - } - - // Tell that KMess is still visible in the tray - systemTrayWidget_->displayCloseMessage(); - -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface::queryClose: Rejecting quit request, hiding window" << endl; -#endif - - hide(); - return false; -} - - - -// Restore the window properties (called by KMainWindow) -void KMessInterface::readProperties(KConfig *config) -{ -#ifdef KMESSTEST - ASSERT( config != 0 ); -#endif -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - Reading properties" << endl; -#endif - - // Pull in the window size and position - config->setGroup("General"); - QSize windowsize = config->readSizeEntry("Size"); - if(!windowsize.isEmpty()) - { - resize(windowsize); - } - QPoint position = config->readPointEntry("Position"); - if(!position.isNull()) - { - move(position); - } - // bar status settings - bool bViewToolbar = config->readBoolEntry("Show Toolbar", true); - showToolBar_->setChecked(bViewToolbar); - showToolBar(); - - bool bViewStatusbar = config->readBoolEntry("Show Statusbar", true); - showStatusBar_->setChecked(bViewStatusbar); - showStatusBar(); - - // bar position settings - KToolBar::BarPosition toolBarPos; - toolBarPos=(KToolBar::BarPosition) config->readNumEntry("ToolBarPos", KToolBar::Top); - toolBar("mainToolBar")->setBarPos(toolBarPos); -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - Done reading properties" << endl; -#endif - - -#ifdef KMESSTEST - ASSERT( config->readSizeEntry("Size") == size() ); - ASSERT( config->readPointEntry("Position") == pos() ); - ASSERT( config->readBoolEntry("Show Toolbar", true) == showToolBar_->isChecked() ); - ASSERT( config->readBoolEntry("Show Statusbar", true) == showStatusBar_->isChecked() ); - ASSERT( config->readNumEntry("ToolBarPos", KToolBar::Top) == (int) toolBar("mainToolBar")->barPos() ); -#endif -} - - -// Save the window properties (called by KMainWindow) -void KMessInterface::saveProperties(KConfig *config) -{ -#ifdef KMESSTEST - ASSERT( config != 0 ); -#endif -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - Saving properties" << endl; -#endif - config->setGroup("General"); - config->writeEntry("Size", size() ); - config->writeEntry("Position", pos() ); - config->writeEntry("Show Toolbar", showToolBar_->isChecked() ); - config->writeEntry("Show Statusbar", showStatusBar_->isChecked() ); - config->writeEntry("ToolBarPos", (int) toolBar("mainToolBar")->barPos() ); -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "KMessInterface - Done saving properties" << endl; -#endif -#ifdef KMESSTEST - ASSERT( config->readSizeEntry("Size") == size() ); - ASSERT( config->readPointEntry("Position") == pos() ); - ASSERT( config->readBoolEntry("Show Toolbar", true) == showToolBar_->isChecked() ); - ASSERT( config->readBoolEntry("Show Statusbar", true) == showStatusBar_->isChecked() ); - ASSERT( config->readNumEntry("ToolBarPos", KToolBar::Top) == (int) toolBar("mainToolBar")->barPos() ); -#endif -} - - - -// Open up the URL for MSN's contact search page. -void KMessInterface::searchForContact() -{ - kapp->invokeBrowser( "http://members.msn.com/find.msnw?pgmarket=en-en" ); -} - - - -// Open up the URL to MSN's "search by interest" page. -void KMessInterface::searchForContactByInterest() -{ - kapp->invokeBrowser( "http://members.msn.com/rootcat.msnw?pgmarket=en-en" ); -} - - - -// "Show status bar" was toggled. -void KMessInterface::showStatusBar() -{ - if(!showStatusBar_->isChecked()) - { - statusBar()->hide(); - } - else - { - statusBar()->show(); - } -} - - - -// "Show toolbar" was toggled. -void KMessInterface::showToolBar() -{ - if(!showToolBar_->isChecked()) - { - toolBar("mainToolBar")->hide(); - } - else - { - toolBar("mainToolBar")->show(); - } -} - - - -// Show the user's MSN profile. -void KMessInterface::showUserProfile() -{ - kdDebug() << "showUserProfile not implemented" << endl; -} - - - -// Change the status bar message. -void KMessInterface::statusMessage( QString message, ConnectionStatus connectState ) -{ -#ifdef KMESSDEBUG_KMESSINTERFACE - kdDebug() << "STATUS MESSAGE " << message << endl; -#endif - //statusBar()->clear(); - //statusBar()->changeItem( message, ID_STATUS_MSG ); - statusLabel_->setText( message ); - - if ( connectState != connectState_ ) - { - switch ( connectState ) - { - case TYPE_MESSAGE: - onlineTime_ = 0; - onlineTimer_->start( 60000 ); - break; - case TYPE_WARNING: // No actions are needed for the warning messages - break; - case TYPE_ERROR: - - onlineTimer_->stop(); - statusTimer_->setText( "00:00" ); - break; - } - - connectState_ = connectState; - } -} - - - -// The "show display pictures" menu item has been toggled. -void KMessInterface::toggleDisplayPictures(bool /*show*/) -{ - kdDebug() << "toggleDisplayPictures not implemented" << endl; -} - - - -// The "show allowed contacts" menu item has been toggled. -void KMessInterface::toggleShowAllowed(bool /*show*/) -{ - kdDebug() << "toggleShowAllowed not implemented" << endl; -} - - - -// The "show offline contacts" menu item has been toggled. -void KMessInterface::toggleShowOffline(bool /*show*/) -{ - kdDebug() << "toggleShowOffline not implemented" << endl; -} - - - -// The "show removed contacts" menu item has been toggled. -void KMessInterface::toggleShowRemoved(bool /*show*/) -{ - kdDebug() << "toggleShowRemoved not implemented" << endl; -} - - -// Increment and update the online timer. -void KMessInterface::updateOnlineTimer() -{ - QString timeText; - - onlineTime_ ++; - - timeText.sprintf( "%02i:%02i", onlineTime_ / 60, onlineTime_ % 60 ); - - statusTimer_->setText( timeText ); -} - -#include "kmessinterface.moc" diff --git a/kmess/kmesslistviewitem.cpp b/kmess/kmesslistviewitem.cpp deleted file mode 100644 index cc3a3eb..0000000 --- a/kmess/kmesslistviewitem.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/*************************************************************************** - kmesslistviewitem.cpp - description - ------------------- - begin : Fri Mar 28 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 "kmesslistviewitem.h" - -#include "kmessdebug.h" - -#include -#include -#include -#include -#include - -#include - -#ifdef KMESSDEBUG_KMESSLISTVIEWITEM -#define KMESSDEBUG_KMESSLISTVIEWITEM_GENERAL -#endif - - -// The constructor -KMessListViewItem::KMessListViewItem(QListView *parent) - : QListViewItem( parent ), - richText_(0), - htmlText_(QString("")), - listParent_(parent) -{ - setMultiLinesEnabled( false ); - updateAppearance(); -} - - - -// The constructor -KMessListViewItem::KMessListViewItem(QListViewItem *parent) - : QListViewItem( parent ), - richText_(0), - htmlText_(QString("")), - listParent_(0) -{ - setMultiLinesEnabled( false ); - updateAppearance(); -} - - - -// The destructor -KMessListViewItem::~KMessListViewItem() -{ - if( richText_ != 0 ) delete richText_; -} - - - -// Change the text displayed by this item -void KMessListViewItem::setText( const QString &text ) -{ - htmlText_ = QString( text ); - updateAppearance(); -} - - - -// Change the text used as sorting key by the parent QListView -void KMessListViewItem::setKey( const QString &key ) -{ - // Set the item's text, this will only be used as sorting key and not displayed - QListViewItem::setText( 0, key ); -} - - - -// // Compare -// int KMessListViewItem::compare( QListViewItem *item, int /* col */, bool /* asc */) const -// { -// #ifdef KMESSTEST -// ASSERT( dynamic_cast(item) != 0 ); -// #endif -// -// int thisType = this->getType(); // Is overwritten in sub classes -// int thatType = static_cast(item) -> getType(); -// -// if(thisType == thatType) return 0; // Equal. -// if(thisType == LISTTYPE_CONTACT) return -1; // Contact is smaller, show individual contacts above the groups. -// return 1; // "Group" and "base" are greather, sort at the bottom. -// } - - - -// Return the type ID -int KMessListViewItem::getType() const -{ - return LISTTYPE_BASE; -} - - - -// Paint a cell (column 0, always) - this allows us emoticons, through QSimpleRichText -void KMessListViewItem::paintCell( QPainter *painter, const QColorGroup &colourGroup, int column, int width, int align ) -{ - // Columns other than the contacts' one are displayed normally - if( column != 0 ) - { - QListViewItem::paintCell( painter, colourGroup, column, width, align ); - return; - } - - // We need to change the cell's colors, to prevent the original text from displaying: - // this is required due to the QSimpleRichText widget that we're putting over the cell - QColorGroup customColourGroup = QColorGroup( colourGroup ); - - // Hide the sorting key text, both when selected and normal items are being painted - if( isSelected() ) - { - // Hide it using the selection bar's color - customColourGroup.setColor( QColorGroup::HighlightedText, colourGroup.color( QColorGroup::Highlight ) ); - } - else - { - // Hide it using a transparent color - customColourGroup.setColor( QColorGroup::Text, QColor( qRgba( 255,255,255,0 ) ) ); - } - - // Repaint the cell - with the transparent text - QListViewItem::paintCell( painter, customColourGroup, column, width, align ); - - // Redraw the rich text - richText_->draw( painter, listView()->itemMargin(), 0, QRect( 0, 0, width, height() ), colourGroup, 0 ); - - // Fit the cell to the rich text's height - setHeight( richText_->height() ); -} - - - -// Recreate the rich text -void KMessListViewItem::updateAppearance() -{ - // Delete the existing rich text - if ( richText_ != 0 ) - { - delete richText_; - richText_ = 0; - } - - // Create a new rich text object - richText_ = new QSimpleRichText( "" + htmlText_ + "", listView()->viewport()->font() ); - // TODO: use the QMimeSourceFactory parameter to load all graphics only once. - - // Avoid using widthUsed() since that breaks with right-aligned text (right-to-left languages). - richText_->setWidth( 0 ); - - // Tell the listview to re-calculate it's width - widthChanged(0); - - repaint(); -} - - -// Re-sort the parent nodes -void KMessListViewItem::resortParent() -{ - // Ask parent to re-run the sorting algorithm - if(QListViewItem::parent() != 0) - { - QListViewItem::parent()->sort(); - } - else if(listParent_ != 0) - { - // FIXME: remove this if the QListViewItem::parent() also works for listviews - listParent_->sort(); - } -#ifdef KMESSDEBUG_KMESSLISTVIEWITEM_GENERAL - else - { - kdDebug() << "KMessListViewItem::resortParent: No parent found!" << endl; - } -#endif -} - - - -// returns the width of the text in the column -int KMessListViewItem::width( const QFontMetrics & fm, const QListView * lv, int c) const -{ - if(c == 0) - { - return richText_->width(); - } - - return QListViewItem::width( fm, lv, c ); -} diff --git a/kmess/kmesslistviewitem.h b/kmess/kmesslistviewitem.h deleted file mode 100644 index 1dfbed8..0000000 --- a/kmess/kmesslistviewitem.h +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************** - kmesslistviewitem.h - description - ------------------- - begin : Fri Mar 28 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 KMESSLISTVIEWITEM_H -#define KMESSLISTVIEWITEM_H - -#include - -// Forward declarations -class QSimpleRichText; -class QString; - - -/** - * @brief Base class for contact list view items. - * - * This class implements the base features both ContactListViewItem and GroupListViewItem inherit. - * It handles the painting of rich text and communication with the QListView parent. - * The rich text painting features are used to draw emoticons in the contact list. - * - * @author Mike K. Bennett - * @ingroup Root - */ -class KMessListViewItem : public QListViewItem -{ - public: - enum ListTypes - { - LISTTYPE_BASE = -1, - LISTTYPE_GROUP = 0, - LISTTYPE_CONTACT = 1 - }; - - // The constructor - KMessListViewItem(QListView *parent); - // The constructor - KMessListViewItem(QListViewItem *parent); - // The destructor - ~KMessListViewItem(); - - // Compare -// virtual int compare( QListViewItem *item, int column, bool ascending ) const; - // Return the type of the item - virtual int getType() const; - // Return the tooltip text. - virtual QString getToolTipText() const = 0; - // Paint a cell (column 0, always) - this allows us emoticons, through QSimpleRichText - void paintCell( QPainter * painter, const QColorGroup & colourGroup, int column, int width, int align ); - // Change the cell's text - void setText(const QString &text); - // Change the ordering key for the cell - void setKey(const QString &text); - - protected: - // Re-sort the parent nodes - void resortParent(); - - private: // Private methods - // Recreate the rich text - void updateAppearance(); - // returns the width of the text in the column - int width ( const QFontMetrics & fm, const QListView * lv, int c ) const; - - private: // Private attributes - // The rich text painter - QSimpleRichText *richText_; - // The cell's visible text. - QString htmlText_; - // TODO: Remove this, temporary fix - QListView *listParent_; -}; - -#endif diff --git a/kmess/kmesstest.cpp b/kmess/kmesstest.cpp deleted file mode 100644 index 908794e..0000000 --- a/kmess/kmesstest.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/*************************************************************************** - kmesstest.cpp - description - ------------------- - begin : Sun Jan 5 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 "kmesstest.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include "settings/settingsdialog.h" -#include "network/msnnotificationconnection.h" -#include "network/msnswitchboardconnection.h" -#include "contact/contactbase.h" -#include "contact/contactlist.h" -#include "contact/group.h" -#include "currentaccount.h" -#include "emoticonmanager.h" -#include "kmess.h" -#include "kmessview.h" -#include "chat/chatwindow.h" -#include "chat/contactsidebar.h" -#include "chat/xsltransformation.h" -#include "nowlisteningclient.h" -#include "dialogs/transferwindow.h" -#include "dialogs/transferentryinterface.h" -#include "dialogs/transferentry.h" - -#include "network/soap/httpsoapconnection.h" -#include "network/soap/soapmessage.h" -#include "network/soap/msnappdirectoryservice.h" - -#include "notification/passivepopupinterface.h" -#include "notification/notificationcontactstatus.h" -// #include "network/upnp/manager.h" - -// The constructor -KMessTest::KMessTest(KMess *kmess) - : QObject() - , kmess_(kmess) -{ -} - - - -// The destructor -KMessTest::~KMessTest() -{ - kdDebug() << "KMessTest DESTROYED" << endl; -} - - -#ifdef KMESSTEST - -// The main testing function -void KMessTest::test() -{ - kdDebug() << "----------------------------------------" << endl << endl; -// testTransferWindow(); -// testChatWindow(); -// testNotificationConnection(); -// testContactListWithNotificationConnection(); -// testConnect(); -// testSettings(); -// testSwitchboardConnection(); -// testNotifications(); -// testNowListening(); -// testSoapConnection(); -// testUpnpConnection(); -// testXslTransformation(); - kdDebug() << endl << "----------------------------------------" << endl; - - // Close the application -} - -void KMessTest::testTransferWindow() -{ - int id; - KIconLoader *loader = KGlobal::iconLoader(); - TransferWindow *instance = TransferWindow::getInstance(); - - id = instance->addEntry( "Filename1", 1234567890, true, QImage( loader->iconPath( "add", 48, false ) ) ); - kdDebug() << "Added ID: " << id << endl; - - id = instance->addEntry( "Filename2", 34567890, false, QImage( loader->iconPath( "remove", 48, false ) ) ); - kdDebug() << "Added ID: " << id << endl; - - id = instance->addEntry( "Filename3", 567890, true ); - kdDebug() << "Added ID: " << id << endl; - -// TransferWindow::destroy(); -} - - -void KMessTest::testChatWindow() -{ - EmoticonManager::instance()->connected(); - ChatWindow *chatWindow = new ChatWindow(); - chatWindow->initialize("none"); - chatWindow->contactSidebar_->contactJoined("contact1@kmess.org", QString::null); - chatWindow->contactSidebar_->contactJoined("contact2@kmess.org", QString::null); - MsnSwitchboardConnection *sb = new MsnSwitchboardConnection(); - chatWindow->setSwitchboardConnection( sb ); - chatWindow->show(); -} - -void KMessTest::testNotifications() -{ - kdDebug() << "PassivePopup: Testing..." << endl; - - NotificationContactStatus *cs = new NotificationContactStatus( kmess_->notificationManager_ ); - Contact *contact1 = new Contact( "gni", "Test!", 0, "0", "235"); - Contact *contact2 = new Contact( "dfg", "// Notify the user about this cationContactOnline( kmess_->notificatievent (a new email has arrived) void NotificationNewEmail::notify( QString sender, QString subject, bool inInbox, QString command, QString folder, QString url )", 0, "0", "551"); - Contact *contact3 = new Contact( "ehb", "Status Contact", 0, "0", "745"); - - contact1->setStatus( "NLN" ); - contact2->setStatus( "FLN" ); - contact3->setStatus( "BSY" ); - - cs->notify( contact1, true ); - cs->notify( contact2, true ); - cs->notify( contact3, true ); -} - -void KMessTest::testNowListening() -{ - NowListeningClient *client = new NowListeningClient(); - client->setEnabled( true ); -} - -void KMessTest::testNotificationConnection() { } -void KMessTest::testContactListWithNotificationConnection() { } -void KMessTest::testConnect() { } -void KMessTest::testSettings() { } -void KMessTest::testSwitchboardConnection() { } - - - -void KMessTest::testSoapConnection() -{ - MsnAppDirectoryService *appDir = new MsnAppDirectoryService(); - appDir->queryServiceList( MsnAppDirectoryService::GAMES ); - -// QString xml = "" -// "" -// "" -// "" -// " Removed for security reasons " -// "

Removed for security reasons

" -// "
" -// "
" -// "" -// "" -// "MSG1132093467.11" -// "false" -// "" -// "" -// "
"; -// -// HttpSoapConnection *soap = new HttpSoapConnection("http://localhost:81/index.xml"); -// soap->sendRequest("http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage", xml); -} - - - -void KMessTest::testUpnpConnection() -{ -// UPnP::Manager *manager = UPnP::Manager::instance(); -} - - -void KMessTest::testXslTransformation() -{ - // A simple test using XSL/XML data of the KMess website - QString wwwRoot = "/srv/www/vhosts/kmess/htdocs"; - - // Load XSL - XslTransformation xsl; - xsl.setStylesheet( wwwRoot + "/resources/xsl/kmess.xsl" ); - - // Open XML - QFile file( wwwRoot + "/index.xml" ); - bool open = file.open(IO_ReadOnly); - if(! open) - { - kdWarning() << "Could not open file: " << file.name() << endl; - } - - // Load XML - QByteArray fileData = file.readAll(); - QString xml = QString::fromUtf8(fileData.data(), fileData.size()); - file.close(); - - // Transform XML - kdDebug() << "XSL transformation result:" << endl; - kdDebug() << xsl.convertXmlString(xml); -} - - - -#endif // KMESSTEST - - -#include "kmesstest.moc" diff --git a/kmess/kmessview.cpp b/kmess/kmessview.cpp deleted file mode 100644 index 081b005..0000000 --- a/kmess/kmessview.cpp +++ /dev/null @@ -1,1854 +0,0 @@ -/*************************************************************************** - kmessview.cpp - description - ------------------- - begin : Thu Jan 9 2003 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 "kmessview.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "contact/contact.h" -#include "contact/contactlist.h" -#include "contact/group.h" -#include "dialogs/contactpropertiesdialog.h" - -#include "contactlistviewitem.h" -#include "currentaccount.h" -#include "grouplistviewitem.h" -#include "kmessdebug.h" -#include "specialgroups.h" - -#ifdef KMESSDEBUG_KMESSVIEW -#define KMESSDEBUG_KMESSVIEW_GENERAL -#endif - - -// The constructor -KMessView::KMessView(QWidget *parent, const char *name ) - : KMessViewInterface(parent,name), - connected_(false), - currentAccount_(0), - initialized_(false) -{ - toolTip_ = new ToolTip(this, 0); - - // Capture focus events without subclassing the widget from the .UI file - personalMessageInput_->installEventFilter(this); - currentAccountDisplayPic_->installEventFilter(this); - - // Fake an event to configure the personal message input - QEvent ev(QEvent::FocusOut); - eventFilter(personalMessageInput_, &ev); - - // I actually want to implement a tooltip like filelight has, - // but this makes things easier already. - // It causes a dialog to display tooltips faster. - QToolTip::setWakeUpDelay(200); -} - - - -// The destructor -KMessView::~KMessView() -{ - delete toolTip_; - -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "DESTROYED KMessView " << endl; -#endif -} - - - -// The currently playing song was changed. -void KMessView::changedSong( const QString &artist, const QString &/*album*/, const QString &track, bool playing ) -{ - if( playing ) - { - // Show status line - if( ! nowListeningFrame_->isVisible() ) - { - nowListeningFrame_->setHidden(false); - nowListeningFrame_->setMaximumHeight(40); - } - - // Update label - QString longTitle = artist + (artist.isEmpty() ? "" : " - ") + track; - nowListeningLabel_->setText( i18n("Now listening to %1").arg(longTitle) ); - } - else - { - // Hide status line - nowListeningFrame_->setHidden(true); - nowListeningFrame_->setMaximumHeight(0); - } -} - - - -// The program is connected to the server. Store the user account and -// update the user information. -void KMessView::connected() -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView - connected" << endl; -#endif - connected_ = true; - - // Run the update functions with the current user data - slotUpdateEmailDisplay(); - slotUpdateUserStatus(); - slotUpdateNoEmails(); - slotUpdateDisplayPicture(); - - // Enable the labels - onlineStatusLabel_->setEnabled(true); - emailLabel_->setEnabled(true); - - // Hide the now listening until something is playing - changedSong( QString::null, QString::null, QString::null, false ); - - // Restore the personal message text - const QString &message = currentAccount_->getPersonalMessage(); - if( message.isEmpty() ) - { - personalMessageInput_->setText( i18n("") ); - } - else - { - personalMessageInput_->setText( message ); - } -} - - - -// Called when the program has disconnected from the server. -void KMessView::disconnected() -{ - KIconLoader *loader = KGlobal::iconLoader(); - - connected_ = false; - - // Disable and reset the labels - onlineStatusLabel_->setText( i18n("Disconnected") ); - onlineStatusLabel_->setEnabled(false); - currentAccountDisplayPic_->setPixmap( loader->loadIcon( "offline", KIcon::User ) ); - emailLabel_->setText(""); - emailLabel_->setEnabled(false); - - // Clear the contact list - // (all current items still reffer to non-existing contacts) - contactListView_->clear(); - personalMessageInput_->clear(); - - // Add the existing groups of the contactlist to this view - QPtrList groupList( currentAccount_->getContactList()->getGroupList() ); - QPtrListIterator it( groupList ); - while(it.current() != 0) - { - slotGroupAdded(it.current()); - ++it; - } -} - - - -// Fix the sort positions, by making them incremental again. -void KMessView::fixGroupSortPositions() -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::fixGroupSortPositions" << endl; -#endif - - Group *group; - GroupListViewItem *groupItem = findFirstGroup(); - int newPosition = 0; - - while(groupItem != 0) - { - group = groupItem->getGroup(); - - if(! group->isSpecialGroup()) - { - // This does not change the list sorting - // (since we found the items in this sequence), - // but it ensures the sort-index is unique. - group->setSortPosition(++newPosition); - -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView: Group " << group->getName() - << " has sort position " << newPosition << endl; -#endif - } - - groupItem = findNextGroup(groupItem); - } -} - - - -// Return the contact associated with the given item -Contact * KMessView::getContactByItem(QListViewItem *item) const -{ - if(item == 0) - { - // Happens when contactListView_->currentItem() is null. - return 0; - } - -#ifdef KMESSTEST - ASSERT( dynamic_cast(item) != 0 ); -#endif - - // Check the type - int type = static_cast(item) -> getType(); - - switch(type) - { - case KMessListViewItem::LISTTYPE_CONTACT : - { - return static_cast(item) -> getContact(); - } - } - - return 0; -} - - - -// Find out whether the contact is added to the group item -ContactListViewItem* KMessView::getContactItemInGroup(const QListViewItem *groupItem, const Contact *contact) const -{ - QListViewItem *currentItem; - ContactListViewItem *contactItem; - int type; - - // Get the first item - currentItem = groupItem->firstChild(); - - while(currentItem != 0) - { - // Check the type - type = static_cast( currentItem )->getType(); - - switch(type) - { - case KMessListViewItem::LISTTYPE_CONTACT : - { - // Check if this is the requested contact - contactItem = static_cast( currentItem ); - if(contactItem->getContact() == contact) - { - return contactItem; - } - } - } - - // Get the next item - currentItem = currentItem->nextSibling(); - } - - return 0; -} - - - -// Return the group associated with the given item -Group * KMessView::getGroupByItem(QListViewItem *item) const -{ - if(item == 0) - { - // Happens when contactListView_->currentItem() is null. - return 0; - } - -#ifdef KMESSTEST - ASSERT( dynamic_cast(item) != 0 ); -#endif - - int type; - QListViewItem *realItem; - - // Find the root node - realItem = item; - while(realItem->parent() != 0) - { - realItem = realItem->parent(); - } - - // Check the type - type = static_cast(realItem) -> getType(); - - switch(type) - { - case KMessListViewItem::LISTTYPE_GROUP : - { - return static_cast(realItem) -> getGroup(); - } - } - - return 0; -} - - - -// Return the special group the contact should be placed in. -QString KMessView::getMetaGroupId(const Contact *contact) const -{ - if( contact->isFriend() ) - { - // If a contact is in the friends list, show on top - return SpecialGroups::INDIVIDUALS; - } - else if( contact->isAllowed() ) - { - // If the contact is only allowed, show in "allowed" group - return SpecialGroups::ALLOWED; - } - else if (contact->isBlocked() || contact->isReverse()) - { - // The contact is either blocked, or *only* at the reverse list - return SpecialGroups::REMOVED; - } - else - { - // Contact no longer visible in *any* list, is really removed. - return QString::null; - } -} - - - -// Initialize the class -bool KMessView::initialize() -{ - bool success; - KIconLoader *loader = KGlobal::iconLoader(); - - if ( initialized_ ) - { - kdDebug() << "KMessView already initialized." << endl; - return false; - } - - success = initContactListView(); - if(! success) - { - kdDebug() << "KMessView - Couldn't initialize contact list view." << endl; - return false; - } - - success = initContactPopup(); - if(! success) - { - kdDebug() << "KMessView - Couldn't initialize contact popup." << endl; - return false; - } - - success = initGroupPopup(); - if(! success) - { - kdDebug() << "KMessView - Couldn't initialize group popup." << endl; - return false; - } - - // Set an icon for the email label - // Using "knotify" icon because it's available everywhere. "multimedia" is SUSE-specific. - emailPixmapLabel_->setPixmap( loader->loadIcon("mail_generic", KIcon::NoGroup) ); - nowListeningPixmapLabel_->setPixmap( loader->loadIcon("knotify", KIcon::NoGroup) ); - - - // Connect signals for the current-account - currentAccount_ = CurrentAccount::instance(); - - connect( currentAccount_, SIGNAL( changedMsnObject() ), - this, SLOT ( slotUpdateDisplayPicture() ) ); // Changed users display pic - connect( currentAccount_, SIGNAL( changedNoEmails() ), // Changed e-mail 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 - this, SLOT ( slotUpdateEmailDisplay() ) ); - connect( currentAccount_, SIGNAL( changedDisplaySettings() ), // Changed group-display settings - this, SLOT ( slotUpdateDisplaySettings() ) ); - connect( currentAccount_, SIGNAL( changedViewMode() ), // Changed the requested view mode - this, SLOT ( slotUpdateViewMode() ) ); - - // Connect signals for the contactlist - const ContactList *contactList = currentAccount_->getContactList(); - - connect( contactList, SIGNAL( contactAdded(Contact*) ), // A contact was added. - this, SLOT( slotContactAdded(Contact*) ) ); - connect( contactList, SIGNAL( contactOffline(Contact*,bool) ), // A contact went offline - this, SLOT( slotContactChangedOnline(Contact*) ) ); - connect( contactList, SIGNAL( contactOnline(Contact*,bool) ), // A contact went online - this, SLOT( slotContactChangedOnline(Contact*) ) ); - connect( contactList, SIGNAL( contactMoved(Contact*) ), // A contact was moved - this, SLOT( slotContactMoved(Contact*) ) ); - connect( contactList, SIGNAL( contactRemoved(const Contact*) ), // A contact was removed - this, SLOT( slotContactRemoved(const Contact*) ) ); - connect( contactList, SIGNAL( groupAdded(Group*) ), // A group was added - this, SLOT( slotGroupAdded(Group*) ) ); - connect( contactList, SIGNAL( groupRemoved(const Group*) ), // A group was removed - this, SLOT( slotGroupRemoved(const Group*) ) ); - - // Add the existing groups of the contactlist to this view - QPtrList groupList( contactList->getGroupList() ); - QPtrListIterator it( groupList ); - while(it.current() != 0) - { - slotGroupAdded(it.current()); - ++it; - } - // Assign a ref. number to group positions - fixGroupSortPositions(); - - return true; -} - - - -// The personal status message received an event. -bool KMessView::eventFilter(QObject *obj, QEvent *event) -{ - if( obj != personalMessageInput_ - && obj != currentAccountDisplayPic_ ) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdWarning() << "KMessView::eventFilter: Received event '" << event->type() << "' from object '" << obj->name() << "'." << endl; -#endif - return false; - } - - QEvent::Type eventType = event->type(); - - if( obj == currentAccountDisplayPic_ ) - { - if( eventType == QEvent::MouseButtonPress ) - { - QImage glowingImage( currentAccount_->getImagePath() ); - KIconEffect::toGamma( glowingImage, 0.8 ); - currentAccountDisplayPic_->setPixmap( QPixmap( glowingImage ) ); - } - else if( eventType == QEvent::MouseButtonRelease ) - { - currentAccountDisplayPic_->setPixmap( QPixmap( currentAccount_->getImagePath() ) ); - emit showSettings(); - } - } - else if( obj == personalMessageInput_ ) - { - if( eventType == QEvent::Enter ) - { - // Mouse enters widget's boundaries - // Just a bit different from the original client, already change the background line web-forms also do. - // personalMessageInput_->setFrameShape( QLineEdit::StyledPanel ); - personalMessageInput_->setBackgroundColor( Qt::white ); - } - else if( eventType == QEvent::Leave ) - { - // Mouse leaves the widget. - if( ! personalMessageInput_->hasFocus() ) - { - // personalMessageInput_->setFrameShape( QLineEdit::NoFrame ); - personalMessageInput_->setBackgroundColor( this->backgroundColor() ); - } - } - else if( eventType == QEvent::FocusIn ) - { - // Personal status mesage got the focus - personalMessageInput_->setBackgroundColor( Qt::white ); - //personalMessageInput_->setFrameShape( QLineEdit::StyledPanel ); - - // Clear if there is no status message, but a placeholder label - if( currentAccount_->getPersonalMessage().isEmpty() ) - { - personalMessageInput_->clear(); - } - else - { - // Select all text for editing - personalMessageInput_->selectAll(); - } - } - else if( event->type() == QEvent::FocusOut ) - { - // Lost the focus - //personalMessageInput_->setFrameShape( QLineEdit::NoFrame ); - personalMessageInput_->setBackgroundColor( this->backgroundColor() ); - } - } - - return false; // don't stop processing. -} - - - -// Find the first group in the first -GroupListViewItem * KMessView::findFirstGroup() const -{ - QListViewItem *currentItem = contactListView_->firstChild(); - int type; - - while(currentItem != 0) - { - // Check for the given type - type = static_cast( currentItem )->getType(); - - switch(type) - { - case KMessListViewItem::LISTTYPE_GROUP : - { - return static_cast( currentItem ); - } - } - - // Get next item - currentItem = currentItem->nextSibling(); - } - - return 0; -} - - - -// Find the next group in the list -GroupListViewItem * KMessView::findNextGroup(GroupListViewItem *previousGroup) const -{ - QListViewItem *currentItem = previousGroup; - int type; - - // Get next item - currentItem = currentItem->nextSibling(); - - while(currentItem != 0) - { - // Check for the given type - type = static_cast( currentItem )->getType(); - - switch(type) - { - case KMessListViewItem::LISTTYPE_GROUP : - { - return static_cast( currentItem ); - } - } - - // Get next item - currentItem = currentItem->nextSibling(); - } - - return 0; -} - - - -// Initialize the contact list view -bool KMessView::initContactListView() -{ - KIconLoader *loader = KGlobal::iconLoader(); - - // Hide the column header - contactListView_->header()->hide(); - contactListView_->setStaticBackground(true); // Workarround for the smudge -// contactListView_->setRootIsDecorated(true); - contactListView_->setPaletteForegroundColor( Qt::black ); - - - // Set a background pixmap - backgroundPixmap_ = loader->loadIcon( "background", KIcon::User, 0, KIcon::DefaultState, 0L, true ); - - if(! backgroundPixmap_.isNull()) - { - contactListView_->setPaletteBackgroundPixmap( backgroundPixmap_ ); - } - - return true; -} - - - -// Initialize the contact popup -bool KMessView::initContactPopup() -{ - // Initialize context menu actions - chatWithContact_ = new KAction( i18n("Cha&t"), "kontact_contacts", 0, this, "chat" ); - emailContact_ = new KAction( i18n("&Send email"), "mail_generic", 0, this, "email" ); - msnProfile_ = new KAction( i18n("&View Profile"), "identity", 0, this, "profile" ); - contactProperties_ = new KAction( i18n("&Properties"), "edit_user", 0, this, "properties" ); - - addContact_ = new KAction( i18n("&Add Contact"), "add", 0, this, "add" ); - allowContact_ = new KAction( i18n("A&llow Contact"), "apply", 0, this, "allow" ); - blockContact_ = new KAction( i18n("&Block Contact"), "button_cancel", 0, this, "block" ); - unblockContact_ = new KAction( i18n("&Unblock Contact"), "button_ok", 0, this, "unblock" ); - removeContact_ = new KAction( i18n("&Delete Contact"), "delete_user", 0, this, "remove" ); - removeFromGroup_ = new KAction( i18n("&Remove from group"), 0, 0, this, "removeFromGroup" ); - - // Connect the actions - connect( chatWithContact_, SIGNAL(activated()), this, SLOT(slotForwardStartChat()) ); - connect( emailContact_, SIGNAL(activated()), this, SLOT(slotEmailContact()) ); - connect( msnProfile_, SIGNAL(activated()), this, SLOT(slotShowContactProfile()) ); - connect( contactProperties_, SIGNAL(activated()), this, SLOT(slotShowContactProperties()) ); - - connect( addContact_, SIGNAL(activated()), this, SLOT(slotForwardAddContact()) ); - connect( allowContact_, SIGNAL(activated()), this, SLOT(slotForwardAllowContact()) ); - connect( blockContact_, SIGNAL(activated()), this, SLOT(slotForwardBlockContact()) ); - connect( unblockContact_, SIGNAL(activated()), this, SLOT(slotForwardUnblockContact()) ); - connect( removeContact_, SIGNAL(activated()), this, SLOT(slotForwardRemoveContact()) ); - connect( removeFromGroup_, SIGNAL(activated()), this, SLOT(slotForwardRemoveFromGroup())); - - - // Initialize sub menu's - moveContactToGroup_ = new KActionMenu(i18n("&Move to Group"), this, "moveToGroup"); - copyContactToGroup_ = new KActionMenu(i18n("&Copy to Group"), this, "copyToGroup"); - - // Initialize the popup menu - contactActionPopup_ = new KPopupMenu(this); - contactActionPopup_->insertTitle("KMess", 0); - - chatWithContact_ ->plug(contactActionPopup_); - emailContact_ ->plug(contactActionPopup_); - msnProfile_ ->plug(contactActionPopup_); - contactProperties_ ->plug(contactActionPopup_); - contactActionPopup_->insertSeparator(); - - addContact_ ->plug(contactActionPopup_); - allowContact_ ->plug(contactActionPopup_); - - blockContact_ ->plug(contactActionPopup_); - unblockContact_ ->plug(contactActionPopup_); - - moveContactToGroup_->plug(contactActionPopup_); - copyContactToGroup_->plug(contactActionPopup_); - removeFromGroup_ ->plug(contactActionPopup_); - removeContact_ ->plug(contactActionPopup_); - - - return true; -} - - - -// Initialize the group popup -bool KMessView::initGroupPopup() -{ - // Initialize context menu actions - moveGroupDown_ = new KAction(i18n("Move Group &Down"), "1downarrow", 0, this, "movedown" ); - moveGroupUp_ = new KAction(i18n("Move Group &Up"), "1uparrow", 0, this, "moveup" ); - removeGroup_ = new KAction(i18n("Re&move Group"), "editdelete", 0, this, "remove" ); - renameGroup_ = new KAction(i18n("Re&name Group"), "edit", 0, this, "rename" ); - - // Connect the actions - connect( moveGroupDown_, SIGNAL(activated()), this, SLOT(slotMoveGroupDown()) ); - connect( moveGroupUp_, SIGNAL(activated()), this, SLOT(slotMoveGroupUp()) ); - connect( removeGroup_, SIGNAL(activated()), this, SLOT(slotForwardRemoveGroup()) ); - connect( renameGroup_, SIGNAL(activated()), this, SLOT(slotForwardRenameGroup()) ); - - // Initialize the popup menu - groupActionPopup_ = new KPopupMenu(this); - groupActionPopup_->insertTitle("KMess", 0); - - moveGroupUp_ ->plug(groupActionPopup_); - moveGroupDown_ ->plug(groupActionPopup_); - groupActionPopup_->insertSeparator(); - - renameGroup_ ->plug(groupActionPopup_); - removeGroup_ ->plug(groupActionPopup_); - - return true; -} - -// Rebuild the contents of the move-contact menu. -void KMessView::rebuildCopyMenu(const Contact *contact) -{ - bool inGroup; - KAction *copyAction = 0; - QStringList groupIds = contact->getGroupIds(); - GroupListViewItem *groupItem = findFirstGroup(); - - while(groupItem != 0) - { - // First remove the item, because there is no way to tell whether - // it was already added (besides, this fixes the sorting) - copyContactToGroup_->remove(groupItem->getCopyAction()); - - // add the item - copyAction = groupItem->getCopyAction(); // is null for special groups - - if(copyAction != 0) - { - inGroup = groupIds.contains(groupItem->getGroup()->getId()); - if(! inGroup) - { - copyContactToGroup_->insert(copyAction); - } - } - - groupItem = findNextGroup(groupItem); - } -} - -// Rebuild the contents of the move-contact menu. -void KMessView::rebuildMoveMenu(const Contact *contact) -{ - bool inGroup; - KAction *moveAction = 0; - QStringList groupIds = contact->getGroupIds(); - GroupListViewItem *groupItem = findFirstGroup(); - - while(groupItem != 0) - { - // First remove the item, because there is no way to tell whether - // it was already added (besides, this fixes the sorting) - moveContactToGroup_->remove(groupItem->getMoveAction()); - - // add the item - moveAction = groupItem->getMoveAction(); // is null for special groups - - if(moveAction != 0) - { - inGroup = groupIds.contains(groupItem->getGroup()->getId()); - if(! inGroup) - { - moveContactToGroup_->insert(moveAction); - } - } - - groupItem = findNextGroup(groupItem); - } -} - - - -// The email label was clicked so open the user's preferred email url -void KMessView::slotEmailLabelClicked() -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotEmailLabelClicked" << endl; -#endif - - currentAccount_->openMailAtInbox(); -} - - - -// Called when a contact was added. -void KMessView::slotContactAdded(Contact *contact) -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactAdded" << endl; -#endif - - ContactListViewItem *item = 0; - GroupListViewItem *groupItem; - - Group *group; - QString metaGroupId; - QStringList groupIds = contact->getGroupIds(); - bool addToOnline = contact->isOnline(); - bool addToOffline = contact->isOffline(); - bool foundGroup = false; - bool isIndividual = false; - - - // Use meta-group id for non-grouped contacts - if(groupIds.isEmpty()) - { - metaGroupId = getMetaGroupId(contact); - - if(! metaGroupId.isNull()) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactAdded: using meta group " << metaGroupId << endl; -#endif - - // Use meta group ID - groupIds.append(metaGroupId); - isIndividual = (metaGroupId == SpecialGroups::INDIVIDUALS); - - // Only add to online/offline if the contact - // is visible in any other normal list. - addToOnline = (addToOnline && isIndividual); - addToOffline = (addToOffline && isIndividual); - } - } - - - // Add a contact node to every related group - groupItem = findFirstGroup(); - - while(groupItem != 0) - { - group = groupItem->getGroup(); - - // If the contact is a member of the group, add it - if( groupIds.contains(group->getId()) ) - { - groupItem->addContactItem(contact); - foundGroup = true; - } - else if( (addToOnline && group->getId() == SpecialGroups::ONLINE) || - (addToOffline && group->getId() == SpecialGroups::OFFLINE) ) - { - // Also make sure the contact is always added to the online/offline group. - groupItem->addContactItem(contact); - } - - groupItem = findNextGroup(groupItem); - } - - - // Also add item to root if not found - if(! foundGroup) - { - // Add it to the list directly. - item = new ContactListViewItem(contactListView_, contact); - } -} - - - -// Called when a contact went online or offline -void KMessView::slotContactChangedOnline(Contact *contact) -{ - // Move the contact to the other group. - slotContactMoved(contact); -} - - - -// Called when a contact is moved to a different position -void KMessView::slotContactMoved(Contact *contact) -{ - // Create the iterator - QListViewItem *currentItem; - ContactListViewItem *contactItem; - - GroupListViewItem *metaGroupItem = 0; - GroupListViewItem *groupItem = 0; - QString groupId; - int nodeType; - - QString metaGroupId; - QStringList groupIds = contact->getGroupIds(); - bool addToOnline = contact->isOnline(); - bool addToOffline = contact->isOffline(); - bool contactInGroup = false; - bool contactFound = false; - bool isIndividual = false; - - - // Use meta-group id for non-grouped contacts - if(groupIds.isEmpty()) - { - metaGroupId = getMetaGroupId(contact); - - if(metaGroupId.isNull()) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: contact has no groups, also no meta-group." << endl; -#endif - } - else - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: contact has no groups, using meta group '" << metaGroupId << "'." << endl; -#endif - - // Use meta group - groupIds.append(metaGroupId); - isIndividual = (metaGroupId == SpecialGroups::INDIVIDUALS); - - // Only add to online/offline if the contact - // is visible in any other normal list. - addToOnline = (addToOnline && isIndividual); - addToOffline = (addToOffline && isIndividual); - } - } - - -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved " - << contact->getHandle() << " moved to '" << groupIds.join(",") << "'." << endl; -#endif - - - currentItem = contactListView_->firstChild(); - - while(currentItem != 0) - { - // Check for the given type - nodeType = static_cast( currentItem )->getType(); - - switch(nodeType) - { - case KMessListViewItem::LISTTYPE_GROUP : - { - // Read group properties - groupItem = static_cast( currentItem ); - groupId = groupItem->getGroup()->getId(); - - // Does the contact exist here / should it exist here? - contactItem = getContactItemInGroup(currentItem, contact); - contactInGroup = groupIds.contains(groupId); - - // Contact not found in this groupItem? - if(contactItem == 0) - { - if((contactInGroup) || - (addToOnline && groupId == SpecialGroups::ONLINE) || - (addToOffline && groupId == SpecialGroups::OFFLINE)) - { - // Add to current group -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: Adding contact to '" << groupId << "'." << endl; -#endif - groupItem->addContactItem(contact); - - // Only register contact if it's a normal group - if(contactInGroup) - { - contactFound = true; - } - } - } - else // contactItem not found - { - if(contactInGroup) - { - // Found in the list - contactFound = true; - } - else if(! (addToOnline && groupId == SpecialGroups::ONLINE) && // unless "keep here, in online group" - ! (addToOffline && groupId == SpecialGroups::OFFLINE)) // and "keep here, in offline group" - { - // Remove from current group. -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: Contact removed from '" << groupId << "'." << endl; -#endif - groupItem->detachContactItem(contactItem); - delete contactItem; - groupItem->recountContacts(); - } - } - - // If we found the meta-group, store it - if(groupId == metaGroupId) - { - metaGroupItem = groupItem; - } - - break; - } - case KMessListViewItem::LISTTYPE_CONTACT : - { - // Found a contact in the root. - contactItem = static_cast( currentItem ); - if(contactItem->getContact() == contact) - { - if(isIndividual) - { - // Found in the list - contactFound = true; - } - else - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: Contact removed from root." << endl; -#endif - // Jump to nextSibling before we delete the object - currentItem = currentItem->nextSibling(); - - // Delete the object - delete contactItem; - continue; - } - } - - break; - } - } - - currentItem = currentItem->nextSibling(); - } - - - // If the item was not found, add it to a special group - if(! contactFound) - { - if(isIndividual) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: Contact not found in group nodes, but is individual, adding to root." << endl; -#endif - // Add it to the list directly. - contactItem = new ContactListViewItem(contactListView_, contact); - } - else if(metaGroupItem != 0) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: Contact not found in group nodes, adding to meta '" << metaGroupId << "'." << endl; -#endif - // Add the contact to the meta-group - metaGroupItem->addContactItem(contact); - } - else - { - if( ! groupIds.isEmpty() ) - { - // No longer displayed, but still part of some groups?? Problem! - kdWarning() << "KMessView: Contact " << contact->getHandle() << " is no longer displayed, " - << "but still a member of the groups '" << groupIds << "'!" << endl; - } - else - { - // the contact is removed from all lists, - // only exists in kmess memory, no not display. -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactMoved: Contact " << contact->getHandle() << " no longer displayed." << endl; -#endif - } - } - } -} - - - -// Called when a contact is removed -void KMessView::slotContactRemoved(const Contact *contact) -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotContactRemoved" << endl; -#endif - - QListViewItemIterator iterator(contactListView_); - GroupListViewItem *currentGroup = 0; - ContactListViewItem *contactItem; - int type; - - while(iterator.current() != 0) - { - // Check for the given type - type = static_cast( iterator.current() )->getType(); - - switch(type) - { - case KMessListViewItem::LISTTYPE_GROUP : - { - currentGroup = static_cast( iterator.current() ); - break; - } - case KMessListViewItem::LISTTYPE_CONTACT : - { - // Check whether the object references a contact - contactItem = static_cast( iterator.current() ); - if(contactItem->getContact() == contact) - { - // Detach from current group - if(currentGroup != 0) - { - currentGroup->detachContactItem(contactItem); - } - - // remove it - delete contactItem; // is iterator.current() - - // Update group contact counter - if(currentGroup != 0) - { - currentGroup->recountContacts(); - } - } - break; - } - } - ++iterator; - } -} - - - -// A list item was right clicked. -void KMessView::slotContextMenu(QListViewItem *item, const QPoint &point, int /*col*/) -{ - Contact *contact = getContactByItem(item); - Group *group = getGroupByItem(item); - - // A contact was pressed - if(contact != 0) - { - bool isAllowed = contact->isAllowed(); - bool isBlocked = contact->isBlocked(); - bool isReverse = contact->isReverse(); - bool isFriend = contact->isFriend(); - bool isOnline = contact->isOnline(); - - // Only chat if contact is friends list, and not blocked. - chatWithContact_ ->setEnabled( isFriend && ! isBlocked && isOnline ); - - moveContactToGroup_ ->setEnabled( 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(contact->getGroupIds()[0] == 0 ) - { - copyContactToGroup_ ->setEnabled( false ); - } - else if( contact->getGroupIds()[0] != 0 && - currentAccount_->getContactList()->getGroupList().count() == 5 ) - { - copyContactToGroup_ ->setEnabled( false ); - moveContactToGroup_ ->setEnabled( false ); - } - else - { - copyContactToGroup_ ->setEnabled( isFriend ); - } - - // Only if not added yet - addContact_ ->setEnabled( ! isFriend ); - - // Only allow if contact is on the "removed" group. - allowContact_ ->setEnabled( ! isFriend && ! isAllowed && ! isBlocked ); - - // Only one of these is enabled: - blockContact_ ->setEnabled( ! isBlocked ); - unblockContact_ ->setEnabled( 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_ ->setEnabled( isFriend || ! isReverse ); - - // Only if the contact is in the 'Implicit' group - if(contact->getGroupIds()[0]==0) - { - removeFromGroup_ ->setEnabled(false); - } - else - { - removeFromGroup_ ->setEnabled(true); - } - - // Rebuild the copy-to-group list - rebuildCopyMenu(contact); - - // Rebuild the move-to-group list - rebuildMoveMenu(contact); - - // Show the popup - contactActionPopup_->changeTitle(0, contact->getHandle()); // Not name, because most msn names are too weird. - contactActionPopup_->popup(point); - } - // A group was pressed - else if( group != 0 && ! group->isSpecialGroup() ) - { - int pos = group->getSortPosition(); - const ContactList *cl = currentAccount_->getContactList(); - - moveGroupUp_ ->setEnabled( cl->getGroupBySortPosition( pos - 1 ) != 0 ); - moveGroupDown_ ->setEnabled( cl->getGroupBySortPosition( pos + 1 ) != 0 ); - - // Show the popup - groupActionPopup_->changeTitle( 0, i18n("Group") + ": " + group->getName() ); - groupActionPopup_->popup(point); - } -} - - - -// E-mail the current contact -void KMessView::slotEmailContact() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - currentAccount_->openMailAtCompose( contact->getHandle() ); -} - - -// An item was clicked -void KMessView::slotItemClicked( QListViewItem *item ) -{ - // Avoid accidental clicks - if( ! KGlobalSettings::singleClick() ) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotItemClicked() - Accidental click detected!" << endl; -#endif - return; - } - - // Forward the event to the execution slot - slotItemExecuted( item ); -} - - -// An item was double-clicked -void KMessView::slotItemDoubleClicked( QListViewItem *item ) -{ - // Avoid accidental double-clicks - if( KGlobalSettings::singleClick() ) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotItemDoubleClicked() - Accidental double-click detected!" << endl; -#endif - return; - } - - // Forward the event to the execution slot - slotItemExecuted( item ); -} - - - -// A list item was executed -void KMessView::slotItemExecuted(QListViewItem *item) -{ - // Handle group click events - if( item != 0 && item->isExpandable() && item->childCount() > 0 ) - { - // Open the group if it's collapsed, close it if it's expanded. - Group *group = getGroupByItem( item ); - group->setExpanded( ! group->isExpanded() ); - return; - } - - Contact *contact = getContactByItem(item); - if(contact == 0) { - return; // e.g. not a contact. - } - - // If the contact is online - if(contact->isOnline()) - { - // Tell the Chat Master class that we'd like to start a chat. - emit requestChat( contact->getHandle() ); - } -} - - - -// Forward the "add contact" menu action -void KMessView::slotForwardAddContact() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - emit addContact( contact->getHandle() ); -} - - - -// Forward the "allow contact" menu action -void KMessView::slotForwardAllowContact() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - emit allowContact( contact->getHandle() ); -} - - - -// Forward the "block contact" menu action -void KMessView::slotForwardBlockContact() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - emit blockContact( contact->getHandle() ); -} - - - -// Called when a contact should be copied -void KMessView::slotForwardCopyContact(Group *newGroup) -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - emit copyContact( contact->getHandle(), newGroup->getId() ); -} - - - -// Called when a contact should be moved -void KMessView::slotForwardMoveContact(Group *newGroup) -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - Group *oldGroup = getGroupByItem( contactListView_->currentItem() ); - QString oldGroupId = (oldGroup != 0 ? oldGroup->getId() : "0"); - if( KMESS_NULL(contact) ) return; - - emit moveContact( contact->getHandle(), oldGroupId, newGroup->getId() ); -} - - - -// Forward the "remove contact" menu action -void KMessView::slotForwardRemoveContact() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - emit removeContact( contact->getHandle() ); -} - - -void KMessView::slotForwardRemoveFromGroup() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - Group *group = getGroupByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - emit removeContactFromGroup( contact->getHandle(), group->getId() ); -} - - -// Forward the "remove group" menu action -void KMessView::slotForwardRemoveGroup() -{ - Group *group = getGroupByItem( contactListView_->currentItem() ); - if( KMESS_NULL(group) ) return; - - emit removeGroup( group->getId() ); -} - - - - -// Forward the "rename group" menu action -void KMessView::slotForwardRenameGroup() -{ - Group *group = getGroupByItem( contactListView_->currentItem() ); - if( KMESS_NULL(group) ) return; - - emit renameGroup( group->getId() ); -} - - - -// Forward the "start chat" menu action -void KMessView::slotForwardStartChat() -{ - slotItemExecuted( contactListView_->currentItem() ); -} - - - -// Forward the "unblock contact" menu action -void KMessView::slotForwardUnblockContact() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if( KMESS_NULL(contact) ) return; - - emit unblockContact( contact->getHandle() ); -} - - - -// Called when a group was added -void KMessView::slotGroupAdded(Group *group) -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotGroupAdded" << endl; -#endif - - GroupListViewItem *item; - item = new GroupListViewItem(contactListView_, group); - - if(! group->isSpecialGroup() || group->getId() == SpecialGroups::INDIVIDUALS) - { - // Connect item move and copy signals - connect(item, SIGNAL(moveToGroup(Group*)), this, SLOT(slotForwardMoveContact(Group*))); - connect(item, SIGNAL(copyToGroup(Group*)), this, SLOT(slotForwardCopyContact(Group*))); - // Hide normal group if user likes to sort contacts by online/offline state - item->setVisible( currentAccount_->getShowContactsByGroup() ); - } - else - { - // For special groups, determine whether to show the item or not. - if(group->getId() == SpecialGroups::ALLOWED) - { - item->setVisible( currentAccount_->getShowAllowedContacts() ); - } - else if(group->getId() == SpecialGroups::REMOVED) - { - item->setVisible( currentAccount_->getShowRemovedContacts() ); - } - else if(group->getId() == SpecialGroups::ONLINE) - { - item->setVisible( ! currentAccount_->getShowContactsByGroup() ); - } - else if(group->getId() == SpecialGroups::OFFLINE) - { - item->setVisible( ! currentAccount_->getShowContactsByGroup() && - currentAccount_->getShowOfflineContacts() ); - } - } -} - - - -// Called when a group was removed -void KMessView::slotGroupRemoved(const Group *group) -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotGroupRemoved" << endl; -#endif - - GroupListViewItem *groupItem = findFirstGroup(); - - while(groupItem != 0) - { - // If the group is found - if(groupItem->getGroup() == group) - { - // remove it - delete groupItem; - return; // don't expect to find another group. - } - - groupItem = findNextGroup(groupItem); - } -} - - - -// Called when a group should move down -void KMessView::slotMoveGroupDown() -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotMoveGroupDown()" << endl; -#endif - - Group *nextGroup; - int sortPosition; - Group *group = getGroupByItem( contactListView_->currentItem() ); - - if(group != 0) - { - fixGroupSortPositions(); - - // Swap both sort positions - sortPosition = group->getSortPosition(); - nextGroup = currentAccount_->getContactList()->getGroupBySortPosition(sortPosition + 1); - - if(nextGroup != 0) - { - group ->setSortPosition( nextGroup->getSortPosition() ); - nextGroup ->setSortPosition( sortPosition ); - contactListView_->sort(); - } - else - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotMoveGroupDown: Next group not found" << endl; -#endif - } - } -} - - - -// Called when a group should move up -void KMessView::slotMoveGroupUp() -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotMoveGroupUp()" << endl; -#endif - - Group *previousGroup; - int sortPosition; - Group *group = getGroupByItem( contactListView_->currentItem() ); - - if(group != 0) - { - fixGroupSortPositions(); - - // Swap both sort positions - sortPosition = group->getSortPosition(); - if(sortPosition <= 1) return; // Already on top. - previousGroup = currentAccount_->getContactList()->getGroupBySortPosition(sortPosition - 1); - - if(previousGroup != 0) - { - group ->setSortPosition( previousGroup->getSortPosition() ); - previousGroup ->setSortPosition( sortPosition ); - contactListView_->sort(); - } - else - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotMoveGroupUp: Previous group not found" << endl; -#endif - } - } -} - - - -// Called when the enter key is pressed on the personal message input -void KMessView::slotPersonalMessageEnterPressed() -{ - personalMessageInput_->clearFocus(); -} - - - -// Called when the personal message input looses focus -void KMessView::slotPersonalMessageLostFocus() -{ - if( ! connected_ ) - { - // Avoid "lost focus" saving an empty message events when the dialog closes. -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotPersonalMessageLostFocus() - Not connected, so not updating." << endl; -#endif - return; - } - - personalMessageInput_->clearFocus(); - contactListView_->setFocus(); - - // It was the main window which has lost focus, not the pm input box itself, so don't update. - if( ! isActiveWindow() || ! topLevelWidget()->isActiveWindow() ) - { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotPersonalMessageLostFocus() - Not updating when main window loses focus." << endl; -#endif - return; - } - -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotPersonalMessageLostFocus() - Updating personal message" << endl; -#endif - - // Get message - QString message = personalMessageInput_->text(); - - // Protect against weird situations where the label is seen as text. - // The lost focus event is also sent when the while window looses focus - if( message == i18n("") ) - { - kdWarning() << "KMessView: Personal message label was about to be used as personal message!" << endl; - return; - } - - // Update message and save the changes - currentAccount_->setPersonalMessage( message ); - // Commit changes to disk, now - KConfig *config = kapp->config(); - currentAccount_->saveProperties( config ); - - // Notify changes to the MSN server - emit changePersonalMessage( message ); - - // Restore placeholder. - if( message.isEmpty() ) - { - personalMessageInput_->setText( i18n("") ); - } -} - - - -// Display the profile of the current contact -void KMessView::slotShowContactProfile() -{ - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if(contact != 0) - { - // Create a URL to the msn profile page. (Unfortunately, this isn't internationalized) - kapp->invokeBrowser( "http://members.msn.com/default.msnw?mem=" + contact->getHandle() ); - } -} - - - -// Display the properties of the current contact -void KMessView::slotShowContactProperties() -{ - ContactPropertiesDialog *dialog; - - Contact *contact = getContactByItem( contactListView_->currentItem() ); - if(contact != 0) - { - dialog = new ContactPropertiesDialog( this, "contactProperties" ); - dialog->launch( contact ); - delete dialog; - } -} - - -// Update the users display pic -void KMessView::slotUpdateDisplayPicture() -{ - QString image = ""; - - if( currentAccount_->getShowImage() ) - { - displayPicFrame_->show(); - image = currentAccount_->getImagePath(); - currentAccountDisplayPic_->setPixmap( QPixmap( image ) ); - } - else // The user does not want to show a display pic, so just show an icon for their sign in status - { - displayPicFrame_->hide(); - } -} - - -// Change whether the allowed,removed groups are displayed. -void KMessView::slotUpdateDisplaySettings() -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView::slotUpdateDisplaySettings - changing visibility of groups" << endl; -#endif - - // Read the settings - bool showAllowed = currentAccount_->getShowAllowedContacts(); - bool showRemoved = currentAccount_->getShowRemovedContacts(); - bool showByGroup = currentAccount_->getShowContactsByGroup(); - bool showOffline = currentAccount_->getShowOfflineContacts(); - - QString groupId; - GroupListViewItem *groupItem = findFirstGroup(); - - while(groupItem != 0) - { - groupId = groupItem->getGroup()->getId(); - - // Hide or show the special groups - if(groupId == SpecialGroups::ALLOWED) - { - groupItem->setVisible( showAllowed ); - } - else if(groupId == SpecialGroups::REMOVED) - { - groupItem->setVisible( showRemoved ); - } - else if(groupId == SpecialGroups::ONLINE) - { - groupItem->setVisible( ! showByGroup ); - } - else if(groupId == SpecialGroups::OFFLINE) - { - groupItem->setVisible( ! showByGroup && showOffline ); - } - else - { - // For convenience, hide normal groups if display mode has changed. - // This feature is used from slotUpdateViewMode() - if(! groupItem->getGroup()->isSpecialGroup()) - { - groupItem->setVisible( showByGroup ); - } - } - - groupItem = findNextGroup(groupItem); - } -} - - - -// Change whether or not the email label is displayed based on account settings. -void KMessView::slotUpdateEmailDisplay() -{ - if ( currentAccount_->getShowEmail() && currentAccount_->getEmailSupported() ) - { - emailFrame_->setHidden(false); - //emailFrame_->setMargin(statusLayout_->margin()); - emailFrame_->setMaximumHeight(40); - } - else - { - emailFrame_->setHidden(true); - //emailFrame_->setMargin(0); - emailFrame_->setMaximumHeight(0); - } -} - - - -// Update the email count. -void KMessView::slotUpdateNoEmails() -{ - QString message; - - // Update the label - if ( currentAccount_->getNoEmails() == 1 ) - { - message = i18n("You have 1 new e-mail in your inbox."); - } - else - { - message = i18n("You have %1 new emails in your inbox.") - .arg(currentAccount_->getNoEmails()); - } - emailLabel_->setText( message ); - // Set the user's preferred email website. - emailLabel_->setURL( currentAccount_->getEmailUrl() ); -} - - - -// Update the user's status. -void KMessView::slotUpdateUserStatus() -{ - - QString friendlyName, status; - QString statusIdentifier; - QString image; - - // Avoid newlines, which cause problems to the layout. - friendlyName = currentAccount_->getFriendlyName().replace( "\n", " " ); - status = currentAccount_->getStatus(); - -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView - update user status to " << status << endl; -#endif - - // Update the onlineStatusLabel and pixmap - if ( status == "AWY" ) - { - statusIdentifier = i18n( "(Away)" ); - image = "away"; - } - else if ( status == "BRB" ) - { - statusIdentifier = i18n( "(Be Right Back)" ); - image = "berightback"; - } - else if ( status == "BSY" ) - { - statusIdentifier = i18n( "(Busy)" ); - image = "busy"; - } - else if ( status == "FLN" ) - { - statusIdentifier = ""; - image = "online"; - } - else if ( status == "HDN" ) - { - statusIdentifier = i18n("(Invisible)"); - image = "invisible"; - } - else if ( status == "IDL" ) - { - statusIdentifier = i18n( "(Away - Idle)" ); - image = "away"; - } - else if ( status == "LUN" ) - { - statusIdentifier = i18n( "(Out to Lunch)" ); - image = "lunch"; - } - else if ( status == "NLN" ) - { - statusIdentifier = ""; - image = "online"; - } - else if ( status == "PHN" ) - { - statusIdentifier = i18n( "(On the Phone)" ); - image = "onthephone"; - } - else - { - kdDebug() << "KMessView - updateUserStatus() - The account had the invalid status " << status << "." << endl; - return; - } - onlineStatusLabel_->setText( friendlyName + " " + statusIdentifier ); - KIconLoader *loader = KGlobal::iconLoader(); - onlineStatusPixmapLabel_->setPixmap( loader->loadIcon( image, KIcon::User ) ); -} - - - -// Update the way contact groups are displayed -void KMessView::slotUpdateViewMode() -{ - // 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) - slotUpdateDisplaySettings(); -} - - - -KMessView::ToolTip::ToolTip(KMessView *kmessView, QToolTipGroup *group) -: QToolTip(kmessView->contactListView_->viewport(), group), - kmessView_(kmessView) -{ -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kdDebug() << "KMessView: Created tooltip" << endl; -#endif -} - - -KMessView::ToolTip::~ToolTip() -{ - -} - - -void KMessView::ToolTip::maybeTip(const QPoint &cursorPosition) -{ - // Get the list view item. - KMessListViewItem *currentItem = static_cast( kmessView_->contactListView_->itemAt(cursorPosition) ); - if( currentItem == 0 ) - { - return; - } - - // Display the tooltip text of the list view item. - QString tipText = currentItem->getToolTipText(); - if( ! tipText.isEmpty() ) - { - tip( kmessView_->contactListView_->itemRect(currentItem), tipText ); - } -} - - -#include "kmessview.moc" diff --git a/kmess/kmessviewinterface.ui b/kmess/kmessviewinterface.ui deleted file mode 100644 index ddf940b..0000000 --- a/kmess/kmessviewinterface.ui +++ /dev/null @@ -1,516 +0,0 @@ - -KMessViewInterface - - - KMessViewInterface - - - - 0 - 0 - 344 - 508 - - - - - 7 - 7 - 0 - 0 - - - - - 275 - 100 - - - - KMessViewInterface - - - - unnamed - - - 4 - - - 2 - - - - layout6 - - - - unnamed - - - - layout17 - - - - unnamed - - - - spacer3 - - - Horizontal - - - Fixed - - - - 20 - 16 - - - - - - onlineStatusPixmapLabel_ - - - - 0 - 0 - 0 - 0 - - - - - 16 - 16 - - - - - 16 - 16 - - - - 1 - - - true - - - - - personalMessageInput_ - - - - 9 - - - - 13 - - - ClickFocus - - - false - - - StyledPanel - - - 1 - - - <Enter your personal message here> - - - 256 - - - false - - - true - - - true - - - Enter your personal message here - - - - - onlineStatusLabel_ - - - - 11 - - - - - - - - emailFrame_ - - - true - - - - 3 - 4 - 0 - 0 - - - - NoFrame - - - Plain - - - 0 - - - - unnamed - - - 0 - - - 0 - - - - emailPixmapLabel_ - - - - 0 - 4 - 0 - 0 - - - - - 16 - 16 - - - - - 16 - 16 - - - - 1 - - - true - - - - - emailLabel_ - - - true - - - - 5 - 4 - 0 - 0 - - - - 0 - - - - - - - nowListeningFrame_ - - - - 3 - 4 - 0 - 0 - - - - NoFrame - - - Plain - - - 0 - - - - unnamed - - - 0 - - - 3 - - - - nowListeningPixmapLabel_ - - - - 0 - 4 - 0 - 0 - - - - - 16 - 16 - - - - - 16 - 16 - - - - 1 - - - true - - - - - nowListeningLabel_ - - - - 7 - 4 - 0 - 0 - - - - Listening to %1 - - - - - - - spacer1 - - - Vertical - - - Minimum - - - - 50 - 0 - - - - - - - - - - - - true - - - true - - - - contactListView_ - - - - 7 - 2 - 0 - 0 - - - - true - - - - - displayPicFrame_ - - - - 0 - 1 - 0 - 0 - - - - NoFrame - - - Plain - - - - unnamed - - - 0 - - - 0 - - - - currentAccountDisplayPic_ - - - - 0 - 0 - 0 - 0 - - - - - 64 - 64 - - - - - 64 - 64 - - - - 13 - - - StyledPanel - - - Raised - - - 1 - - - true - - - - - spacer1_2 - - - Vertical - - - Minimum - - - - 16 - 0 - - - - - - - - - - contactListView_ - contextMenuRequested(QListViewItem*,const QPoint&,int) - KMessViewInterface - slotContextMenu(QListViewItem*,const QPoint&,int) - - - contactListView_ - clicked(QListViewItem*) - KMessViewInterface - slotItemClicked(QListViewItem*) - - - emailLabel_ - leftClickedURL() - KMessViewInterface - slotEmailLabelClicked() - - - personalMessageInput_ - returnPressed() - KMessViewInterface - slotPersonalMessageEnterPressed() - - - personalMessageInput_ - lostFocus() - KMessViewInterface - slotPersonalMessageLostFocus() - - - contactListView_ - doubleClicked(QListViewItem*) - KMessViewInterface - slotItemDoubleClicked(QListViewItem*) - - - - slotItemDoubleClicked( QListViewItem * item ) - slotContextMenu( QListViewItem * item, const QPoint & point, int col ) - slotItemClicked( QListViewItem * item ) - slotEmailLabelClicked() - slotPersonalMessageEnterPressed() - slotPersonalMessageLostFocus() - - - - klineedit.h - ksqueezedtextlabel.h - kurllabel.h - ksqueezedtextlabel.h - klistview.h - - diff --git a/kmess/lo16-app-kmess.png b/kmess/lo16-app-kmess.png deleted file mode 100644 index d042782..0000000 Binary files a/kmess/lo16-app-kmess.png and /dev/null differ diff --git a/kmess/lo22-app-kmess.png b/kmess/lo22-app-kmess.png deleted file mode 100644 index 4d8f3a0..0000000 Binary files a/kmess/lo22-app-kmess.png and /dev/null differ diff --git a/kmess/lo32-app-kmess.png b/kmess/lo32-app-kmess.png deleted file mode 100644 index b934c60..0000000 Binary files a/kmess/lo32-app-kmess.png and /dev/null differ diff --git a/kmess/main.cpp b/kmess/main.cpp deleted file mode 100644 index 9d47766..0000000 --- a/kmess/main.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Sun Jan 5 15:18:36 CST 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 -#include -#include - -#include "kmess.h" -#include "kmesstest.h" -#include "kmessdebug.h" -#include "kmessapplication.h" - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#ifdef ENABLE_BINRELOC -// Required for autopackage support. -// Handles detection of paths at run time. -#include "binreloc.h" -#endif - -#include -#include -#include - -// Command line options -static KCmdLineOptions kmessOptions[] = -{ - { "autologin ", I18N_NOOP("Autologin with the given email address"), 0 }, - { 0, 0, 0 } -}; - - -// Main starting point of the application -int main(int argc, char *argv[]) -{ - // Tab 1: General - KAboutData aboutData( "kmess", /* internal app name */ - I18N_NOOP("KMess"), /* real program name */ - VERSION, /* app version (from config.h, generated with Makefile.am) */ - "KMess", /* description of the app */ - KAboutData::License_GPL, /* license */ - "(c) 2002-2008, Mike K. Bennett\n" /* copyright */ - "(c) 2005-2008, Diederik van der Boor\n" - "(c) 2007-2008, Valerio Pilo\n", - "A MSN Messenger client for KDE", /* free form text */ - "http://www.kmess.org/", /* project home page */ - "codingdomain" "@" "users.sourceforge.net" /* address for bugs */ - ); - - // Note all e-mail addresses are written in an anti-spam style. - - // Tab 2: Authors - // TODO: escape the special characters to some Unicode format. (how?) - aboutData.addAuthor( "Mike K. Bennett", 0, "mkb137" "@" "users.sourceforge" "." "net" ); - aboutData.addAuthor( "Michael Curtis", 0, "mdcurtis" "@" "users.sourceforge" "." "net" ); - aboutData.addAuthor( "Jan Tönjes", 0, "jan" ".toenjes" "@" "web" "." "de" ); - aboutData.addAuthor( "Diederik van der Boor", 0, "vdboor" "@" "codingdomain" "." "com" ); - aboutData.addAuthor( "Richard Conway", 0, "richard" "conway" "@" "users.sourceforge" "." "net" ); - aboutData.addAuthor( "Valerio Pilo", 0, "amroth" "@" "coldshock" "." "net" ); - - // Tab 3: Credits - aboutData.addCredit("Jan Tönjes", I18N_NOOP("German translation, testing, documentation, web master, project management, etc..."), "jan" "." "toenjes" "@" "web" "." "de"); - aboutData.addCredit("Dane Harnett", I18N_NOOP("Web design"), "dynamitedane" "@" "hotmail" "." "com"); - aboutData.addCredit("David Vignoni", I18N_NOOP("The main and yellow/blue/violet emoticon sets and Italian translation"), "dvgn" "@" "libero" "." "it"); - aboutData.addCredit("Julien Joubin", I18N_NOOP("Cartoon emoticons"), "jujubinche" "@" "netscape" "." "net"); - aboutData.addCredit("Christian Müller", I18N_NOOP("Default sound theme"), "cmue81" "@" "gmx" "." "de"); - - // Translations - // Sorted by Alphabetic order of language. - aboutData.addCredit("Mohamed Aser", I18N_NOOP("Arabic translation, internationalization of file saving fix" "." ""), "mohasr" "@" "link" "." "net"); - aboutData.addCredit("Youssef Chahibi", I18N_NOOP("More Arabic translation"), "chahibi" "@" "gmail" "." "com"); - aboutData.addCredit("Mauricio Rother", I18N_NOOP("Brazilian Portuguese translation"), "mauricio" "@" "digicomm" "." "com.br"); - aboutData.addCredit("Darlan Campos", I18N_NOOP("More Brazilian Portuguese translation"), "darlanpedro" "@" "gmail" "." "com"); - - aboutData.addCredit("Jaume Cornadó", I18N_NOOP("Catalan translation"), "jaumec" "@" "lleida" "." "net"); - - aboutData.addCredit("Lin Haoxiang", I18N_NOOP("Simplified Chinese translation, file send bug fix, proxy connect code"), "linhaoxiang" "@" "hotmail" "." "com"); - aboutData.addCredit("Liu Sizhuang", I18N_NOOP("More Simplified Chinese translation"), "chinatslsz" "@" "hotmail.com"); - aboutData.addCredit("Yen-chou Chen", I18N_NOOP("Traditional Chinese translation"), "yenchou" "." "mse90" "@" "nctu" "." "edu" "." "tw"); - - aboutData.addCredit("Lars Sommer", I18N_NOOP("Danish translation"), "admin" "@" "lasg" "." "dk"); - aboutData.addCredit("Pascal d'Hermilly", I18N_NOOP("More Danish translation"), "pascal" "@" "tipisoft" "." "dk"); - aboutData.addCredit("Arend van Beelen Jr.", I18N_NOOP("Dutch translation"), "arend" "@" "auton" "." "nl"); - aboutData.addCredit("Jaap Woldringh", I18N_NOOP("More Dutch translation"), "jjh" "." "woldringh" "@" "planet" "." "nl"); - - aboutData.addCredit("Jyri Toomessoo", I18N_NOOP("Estonian translation"), "nuubik" "@" "hotmail" "." "com"); - aboutData.addCredit("Markus Vuori", I18N_NOOP("Finnish translation"), "markus" "@" "vuoret" "." "net"); - aboutData.addCredit("Joonas Niilola", I18N_NOOP("More Finnish translation"), "juippis" "@" "roskakori" "." "org"); - aboutData.addCredit("Jussi Timperi", I18N_NOOP("More Finnish translation"), "jussi.timperi" "@" "gmail" "." "com"); - - aboutData.addCredit("Choplair", I18N_NOOP("French translation"), "pachilor" "@" "yahoo" "." "co" "." "jp"); - aboutData.addCredit("Vincent Fretin", I18N_NOOP("More French translation, MSN6 emoticon definitions"), "fretinvincent" "@" "hotmail" "." "com"); - aboutData.addCredit("Andrea Blankenstijn", I18N_NOOP("More French translation"), "darkan9el" "@" "gmail" "." "com" ); // or "andrea" "@" "zenephiris" "." "ch" - - aboutData.addCredit("Páder Rezsõ", I18N_NOOP("Hungarian translation"), "rezso" "@" "rezso" "." "net"); - aboutData.addCredit("Valerio Pilo", I18N_NOOP("More Italian translation"), "amroth" "@" "coldshock" "." "net"); - aboutData.addCredit("Vincenzo Reale", I18N_NOOP("More Italian translation"), "smart2128" "@" "baslug" "." "org"); - aboutData.addCredit("Park Dong Cheon", I18N_NOOP("Korean translation"), "pdc" "@" "kaist" "." "ac.kr"); - aboutData.addCredit("Øyvind Sæther", I18N_NOOP("Norsk Bokmål translation"), "oyvind" "@" "sather" "." "tk"); - - aboutData.addCredit("Matjaž kaše", I18N_NOOP("Slovenian translation"), "matjaz" "." "kase" "@" "g-kabel" "." "si"); - aboutData.addCredit("Johanna Gersch", I18N_NOOP("Spanish translation")); - aboutData.addCredit("J.C.A. Javi", I18N_NOOP("More Spanish translation"), "yovoya30ks" "@" "hotmail" "." "com"); - aboutData.addCredit("Alejandro Araiza Alvarado", I18N_NOOP("More Spanish translation"), "mebrelith" "@" "gmail" "." "com"); - aboutData.addCredit("Jaume Corbí", I18N_NOOP("More Spanish translation"), "jaume4" "@" "gmail" "." "com"); - aboutData.addCredit("Christian Kaiser", I18N_NOOP("More Spanish translation"), "k39" "@" "users" "." "sourceforge" "." "net"); - aboutData.addCredit("Christian Lundgren", I18N_NOOP("Swedish translation"), "zeflunk" "@" "gmail" "." "com"); - - aboutData.addCredit("Rachan Hongpairote", I18N_NOOP("Thai translation"), "rachanh" "@" "yahoo" "." "com"); - aboutData.addCredit("Gorkem Cetin", I18N_NOOP("Turkish translation"), "gorkem" "@" "gelecek" "." "com" "." "tr"); - aboutData.addCredit("Barbaros Ulutas", I18N_NOOP("More Turkish translation"), "ulutas" "@" "gmail" "." "com"); - aboutData.addCredit("Uğur Çetin", I18N_NOOP("More Turkish translation"), "ugur" "." "jnmbk" "@" "gmail" "." "com"); - - // Other contributors - aboutData.addCredit("Guido Solinas", I18N_NOOP("Pictures in contact list code, contact client info, chat font zoom"), "whereismwhite" "@" "gmail" "." "com"); - aboutData.addCredit("Liu Sizhuang", I18N_NOOP("P4-Context field support"), "chinatslsz" "@" "hotmail.com"); - aboutData.addCredit("Scott Morgan", I18N_NOOP("Xinerama fixes"), "blumf" "@" "blumf" "." "freeserve" "." "co" "." "uk"); - aboutData.addCredit("Laurence Anderson", I18N_NOOP("Original file receive code"), "l.d" "." "anderson" "@" "warwick" ".ac.uk"); - aboutData.addCredit("Choe Hwanjin", I18N_NOOP("Various internationalization fixes" "." ""), "hjchoe" "@" "hancom" "." "com"); - aboutData.addCredit("Damien Sandras", I18N_NOOP("GnomeMeeting developer"), "dsandras" "@" "seconix" "." "com"); - aboutData.addCredit("Tobias Tönjes", I18N_NOOP("Guy with a bag over his head"), ""); - - // Other apps - aboutData.addCredit("KMerlin (kmerlin.olsd.de)", I18N_NOOP("Inspiration and assorted code")); - aboutData.addCredit("Kopete (kopete.kde.org)", I18N_NOOP("Old popup balloons code, initial p2p code, msn challenge handler")); - aboutData.addCredit("KScreensaver", I18N_NOOP("Idle timer code")); - aboutData.addCredit("BasKet", I18N_NOOP("Close-to-tray icon screenshot code")); - - // Nice community detail (very subtle at the bottom..) - aboutData.addCredit( I18N_NOOP("Your name here?"), I18N_NOOP("You are welcome to sent bugfixes and patches to the KMess help forums!\nIf you feel your name is missing here, please contact us too!"), "you@kmess.org"); - - // Add the translation names from the .po file: - aboutData.setTranslator(I18N_NOOP("_: NAME OF TRANSLATORS\nYour names"),I18N_NOOP("_: EMAIL OF TRANSLATORS\nYour emails")); - - - // Register the command line parameters - KCmdLineArgs::init( argc, argv, &aboutData ); - KCmdLineArgs::addCmdLineOptions( kmessOptions ); - - - // Fetch the command line arguments - KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); - QString autologinHandle = args->getOption("autologin"); - - - // Create the KApplication object - KMessApplication a; - - -#ifdef ENABLE_BINRELOC - // Register run-time detected paths for Autopackage support. - // This also prevents the "square boxes images" problem from happening - // if the --prefix of ./configure was incorrect. - BrInitError brError; - if( br_init( &brError ) == 0 && brError != BR_INIT_ERROR_DISABLED) - { - kdWarning() << "BinReloc failed to initialize (error code " << brError << ")" << endl; - kdDebug() << "Will fallback to hardcoded compile-time path (" << KMESS_PREFIX << ")." << endl; - } - - // Detect run-time paths, fallback to KMESS_PREFIX of configure - KGlobal::dirs() -> addPrefix( br_find_prefix( KMESS_PREFIX ) ); - KGlobal::iconLoader() -> addAppDir( br_find_data_dir( KMESS_PREFIX "/share" ) ); -#else - // Add compile time paths as fallback - KGlobal::dirs() -> addPrefix( KMESS_PREFIX ); - KGlobal::iconLoader() -> addAppDir( KMESS_PREFIX "/share" ); -#endif - - // Test whether the prefix is correct. - if( KGlobal::dirs()->findResource( "appdata", "pics/kmesslogo.png" ).isNull() ) - { - kdWarning() << "KMess could not find resources in the search paths: " - << KGlobal::dirs()->findDirs( "appdata", QString::null ).join(", ") << endl; - } - - // For KDE 3.3 and below, add the prefix for emoticons (only available as of KDE 3.4) - if( ! KGlobal::dirs()->allTypes().contains("emoticons") ) - { - KGlobal::dirs()->addResourceType("emoticons", "share/emoticons"); - } - - - // Create the main window (inherits KMessInterface and KMainWindow) - KMess *kmess = new KMess(0, "mainwindow"); - - // Initialize the main window - if( kmess->initialize() ) - { - // Set as main widget - a.setMainWidget(kmess); - - // Avoid showing the main window is KMess is started with KDE. - if( ! kapp->isRestored() ) - { - kmess->show(); - } - - // Start auto login - kmess->checkAutologin( autologinHandle ); - - /* - // For debugging: -#ifdef KMESSTEST - KMessTest *kmessTest = new KMessTest(kmess); - kmessTest->test(); - delete kmessTest; -#endif - */ - } - - // Start the application + event loop - return a.exec(); -} diff --git a/kmess/network/.cvsignore b/kmess/network/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/network/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/network/Makefile.am b/kmess/network/Makefile.am deleted file mode 100644 index deffa18..0000000 --- a/kmess/network/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libnetwork.a - -INCLUDES = $(all_includes) - -libnetwork_a_METASOURCES = AUTO - -libnetwork_a_SOURCES = chatinformation.cpp kmessbuffer.cpp mimemessage.cpp \ - msnconnection.cpp msnnotificationconnection.cpp msnswitchboardconnection.cpp \ - p2pmessage.cpp multipacketmessage.cpp msnchallengehandler.cpp \ - tcpconnectionbase.cpp - -SUBDIRS = . applications extra soap upnp -noinst_HEADERS = chatinformation.h kmessbuffer.h mimemessage.h msnconnection.h \ - msnnotificationconnection.h msnswitchboardconnection.h p2pmessage.h \ - multipacketmessage.h msnchallengehandler.h tcpconnectionbase.h - -####### kdevelop will overwrite this part!!! (end)############ diff --git a/kmess/network/Makefile.in b/kmess/network/Makefile.in deleted file mode 100644 index ab9eff9..0000000 --- a/kmess/network/Makefile.in +++ /dev/null @@ -1,921 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libnetwork_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/network -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libnetwork_a_AR = $(AR) $(ARFLAGS) -libnetwork_a_LIBADD = -am_libnetwork_a_OBJECTS = chatinformation.$(OBJEXT) \ - kmessbuffer.$(OBJEXT) mimemessage.$(OBJEXT) \ - msnconnection.$(OBJEXT) msnnotificationconnection.$(OBJEXT) \ - msnswitchboardconnection.$(OBJEXT) p2pmessage.$(OBJEXT) \ - multipacketmessage.$(OBJEXT) msnchallengehandler.$(OBJEXT) \ - tcpconnectionbase.$(OBJEXT) -#>- libnetwork_a_OBJECTS = $(am_libnetwork_a_OBJECTS) -#>+ 9 -libnetwork_a_final_OBJECTS = libnetwork_a.all_cpp.o -libnetwork_a_nofinal_OBJECTS = chatinformation.$(OBJEXT) \ - kmessbuffer.$(OBJEXT) mimemessage.$(OBJEXT) \ - msnconnection.$(OBJEXT) msnnotificationconnection.$(OBJEXT) \ - msnswitchboardconnection.$(OBJEXT) p2pmessage.$(OBJEXT) \ - multipacketmessage.$(OBJEXT) msnchallengehandler.$(OBJEXT) \ - tcpconnectionbase.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libnetwork_a_OBJECTS = $(libnetwork_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libnetwork_a_OBJECTS = $(libnetwork_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/chatinformation.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/kmessbuffer.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/mimemessage.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msnchallengehandler.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msnconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msnnotificationconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msnswitchboardconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/multipacketmessage.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/p2pmessage.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/tcpconnectionbase.Po -#>+ 20 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/libnetwork_a.all_cpp.P ./$(DEPDIR)/chatinformation.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessbuffer.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/mimemessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnchallengehandler.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnnotificationconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnswitchboardconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/multipacketmessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/p2pmessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/tcpconnectionbase.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = ./$(DEPDIR)/chatinformation.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/kmessbuffer.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/mimemessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnchallengehandler.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnnotificationconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnswitchboardconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/multipacketmessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/p2pmessage.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/tcpconnectionbase.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libnetwork_a_SOURCES) -DIST_SOURCES = $(libnetwork_a_SOURCES) -#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -#>- html-recursive info-recursive install-data-recursive \ -#>- install-exec-recursive install-info-recursive \ -#>- install-recursive installcheck-recursive installdirs-recursive \ -#>- pdf-recursive ps-recursive uninstall-info-recursive \ -#>- uninstall-recursive -#>+ 6 -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive nmcheck-recursive bcheck-recursive -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libnetwork.a -INCLUDES = $(all_includes) -#>- libnetwork_a_METASOURCES = AUTO -libnetwork_a_SOURCES = chatinformation.cpp kmessbuffer.cpp mimemessage.cpp \ - msnconnection.cpp msnnotificationconnection.cpp msnswitchboardconnection.cpp \ - p2pmessage.cpp multipacketmessage.cpp msnchallengehandler.cpp \ - tcpconnectionbase.cpp - -SUBDIRS = . applications extra soap upnp -noinst_HEADERS = chatinformation.h kmessbuffer.h mimemessage.h msnconnection.h \ - msnnotificationconnection.h msnswitchboardconnection.h p2pmessage.h \ - multipacketmessage.h msnchallengehandler.h tcpconnectionbase.h - -#>- all: all-recursive -#>+ 1 -all: docs-am all-recursive - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/network/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libnetwork.a: $(libnetwork_a_OBJECTS) $(libnetwork_a_DEPENDENCIES) - -rm -f libnetwork.a - $(libnetwork_a_AR) libnetwork.a $(libnetwork_a_OBJECTS) $(libnetwork_a_LIBADD) - $(RANLIB) libnetwork.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatinformation.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmessbuffer.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mimemessage.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnchallengehandler.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnnotificationconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnswitchboardconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multipacketmessage.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p2pmessage.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcpconnectionbase.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || mkdir "$(distdir)/$$subdir" \ - || exit 1; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="../$(top_distdir)" \ - distdir="../$(distdir)/$$subdir" \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-recursive -#>+ 1 -clean: kde-rpo-clean clean-recursive - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-recursive - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-info-am - -uninstall-info: uninstall-info-recursive - -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ - clean clean-generic clean-libtool clean-noinstLIBRARIES \ - clean-recursive ctags ctags-recursive distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-recursive distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic maintainer-clean-recursive \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am uninstall-info-am - - -####### kdevelop will overwrite this part!!! (end)############ -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -msnconnection.moc: $(srcdir)/msnconnection.h - $(MOC) $(srcdir)/msnconnection.h -o msnconnection.moc - -#>+ 2 -mocs: msnconnection.moc - -#>+ 3 -tcpconnectionbase.moc: $(srcdir)/tcpconnectionbase.h - $(MOC) $(srcdir)/tcpconnectionbase.h -o tcpconnectionbase.moc - -#>+ 2 -mocs: tcpconnectionbase.moc - -#>+ 3 -msnnotificationconnection.moc: $(srcdir)/msnnotificationconnection.h - $(MOC) $(srcdir)/msnnotificationconnection.h -o msnnotificationconnection.moc - -#>+ 2 -mocs: msnnotificationconnection.moc - -#>+ 3 -msnswitchboardconnection.moc: $(srcdir)/msnswitchboardconnection.h - $(MOC) $(srcdir)/msnswitchboardconnection.h -o msnswitchboardconnection.moc - -#>+ 2 -mocs: msnswitchboardconnection.moc - -#>+ 3 -clean-metasources: - -rm -f msnconnection.moc tcpconnectionbase.moc msnnotificationconnection.moc msnswitchboardconnection.moc - -#>+ 2 -KDE_DIST=configure.in.in Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-recursive - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libnetwork_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/chatinformation.cpp $(srcdir)/kmessbuffer.cpp $(srcdir)/mimemessage.cpp $(srcdir)/msnconnection.cpp $(srcdir)/msnnotificationconnection.cpp $(srcdir)/msnswitchboardconnection.cpp $(srcdir)/p2pmessage.cpp $(srcdir)/multipacketmessage.cpp $(srcdir)/msnchallengehandler.cpp $(srcdir)/tcpconnectionbase.cpp tcpconnectionbase.moc msnconnection.moc msnnotificationconnection.moc msnswitchboardconnection.moc - @echo 'creating libnetwork_a.all_cpp.cpp ...'; \ - rm -f libnetwork_a.all_cpp.files libnetwork_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libnetwork_a.all_cpp.final; \ - for file in chatinformation.cpp kmessbuffer.cpp mimemessage.cpp msnconnection.cpp msnnotificationconnection.cpp msnswitchboardconnection.cpp p2pmessage.cpp multipacketmessage.cpp msnchallengehandler.cpp tcpconnectionbase.cpp ; do \ - echo "#include \"$$file\"" >> libnetwork_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libnetwork_a.all_cpp.final; \ - done; \ - cat libnetwork_a.all_cpp.final libnetwork_a.all_cpp.files > libnetwork_a.all_cpp.cpp; \ - rm -f libnetwork_a.all_cpp.final libnetwork_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libnetwork_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libnetwork_a_OBJECTS="$(libnetwork_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libnetwork_a_OBJECTS="$(libnetwork_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libnetwork_a_OBJECTS="$(libnetwork_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libnetwork_a_OBJECTS="$(libnetwork_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 11 -nmcheck: -msnswitchboardconnection.lo: msnswitchboardconnection.moc -msnswitchboardconnection.o: msnswitchboardconnection.moc -nmcheck-am: nmcheck -tcpconnectionbase.o: tcpconnectionbase.moc -msnconnection.lo: msnconnection.moc -msnconnection.o: msnconnection.moc -msnnotificationconnection.lo: msnnotificationconnection.moc -msnnotificationconnection.o: msnnotificationconnection.moc -tcpconnectionbase.lo: tcpconnectionbase.moc diff --git a/kmess/network/applications/.cvsignore b/kmess/network/applications/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/network/applications/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/network/applications/Makefile.am b/kmess/network/applications/Makefile.am deleted file mode 100644 index 5fcefda..0000000 --- a/kmess/network/applications/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libapplications.a - -INCLUDES = $(all_includes) -I$(KPHONEDIR) - -libapplications_a_METASOURCES = AUTO - -libapplications_a_SOURCES = application.cpp mimeapplication.cpp \ - p2papplication.cpp gnomemeeting.cpp msnremotedesktop.cpp picturetransferp2p.cpp \ - voiceconversation.cpp sipconnection.cpp filetransferp2p.cpp filetransfer.cpp \ - webapplicationp2p.cpp applicationlist.cpp webcamtransferp2p.cpp - - -noinst_HEADERS = application.h mimeapplication.h p2papplication.h \ - gnomemeeting.h msnremotedesktop.h picturetransferp2p.h voiceconversation.h \ - filetransferp2p.h filetransfer.h sipconnection.h webapplicationp2p.h applicationlist.h \ - webcamtransferp2p.h - -libapplications_a_LIBADD = ${KPHONE_G711_OBJ} ${KPHONE_DTMFGENERATOR_OBJ} \ - ${KPHONE_DSPOUTRTP_OBJ} ${KPHONE_DSPOUTOSS_OBJ} ${KPHONE_DSPOUT_OBJ} ${KPHONE_DSPAUDIO_OBJ} \ - ${KPHONE_DSPAUDIOIN_OBJ} ${KPHONE_DSPAUDIOOUT_OBJ} ${KPHONE_CALLAUDIO_OBJ} \ - ${KPHONE_CALLAUDIO_MOC_OBJ} ${KPHONE_AUDIOBUFFER_OBJ} - -####### kdevelop will overwrite this part!!! (end)############ diff --git a/kmess/network/applications/Makefile.in b/kmess/network/applications/Makefile.in deleted file mode 100644 index adaeb0a..0000000 --- a/kmess/network/applications/Makefile.in +++ /dev/null @@ -1,920 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libapplications_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/network/applications -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libapplications_a_AR = $(AR) $(ARFLAGS) -am__DEPENDENCIES_1 = -libapplications_a_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am_libapplications_a_OBJECTS = application.$(OBJEXT) \ - mimeapplication.$(OBJEXT) p2papplication.$(OBJEXT) \ - gnomemeeting.$(OBJEXT) msnremotedesktop.$(OBJEXT) \ - picturetransferp2p.$(OBJEXT) voiceconversation.$(OBJEXT) \ - sipconnection.$(OBJEXT) filetransferp2p.$(OBJEXT) \ - filetransfer.$(OBJEXT) webapplicationp2p.$(OBJEXT) \ - applicationlist.$(OBJEXT) webcamtransferp2p.$(OBJEXT) -#>- libapplications_a_OBJECTS = $(am_libapplications_a_OBJECTS) -#>+ 11 -libapplications_a_final_OBJECTS = libapplications_a.all_cpp.o -libapplications_a_nofinal_OBJECTS = application.$(OBJEXT) \ - mimeapplication.$(OBJEXT) p2papplication.$(OBJEXT) \ - gnomemeeting.$(OBJEXT) msnremotedesktop.$(OBJEXT) \ - picturetransferp2p.$(OBJEXT) voiceconversation.$(OBJEXT) \ - sipconnection.$(OBJEXT) filetransferp2p.$(OBJEXT) \ - filetransfer.$(OBJEXT) webapplicationp2p.$(OBJEXT) \ - applicationlist.$(OBJEXT) webcamtransferp2p.$(OBJEXT)\ -webapplicationp2p.moc.o webcamtransferp2p.moc.o -@KDE_USE_FINAL_FALSE@libapplications_a_OBJECTS = $(libapplications_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libapplications_a_OBJECTS = $(libapplications_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/application.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/applicationlist.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/filetransfer.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/filetransferp2p.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/gnomemeeting.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/mimeapplication.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msnremotedesktop.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/p2papplication.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/picturetransferp2p.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/sipconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/voiceconversation.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/webapplicationp2p.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/webcamtransferp2p.Po -#>+ 26 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/webapplicationp2p.moc.P $(DEPDIR)/webcamtransferp2p.moc.P $(DEPDIR)/libapplications_a.all_cpp.P ./$(DEPDIR)/application.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/applicationlist.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/filetransfer.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/filetransferp2p.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/gnomemeeting.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/mimeapplication.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnremotedesktop.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/p2papplication.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/picturetransferp2p.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/sipconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/voiceconversation.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/webapplicationp2p.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/webcamtransferp2p.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/webapplicationp2p.moc.P $(DEPDIR)/webcamtransferp2p.moc.P ./$(DEPDIR)/application.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/applicationlist.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/filetransfer.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/filetransferp2p.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/gnomemeeting.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/mimeapplication.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnremotedesktop.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/p2papplication.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/picturetransferp2p.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/sipconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/voiceconversation.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/webapplicationp2p.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/webcamtransferp2p.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libapplications_a_SOURCES) -DIST_SOURCES = $(libapplications_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libapplications.a -INCLUDES = $(all_includes) -I$(KPHONEDIR) -#>- libapplications_a_METASOURCES = AUTO -libapplications_a_SOURCES = application.cpp mimeapplication.cpp \ - p2papplication.cpp gnomemeeting.cpp msnremotedesktop.cpp picturetransferp2p.cpp \ - voiceconversation.cpp sipconnection.cpp filetransferp2p.cpp filetransfer.cpp \ - webapplicationp2p.cpp applicationlist.cpp webcamtransferp2p.cpp - -noinst_HEADERS = application.h mimeapplication.h p2papplication.h \ - gnomemeeting.h msnremotedesktop.h picturetransferp2p.h voiceconversation.h \ - filetransferp2p.h filetransfer.h sipconnection.h webapplicationp2p.h applicationlist.h \ - webcamtransferp2p.h - -libapplications_a_LIBADD = ${KPHONE_G711_OBJ} ${KPHONE_DTMFGENERATOR_OBJ} \ - ${KPHONE_DSPOUTRTP_OBJ} ${KPHONE_DSPOUTOSS_OBJ} ${KPHONE_DSPOUT_OBJ} ${KPHONE_DSPAUDIO_OBJ} \ - ${KPHONE_DSPAUDIOIN_OBJ} ${KPHONE_DSPAUDIOOUT_OBJ} ${KPHONE_CALLAUDIO_OBJ} \ - ${KPHONE_CALLAUDIO_MOC_OBJ} ${KPHONE_AUDIOBUFFER_OBJ} - -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/applications/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/network/applications/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/applications/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/applications/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/applications/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libapplications.a: $(libapplications_a_OBJECTS) $(libapplications_a_DEPENDENCIES) - -rm -f libapplications.a - $(libapplications_a_AR) libapplications.a $(libapplications_a_OBJECTS) $(libapplications_a_LIBADD) - $(RANLIB) libapplications.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/application.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/applicationlist.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filetransfer.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filetransferp2p.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnomemeeting.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mimeapplication.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnremotedesktop.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p2papplication.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/picturetransferp2p.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sipconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/voiceconversation.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/webapplicationp2p.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/webcamtransferp2p.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - - -####### kdevelop will overwrite this part!!! (end)############ -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -msnremotedesktop.moc: $(srcdir)/msnremotedesktop.h - $(MOC) $(srcdir)/msnremotedesktop.h -o msnremotedesktop.moc - -#>+ 2 -mocs: msnremotedesktop.moc - -#>+ 3 -filetransfer.moc: $(srcdir)/filetransfer.h - $(MOC) $(srcdir)/filetransfer.h -o filetransfer.moc - -#>+ 2 -mocs: filetransfer.moc - -#>+ 3 -webapplicationp2p.moc.cpp: $(srcdir)/webapplicationp2p.h - $(MOC) $(srcdir)/webapplicationp2p.h -o webapplicationp2p.moc.cpp - -#>+ 2 -mocs: webapplicationp2p.moc.cpp - -#>+ 3 -picturetransferp2p.moc: $(srcdir)/picturetransferp2p.h - $(MOC) $(srcdir)/picturetransferp2p.h -o picturetransferp2p.moc - -#>+ 2 -mocs: picturetransferp2p.moc - -#>+ 3 -application.moc: $(srcdir)/application.h - $(MOC) $(srcdir)/application.h -o application.moc - -#>+ 2 -mocs: application.moc - -#>+ 3 -filetransferp2p.moc: $(srcdir)/filetransferp2p.h - $(MOC) $(srcdir)/filetransferp2p.h -o filetransferp2p.moc - -#>+ 2 -mocs: filetransferp2p.moc - -#>+ 3 -webcamtransferp2p.moc.cpp: $(srcdir)/webcamtransferp2p.h - $(MOC) $(srcdir)/webcamtransferp2p.h -o webcamtransferp2p.moc.cpp - -#>+ 2 -mocs: webcamtransferp2p.moc.cpp - -#>+ 3 -p2papplication.moc: $(srcdir)/p2papplication.h - $(MOC) $(srcdir)/p2papplication.h -o p2papplication.moc - -#>+ 2 -mocs: p2papplication.moc - -#>+ 3 -gnomemeeting.moc: $(srcdir)/gnomemeeting.h - $(MOC) $(srcdir)/gnomemeeting.h -o gnomemeeting.moc - -#>+ 2 -mocs: gnomemeeting.moc - -#>+ 3 -applicationlist.moc: $(srcdir)/applicationlist.h - $(MOC) $(srcdir)/applicationlist.h -o applicationlist.moc - -#>+ 2 -mocs: applicationlist.moc - -#>+ 3 -voiceconversation.moc: $(srcdir)/voiceconversation.h - $(MOC) $(srcdir)/voiceconversation.h -o voiceconversation.moc - -#>+ 2 -mocs: voiceconversation.moc - -#>+ 3 -mimeapplication.moc: $(srcdir)/mimeapplication.h - $(MOC) $(srcdir)/mimeapplication.h -o mimeapplication.moc - -#>+ 2 -mocs: mimeapplication.moc - -#>+ 3 -sipconnection.moc: $(srcdir)/sipconnection.h - $(MOC) $(srcdir)/sipconnection.h -o sipconnection.moc - -#>+ 2 -mocs: sipconnection.moc - -#>+ 3 -clean-metasources: - -rm -f msnremotedesktop.moc filetransfer.moc webapplicationp2p.moc.cpp picturetransferp2p.moc application.moc filetransferp2p.moc webcamtransferp2p.moc.cpp p2papplication.moc gnomemeeting.moc applicationlist.moc voiceconversation.moc mimeapplication.moc sipconnection.moc - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/applications/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/applications/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/applications/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libapplications_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/application.cpp $(srcdir)/mimeapplication.cpp $(srcdir)/p2papplication.cpp $(srcdir)/gnomemeeting.cpp $(srcdir)/msnremotedesktop.cpp $(srcdir)/picturetransferp2p.cpp $(srcdir)/voiceconversation.cpp $(srcdir)/sipconnection.cpp $(srcdir)/filetransferp2p.cpp $(srcdir)/filetransfer.cpp $(srcdir)/webapplicationp2p.cpp $(srcdir)/applicationlist.cpp $(srcdir)/webcamtransferp2p.cpp webapplicationp2p.moc.cpp webcamtransferp2p.moc.cpp msnremotedesktop.moc filetransfer.moc picturetransferp2p.moc filetransferp2p.moc application.moc p2papplication.moc gnomemeeting.moc voiceconversation.moc applicationlist.moc mimeapplication.moc sipconnection.moc - @echo 'creating libapplications_a.all_cpp.cpp ...'; \ - rm -f libapplications_a.all_cpp.files libapplications_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libapplications_a.all_cpp.final; \ - for file in application.cpp mimeapplication.cpp p2papplication.cpp gnomemeeting.cpp msnremotedesktop.cpp picturetransferp2p.cpp voiceconversation.cpp sipconnection.cpp filetransferp2p.cpp filetransfer.cpp webapplicationp2p.cpp applicationlist.cpp webcamtransferp2p.cpp webapplicationp2p.moc.cpp webcamtransferp2p.moc.cpp ; do \ - echo "#include \"$$file\"" >> libapplications_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libapplications_a.all_cpp.final; \ - done; \ - cat libapplications_a.all_cpp.final libapplications_a.all_cpp.files > libapplications_a.all_cpp.cpp; \ - rm -f libapplications_a.all_cpp.final libapplications_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libapplications_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libapplications_a_OBJECTS="$(libapplications_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libapplications_a_OBJECTS="$(libapplications_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libapplications_a_OBJECTS="$(libapplications_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libapplications_a_OBJECTS="$(libapplications_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 25 -gnomemeeting.o: gnomemeeting.moc -filetransferp2p.lo: filetransferp2p.moc -picturetransferp2p.lo: picturetransferp2p.moc -p2papplication.o: p2papplication.moc -filetransferp2p.o: filetransferp2p.moc -filetransfer.o: filetransfer.moc -msnremotedesktop.lo: msnremotedesktop.moc -sipconnection.lo: sipconnection.moc -p2papplication.lo: p2papplication.moc -filetransfer.lo: filetransfer.moc -nmcheck: -mimeapplication.o: mimeapplication.moc -picturetransferp2p.o: picturetransferp2p.moc -sipconnection.o: sipconnection.moc -voiceconversation.lo: voiceconversation.moc -nmcheck-am: nmcheck -mimeapplication.lo: mimeapplication.moc -msnremotedesktop.o: msnremotedesktop.moc -applicationlist.o: applicationlist.moc -application.lo: application.moc -gnomemeeting.lo: gnomemeeting.moc -applicationlist.lo: applicationlist.moc -voiceconversation.o: voiceconversation.moc -application.o: application.moc diff --git a/kmess/network/applications/p2papplication.cpp b/kmess/network/applications/p2papplication.cpp deleted file mode 100644 index 27a2f60..0000000 --- a/kmess/network/applications/p2papplication.cpp +++ /dev/null @@ -1,5591 +0,0 @@ -/*************************************************************************** - p2papplication.cpp - description - ------------------- - begin : Mon Nov 22 2004 - copyright : (C) 2004 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 "p2papplication.h" - -#include -#include // for memcpy - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "applicationlist.h" -#include "../mimemessage.h" -#include "../p2pmessage.h" -#include "../extra/msndirectconnection.h" -#include "../../msnobject.h" -#include "../../kmessdebug.h" -#include "../../currentaccount.h" - -#ifdef KMESSDEBUG_P2PAPPLICATION -#define KMESSDEBUG_P2PAPPLICATION_GENERAL -#endif - -// Settings for debugging. -#define P2PAPPLICATION_AVOID_DC_CLIENT 0 -#define P2PAPPLICATION_AVOID_DC_SERVER 0 - -// Timeout settings, to prevent stale instances. -// Measured an ACK response time of 90 seconds once for an overloaded machine (Pentium 2 running Skype + WLM). -#define P2PAPPLICATION_TIMEOUT_ACCEPT 120000 -#define P2PAPPLICATION_TIMEOUT_ACK 120000 -#define P2PAPPLICATION_TIMEOUT_DATA 120000 -#define P2PAPPLICATION_TIMEOUT_MOREDATA 120000 -#define P2PAPPLICATION_TIMEOUT_SLP 120000 // 120 seconds -#define P2PAPPLICATION_TIMEOUT_DESTROY 10000 // 10 seconds - - -/** - * @brief Constructor, initializes the P2PApplication instance fields. - * - * The ApplicationList object contains the direct connection, which is shared between all P2P applications of one same contact. - * This object is also used to deliver messages back to the contact. - * - * @param applicationList The application list object for the contact - */ -P2PApplication::P2PApplication(ApplicationList *applicationList) -: Application( applicationList->getContactHandle() ), - aborting_(false), - applicationList_(applicationList), - buffer_(0), - dataSource_(0), - dataType_(P2P_TYPE_NEGOTIATION), - fragmentMessageID_(0), - fragmentOffset_(0), - fragmentTotalSize_(0), - gotSlpMessage_(false), - invitationCSeq_(0), - invitationSessionID_(0), - sessionID_(0), - nextMessageID_(0), - shouldSendAck_(false), - userShouldAcknowledge_(false), - waitingState_(P2P_WAIT_DEFAULT) -{ - // Reset other internal fields - lastIncomingMessage_.dataSize = 0; - lastIncomingMessage_.messageID = 0; - lastIncomingMessage_.messageType = P2P_MSG_UNKNOWN; - lastIncomingMessage_.sentTime = 0; - lastIncomingMessage_.sessionID = 0; - lastIncomingMessage_.totalSize = 0; - lastIncomingMessage_.ackSessionID = 0; - - // Enable auto-deletion on ack queue properties. - outgoingMessages_.setAutoDelete(true); - - // Initiaize the timer - waitingTimer_ = new QTimer(this); - connect( waitingTimer_, SIGNAL(timeout()), this, SLOT(slotCleanup()) ); -} - - - -/** - * @brief Class destructor. - * - * Cleans up buffers and timers. - */ -P2PApplication::~P2PApplication() -{ -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "P2PApplication: entering destructor," - " session=" << sessionID_ << - " closing=" << isClosing() << - " timer=" << waitingTimer_->isActive() << - " state=" << waitingState_ << - " unackedCount=" << outgoingMessages_.count() << "." << endl; -#endif -#ifdef KMESSTEST - ASSERT( outgoingMessages_.isEmpty() ); -#endif - - // Stop the timer - waitingTimer_->stop(); - applicationList_ = 0; - dataSource_ = 0; - - // Delete pointers - delete waitingTimer_; - delete buffer_; -} - - - -/** - * @brief Make sure no more data will be sent. - */ -void P2PApplication::abortDataSending() -{ - // Abort sending. - if( dataSource_ != 0 ) - { -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "P2PApplication::abortDataSending() - application was still sending data, resetting." << endl; -#endif - - dataSource_ = 0; - dataType_ = P2P_TYPE_NEGOTIATION; - applicationList_->unregisterDataSendingApplication( this ); - } -} - - - -/** - * @brief The contact aborted the session - * - * This method is overwritten from the base class, so - * endApplicationLater() is called instead of endApplication(). - * This leaves the P2P session open for a short while, to accept any remaining - * packets that could be sent (like TCP's TIME_WAIT state). - * - * @param message Optional message to display, defaults to getContactAbortMessage(). - */ -void P2PApplication::contactAborted(const QString &message) -{ -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "P2PApplication::contactAborted() - state=" << waitingState_ << endl; -#endif - - // Make sure a second message is not displayed here. - // The contact could be sending multiple error messages. - if( waitingState_ == P2P_WAIT_END_APPLICATION ) - { -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "P2PApplication::contactAborted() - Abort the application again, " - "application was already awaiting termination." << endl; -#endif - - // Make sure the timer is started again. - endApplicationLater(); - return; - } - else if( isClosing() ) - { - kdWarning() << "P2PApplication::contactAborted: Attempted to close application twice " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplicationlater)" << endl; - - // Make sure the timer is started again. - endApplicationLater(); - return; - } - - - bool isTransferComplete = fragmentTracker_.isComplete(); - if( isTransferComplete ) - { - // Make sure the user won't get a "transfer complete" message - // followed by a "contact aborted" message. - // - // This could happen if: - // - WLM sends data - // - KMess acks - // - WLM closes the SB - // - contactAborted() called for every app. - - // Also interesting: - // - signout / signin with WLM. - // - establish a SB connection again by starting a chat. - // - The P2P session is still active in WLM, - // and has a bridge now, so WLM sends the SLP BYE. - // - kmess will ack it with a temporary p2p session. - kdWarning() << "P2PApplication::contactAborted() - not displaying message because data transfer is complete. " - "The switchboard was likely closed after receiving all data. " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplicationlater)" << endl; - } - else - { - if( message.isEmpty() ) - { - showEventMessage( getContactAbortMessage(), ChatMessage::CONTENT_APP_CANCELED, true ); - } - else - { - showEventMessage( message, ChatMessage::CONTENT_APP_CANCELED, true ); - } - } - - endApplicationLater(); -} - - - -/** - * @brief Step 1 of a contact-started chat: the contact invites the user - * - * This default implementation automatically declines the invitation with a "feature not supported" notification. - * - * Override this method to handle the invitation instead. - * It can typically do one of the following things: - * - parse the 'Context' field of the invitation and store the information. - * - display the accept/cancel link with offerAcceptOrReject(). - * - automatically accept the invitation by calling contactStarted2_UserAccepts(). - * - decline the invitation by calling sendCancelMessage(). - * - * @param message The body (payload fields) of the SLP INVITE message, - * which typically has the fields 'Context' and 'AppID'. - * The 'SessionID' and 'EUF-GUID' fields are be processed automatically. - */ -void P2PApplication::contactStarted1_ContactInvitesUser(const MimeMessage &message) -{ -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "P2PApplication - contactStarted1_ContactInvitesUser (rejects invitation)" << endl; -#endif - - // We can assume the switchboard already displayed a better error message -#ifdef KMESTEST - kdWarning() << "The Application subclass didn't implement contactStarted1_ContactInvitesUser!" << endl; -#endif - - // Send some debug info to the console - MimeMessage slpMimeBody(message.getBody()); - kdWarning() << "The contact sent an MSNSLP invitation type KMess can't handle yet " - "(euf-guid=" << slpMimeBody.getValue("EUF-GUID") << - " appid=" << slpMimeBody.getValue("AppID") << - " action=send500)." << endl; - - // Display a warning to the user - showSystemMessage( i18n("The contact initiated a MSN6 feature KMess can't handle yet."), ChatMessage::CONTENT_SYSTEM_NOTICE, true ); - - - // Cancel the invitation - sendCancelMessage( CANCEL_NOT_INSTALLED ); - - // Unlike Application::contactStarted1_ContactInvitesUser() - // we don't quit here!! We should wait for the BYE message from the other contact! -} - - - -/** - * @brief Step 4 of a contact-started chat: the contact confirms the data-preparation message. - * - * This method was added for P2P-style chats to support the last step of a P2P session. - * When the contact requests to send data, call sendData() here to start the transfer. - */ -void P2PApplication::contactStarted4_ContactConfirmsPreparation() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication - contactStarted4_ContactConfirmsPreparation" << endl; -#endif -} - - - -/** - * @brief Scheduelle termination, but wait for last incoming packets - */ -void P2PApplication::endApplicationLater() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::endApplicationLater() - setting timeout to destroy object, allow contact to send a final message." << endl; -#endif - - // If a transfer was active, make sure it ends. - abortDataSending(); - - if( waitingState_ != P2P_WAIT_END_APPLICATION ) - { - // Test if there are still unacked messages (make sure it's only tested once). - // This is done explicitly before the data transfer ends. - testUnAckedMessages( false ); - } - - // Set timeout to destroy - waitingState_ = P2P_WAIT_END_APPLICATION; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DESTROY, true ); - - // Set flag to avoid second attempts. - setClosing( true ); -} - - - -/** - * @brief Private utility function to generate an Session and message/sequence ID. - * @return A random value between 4 and 4294967295. - */ -unsigned long P2PApplication::generateID() -{ - return (rand() & 0x00FFFFFC); -} - - - -/** - * @brief Private utility function to generate a Call ID or Branch ID. - * @return A randomly generated GUID value. - */ -QString P2PApplication::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) - + "}"; - return guid.upper(); -} - - - -/** - * @brief Return the identifier the SLP INVITE message. - * @return The Branch-ID value from the SLP INVITE message. - */ -QString P2PApplication::getBranch() const -{ - return branch_; -} - - - -/** - * @brief Return the identifier of the SLP session. - * @return The Call-ID value from the SLP INVITE message. - */ -QString P2PApplication::getCallID() const -{ - return callID_; -} - - - -/** - * @brief Return the Content-Type of the invitation message - * - * This method is useful for some contactStarted1_ContactInvitesUser() implementations. - * - * @return The Content-Type value, e.g. application/x-msnmsgr-sessionreqbody. - */ -const QString& P2PApplication::getInvitationContentType() const -{ - return invitationContentType_; -} - - - -/** - * @brief Return the identifier of the SLP INVITE message. - * - * This method is useful for some contactStarted2_UserAccepts() implementations. - * It's possible getSessionID() still returns zero, because the client should confirm the Session-ID first. - * - * @return The 'SessionID' field from the SLP payload of the invitation message. - */ -unsigned long P2PApplication::getInvitationSessionID() const -{ - return invitationSessionID_; -} - - - -/** - * @brief Return the message ID used in the previous message from the contact. - * - * This value is used to match fragmented messages. - * It's the second field of the binary P2P header. - * - * @return The message ID field used in the binary P2P header. - */ -unsigned long P2PApplication::getLastContactMessageID() const -{ - return lastIncomingMessage_.messageID; -} - - - -/** - * @brief Returns the nonce that's being expected. - * - * This value is used to authenticate the direct connection. - * - * @return The Nonce value; a randonly generated GUID. - */ -const QString & P2PApplication::getNonce() const -{ - return nonce_; -} - - - -/** - * @brief Return the session ID, this identifies the P2P session. - * - * It's the first field of the binary P2P header. - * When a negotiation message is sent, it's session ID field will always be zero, - * regardless of the real session ID. - * - * @return The session ID field used in the binary P2P header. - */ -unsigned long P2PApplication::getSessionID() const -{ - return sessionID_; -} - - - -/** - * @brief Find the unacked message which corresponds with the received P2P ACK message. - * - * This method compares the binary P2P fields to find the original message which was sent. - * The returned 'messageType' field is used later in gotAck() to handle ACKs for some specific messages. - * - * @param ackMessage The ACK message to test for. - * @return The meta information about the original message ACKed by the contact. - */ -P2PApplication::UnAckedMessage * P2PApplication::getUnAckedMessage(const P2PMessage &ackMessage) const -{ -#ifdef KMESSTEST - ASSERT( ackMessage.getFlags() != 0 && ackMessage.getDataSize() == 0 ); -#endif - - unsigned long ackSessionID = ackMessage.getAckSessionID(); // ackSid - unsigned long ackUniqueID = ackMessage.getAckUniqueID(); // ackUid - unsigned long ackFlag = ackMessage.getFlags(); - - QPtrListIterator it(outgoingMessages_); - while( it.current() != 0 ) - { - UnAckedMessage *unAcked = it.current(); - - // This works for normal ACKs (0x02) to P2P messages. - // Ack message | original message - // ----------------------------------------- - // ackSid = messageID - // ackUid = ackSid - // ackSize = size - if( ackUniqueID == unAcked->ackSessionID ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::getUnAckedMessage() - message is matched, option 1: " - "ackUniqueID = original uniqueID " << ackUniqueID << "." << endl; -#endif -#ifdef KMESSTEST - ASSERT( ackFlag == P2PMessage::MSN_FLAG_ACK ); -#endif - // Found it, save reference - return unAcked; - } - - - // This works for control messages (like 0x08): - // uniqueID is reffers to uniqueID of original message. - // Ack message | original message - // ----------------------------------------- - // total = total - // ackSid = ackSid - // ackUid = 0 - // ackSize = 0 - if( ackSessionID == unAcked->ackSessionID && ackUniqueID == 0 ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::getUnAckedMessage() - message is matched, option 2: " - "ackSessionID = original uniqueID " << ackSessionID << "." << endl; -#endif -#ifdef KMESSTEST - ASSERT( ackFlag == P2PMessage::MSN_FLAG_ERROR ); -#endif - // Found it, save reference - return unAcked; - } - - // Also attempt to match on the messageID alone if: - // - it's a 0x80 message. In this case sendP2PMessage() 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: - // Ack message | original message - // ----------------------------------------- - // ackSid = messageID - // ackUid = 0 - // ackSize = bytepos - // - // This happens with 0x80 messages: - // Ack message | original message - // ----------------------------------------- - // ackSid = messageID - // ackUid = new - // ackSize = size - if( ackSessionID == unAcked->messageID - && ( ackFlag == P2PMessage::MSN_FLAG_ABORTED_RECEIVING || ackUniqueID == 0 ) ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::getUnAckedMessage() - message is matched, option 3: " - "ackMessageID = original messageID " << ackSessionID << "." << endl; -#endif -#ifdef KMESSTEST - ASSERT( ackFlag == P2PMessage::MSN_FLAG_ABORTED_RECEIVING - || ackFlag == P2PMessage::MSN_FLAG_NEGATIVE_ACK ); -#endif - - // Found it, save reference - return unAcked; - } - - ++it; - } - - return 0; -} - - - -/** - * @brief Find the unacked message which corresponds with given message type. - * - * @param messageType The P2P message type. - * @return The message unacked message details. - */ -P2PApplication::UnAckedMessage * P2PApplication::getUnAckedMessage(const P2PMessageType messageType) const -{ - QPtrListIterator it( outgoingMessages_ ); - while( it.current() != 0 ) - { - if( it.current()->messageType == messageType ) - { - return it.current(); - } - - ++it; - } - - return 0; -} - - - -/** - * @brief Parse the received ACK message. - * - * The messageType field is used to detect actions - * like "contact ACKed the OK message" or "contact received all data". - * - * It handles the following ACK message types: - * - ACK of a SLP INVITE message invokes gotAck_SlpSessionInvitation(). - * - ACK of a SLP session OK message invokes gotAck_slpSessionOk(). - * - ACK of a SLP tranfer INVITE message invokes gotAck_slpTransferInvitation(). - * - ACK of a SLP tranfer OK message invokes gotAck_slpTransferOk(). - * - ACK of a SLP transfer decline message invokes gotAck_slpTransferDecline(). - * - ACK of the data preparation message invokes gotAck_dataPreparation() - * - ACK of the sent file data invokes gotAck_dataReceived(). - * - ACK of the SLP BYE message, invokes gotAck_slpBye(). - * - ACK of a SLP error message invokes gotAck_slpError(). - * - all other ACKs are not treated specially. - * - * @param message The ACK message. - * @param messageType The type of the original message this ACK corresponds with. - */ -void P2PApplication::gotAck(const P2PMessage &message, const P2PMessageType ackedMessageType) -{ -#ifndef KMESSTEST - Q_UNUSED( message ); // Avoid compiler warning -#endif - -#ifdef KMESSTEST - if( message.isAck() ) // normal 0x02 ack - { - ASSERT( message.getDataSize() == 0 ); - ASSERT( message.getTotalSize() == 0 ); - ASSERT( message.getAckSessionID() != 0 ); - ASSERT( message.getAckUniqueID() != 0 ); - ASSERT( message.getAckDataSize() != 0 ); - } -#endif - - switch( ackedMessageType ) - { - // Are we waiting for the contact to accept our invitation (e.g. send "200 OK")? - case P2P_MSG_SESSION_INVITATION: -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (INVITE ACK)." << endl; -#endif - - gotAck_slpSessionInvitation(); - return; - - - // Are we waiting for the ACK to confirm our "200 OK" message? - case P2P_MSG_SESSION_OK: - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (200 OK ACK)." << endl; -#endif - - gotAck_slpSessionOk(); - return; - - - // Are we waiting for the contact to accept our transfer invitation (e.g. send "200 OK")? - case P2P_MSG_TRANSFER_INVITATION: -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (INVITE transfer ACK)." << endl; -#endif - - gotAck_slpTransferInvitation(); - return; - - - // Are we waiting for the ACK to confirm our "200 OK" message? - case P2P_MSG_TRANSFER_OK: - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (200 transfer OK ACK)." << endl; -#endif - - gotAck_slpTransferOk(); - return; - - - // Are we waiting for the ACK to confirm our data preparation message? - case P2P_MSG_DATA_PREPARATION: - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::getAck() - Got an ACK message (data-preparation ACK)." << endl; -#endif -#ifdef KMESSTEST - ASSERT( message.getAckDataSize() == 4 ); -#endif - - gotAck_dataPreparation(); - return; - - - // Are we waiting for the ACK to confirm that all data was received? - case P2P_MSG_DATA: -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (all-received ACK)." << endl; -#endif - - gotAck_dataReceived(); - return; - - - // Are we waiting for the BYE ACK to quit the session/application? - case P2P_MSG_SESSION_BYE: -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (BYE ACK, terminating)." << endl; -#endif - - gotAck_slpBye(); - return; - - - // Are we expecting a ACK for our decline of the transfer? - case P2P_MSG_TRANSFER_DECLINE: -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (transfer decline ACK)." << endl; -#endif - - gotAck_slpTransferDecline(); - return; - - - // Are we waiting for the SLP Error message to be ACK-ed? - case P2P_MSG_SLP_ERROR: -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message (Confirmed SLP Error)." << endl; -#endif - - gotAck_slpError(); - return; - - - // Standard ACK message or unhandled ACK message. - default: - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - Got an ACK message. " - "waitingState=" << waitingState_ << " ackedMessageType=" << ackedMessageType << "." << endl; -#endif - - // Avoid warnings when we're waiting for something else, and the ACK is not important. - if( waitingState_ == P2P_WAIT_FOR_CONNECTION ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck() - No special action taken (waiting for a connection)." << endl; -#endif - } - else if( waitingState_ != P2P_WAIT_DEFAULT || ackedMessageType != P2P_MSG_UNKNOWN ) - { - // Unexpected, this should be a normal ACK message. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdWarning() << "P2PApplication::gotAck() - Unhandled state for ACK message:" - " waitingState=" << waitingState_ << " ackedMessageType=" << ackedMessageType << "!" << endl; -#endif - // If we were waiting: the timer is stopped and - // we forgot an if-block in this method. - // So make sure the object will still be killed eventually. - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DATA, true ); - return; - } - } -} - - - -/** - * @brief Called when the ACK for the data preparation was received. - * - * This invokes initiateTransfer(), unless the the application - * waits for an ACK to a SLP transfer OK message. - */ -void P2PApplication::gotAck_dataPreparation() -{ -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_PREPARE_ACK || waitingState_ == P2P_WAIT_FOR_CONNECTION ); -#endif - - waitingState_ = P2P_WAIT_DEFAULT; - - // This should happen after the data preparation message is sent. - - // If the user sent the invitation, - // we shouldn't receive the prepare-ack, but sent it. - if(isUserStartedApp()) - { - // We received a data preparation ACK but didn't expect it. - kdWarning() << "P2PApplication::gotAck_dataPreparation() - P2P message can't be handled, " - "this ack is not expected for applications started by the user " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - - // Send error back. - shouldSendAck_ = true; // ASSERT in sendP2PAck would fail otherwise - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - - showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, false ); - endApplicationLater(); - return; - } - - - // Keep waiting if a direct connection setup is about to be complete. - if( hasUnAckedMessage(P2P_MSG_TRANSFER_OK) ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_dataPreparation() - Application is waiting for a 200 transfer OK ACK, " - "not initiating transfer yet." << endl; -#endif - - waitingState_ = P2P_WAIT_FOR_TRANSFER_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_SLP, true ); - return; - } - - - // Dispatch to derived implementation - initiateTransfer(); -} - - - -/** - * @brief Called when the ACK for the sent file data was received. - * - * This method invokes showTransferComplete(), and sends the SLP BYE if needed. - */ -void P2PApplication::gotAck_dataReceived() -{ -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_DATA_ACK ); -#endif - - if(isUserStartedApp()) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_dataReceived() - All data sent and confirmed, " - "sending BYE message..." << endl; -#endif - - // We sent the INVITE, now we send the BYE. - waitingState_ = P2P_WAIT_DEFAULT; - sendSlpBye(); - - // All data was acked - // Telling derived class the transfer is complete. - showTransferComplete(); - - // Don't terminate yet, that message needs to be ACK-ed as well. - } - else - { -#ifdef gotAck_dataReceived - kdDebug() << "P2PApplication::gotAck_dataReceived() - All data sent and confirmed, " - "waiting for BYE message..." << endl; -#endif - - // All data was acked, this is good enough. - // The remaining teardown happens behind the scenes. - showTransferComplete(); - - // The other contact sent the INVITE, so we also wait for the BYE message. - // This happens for picture transfers for example. - - waitingState_ = P2P_WAIT_FOR_SLP_BYE; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_SLP, true ); - } -} - - - -/** - * @brief Called when the ACK for the SLP BYE message was received. - * - * This schedules the application for termination. - */ -void P2PApplication::gotAck_slpBye() -{ -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_SLP_BYE_ACK ); -#endif - - // See if the data was not acked. - UnAckedMessage *unAckedDataMessage = getUnAckedMessage( P2P_MSG_DATA ); - if( unAckedDataMessage != 0 ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpBye() - Data was not acked, sending 0x40 to abort ack request." << endl; -#endif - - // It's possible WLM also closed it's data stream at this point, - // so ignores the 0x40 and sends a 0x80 at the same time back. - sendP2PAck( P2PMessage::MSN_FLAG_ABORTED_SENDING, unAckedDataMessage ); - outgoingMessages_.remove( unAckedDataMessage ); - } - - waitingState_ = P2P_WAIT_DEFAULT; - - // Session complete. - endApplicationLater(); -} - - - -/** - * @brief Called when the ACK for a SLP Error was received. - * - * if the contact started the application, this will wait for the SLP BYE message. - * Otherwise the application is terminated. - */ -void P2PApplication::gotAck_slpError() -{ -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_SLP_ERR_ACK ); -#endif - waitingState_ = P2P_WAIT_DEFAULT; - - if(! isUserStartedApp()) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpError() - The contact started this application, waiting for BYE." << endl; -#endif - - // We wait for the BYE - waitingState_ = P2P_WAIT_FOR_SLP_BYE; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_SLP, true ); - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpError() - The user started this application, terminating." << endl; -#endif - - // TODO: send BYE after the client confirmed our SLP error? - endApplicationLater(); - } -} - - - -/** - * @brief Called when the ACK for the first SLP INVITE message was received. - * - * This only changes the waiting state, to wait for the SLP OK message. - */ -void P2PApplication::gotAck_slpSessionInvitation() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpSessionInvitation() - Waiting for 200 OK message..." << endl; -#endif - - // Continue to wait for the contact to send the accept message (SLP OK). - waitingState_ = P2P_WAIT_CONTACT_ACCEPT; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACCEPT, true ); - - // note KMess uses a fixed time user to accept/decline here. - // WLM8 has no timeout here for file transfer. -} - - - -/** - * @brief Called when the ACK of the SLP OK message was received. - * - * This method invokes contactStarted3_ContactConfirmsAccept() - */ -void P2PApplication::gotAck_slpSessionOk() -{ - // Reset, will be changed by initiateTransfer->contactStarted3..->sendDataPreparationAck. - // TODO: rewrite the sending of the data-preparation message using the incoming/outgoing queue. - waitingState_ = P2P_WAIT_DEFAULT; - - - // This should happen after the "200 OK" message is sent. - - // If the user started the inviation, - // we send the SLP OK ack, not receive it - if( isUserStartedApp() ) - { - // We received an 200 OK ACK but didn't expect it. - kdWarning() << "P2PApplication::gotAck_sessionOk() - P2P message can't be handled, " - "this ack is not expected for applications started by the user " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - // TODO: cancel session in a different way, can't respond with ACKs on ACKs. - shouldSendAck_ = true; // ASSERT in sendP2PAck would fail otherwise - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - - - showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, false ); - endApplicationLater(); - return; - } - - // SLP OK message ACKed - // For P2P apps, we can't prove any mime fields here, so an empty constructor is what's left.. - // This is where the data preparation ACK could be sent. - contactStarted3_ContactConfirmsAccept(MimeMessage()); - -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_DEFAULT || waitingState_ == P2P_WAIT_FOR_PREPARE_ACK ); -#endif - - // If the contactStarted3() didn't sent anything, we'll wait for incoming file data. - if(waitingState_ == P2P_WAIT_DEFAULT) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpSessionOk() - Waiting state not changed, " - "waiting for file data..." << endl; -#endif - - // For Pictures, the contact must send the data preparation ACK at this point (P2P_WAIT_FOR_PREPARE_ACK) - // For Files, the contact must initiate the data transfer now. (P2P_WAIT_DEFAULT) - waitingState_ = P2P_WAIT_FOR_FILE_DATA; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DATA, true ); - } -} - - - -/** - * @brief Called when the ACK for the SLP transfer decline message was received. - * - * This only changes the waiting state, - * the contact should start to send the data now. - */ -void P2PApplication::gotAck_slpTransferDecline() -{ -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_SLP_ERR_ACK || waitingState_ == P2P_WAIT_FOR_FILE_DATA ); -#endif - - if( waitingState_ == P2P_WAIT_FOR_FILE_DATA || ! fragmentTracker_.isEmpty() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpTransferDecline() - Got ack while data transfer is already active." << endl; -#endif - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpTransferDecline() - Waiting for file data..." << endl; -#endif - - // Continue to wait for the contact to send the file data - waitingState_ = P2P_WAIT_FOR_FILE_DATA; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DATA, true ); - } -} - - - -/** - * @brief Called when the ACK for the SLP transfer INVITE message was received. - * - * This only changes the waiting state, to wait for the SLP OK message. - */ -void P2PApplication::gotAck_slpTransferInvitation() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpTransferInvitation() - Waiting for 200 OK message..." << endl; -#endif -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_INVITE_TR_ACK ); -#endif - - // Continue to wait for the contact to send the accept message (SLP OK). - waitingState_ = P2P_WAIT_FOR_TRANSFER_ACCEPT; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACCEPT, true ); - - // note KMess uses a fixed time user to accept/decline here. - // WLM8 has no timeout here for file transfer. -} - - - -/** - * @brief Called when the ACK for the SLP transfer OK mesages was received. - * - * This invokes initiateTransfer() or waits - * for an other direct connection to complete. - */ -void P2PApplication::gotAck_slpTransferOk() -{ - // For some reason, our "MSNSLP/1.0 200 OK" message can be ACKed when we just ACKed all data is received. - // Detect this, otherwise the chat window is filled with "File transfer complete.. Contact aborted" messages. - if( waitingState_ == P2P_WAIT_FOR_SLP_BYE || fragmentTracker_.isComplete() ) - { - kdWarning() << "P2PApplication::gotAck_slpTransferOk() - Received ACK for 'transrespbody' message " - "while closing the session " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=return)." << endl; - - // Make sure the timer starts again. - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_SLP, true ); - return; - } - - waitingState_ = P2P_WAIT_DEFAULT; - - // This should happen after the "200 OK" message is sent. - - // SLP ransfer OK message ACKed - if( ! applicationList_->hasDirectConnection() - && ! applicationList_->hasPendingConnections() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpTransferOk() - No connection attempts were made, " - "so starting transfer immediately." << endl; -#endif - // TODO: the contact may actually send an INVITE back to become the server. - initiateTransfer(); - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpTransferOk() - 200 transfer OK ACK received, " - "but waiting for connection attempts to succeed or fail..." << endl; -#endif - } - - // If the contactStarted3() didn't sent anything, we'll wait for incoming file data. - if(waitingState_ == P2P_WAIT_DEFAULT) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotAck_slpTransferOk() - Waiting state not changed, " - "waiting for file data..." << endl; -#endif - - // At some slow systems, it seams WLM can already start - // the data transfer before waiting for a connection. - if( ! fragmentTracker_.isEmpty() ) - { - kdWarning() << "P2PApplication::gotAck_slpTransferOk() - already received " << - fragmentTracker_.getTransferredBytes() << " bytes before receiving the 200 transfer OK ACK " - "(state=" << waitingState_ << - " dc=" << applicationList_->hasDirectConnection() << - " dcauth=" << applicationList_->hasAuthorizedDirectConnection() << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)." << endl; - } - - // For Files, the contact must initiate the data transfer now. (P2P_WAIT_DEFAULT) - waitingState_ = P2P_WAIT_FOR_FILE_DATA; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DATA, true ); - } -} - - - -/** - * @brief Got an direct connection handshake ack. - * - * This method verifies the Nonce field and marks the connection as authenticated. - * If the Nonce field is invalid, the connection will be closed without any notice. - * - * @param message The handshake message received from the direct connection. - */ -void P2PApplication::gotDirectConnectionHandshake(const P2PMessage &message) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDirectConnectionHandshake() - Got a direct connection handshake message." << endl; -#endif - - // If the contact was sending a handshake when we dropped the connection, - // it's possible this packet will be delivered over the switchboard. - if( ! applicationList_->hasDirectConnection() ) - { - // Ignore the packet - kdWarning() << "P2PApplication::gotDirectConnectionHandshake() - Received direct connection handshake at the switchboard " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=return)." << endl; - return; - } - - MsnDirectConnection *directConnection = applicationList_->getDirectConnection(); - - // Get connection info - QString nonce = message.getNonce(); - bool isServer = directConnection->isServer(); - - // Verify the nonce - // Nonce is already used in ApplicationList to find this application, - // but this is kept here for consistency, and if ApplicationList would change one time. - if( nonce != nonce_ ) - { - // Invalid nonce! Drop connection - kdWarning() << "P2PApplication::gotDirectConnectionHandshake() - Contact sent invalid nonce " - "(received=" << nonce << - " expected=" << nonce_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=closeconnection)." << endl; - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDirectConnectionHandshake() - Closing connection, moving transfer to switchboard." << endl; -#endif - - // Like the official client, close the connection without any notice. - // The transfer continues over the switchboard instead. - directConnection->closeConnection(); // DirectConnectionPool deletes it. - } - else if( isServer ) - { - // If we're the server, we still need to send a handshake back -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDirectConnectionHandshake() - Contact sent correct nonce, " - "sending direct connection handshake ACK." << endl; -#endif -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_HANDSHAKE || ! fragmentTracker_.isEmpty() ); -#endif - - // KMess is the server, it should authenticate the handshake message. - sendDirectConnectionHandshake(); - } - else - { - // KMess is the client, it should verify the handshake response only. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDirectConnectionHandshake() - Contact sent correct nonce, " - "marking connection as authorized." << endl; -#endif - -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_FOR_HANDSHAKE_OK || ! fragmentTracker_.isEmpty() ); -#endif - - // Detect when the contact sent a second INVITE, runs the direct connection server, but sends the nonce first. - // This happened once with WLM8 after the data transfer because KMess didn't send the handshake. - if( waitingState_ == P2P_WAIT_FOR_HANDSHAKE ) - { - kdWarning() << "P2PApplication::gotDirectConnectionHandshake() - received nonce from contact first, " - "but it's running the server" - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x100)!" << endl; - - sendDirectConnectionHandshake(); - } - } - - - // See if the transfer was already started. - if( fragmentTracker_.isComplete() ) - { - kdWarning() << "P2PApplication::gotDirectConnectionHandshake() - connection is authorized " - "but data transfer is already complete" - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x100)!" << endl; - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDirectConnectionHandshake() - marking connection as authorized, transfer should start." << endl; -#endif - - waitingState_ = P2P_WAIT_FOR_FILE_DATA; - } - - // Mark connection as authorized - // This also starts signals which call slotConnectionAuthorized() - directConnection->setAuthorized(true); -} - - - -/** - * @brief Called when data is received. - * - * This method should be overwritten in the derived class - * to store the data in a file, buffer, etc.. - * - * The order of the data fragments is not guaranteed by WLM, especially when it's switching to a direct connection. - * The writeP2PDataToFile() function can be used to cope with this behavour. - * Also don't rely on P2PMessage::isLastFragment() to determine when the transfer is complete. - * Overwrite showTransferComplete() instead. - * - * @param message The P2P message containing the data. - */ -void P2PApplication::gotData(const P2PMessage &/*message*/) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdWarning() << "P2PApplication::gotData() - Data not handeled by derived class." << endl; -#endif -} - - - -/** - * @brief Called internally when data is received, this eventually calls gotData() - * - * It validates the current state, calls showTransferProgress() and gotData(). - * After receiving the last message, it calls showTransferComplete() and sends the SLP BYE message if needed. - * - * @param message The received data message. - */ -void P2PApplication::gotDataFragment(const P2PMessage &message) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataFragment() - Received file data, calling gotData()." << endl; -#endif -#ifdef KMESSDEBUG - ASSERT( waitingState_ == P2P_WAIT_FOR_FILE_DATA ); -#endif - - unsigned long dataOffset = message.getDataOffset(); - - // See if the class is trying to abort. - // Avoid bothering the derived class with these issues. - if( waitingState_ == P2P_WAIT_FOR_SLP_BYE_ACK ) - { - kdWarning() << "P2PApplication::gotDataFragment() - Still receiving data while BYE is sent " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - return; - } - else if( waitingState_ == P2P_WAIT_FOR_SLP_BYE ) - { - // This actually happened when there were some delayed packets in the buffer with WLM. - // When switching bridges (SB/DC) it actually cannot guarantee the messages will be sent in order. - // This is visible at slow computers. - kdWarning() << "P2PApplication::gotDataFragment() - Still receiving data while last fragment was received " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - return; - } - else if( waitingState_ == P2P_WAIT_END_APPLICATION ) - { - // This happend when the data preparation was rejected, - // and the contact kept sending data. - kdWarning() << "P2PApplication::gotDataFragment() - Still receiving data while the application wants to close " - "(contact=" << getContactHandle() << - " session=" << getSessionID() << - " class=" << metaObject()->className() << - " action=send0x08)."; - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - return; - } - - - // See if data is already sent before establishing a connection. - // Happens with WLM, likely at slow computers. - if( dataOffset == 0 && ! applicationList_->hasDirectConnection() - && ( applicationList_->hasPendingConnections() || applicationList_->hasPendingConnectionInvitation() ) ) - { - kdWarning() << "P2PApplication::gotDataFragment() - Contact is already sending data " - "while attempting to establish a direct connection " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)." << endl; - } - - - // Initialize at the first message - if( dataOffset == 0 ) - { - fragmentTracker_.initialize( message.getMessageID(), message.getTotalSize() ); - } - else - { - // Check if the new data fragment belongs to the current one. - if( ! fragmentTracker_.isInitialized( message.getMessageID() ) ) - { - // Send negative ack message, like WLM does (0x01) - kdWarning() << "P2PApplication::gotDataFragment() - Received unexpected offset for message " - "(offset=" << dataOffset << - " messageID=" << message.getMessageID() << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x01)." << endl; - sendP2PAck(P2PMessage::MSN_FLAG_NEGATIVE_ACK); - sendCancelMessage( CANCEL_FAILED ); // sends slp bye - return; - } - } - - - // Update the tracker - fragmentTracker_.registerFragment( message.getDataOffset(), message.getDataSize() ); - - // Dispatch the message to the derived class - showTransferProgress( fragmentTracker_.getTransferredBytes() ); - gotData(message); - - - // See if the transfer should be complete now. - bool isComplete = fragmentTracker_.isComplete(); - if( ! isComplete ) - { - // Wait for more data to arrive. - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_MOREDATA, true ); - - if( message.isLastFragment() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataFragment() - Got the last fragment, " - "but some messages are not received yet." << endl; - kdDebug() << "Current message is " << fragmentTracker_.getDebugMap() << endl; -#endif - shouldSendAck_ = false; // could be true if received out of order. - } - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataFragment() - Got the last fragment. About to send ACK, but calling showTransferComplete() first so it can still abort." << endl; -#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. - if( shouldSendAck_ ) - { - // TODO: if the messages were received out of order, should we ACK the final message instead? - sendP2PAck(); - } - - // Determine what to send next - if(isUserStartedApp()) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataFragment() - Application was started by the user, also send SLP BYE." << endl; -#endif - - // We sent the INVITE, now we send the BYE. - waitingState_ = P2P_WAIT_DEFAULT; - sendSlpBye(); - // Don't terminate yet, that message needs to be ACK-ed as well. - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataFragment() - Application was started by the contact, waiting for SLP BYE..." << endl; -#endif - - // Otherwise we wait for the BYE - waitingState_ = P2P_WAIT_FOR_SLP_BYE; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_SLP, true ); - } - } -} - - - -/** - * @brief Called when the data preparation message is received. - * - * It calls initiateTransfer() to inform the derived class. - * When sendDataPreparationAck() is not called by the derived class, - * the session will abort automatically. - * - * @param message The P2P data preparation message. - */ -void P2PApplication::gotDataPreparation(const P2PMessage &/*message*/) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataPreparation() - Got the data preparation message" << endl; -#endif -#ifdef KMESSTEST - ASSERT( shouldSendAck_ ); - // WLM invites for a DC first before sending the data preparation. - // Since KMess declines this with a 603, P2P_WAIT_FOR_SLP_ERR_ACK is also a valid state here. - ASSERT( waitingState_ == P2P_WAIT_FOR_PREPARE || waitingState_ == P2P_WAIT_FOR_SLP_ERR_ACK ); -#endif - - - // Tell the derived class it can send the data. - // You typically want to call sendDataPreparation() or sendCancelMessage() here. - // sendDataPreparationAck() only sets a boolean, so we're able to send the - // correct ack or error message here. - // The methods changes one the following variables: - shouldSendAck_ = true; - userShouldAcknowledge_ = true; - - initiateTransfer(); - - - // sendDataPreparation() was not called, determine now what to send: - if(userShouldAcknowledge_) - { - kdDebug() << "P2PApplication::gotDataPreparation() - Handling of data preparation failed " - "(contact=" << getContactHandle() << " action=send0x08)" << endl; - - // Derived class still didn't acknowledge or cancel at all - // (both disable userShouldAcknowledge_). This shouldn't occur! - - // Reject the data-preparation message - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - showEventMessage( i18n("The transfer failed. Data preparation failed."), ChatMessage::CONTENT_APP_FAILED, false ); - endApplicationLater(); - return; - } - - - // If the user did acknowledge something, we no longer have to send an ack any more - // it must have been sendCancelMessage(CANCEL_ABORT) calling sendP2PAck(P2PMessage::MSN_FLAG_ERROR). - if(! shouldSendAck_) - { - // No error message here, assume your derived class already displayed something. - // If sendP2PAck() was called, the app won't terminate, so end it now. - endApplicationLater(); - return; - } - - - // TODO: for WLM8, we need to delay the P2P ack message until the DC is established. - - // User did acknowledge, we can send the *actual* preparation ACK now. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataPreparation() - Data preparation successful, sending ACK" << endl; -#endif - - sendP2PAck(); - - - // Now wait for the data to arrive -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotDataPreparation() - Waiting for file data to arrive..." << endl; -#endif - - waitingState_ = P2P_WAIT_FOR_FILE_DATA; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DATA, true ); -} - - - -/** - * @brief Called when a P2P message was received with the error-flag set. - * - * This method aborts the application by calling contactAborted(). - * - * @param message The received error message. - */ -void P2PApplication::gotErrorAck(const P2PMessage &message) -{ -#ifdef KMESSTEST - ASSERT( message.getDataSize() == 0 ); - - if( message.isNegativeAck() ) - { - ASSERT( message.getTotalSize() == 0 ); - } - else if( message.isError() ) - { - ASSERT( message.getTotalSize() != 0 ); - } - - ASSERT( message.getAckSessionID() != 0 ); - ASSERT( message.getAckUniqueID() == 0 ); - ASSERT( message.getAckDataSize() == 0 ); -#endif - - // When the contact aborted, it could send some 0x08 messages back for the - // next fragments which were already sent (e.g. already in the DC at that time). - // Ignore these error messages. - if( isClosing() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotErrorAck() - Got an P2P error-response while closing " - "(flag=0x" << QString::number( message.getFlags(), 16 ) << - ", ignoring message)." << endl; -#endif - - // Make sure the timer resumes. - endApplicationLater(); - return; - } - - if( message.isNegativeAck() ) - { - // Received when the transfer failed, e.g. write errors at the direct connection. - kdWarning() << "P2PApplication::gotErrorAck() - Got an unexpected P2P error-response " - "(flag=nak" << - " byte=" << message.getDataSize() << - " state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)." << endl; - - abortDataSending(); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotErrorAck() - Waiting for contact to send a BYE message." << endl; -#endif - - waitingState_ = P2P_WAIT_FOR_SLP_BYE; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_SLP, true ); - } - else - { - // Error in our headers? - kdWarning() << "P2PApplication::gotErrorAck() - Got an unexpected P2P error-response " - "(flag=0x" << QString::number( message.getFlags(), 16 ) << - " state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=contactaborted)." << endl; - - - if( dataType_ == P2P_TYPE_NEGOTIATION && ! P2P_WAIT_FOR_DATA_ACK ) - { - // We likely made an error in the invitation/bye reponse - contactAborted( i18n("The contact rejected the invitation. An internal error occured.") ); - } - else - { - // TODO: make this error custom. - // We were sending or receiving a file/picture - // Can also happen if the contact can't handle our data for a different reason. - contactAborted( i18n("The transfer failed.") ); - } - } -} - - - -/** - * @brief Main entry function for incoming incoming messages. - * - * This method receives the incoming P2P messages, analyses it's - * flags and delivers it to various handling methods: - * - ACK messages are delivered to gotAck(), gotDirectConnectionHandshake(), gotErrorAck() or gotTimeoutAck(). - * - SLP negotiation messages are delivered to gotNegotiationFragment(). - * - P2P data preparation messages are delivered to gotDataPreparation(). - * - P2P data messages are delivered to gotDataFragment(). - * - * Other P2P messages are rejected with an error message. - * - * @param p2pMessage A reference to a P2PMessage object. - */ -void P2PApplication::gotMessage(const P2PMessage &p2pMessage) -{ - // Reset session variables. - waitingTimer_->stop(); // stop timer - gotSlpMessage_ = false; // tell this is not a slp message until proven otherwise - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - if( nextMessageID_ == 0 ) - { - // No messages sent, new application - kdDebug() << "P2PApplication::gotMessage() - P2P message from " << getContactHandle() << " is handled by a newly created session." << endl; - } - else - { - // s/found/received/ since ApplicationList::gotMessage() finds it, but this makes it easier to filter the logs. - kdDebug() << "P2PApplication::gotMessage() - New P2P message from " << getContactHandle() << " is handled by session " << sessionID_ << "." << endl; - } -#endif - - // Cancel termination if a new message is received - // while the application was already scheduelled to be closed. - // Ignore typical messages which are sent while a transfer is aborting. - if( waitingState_ == P2P_WAIT_END_APPLICATION - && ! p2pMessage.isError() - && ! p2pMessage.isAbortedReceivingAck() - && ! p2pMessage.isAbortedSendingAck() ) - { - kdWarning() << "P2PApplication::gotMessage() - received another message while awaiting termination " - "(flags=0x" << QString::number( p2pMessage.getFlags(), 16 ) << - " size=" << p2pMessage.getDataSize() << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=unsetclosing)." << endl; - - // Don't reset the waiting state. should happen by next method which responds to the message. - // It could be a SLP BYE for example or "481 No Such Call". - aborting_ = false; - setClosing( false ); - } - - - // If this object was initialized to handle a Bad packet. - if( getMode() == APP_MODE_ERROR_HANDLER ) - { - // Make an exception for SLP packets - 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. - shouldSendAck_ = true; // ASSERT in sendP2PAck would fail otherwise - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, ! isUserStartedApp() ); - endApplication(); - return; - } - } - - - // Handle ACKs before everything else. - if( p2pMessage.getDataSize() == 0 ) // HACK: for Bot2K3 4.1: no testing for flags - { - UnAckedMessage *unAcked = getUnAckedMessage(p2pMessage); - P2PMessageType ackedMessageType = P2P_MSG_UNKNOWN; - if( unAcked == 0 ) - { - if( p2pMessage.isAck() ) // other messages can't relate have the control flags set. - { - kdWarning() << "P2PApplication::gotMessage() - Unable to handle ACK message, " - "original message not found " - "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << - " size=0 state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=return)." << endl; - return; - } - } - else - { - // Remove record, auto-deletes - // Avoids that hasUnAckedMessage() returns the message we just received. - ackedMessageType = unAcked->messageType; - outgoingMessages_.remove(unAcked); - } - - - if( p2pMessage.isAck() ) // 0x02 - { - gotAck( p2pMessage, ackedMessageType ); - } - else if(p2pMessage.isConnectionHandshake()) // 0x100 - { - gotDirectConnectionHandshake( p2pMessage ); - } - else if(p2pMessage.isNegativeAck()) // 0x01 - { - gotErrorAck( p2pMessage ); - } - else if(p2pMessage.isWaitingForReply()) // 0x04 - { - gotTimeoutAck( p2pMessage ); - } - else if(p2pMessage.isWaitingForAck()) // 0x06 - { - gotTimeoutAck( p2pMessage ); - } - else if(p2pMessage.isError()) // 0x08 - { - gotErrorAck( p2pMessage ); - } - else if(p2pMessage.isAbortedSendingAck()) // 0x40 - { - gotTransferAbortedAck( p2pMessage ); - } - else if(p2pMessage.isAbortedReceivingAck()) // 0x80 - { - gotTransferAbortedAck( p2pMessage ); - } - else - { - kdWarning() << "P2PApplication::gotMessage() - Unable to handle ACK message, " - "unknown flag value encountered " - "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << - " size=0 state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=assumerror)." << endl; - - // Make sure the application does abort somehow. - gotErrorAck( p2pMessage ); - } - - return; - } - - - // Send the ack if needed (also applies to INVITE messages) - shouldSendAck_ = p2pMessage.isLastFragment(); - - // Store some message parameters for Acknowledgement later, or to send an error message. - // This should not be inserted in a if(shouldSendAck_) line, this info is used to resolve fragmented messages. - lastIncomingMessage_.dataSize = p2pMessage.getDataSize(); - lastIncomingMessage_.messageID = p2pMessage.getMessageID(); - lastIncomingMessage_.messageType = P2P_MSG_UNKNOWN; - lastIncomingMessage_.sentTime = 0; - lastIncomingMessage_.sessionID = p2pMessage.getSessionID(); - lastIncomingMessage_.totalSize = p2pMessage.getTotalSize(); - lastIncomingMessage_.ackSessionID = p2pMessage.getAckSessionID(); - - - // Session ID is 0? -> the clients negotiate for session. - if(p2pMessage.getSessionID() == 0) - { - if(p2pMessage.isSlpData()) - { - // Parse the fragment - gotNegotiationFragment(p2pMessage); - } - else - { - kdWarning() << "P2PApplication:gotMessage() - P2P message can't be handled, " - "unknown negotiation message type " - "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << - " size=" << p2pMessage.getDataSize() << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - - // Don't know what to do with a negotiation message with flags set. - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - - // Abort the application - showEventMessage( i18n("The transfer failed. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, true ); - endApplicationLater(); - return; - } - } - // Session ID not zero? -> clients exchange data in the session - else - { - // Check for data preparation messages - if( p2pMessage.isDataPreparation() ) - { - gotDataPreparation(p2pMessage); - } - else if( waitingState_ != P2P_WAIT_FOR_FILE_DATA - && p2pMessage.isData() - && p2pMessage.getDataSize() == 4 - && p2pMessage.getTotalSize() == 4 ) - { - // HACK: added for Encarta Instant Answers (has data flag set with preparation message). - kdWarning() << "P2PApplication::gotMessage() - Expecting data-preparation message, " - "got message of 4 bytes with incorrect flags " - "(assuming data preparation," - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << ")!" << endl; - gotDataPreparation(p2pMessage); - } - // Check for data messages - else if(p2pMessage.isData()) - { - gotDataFragment(p2pMessage); - } - 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). - kdWarning() << "P2PApplication::gotMessage() - Expecting data message, " - "got fragmented message with no flags set " - "(assuming file data," - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << ")!" << endl; - gotDataFragment(p2pMessage); - } - else - { - // Unknown p2p message - kdWarning() << "P2PApplication::gotMessage() - P2P message can't be handled, " - "unknown data message type " - "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << - " size=" << p2pMessage.getDataSize() << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - - // Got an P2P binary message we can't handle. (some new kind of flag..?) - shouldSendAck_ = true; // ASSERT in sendP2PAck would fail otherwise - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - - // Abort the application - showEventMessage( i18n("The transfer failed. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, true ); - endApplicationLater(); - return; - } - } - -#ifdef KMESSTEST - // At the end of this method, we should have sent the ACK..! - ASSERT( ! shouldSendAck_ ); -#endif -} - - - -/** - * @brief Called when a SLP message fragment was received. - * - * The fragments is buffered until all parts are received. - * The gotNegotiationMessage() will be called afterwards. - * - * @param p2pMessage The received P2P message with SLP payload. - */ -void P2PApplication::gotNegotiationFragment(const P2PMessage &p2pMessage) -{ - if(! p2pMessage.isLastFragment()) - { - // Not everything received yet, buffer it. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotNegotiationFragment() - Got an SLP fragment, buffering it." << endl; -#endif - - if(buffer_ == 0) - { - buffer_ = new QBuffer(); - buffer_->open(IO_ReadWrite); - } - - buffer_->writeBlock( p2pMessage.getData(), p2pMessage.getDataSize() ); - } - else - { - // Read the message or buffer - QString slpData; - QByteArray bufferData; - - if(buffer_ != 0) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotNegotiationFragment() - Got the last SLP fragment." << endl; -#endif - - // Append the last MSNSLP fraqment and call the method. - buffer_->writeBlock( p2pMessage.getData(), p2pMessage.getDataSize() ); - buffer_->reset(); - - // Read the buffer - bufferData = buffer_->readAll(); - slpData = QString::fromUtf8( bufferData.data(), bufferData.size() ); - - delete buffer_; - buffer_ = 0; - } - else - { - // Read the data directly from the message - slpData = QString::fromUtf8( p2pMessage.getData(), p2pMessage.getDataSize() ); - } - - // Remove the first preamble line, because it's not in MIME format. - // Parse the remaining as MIME fields. - int preambleEnd = slpData.find("\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 - gotNegotiationMessage( slpMessage, preamble ); - } -} - - - -/** - * @brief Called when an complete SLP message is received. - * - * These messages are used to negotiate session parameters. - * The SLP message itself also has a MIME header and MIME body. - * - * This method validates the 'To' field, - * and dispatches the to the correct handler: - * - messages starting with INVITE MSNMSGR are delivered to gotSlpInvite(). - * - messages starting with MSNSLP/ are delivered to gotSlpStatus(). - * - messages starting with BYE MSNMSGR are delivered to gotSlpBye(). - * - other messages are rejected with an P2P error. - * - * The P2P message is not ACKed yet, each handler does this - * when it's able to parse the SLP body. - * - * A preamble could look like one of the following: - * @code -INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -@endcode -@code -MSNSLP/1.0 200 OK -@endcode -@code -BYE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -@endcode - * - * The message itself looks like: - * @code -To: -From: -Via: MSNSLP/1.0/TLP ;branch={068676F2-9B0C-4945-8ABA-4E6F585F710F} -CSeq: 0 -Call-ID: {E9BCFBDB-2768-4BD3-9E4C-A97DC70261E8} -Max-Forwards: 0 -Content-Type: application/x-msnmsgr-sessionreqbody -Content-Length: 348 - -{the message contents} -@endcode - * - * @param slpMessage The payload extracted from the P2P message fragments (the MIME fields and body). - * @param preamble The first status line sent before the MIME fields, which describes the message type. - */ -void P2PApplication::gotNegotiationMessage(const MimeMessage &slpMessage, const QString &preamble) -{ - // Parse the "negotiation message" (P2PMessage with sessionID 0) - // Verify it is indeed directed to us.. - QString msgTo = slpMessage.getValue("To"); - - if(! msgTo.isEmpty()) - { - // Only test if the field is available. If it's not, either something - // is wrong in this application, or the client sent a bad message and - // we should respond with an 500 error instead. - // For some reason this can be received in upper case too if the user entered it that way (likely happens with 3rd party clients). - if( msgTo.lower() != "getHandle().lower() + ">" ) - { - // In the future, the string might be replaced with - // something to support MSN to AOL chats, etc.. - kdWarning() << "P2PApplication::gotNegotiationMessage() - P2P message can't be handled, " - "addressed to someone else " - "(to=" << msgTo << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send404)." << endl; - - showEventMessage( i18n("The invitation was cancelled. Message was not directed to us."), ChatMessage::CONTENT_APP_CANCELED, true ); - - // Send error message back - sendSlpError("404 Not Found"); // Waits for ACK and terminates - return; - } - } - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotNegotiationMessage() - Got an SLP message, preamble=" << preamble << "." << endl; -#endif - - - - // Find out what kind of message this is: - if( preamble.startsWith("INVITE MSNMSGR") ) - { - // Got an invitation! - gotSlpInvite( slpMessage ); - } - else if( preamble.startsWith("MSNSLP/") ) - { - // Error message, or "MSNSLP/1.0 200 OK" message - gotSlpStatus( slpMessage, preamble ); - } - else if( preamble.startsWith("ACK MSNMSGR") ) - { - // Got a SLP ACK message (Windows Live Messenger feature) - gotSlpAck( slpMessage ); - } - else if( preamble.startsWith("BYE MSNMSGR") ) - { - // Got a BYE message - gotSlpBye( slpMessage ); - } - else - { - // Unknown SLP message - kdWarning() << "P2PApplication::gotNegotiationMessage() - P2P message can't be handled, " - "unsuppored SLP negotiation message " - "(preamble=" << preamble << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - - // Got an unknown SLP preamble - sendP2PAck( P2PMessage::MSN_FLAG_ERROR ); - - // Abort the application - showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, true ); - endApplicationLater(); - return; - } -} - - - -/** - * @brief Called when an SLP ACK message was received. - * - * This message should not be confused with a P2P ACK. - * - * Windows Live Messenger uses this message to acknowlegde - * IP/port information for a direct connection. - * - * This method is currently a STUB to keep Windows Live Messenger happy. - * - * One of the observed messages is: - * @code -ACK MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -To: -From: -Via: MSNSLP/1.0/TLP ;branch={67683AAA-A6F2-4B11-895F-EF46B483F3A9} -CSeq: 0 -Call-ID: {00000000-0000-0000-0000-000000000000} -Max-Forwards: 0 -Content-Type: application/x-msnmsgr-transudpswitch -Content-Length: 157 - -IPv4ExternalAddrsAndPorts: 111.222.333.444:3495 -IPv4InternalAddrsAndPorts: 192.168.1.12:3495 -SessionID: 15076776 -SChannelState: 0 -Capabilities-Flags: 1 -@endcode - * - * @code -ACK MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -To: -From: -Via: MSNSLP/1.0/TLP ;branch={BBE6AAC0-10F4-4419-B01C-1F7C2838BC3D} -CSeq: 0 -Call-ID: {00000000-0000-0000-0000-000000000000} -Max-Forwards: 0 -Content-Type: application/x-msnmsgr-transdestaddrupdate -Content-Length: 197\r\n -\r\n -IPv4ExternalAddrsAndPorts: 11.222.3.44:62570\r\n -IPv4InternalAddrsAndPorts: 192.168.1.69:1343\r\n -IPv4External-Connecting-Port-End-Range: 62576\r\n -SessionID: 15751111\r\n -SChannelState: 0 -Capabilities-Flags: 1 -@endcode - * - * @param slpMessage The parsed SLP message. - */ -void P2PApplication::gotSlpAck(const MimeMessage &slpMessage ) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpAck() - Got SLP ACK message, usage is unknown. Message dump follows.\n" - << slpMessage.getFields() << "\n" - << slpMessage.getBody() << endl; -#else - Q_UNUSED( slpMessage ); -#endif - - bool emptySession = ( nextMessageID_ == 0 || getMode() == APP_MODE_ERROR_HANDLER ); - - // This is some internal message of WLM8. - // Accept it for now. - if(shouldSendAck_) - { - sendP2PAck(); - } - - // Also terminate this instance if it was just created for this SLP ACK messasge. - if( emptySession ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpAck() - Directly terminating temporary P2PApplication instance for SLP ACK message." << endl; -#endif - endApplication(); - } -} - - - -/** - * @brief Called when an SLP BYE message was received. - * - * It sends the ACK back, and calls endApplication() to terminate the session. - * A contact may sent a BYE message to abort the transfer. - * In this case, contactAborted() will be called instead. - * - * The SLP BYE message looks like: - * @code -BYE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -To: -From: -Via: MSNSLP/1.0/TLP ;branch={A1DBCADF-6DA2-43FE-BE27-0AEE26816D91} -CSeq: 0 -Call-ID: {E9BCFBDB-2768-4BD3-9E4C-A97DC70261E8} -Max-Forwards: 0 -Content-Type: application/x-msnmsgr-sessionclosebody -Content-Length: 40 - -SessionID: 114164 -SChannelState: 0 -@endcode - * - * @param slpMessage The parsed SLP message. - */ -void P2PApplication::gotSlpBye( const MimeMessage &slpMessage ) -{ - Q_UNUSED( slpMessage ); // Avoid compiler warning - - // If the BYE was received early, it means the session was aborted prematurely. - // - // There appears to be a small bug in MSN 7.0. It doesn't sent the final "all data received" ACK, - // but sends the BYE directly. After we ACK it, we get a "BYE sent" message back. - // This issue appears to be fixed in MSN 7.5. - // - // Microsoft Messenger for the Mac (6.0.3) takes this even further with picture transfers. - // It sends the BYE first and the "all data received" ACK afterwards. - // This happens when KMess is already in the P2P_WAIT_END_APPLICATION state (see "action=unsetclosing"). - - // Also terminate without errors if we're waiting for a BYE ACK and instead receive another BYE. This - // 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. - - if(shouldSendAck_) - { - sendP2PAck(); - } - - bool isComplete = fragmentTracker_.isComplete(); // TODO: this only works for incoming data. - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpBye() - Got SLP BYE message, closing application " - "(state=" << waitingState_ << ")." << endl; -#endif - - // Make sure the data is not sent anymore - abortDataSending(); - - - if( waitingState_ != P2P_WAIT_FOR_SLP_BYE - && waitingState_ != P2P_WAIT_FOR_SLP_BYE_ACK - && waitingState_ != P2P_WAIT_FOR_DATA_ACK ) // HACK: added for Messenger for the Mac 6.0.3 and MSN 7.0 - { - // Make a final check if our states have been messed up. Had the following situation once: - // - WLM invites to send a file - // - KMess hosted the server socket. - // - WLM started to send data. - // - transfer was complete, acked, waiting for BYE - // - WLM establishes the connection with the socket. - // - connection is authenticated. - // - sockets are disconnected - // - WLM sends BYE - if( isComplete ) - { - kdWarning() << "P2PApplication::gotSlpBye() - Transfer seams complete buit state suggests otherwise " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)" << endl; - endApplicationLater(); - } - else if( waitingState_ == P2P_WAIT_END_APPLICATION ) - { - // When WLM aborts at a very late stage, it actually processes our final data messages, - // ack's those, handle our BYE, and send it's "aborting BYE" afterwards. - kdWarning() << "P2PApplication::gotSlpBye() - Received BYE to abort when all data is already transferred " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplicationlater)" << endl; - - // Resume timer - endApplicationLater(); - } - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpBye() - BYE message was unexpected; contact aborted " - << "(state=" << waitingState_ << " contact=" << getContactHandle() << ")" << endl; -#endif - - // End with failure, bye sent at a different moment. - contactAborted(); // closes the application - - // TODO: after this, the contact should send a 0x40 or 0x80 ack of the data stream. - // the message flag indicates whether the contact aborted it's own stream, or aborted ours. - } - else - { - // Normal end - endApplicationLater(); - } -} - - - -/** - * @brief Called when a SLP INVITE message was received. - * - * It extracts the header fields, updates the instance fields, and parses the MIME body. - * The invitation message is delivered to one of the following methods: - * - The application/x-msnmsgr-sessionreqbody message is delivered to gotSlpSessionInvitation(). - * - The application/x-msnmsgr-transreqbody message is delivered to gotSlpTransferInvitation(). - * - The application/x-msnmsgr-transrespbody message is delivered to gotSlpTransferResponse(), - * with the secondInvite parameter set to true. - * - Other messages are rejected as "unrecognized content-type". - * - * @param slpMessage The parsed SLP message. - */ -void P2PApplication::gotSlpInvite(const MimeMessage &slpMessage) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpInvite() - Got SLP INVITE message" << endl; -#endif -#ifdef KMESSTEST - ASSERT( waitingState_ == P2P_WAIT_DEFAULT // First invitation - || waitingState_ == P2P_WAIT_FOR_FILE_DATA // Second invitation for file transfers. - || waitingState_ == P2P_WAIT_FOR_PREPARE // WLM8: reverse invitation for picture transfer, holds back it's data-preparation message. - || waitingState_ == P2P_WAIT_FOR_PREPARE_ACK // WLM8: second invitation for picture transfer, we already sent data-preparation ack. - ); -#endif - - // Reset the waiting state if this is the second INVITE for a file transfer - // TODO: test what to do for the new WLM8 feature (sending transfer invites before data preparation). - if(waitingState_ == P2P_WAIT_FOR_FILE_DATA) - { - waitingState_ = P2P_WAIT_DEFAULT; - } - - // Indicate this is an SLP message (sendCancelMessage() uses this) - // This value is reset once a message is sent. - gotSlpMessage_ = true; - - - // Session invitation - // Extract the fields of the message. This is required for userRejected() - MimeMessage slpMimeBody( slpMessage.getBody() ); - - // Set global fields from INVITE message. - QString slpVia = slpMessage.getValue("Via"); - callID_ = slpMessage.getValue("Call-ID"); - invitationCSeq_ = slpMessage.getValue("CSeq").toInt(); - invitationContentType_ = slpMessage.getValue("Content-Type"); - - // Extract branch from the "Via" parameter - QRegExp callRE(";branch=(.+)"); // don't use a guid-pattern here, msn6 seams to accept random strings. - callRE.search(slpVia); - branch_ = callRE.cap(1); - - - // Don't forget the initialize the base class - // The cookie is empty if this is a contact-started session. - if( getCookie().isEmpty() ) - { - startByInvite(generateCookie()); - } - - - // Handle invitation based on the Content-Type field - if( invitationContentType_ == "application/x-msnmsgr-sessionreqbody" ) - { - // Send the ACK message - if(shouldSendAck_) - { - sendP2PAck(); - } - - // Client invites us for a session - // Will set the waitingState_ to P2P_WAIT_USER_ACCEPT later. - gotSlpSessionInvitation( slpMimeBody ); - } - else if( invitationContentType_ == "application/x-msnmsgr-transreqbody" ) - { - // Send the ACK message - if(shouldSendAck_) - { - sendP2PAck(); - } - - // Client requested to transfer the session - // Handle the invitation internally - gotSlpTransferInvitation( slpMimeBody ); - } - else if( invitationContentType_ == "application/x-msnmsgr-transrespbody" ) - { - // Send the ACK message - if(shouldSendAck_) - { - sendP2PAck(); - } - - // Client sent a second invitation to become a direct-connection server because we can't be. - gotSlpTransferResponse( slpMimeBody, true ); - } - else - { - // Send the ACK message - if(shouldSendAck_) - { - sendP2PAck(); - } - - // Client sent an unknown invitation type - kdWarning() << "P2PApplication::gotSlpInvite() - Received unexpected Content-Type " - "(type=" << invitationContentType_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send500)." << endl; - - // Indicate we don't like that content-type: - sendCancelMessage(CANCEL_INVALID_SLP_CONTENT_TYPE); - // Don't QUIT, the error will be ACK-ed. - return; - } -} - - - -/** - * @brief Called when a SLP 200 OK message was received. - * - * This method is invoked from gotSlpStatus(). - * It extracts the Content-Type status code, depending on the value it proceeds with a different action: - * - The payload of the application/x-msnmsgr-sessionreqbody message - * is delivered to userStarted2_ContactAccepts(). - * - The payload of the application/x-msnmsgr-transrespbody message - * is delivered to gotSlpTransferResponse(). - * - Any other message is rejected with a SLP error. - * - * A session confirmation looks like: - * @code -MSNSLP/1.0 200 OK -To: -From: -... -Content-Type: application/x-msnmsgr-sessionreqbody -Content-Length: 22 - -SessionID: 114164 -@endcode - * - * For an example of a transfer confirmation, see gotSlpTransferResponse(). - * - * @param slpMessage The parsed SLP message. - */ -void P2PApplication::gotSlpOk(const MimeMessage &slpMessage) -{ - // With a 200 code, we reset the waiting state for every situation, - // to make the next check work. - waitingState_ = P2P_WAIT_DEFAULT; - - // Parse the data of the message - QString contentType = slpMessage.getValue("Content-Type"); - MimeMessage slpMimeBody( slpMessage.getBody() ); // body consists of more mime fields - - - // The content-type tells us which fields are present - if( contentType == "application/x-msnmsgr-sessionreqbody" ) - { - // Message confirms the SessionID -#ifdef KMESSTEST - ASSERT( slpMimeBody.getValue("SessionID").toULong() == getSessionID() ); -#endif - - // Tell the derived class the invitation was accepted - userStarted2_ContactAccepts(slpMimeBody); - } - else if( (contentType == "application/x-msnmsgr-transrespbody") || - // HACK: allow transreqbody too for broken clients, including KMess 1.4.2: - (contentType == "application/x-msnmsgr-transreqbody" && slpMimeBody.hasField("Nonce") )) - { - // 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 - { - // Unsupported response type. - kdWarning() << "P2PApplication::gotSlpOk() - Received unexpected 200/OK message " - "(type=" << contentType << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send500)!" << endl; - - showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, true ); - - // Send error message back - sendCancelMessage( CANCEL_INVALID_SLP_CONTENT_TYPE ); - return; - } - - - // Determine whether we should be waiting for the data-preparation message. - // If we didn't send anything that changed the state and no transfer has started, - // we're likely waiting for some kind of prepare message - if(waitingState_ == P2P_WAIT_DEFAULT && dataType_ == P2P_TYPE_NEGOTIATION) - { - // Waiting for prepare message -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpOk() - Waiting for contact to send some prepare message..." << endl; -#endif - - waitingState_ = P2P_WAIT_FOR_PREPARE; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - } -} - - -/** - * @brief Called when a SLP session invitation was received. - * - * This method stores the session ID and - * invokes contactStarted1_ContactInvitesUser(). - * That method should parse the 'Context' field to handle the invitation. - * - * An SLP INVITE message for a picture transfer looks like: - * @code -INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -To: -From: -... -Content-Type: application/x-msnmsgr-sessionreqbody -Content-Length: 348 - -EUF-GUID: {A4268EEC-FEC5-49E5-95C3-F126696BDBF6} -SessionID: 114164 -AppID: 12 -Context: PG1zbm9ia.. -@endcode - * - * @param slpMimeBody The SLP message with the fields 'EUF-GUID', 'SessionID', 'AppID' and 'Context'. - */ -void P2PApplication::gotSlpSessionInvitation( const MimeMessage &slpMimeBody ) -{ - // Read requested session id from the message - invitationSessionID_ = slpMimeBody.getValue("SessionID").toULong(); - - // Don't accept invites if we sent one. - if( nextMessageID_ != 0 && isUserStartedApp() ) - { - kdWarning() << "P2PApplication::gotSlpSessionInvitation() - Got an INVITE response for " - "user-started application, rejecting " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send500)." << endl; - - sendCancelMessage( CANCEL_INVALID_SLP_CONTENT_TYPE ); - return; - } - - // Tell the derived class we've got an invitation - waitingState_ = P2P_WAIT_USER_ACCEPT; // also used later to abort with 500 instead of BYE. - contactStarted1_ContactInvitesUser( slpMimeBody ); -} - - - -/** - * @brief Called when a SLP status message was received. - * - * This method extracts the status code, depending on the status code it proceeds with a different action: - * - The 200 OK message invokes gotSlpOk(). - * - The 404 Not Found message invokes contactAborted(). - * - THe 481 No Such Call message invotes contactAborted(). - * - The 500 Internal Error message invokes contactAborted(). - * - The 603 Decline message invokes contactRejected(). - * - Any other message is rejected with a P2P error. - * - * @param slpMessage The parsed SLP message. - * @param preamble The status line sent before the MIME fields, - * which contains the error code (much like HTTP status codes). - */ -void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString &preamble) -{ - // An Error message, or "MSNSLP/1.0 200 OK" message -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpStatus() - Got SLP status message (" << preamble << ")" << endl; -#endif - - // See if this object was initialized to handle a Bad packet. - if(getMode() == APP_MODE_ERROR_HANDLER) - { - // This object was initialized to send an error response for an unknown packet (at SLP level). - showSystemMessage( i18n("The transfer failed. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_SYSTEM_NOTICE, true ); - sendSlpError("500 Internal Error"); // Waits for ACK and terminates - return; - } - - // Should only be received if we started it. - if(! isUserStartedApp()) - { - kdWarning() << "P2PApplication::gotSlpStatus() - P2P message can't be handled, " - "unexpected SLP response containing status code " - "(preamble=" << preamble << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - - sessionID_ = 0; - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - - // Abort the application - showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, true ); - endApplicationLater(); - return; - } - - - // Parse the preamble - QRegExp re("MSNSLP/\\d+\\.\\d+ (\\d+) ([^\r\n]+)"); - re.search(preamble); - int code = re.cap(1).toUInt(); - QString detail = re.cap(2); - - - // Reset the waiting state if we were waiting. - if( waitingState_ == P2P_WAIT_CONTACT_ACCEPT ) - { - waitingState_ = P2P_WAIT_DEFAULT; - } - - // Handle the status codes - switch( code ) - { - // 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 - // because that ID was given in the sendSlpInvitation() method. - - // This the first ACK to be sent with the SessionID set. - if( shouldSendAck_ ) - { - sendP2PAck(); - } - - // Parse in separate function - gotSlpOk( slpMessage ); - break; - - - // We sent a bad address in the to: header - case 404: - if( shouldSendAck_ ) - { - sendP2PAck(); - } - - // Inform the user KMess has an error - kdWarning() << "P2PApplication::gotSlpStatus() - KMess sent a bad address in the 'to:' header " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=contactaborted)." << endl; - contactAborted( i18n("The contact rejected the invitation. An internal error occured.") ); - break; - - - // 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 - if( shouldSendAck_ ) - { - sendP2PAck(); - } - - // Content-Type of this message is "application/x-msnmsgr-session-failure-respbody" - - // Inform the user KMess has an error - kdWarning() << "P2PApplication::gotSlpStatus() - KMess sent an invalid Call-ID " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=contactaborted)." << endl; - contactAborted( i18n("The contact rejected the invitation. An internal error occured.") ); - break; - - - // Something was not supported - case 500: - if(shouldSendAck_) - { - sendP2PAck(); - } - - if( slpMessage.getValue("Content-Type") == "null" ) - { - // The Content-Type was not supported - kdWarning() << "P2PApplication::gotSlpStatus() - Content-Type of our invitation was not understood " - "(type=" << invitationContentType_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=contactaborted)!" << endl; - } - else - { - // Bad header sent in SLP fields, or invitation type was not supported - kdWarning() << "P2PApplication::gotSlpStatus() - Our invitation was not supported " - "or the contact client had an internal error " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=contactaborted)" << endl; - } - - contactAborted( i18n("The contact rejected the invitation. An internal error occured.") ); - break; - - - // The invitation was declined - case 603: - if(shouldSendAck_) - { - sendP2PAck(); - } - - // Contact Declined - contactRejected(); - break; - - // Last option: tell the contact it sent an unknown message - default: - kdWarning() << "P2PApplication::gotSlpStatus() - P2P message can't be handled, " - "unsupported SLP response " - "(preamble=" << preamble << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - - // Got an unknown SLP status code - sendP2PAck( P2PMessage::MSN_FLAG_ERROR ); - - // Scheduelle the application to terminate - showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess doesn't support it."), ChatMessage::CONTENT_APP_CANCELED, true ); - endApplicationLater(); - } -} - - - -/** - * @brief Called when a SLP transfer invitation was received. - * - * This is typically received when the contact initiated the file transfer session. - * The Content-Type of the message application/x-msnmsgr-transreqbody. - * The message contains meta-information about the contact's network configuration. - * - * A typical incoming message looks like: - * @code -INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -To: -From: -... -Content-Type: application/x-msnmsgr-transreqbody -Content-Length: 193 - -Bridges: TRUDPv1 TCPv1 -NetID: -789490475 -Conn-Type: IP-Restrict-NAT -UPnPNat: true -ICF: false -Hashed-Nonce: {754C0129-F286-4882-5793-70BA45D62B6A} -SessionID: 114164 -SChannelState: 0 -@endcode - * - * As of Windows Live Messenger 8.1, the message body looks like: -@code -Bridges: TRUDPv1 TCPv1 SBBridge TURNv1 -NetID: 140808277 -Conn-Type: Port-Restrict-NAT -TCP-Conn-Type: Port-Restrict-NAT -UPnPNat: false -ICF: false -Hashed-Nonce: {78F2E9F6-06B7-9080-1D83-A222F143F681} -SessionID: 2674976 -SChannelState: 0 -Capabilities-Flags: 1 -@endcode - * - * Currently the Hashed-Nonce is ignored, a normal Nonce is sent back. - * - * This method attempts to create a server socket and send the possible connection options back to the contact. - * The response message also contains a Listening field - * and supported transport layers (Bridge field). - * It optionally contains one of the following: - * - a generated nonce, the internal/external IP addresses (IPv4Internal-Addrs and IPv4external-Addrs values), or - * - a null nonce to indicate the file data must be sent over the switchboard connection. - * - * See gotSlpTransferResponse() for an example message. - * - * The other contact can decide to start a server socket instead (sending a second invitation message), - * or transfer the file data over the switchboard. - * - * @param slpMimeBody The SLP message with the fields "Bridges", "NetID", "Conn-Type", "UPnPNat", "ICF". - */ -void P2PApplication::gotSlpTransferInvitation(const MimeMessage &slpMimeBody) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferInvitation() - Invite message is a request to transfer the session." << endl; -#endif - - // For some reason it's also possible to receive SLP transfer invitations from WLM8 - // with an entirely different callid while trying to setup a direct connection. - // Perhaps some packet is stalled in the outgoing message channel? - if( sessionID_ == 0 || getMode() == APP_MODE_ERROR_HANDLER ) - { - kdWarning() << "Received an invitation for a direct connection," - " but no session is set up " - "(maybe an old session, " - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << metaObject()->className() << - " action=send603)."; - - sendSlpError("603 Decline", invitationSessionID_, invitationContentType_, P2P_MSG_TRANSFER_DECLINE); - return; - } - - - // See if there is already a connection attempt pending. - // This really happened with WLM8.1, somehow it sent multiple connection invites - // the the contact, even for the same session ID. - if( applicationList_->hasPendingConnections() ) - { - kdWarning() << "Received an invitation for a direct connection," - " while a connection attempt is already in progress " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << metaObject()->className() << - " action=send603)."; - - sendSlpError("603 Decline", invitationSessionID_, invitationContentType_, P2P_MSG_TRANSFER_DECLINE); - return; - } - - - // See if the connection already exists - if( applicationList_->hasDirectConnection() ) - { - kdWarning() << "P2PApplication::gotSlpTransferInvitation() - Received an invitation " - "to start a direct connection, but a direct connection is already available " - "(authorized=" << applicationList_->hasAuthorizedDirectConnection() << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=closeconnection)." << endl; - - // Drop the previous connection. HACK: added for amsn 0.97. - // aMsn 0.97 does some interesting things: - // - DC's it hosted are directly closed after sending all file data. - // - DC's it connected to are left open forever. P2P messages are still received at it, - // but somehow all responses are sent over the SB back as if amsn doesn't know it has a DC. - applicationList_->getDirectConnection()->closeConnection(); - } - - - // Abort if the file data was just received. - // For some reason WLM8 sometimes sends the invitation directly after the file was sent. - // First cause some invites to fail (don't accept/cancel). - // Then accept one but send an "transfer accept" with invalid IP/port. - // Not sure it can always be reproduced this way though. - if( waitingState_ == P2P_WAIT_FOR_SLP_BYE ) - { - kdWarning() << "P2PApplication::gotSlpTransferInvitation() - Received an invitation for " - "a direct connection, but expecting BYE instead " - "(file transfer just completed, " - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=slpcancel)." << endl; - sendCancelMessage( CANCEL_ABORT ); - return; - } - - - // Quick fix for WLM8: don't allow direct connection invite for picture transfer - if( isUserStartedApp() ) - { - // Receiving invitations for your own sessiononly happens for picture transfer at the moment. - // Supporting this *now* opens a whole new can of worms, so decline it. - // It means KMess needs: - // - some way to delay the data preparation acks - // - the ability to detect if a SLP error was sent for the transfer INVITE only. - // - fixes for new issues with the state tracking. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferInvitation() - Received invitation to for a direct connection, this is currently not supported for user started applications." << endl; -#endif - - // Decline the transfer invitation. - // This doesn't kill the session though. - waitingState_ = P2P_WAIT_DEFAULT; // avoid assertion. - sendSlpError("603 Decline", invitationSessionID_, invitationContentType_, P2P_MSG_TRANSFER_DECLINE); - return; - } - - - // Create the accept message - MimeMessage acceptMessage; - bool startListening = false; - - // Get network details - 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 - - - // Based on the contact's network configuration, - // we choose how we want to send the file. - // - // The client can include a Hashed-Nonce field, - // and we can respond with another Hashed-Nonce field. - // This algorithm is not known, but including a normal Nonce field - // in the accept message seams to work (the client has some fallback). - - // Listen at the internal port - // The connection can be used for both the internal and external port - // because it only accepts one incoming packet, the second one will be rejected. -#if P2PAPPLICATION_AVOID_DC_SERVER - int listeningPort = 0; // for debugging. -#else - int listeningPort = applicationList_->addServerConnection(); -#endif - - if( listeningPort != 0 ) - { - // Get parameters for message - nonce_ = generateGUID(); // used for authentication - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferInvitation() - Generating Nonce value " - << nonce_ << " for incoming connections." << endl; -#endif - - acceptMessage.addField( "Bridge", "TCPv1" ); - acceptMessage.addField( "Listening", "true" ); - acceptMessage.addField( "Nonce", nonce_ ); - - if(localIp != externalIp) - { - acceptMessage.addField("IPv4Internal-Addrs", localIp ); - acceptMessage.addField("IPv4Internal-Port", QString::number(listeningPort) ); - } - - acceptMessage.addField("IPv4External-Addrs", externalIp ); // TODO: include other aliases - acceptMessage.addField("IPv4External-Port", QString::number(listeningPort) ); - - // Inform the user about the file transfer progress. - showTransferMessage( i18n("Awaiting connection at %1, port %2").arg(externalIp).arg(listeningPort) ); - - // Prepare to send the nonce too when connection to other contact is established - connect( applicationList_, SIGNAL( connectionEstablished() ), // when connected, send nonce - this, SLOT ( slotConnectionEstablished() )); - connect( applicationList_, SIGNAL( connectionAuthorized() ), // when authorized, send data - this, SLOT ( slotConnectionAuthorized() )); - connect( applicationList_, SIGNAL( connectionFailed() ), // when failed, revert to switchboard - this, SLOT ( slotConnectionFailed() )); - - startListening = true; // avoids double-checking certain conditions. - } - else - { - // Could not listen at a local port, use switchboard instead. - kdWarning() << "P2PApplication::gotSlpTransferInvitation() - Could not listen at local port, " - "redirecting transfer to the switchboard " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)." << endl; - - // This configuration sends each file over the switchboard: - acceptMessage.addField( "Bridge", "TCPv1" ); - acceptMessage.addField( "Listening", "false" ); - acceptMessage.addField( "Nonce", "{00000000-0000-0000-0000-000000000000}"); - - // Inform the user about the file transfer progress. - showTransferMessage( i18n("Reverting to indirect file transfer (this could be slow).") ); - // TODO: at this point, it's assumend the other client will initiate the transfer. - // perhaps set the waitingState_ to detect when the contact does not return a request? - // Windows Live Messenger is also capable of sending a new INVITE message so it becomes the server instead. - } - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferInvitation() - Sending 200 transfer OK message, " - << "listening=" << (listeningPort != 0) << "." << endl; -#endif - - // Confirm the session - sendSlpOkMessage( acceptMessage ); - - // Wait for the contact to ACK the message.. - if( startListening ) - { - waitingState_ = P2P_WAIT_FOR_CONNECTION; -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferInvitation() - Waiting for a connection to succeed or fail..." << endl; -#endif - } - else - { - // Expecting file data now we've rejected the invite. - // TODO: it's also possible another invite is sent, hoping for a second chance. - waitingState_ = P2P_WAIT_FOR_FILE_DATA; -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferInvitation() - Waiting for contact to send file data..." << endl; -#endif - } - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DATA, true ); -} - - - -/** - * @brief Called when a response to a SLP transfer message was received. - * - * The message body contains the IP address to connect to. - * It can be received the following situations: - * - We sent the transfer invitation with a sendSlpTransferInvitation() call. - * The contact sends the "200 OK" message with the ipaddress/port information. - * - We sent a transfer response back with "Listening: false" field. - * The contact sends a second SLP INVITE to become the server instead. - * - * When the contact starts a server, it sends the following message: - * @code -MSNSLP/1.0 200 OK -To: -From: -... -Content-Type: application/x-msnmsgr-transrespbody -Content-Length: 144 - -Bridge: TCPv1 -Listening: true -Nonce: {9BA191DB-3B68-93DA-91A2-BB9031D5B92F} -IPv4External-Addrs: 111.222.333.444 -IPv4External-Port: 6891 -IPv4Internal-Addrs: 192.168.0.111 -IPv4Internal-Port: 6891 -@endcode - * As of Windows Live Messenger 8.0, a SChannelState: 0 field is added. - * Version 8.1 also adds a Capabilities-Flags: 1, Conn-Type and TCP-Conn-Type field. - * - * When the contact is not able to open a port, it sends the following message: - * @code -MSNSLP/1.0 200 OK -To: -From: -... -Content-Type: application/x-msnmsgr-transrespbody -Content-Length: 83 - -Bridge: TCPv1 -Listening: false -Nonce: {00000000-0000-0000-0000-000000000000} -@endcode - * - * When the contact likes to become the server instead it sends the following message: - * @code -INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 -To: -From: -... -Content-Type: application/x-msnmsgr-transrespbody -Content-Length: 146 - -Bridge: TCPv1 -Listening: true -Hashed-Nonce: {B00B2A8A-B3B6-95EB-322F-379747842156} -IPv4Internal-Addrs: 10.0.0.152 -IPv4Internal-Port: 1182 -@endcode - * - * @param slpMimeBody The SLP message with the fields "Listening", "Nonce", - * and optionally ipaddress and port information. - * @param secondInvite Used to indicate the contact sent a second invitation. - */ -void P2PApplication::gotSlpTransferResponse(const MimeMessage &slpMimeBody, bool secondInvite) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - if( ! secondInvite ) - { - kdDebug() << "P2PApplication::gotSlpTransferResponse() - Parsing 200 OK message." << endl; - } - else - { - kdDebug() << "P2PApplication::gotSlpTransferResponse() - Parsing 2nd transfer INVITE message, " - << "contact offers to become the direct connection server." << endl; - } -#endif - - - // Test for an existing (possibly even authorized) direct connection. - // This could happen with local-lan file transfer, the roundtrip of the switchboard - // response message could take longer then the time to authenticate the connection. - if( applicationList_->hasDirectConnection() ) - { - if( applicationList_->hasAuthorizedDirectConnection() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferResponse() - Connection already authorized " - << "before invitation response was received, starting transfer." << endl; -#endif - initiateTransfer(); - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferResponse() - Connection already established " - << "before invitation response was received, waiting for connection to authorize..." << endl; -#endif - // Slots already connected at this point. - } - - return; - } - - - // Handle some special situations when the contact sent an INVITE message back instead. - // This happens when: - // - gotSlpTransferInvitation() was called become the contact wanted to initialize a direct connection. - // - we sent a "200 OK" message back with "Listening: false" to indicate we can't be the server. - // - this method gets called because the contact sends an INVITE to become the server instead. - if( secondInvite ) - { - // TODO: send SLP 200/OK message back when contact sent a second INVITE message? - - // The 'connectionAuthenticated()' and 'connectionFailed()' slots are connected in gotSlpTransferInvitation() - // The 'connectionEstablished()' signal was not connected because we were supposed to become the server. - connect( applicationList_, SIGNAL( connectionEstablished() ), // when connected, send nonce - this, SLOT ( slotConnectionEstablished() )); - } - - - // The Conn-type field of the message is the least important here, - // the "Listening", "ICF" and "UPnPNat" tell us more about the situation of the contact, - // and the probability to create a successful direct connection in either way. - - // Get fields from message - bool listening = slpMimeBody.getValue("Listening") == "true"; - bool listenInternal = slpMimeBody.hasField("IPv4Internal-Addrs"); - bool listenExternal = slpMimeBody.hasField("IPv4External-Addrs"); - nonce_ = slpMimeBody.getValue("Nonce"); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication:gotSlpTransferResponse() - Storing contact nonce value " - << nonce_ << " to authenticate later." << endl; -#endif - -#if P2PAPPLICATION_AVOID_DC_CLIENT - listening = false; // for debugging. -#endif - - - // If the contact is not listening, we can do the following things: - // - invite the contact to connect to connect to this host instead (not implemented yet, TODO) - // - send the data over the switchboard instead. (always works, but it's slow). - - // If the contact is listening, try to create a direct connection to the contact. - if( listening && (listenExternal || listenInternal) ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferResponse() - Contact is listening, " - << "attempting to connect to the given IP-address." << endl; -#endif - - // Get the IP addresses. - QStringList externalIpAddresses; - QStringList internalIpAddresses; - uint externalPort; - uint internalPort; - - if( listenInternal ) - { - internalIpAddresses = QStringList::split( " ", slpMimeBody.getValue("IPv4Internal-Addrs") ); - internalPort = slpMimeBody.getValue("IPv4Internal-Port").toUInt(); - } - - if( listenExternal ) - { - externalIpAddresses = QStringList::split( " ", slpMimeBody.getValue("IPv4External-Addrs") ); - externalPort = slpMimeBody.getValue("IPv4External-Port").toUInt(); - } - - // See if the clients are likely at the same lan. - bool sameLan = ( listenInternal && externalIpAddresses.contains( CurrentAccount::instance()->getExternalIp() ) ); - - // Avoid sending slotAllConnectionsFailed() if one connection attempt fails immediately. - applicationList_->setAddingConnections( true ); - - // Connect to the internal IP address - if( listenInternal ) - { - // Add connection attempt for each local IP address - for ( QStringList::Iterator it = internalIpAddresses.begin(); it != internalIpAddresses.end(); ++it ) - { - // Ignore when connection was made - if( applicationList_->hasDirectConnection() ) - { - break; - } - - // Show "connecting to " message when connecting - if( applicationList_->addConnection( *it, internalPort ) ) - { - showTransferMessage( i18n("Connecting to %1, port %2").arg( *it ).arg( internalPort ) ); - } - } - } - - // Connect to the external IP address - if( listenExternal ) - { - // Add connection attempt for each external IP address - for ( QStringList::Iterator it = externalIpAddresses.begin(); it != externalIpAddresses.end(); ++it ) - { - // Ignore when connection was made - if( applicationList_->hasDirectConnection() ) - { - break; - } - - // Show "connecting to " message message unless the hosts are _likely_ at the same lan. - // In that case, a previous "Connecting to ..." message should stay visible. - if( applicationList_->addConnection( *it, externalPort ) && ! sameLan ) - { - showTransferMessage( i18n("Connecting to %1, port %2").arg( *it ).arg( externalPort ) ); - } - } - } - - // Reset again. - applicationList_->setAddingConnections( false ); - } - - - // After passing the connections to addConnection() it's possible - // some slots are already fired and the connection was established. - if( applicationList_->hasDirectConnection() ) - { - return; - } - - - // See if there aren't connections established already. - if( applicationList_->hasPendingConnections() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferResponse() - Waiting for connection attempt to succeed..." << endl; -#endif - - // Wait for connection to establish - waitingState_ = P2P_WAIT_FOR_CONNECTION2; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_DATA, true ); - } - else - { - // Nothing is pending, nothing is connected. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotSlpTransferResponse() - No connection possible, " - << "informing ApplicationList." << endl; -#endif - - // If no direct connection attempt will be made. - // Reset the pending invitation connection flag, ApplicationList sends the connectionFailed signal. - // This also signals other applications the connection attempt failed. - applicationList_->setPendingConnectionInvitation(false); - } -} - - - -/** - * @brief Called when a P2P message with timeout-flag was received. - * - * This method aborts the application with contactAborted(). - * - * @param message The received P2P message. - */ -void P2PApplication::gotTimeoutAck(const P2PMessage &message) -{ - // Error in our headers? - if(isWaitingForUser()) - { - // Contact aborted this session because we didn't press "accept/cancel" within 120 secs. - contactAborted( i18n("The transfer failed. Timeout while waiting for user to accept.") ); - } - else - { - // Apparently the contact was waiting for something, likely some packet we had to send. - kdWarning() << "P2PApplication::gotTimeoutAck() - Got an unexpected P2P timeout-error response " - "(flag=" << QString::number( message.getFlags(), 16 ) << - " state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=contactaborted)." << endl; - - if( dataType_ == P2P_TYPE_NEGOTIATION ) - { - contactAborted( i18n("The contact rejected the invitation. An internal error occured.") ); - } - else - { - contactAborted( i18n("The transfer failed. An internal error occured.") ); - } - } -} - - - -/** - * @brief Got a transfer aborted ack. - * - * This message acknowledges the data transfer was aborted. - * The flag type indicates whether the sender aborted, or the receiver aborted the transfer. - * - * @param message The received error message. - */ -void P2PApplication::gotTransferAbortedAck(const P2PMessage &message) -{ - // Got some kind of confirmation when we indicated to abort. - // Accept it by closing directly - // Error in our headers? - - if( ! isClosing() ) - { - kdWarning() << "P2PApplication::gotTransferAbortedAck() - Got an unexpected P2P transfer aborted-response " - "(flag=" << QString::number( message.getFlags(), 16 ) << - " state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - - // Make sure the app still quits. - abortDataSending(); - endApplicationLater(); - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::gotTransferAbortedAck() - Message confirms abort, requesting terination." << endl; -#endif - - // Make sure the app will exist, but leave it half-open to receive the final 0x08 messages - // for all messages which were already being sent whle the BYE was underway. - abortDataSending(); - endApplicationLater(); - } -} - - - -/** - * @brief Returns whether the application can handle the given ACK message. - * - * It checks whether an unacked message exists for the given ACK message. - * - * @return Whether the application can handle the ACK message. - */ -bool P2PApplication::hasUnAckedMessage(const P2PMessage &p2pMessage) -{ - // Simply test using the internal function, don't expose the UnAckedMessage pointer to external classes. - return (getUnAckedMessage(p2pMessage) != 0); -} - - - -/** - * @brief Return whether a given message type is still unacked. - * - * @return Whether the given message is still unacked. - */ -bool P2PApplication::hasUnAckedMessage(const P2PMessageType messageType) -{ - return (getUnAckedMessage(messageType) != 0); -} - - - -/** - * @brief Notify the derived class it can initiate the file transfer. - * - * It either calls userStarted3_UserPrepares() or contactStarted4_ContactConfirmsPreparation(), - * depending who started the application. The timeout timer will also be stopped. - */ -void P2PApplication::initiateTransfer() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::initiateTransfer() - Signalling implementation class " - << "to start the file transfer." << endl; -#endif - - if( waitingState_ == P2P_WAIT_FOR_CONNECTION - || waitingState_ == P2P_WAIT_FOR_CONNECTION2 ) - { - waitingState_ = P2P_WAIT_DEFAULT; - } - - // When we start sending information, it could take a while before - // the contact returns messages which disable the waiting timer. - // Avoid this by disabling it now, before we kill our own transfer. - if( waitingTimer_->isActive() ) - { - waitingTimer_->stop(); - kdWarning() << "P2PApplication::initiateTransfer() - timeout detection timer was still running, stopped " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)." << endl; - } - - - // Call the connect implementation based on who invoked this application. - // The implementations of these methods can call sendData(), and - // the actual transfer will be handled transparently here. - if( isUserStartedApp() ) - { - userStarted3_UserPrepares(); - } - else - { - contactStarted4_ContactConfirmsPreparation(); - } -} - - - -/** - * @brief Send a cancel message. - * - * The application will be terminated later, either directly or after the contact ACKed the error. - * - * The following cancelReason values are supported: - * - CANCEL_INVITATION - * The user declined the invitation. This sends an SLP 603 Decline message. - * - * - CANCEL_ABORT / CANCEL_FAILED - * The user aborted the session. - * If called from contactStarted1_ContactInvitesUser() with CANCEL_FAILED, - * this sends an SLP 500 Internal Error message. - * Otherwise it sends a SLP BYE or P2P error message. - * - * - CANCEL_NOT_INSTALLED - * The requested service/application is not installed. - * This sends an SLP 500 Internal Error message. - * - * - CANCEL_TIMEOUT - * There was a timeout waiting for the contact to accept or send certain P2P data. - * This sends an P2P message with the "waiting flag" set (type 4) and terminates the application direclty. - * This reason is used internally by certain timeout functions. - * - * - CANCEL_INVALID_SLP_CONTENT_TYPE - * Sends an "MSNSLP 500 Internal Error" message back, but with a null Content-Type value set. - * - * The error messages which send an SLP message can only be used from - * contactStarted1_ContactInvitesUser() and userStarted2_ContactAccepts(). - * Once the MSNSLP error message is sent, P2PApplication waits for the - * contact to ACK, and terminates the application afterwards. - * Hence, you don't have to call endApplication() at all. - * - * When an MSNSLP error is sent at a different moment, this will likely result in - * undefined responses from the other client (or the error message could be ignored). - * If KMess is compiled in debug mode, an assertion in sendSlpError() detects this. - * - * The CANCEL_ABORT reason is the only valid response to reject - * a data-preparation message in the userStarted3_UserPrepares() method. - * If KMess is compiled in debug mode, an assertion will be triggered otherwise. - * - * @param cancelReason The reason why the application is cancelled. - */ -void P2PApplication::sendCancelMessage(const ApplicationCancelReason cancelReason) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendCancelMessage() - request to abort " - << "(reason=" << cancelReason << ", state=" << waitingState_ << ")." << endl; -#endif - - // I don't care what the reason is if you had - // to send the data-preparation ACK - if(userShouldAcknowledge_) - { -#ifdef KMESSTEST - ASSERT( cancelReason == CANCEL_ABORT); -#endif - - // Cancelled the data preparation message - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - userShouldAcknowledge_ = false; - shouldSendAck_ = false; - - // TODO: send bye here to? wait for bye? just terminate? - kdWarning() << "P2PApplication::sendCancelMessage() - data-preparation stage failed " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplicationlater)." << endl; - endApplicationLater(); - return; - } - - - switch(cancelReason) - { - // Declined the invitation - case CANCEL_INVITATION: -#ifdef KMESSTEST - ASSERT( ! invitationContentType_.isEmpty() ); - ASSERT( invitationSessionID_ != 0 ); -#endif - - // Use the cancel-reason to send the correct message: - sendSlpError("603 Decline", invitationSessionID_, invitationContentType_); - return; - - - // Timeout waiting for some P2P data - // ...or timeout waiting for contact to accept. - case CANCEL_TIMEOUT: - // Timeout handling occurs via slotCleanup(), not here. - kdWarning() << "P2PApplication::sendCancelMessage() - CANCEL_TIMEOUT is not supported here " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x04,endapplicationlater)" << endl; - sendP2PMessage(0, P2PMessage::MSN_FLAG_WAITING, 0); - shouldSendAck_ = false; - endApplicationLater(); - return; - - - // The application type is not installed - case CANCEL_NOT_INSTALLED: - if( gotSlpMessage_) - { - // Usually this particular error is invoked from Application::contactStarted1_ContactInvitesUser(). - sendSlpError("500 Internal Error", invitationSessionID_, "null"); - } - else - { - kdWarning() << "P2PApplication::sendCancelMessage() - CANCEL_NOT_INSTALLED is not supported here " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=return)" << endl; - } - return; - - - // User or application wants to abort - case CANCEL_ABORT: - case CANCEL_FAILED: - // Make sure sending is aborted. - abortDataSending(); - - // Determine which error message to send back. - if( gotSlpMessage_ ) - { - // A: Special case for SLP messages. - if( waitingState_ == P2P_WAIT_USER_ACCEPT && cancelReason == CANCEL_ABORT ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendCancelMessage() - Cancelling after receiving an SLP INVITE, " - << "sending BYE back." << endl; -#endif -#ifdef KMESSTEST - ASSERT( isUserStartedApp() ); -#endif - // Send bye early, contact should detect this. - sendSlpBye(); - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendCancelMessage() - Aborting after receiving an SLP message, " - << "sending 500 Internal Error back." << endl; -#endif - // Cancelled while in SLP negotiate mode. - // Include the original content-type to tell the other - // client that part of the message was not in error. - sendSlpError("500 Internal Error", invitationSessionID_, invitationContentType_); - } - } - else if( isUserStartedApp() ) - { - // B: User started application -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendCancelMessage() Cancelling an application " - << "we've started ourselves, sending BYE early." << endl; -#endif - // Mark the logs if there is something weird going on. - // It's possible the contact doesn't receive the INVITE anymore - // while KMess can't detect yet it's closed. - // This happens sometimes when KMess sent a file before which was aborted by WLM. - if( hasUnAckedMessage( P2P_MSG_SESSION_INVITATION ) ) - { - kdWarning() << "P2PApplication::sendCancelMesage() - aborting while INVITE ack was not received " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue,sendslpbye)." << endl; - } - - // Send bye early, contact should detect this. - sendSlpBye(); - } - else - { - // C: Contact started application -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendCancelMessage() Cancelling an application " - << "started by the other contact, sending BYE early." << endl; -#endif - // Send bye early, contact should detect this. - sendSlpBye(); - - // TODO: after the message is ACKed, the contact sends a 0x40 "I've sent the bye early" message. - // KMess does not do this here. - } - - return; - - - // Invalid content type received - case CANCEL_INVALID_SLP_CONTENT_TYPE: -#ifdef KMESSTEST - ASSERT( gotSlpMessage_ ); -#endif - // Send an 500 error message without content-type set - sendSlpError("500 Internal Error"); - return; - - - // Last option, unknown cancel message - default: - kdWarning() << "P2PApplication::sendCancelMessage() - unknown cancelReason used " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)." << endl; - - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - } -} - - - -/** - * @brief Send file data in P2P packets. - * - * A timer starts that transmits all data packets automatically. - * It uses the dataSource object to determine the total size of the data to send. - * - * @param dataSource Source of the data to send - * @param dataType Type of the data, used to set the correct flag in the P2P footer code. - */ -void P2PApplication::sendData(QIODevice *dataSource, P2PDataType dataType) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendData() - Begin of data transfer" << endl; -#endif -#ifdef KMESSTEST - ASSERT( sessionID_ != 0 ); - ASSERT( dataSource != 0 ); - ASSERT( nextMessageID_ != 0 ); -#endif - - // Make sure we don't activate a slot without a data source. - if(dataSource == 0) - { - kdWarning() << "P2PApplication::sendData() - Couldn't send data, data source is null " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send500)." << endl; - - showEventMessage( i18n("The transfer failed. Couldn't open data source."), ChatMessage::CONTENT_APP_FAILED, false ); - - // TODO: Official client sends BYE when data preparation failed. - sendCancelMessage(CANCEL_FAILED); // MSNSLP messages terminate the application eventually. - return; - } - - // Set the global data fields - dataSource_ = dataSource; - dataType_ = dataType; - - // Reserve the next message ID. - nextMessageID_++; - - // Set the total size field, this causes sendP2PMessage() - // 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(); - - // 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. - applicationList_->registerDataSendingApplication( this ); -} - - - -/** - * @brief Send the data preparation message. - * - * This is a consists of a P2P message with 0x00000000 as message body. - * The contact should return with a data-preparation ACK, which initiates the file transfer. - * Note that Windows Live Messenger (v8) will start a direct connection setup first - * before it sends the data preparation ACK. - */ -void P2PApplication::sendDataPreparation() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendDataPreparation() - Sending data preparation message." << endl; -#endif -#ifdef KMESSTEST - ASSERT( sessionID_ != 0 ); - ASSERT( waitingState_ == P2P_WAIT_DEFAULT || waitingState_ == P2P_WAIT_FOR_FILE_DATA ); -#endif - - // TODO: Check the various footer codes send for certain transfers. - QByteArray p2pMessage(4); - p2pMessage.fill(0x00); - sendP2PMessage(p2pMessage, 0, 1, P2P_MSG_DATA_PREPARATION); - - // Wait until our preparation message is ACK-ed - waitingState_ = P2P_WAIT_FOR_PREPARE_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - - // TODO: after the data preparation is sent, WLM8 starts a direct connection setup: - // - it does not send an ACK yet - // - it sends the transreq message, - // - when the invitation finished (or the DC is up..??) it sends the data preparation ACK. - // - after that it sends the ACK of the last "SLP 200 OK" message. - // - at this point, the data preparation ACK triggers KMess to send the picture data. - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendDataPreparation() - Waiting for data preparation ACK..." << endl; -#endif -} - - - -/** - * @brief Send the data preparation ACK. - * - * You need to call this method from userStarted3_UserPrepares() - * to accept the data-preparation message. - * - * This method will actually set a flag only, - * which is inspected when userStarted3_UserPrepares() returns. - */ -void P2PApplication::sendDataPreparationAck() -{ - if(userShouldAcknowledge_) - { - // This value is checked again after the - // userStarted3_UserPrepares() method returns. - userShouldAcknowledge_ = false; - } - else - { - kdWarning() << "P2PApplication::sendDataPreparationAck() - Call not expected here! " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)" << endl; - } -} - - - -/** - * @brief Send the direct connection handshake - * - * This message contains the Nonce field, - * used by the other contact to authenticate the direct connection. - * The confirmation message is identical to the handshake message. - */ -void P2PApplication::sendDirectConnectionHandshake() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendDirectConnectionHandshake() - Sending direct connection handshake " - << "(nonce=" << nonce_ << ")." << endl; -#endif -#ifdef KMESSTEST - ASSERT( applicationList_->hasDirectConnection() ); -#endif -#ifdef KMESSTEST - // NOTE: the handshake could happen while the file transfer was in progress, or even completed already. - ASSERT( waitingState_ == P2P_WAIT_FOR_CONNECTION2 // we just established connection, send the first handshake - || waitingState_ == P2P_WAIT_FOR_HANDSHAKE // contact established connection, waiting to receive first handshake - || waitingState_ == P2P_WAIT_FOR_HANDSHAKE_OK // we sent the first handshake, waiting for contact to return second. - ); -#endif - - // Message flag is 0x100 - const int handshakeFlag = P2PMessage::MSN_FLAG_DC_HANDSHAKE; - - // Prepare the header - QByteArray header(48); - header.fill(0x00); - nextMessageID_++; - - // Insert the bytes - P2PMessage::insertBytes(header, 0, 0); // 1: SessionID - P2PMessage::insertBytes(header, nextMessageID_, 4); // 2: MessageID - // offset and total size are 0 - P2PMessage::insertBytes(header, handshakeFlag, 28); // 6: Message type (flags) - - // Insert the nonce at fields 7-9 - P2PMessage::insertNonce(header, nonce_); - - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - // Display binary data as hexadecimal string - const int nonceOffset = 32; - const char hexMap[] = "0123456789ABCDEF"; - QString hex; - for(int i = 0; i < 16; i++) - { - if( i == 4 || i == 6 || i == 8 || i == 10 ) - { - hex += "-"; - } - int upper = (header[nonceOffset + i] & 0xf0) >> 4; - int lower = (header[nonceOffset + i] & 0x0f); - hex += hexMap[upper]; - hex += hexMap[lower]; - } - kdDebug() << "P2PApplication::sendDirectConnectionHandshake() - copied nonce '" << nonce_ << "' to p2p message header as '" << hex << "'." << endl; -#endif - - // Forcefully Send the message over the direct connection - applicationList_->getDirectConnection()->sendMessage( header ); - - // Not updating the waiting state here. - // The handshake process could happen while the data transfer is already in progress -} - - - -/** - * @brief Called when the connection is ready to send more file data. - * @param preferredFragments The preferred number of fragments to send at once. - * - * The sendData() method calls ApplicationList::registerDataSendingApplication() - * to start this notification process. Each time the direct connection is - * ready to send more data, ApplicationList::slotConnectionReadyWrite() is called which - * calls this method. - * - * @returns Returns false if something failed, and this method should not be called again. - */ -bool P2PApplication::sendNextDataParts( int preferredFragments ) -{ - // Abort if the data sending was reset. - // Also fixes race conditions with signals. - if( dataType_ == P2P_TYPE_NEGOTIATION || isClosing() || KMESS_NULL(dataSource_) ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendNextDataParts() - called while aborting " - "(datatype=" << dataType_ << - " isclosing=" << isClosing() << - " aborting=" << aborting_ << // sort-of reserved for aborts from ApplicationList. - " datasource=" << dataSource_ << - " waitingState=" << waitingState_ << - " contact=" << getContactHandle() << ")." << endl; -#endif - - // Request caller not to call us again. - return false; - } - - - // Allow the caller to specify the number of loops, - // e.g. more for a direct connection, less for parallel transfers. - int loops = QMAX( preferredFragments, 1 ); - while( --loops >= 0 && fragmentOffset_ < fragmentTotalSize_ && ! dataSource_->atEnd() ) - { - // Read the data from the file. - char buffer[1202]; // 1202 is the max P2P data size. - int bytesRead = dataSource_->readBlock( buffer, 1202 ); - if( bytesRead < 0 ) - { - kdWarning() << "P2PApplication::sendNextDataParts() - Couldn't send more data, " - "read error at " << fragmentOffset_ << " of " << fragmentTotalSize_ << " bytes " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=slpcancel)." << endl; - sendCancelMessage( CANCEL_FAILED ); - return ( dataSource_ == 0 ); // return true if already aborted by sendCancelMessage(). - } - else if( bytesRead == 0 ) - { - break; - } - - // Wrap in buffer, without copying. - QByteArray data; - data.setRawData( buffer, bytesRead ); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendNextDataParts() - Sending data:" - << " offset=" << fragmentOffset_ - << " buffer=" << bytesRead - << endl; -#endif - - // Determine the progress value now because mesageOffset_ it reset by the last sendP2PMessage() call. - unsigned long nextProgressValue = ( fragmentOffset_ + 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; - 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; - - default: - // Display error message for the first message only. - if( fragmentOffset_ == 0 ) - { - kdWarning() << "P2PApplication::sendNextDataParts() - Unknown data transfer mode " - "(mode=" << dataType_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=tryflag)." << endl; - } - - writeSuccess = sendP2PMessage( data, 0, 1, P2P_MSG_DATA, fragmentMessageID_ ); // The best solution in this situation - } - - // Make sure it's reset before returning. - data.resetRawData( buffer, bytesRead ); - - // 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. - if( ! writeSuccess ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendNextDataParts() - message could not be written entirely, leaving loop early." << endl; -#endif - break; - } - - // Dispatch the progress to the derived class - showTransferProgress( nextProgressValue ); - } - - - // Rounds completed, make final assertions. - // Be verbose if something internally goes wrong. - if( dataSource_->atEnd() && fragmentOffset_ < fragmentTotalSize_ ) - { - kdWarning() << "P2PApplication::sendNextDataParts() - data source is at the end, " - "but offset byte count is not " - "(fragmentoffset=" << fragmentOffset_ << - " fragmenttotalsize=" << fragmentTotalSize_ << - " sourcestatus=" << dataSource_->status() << - " sourcesize=" << dataSource_->size() << - " datatype=" << dataType_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=resetstate)!" << endl; - - // Reset for next p2p message. - fragmentTotalSize_ = 0; - fragmentOffset_ = 0; - } - - // See if transfer completed, - // if so tell the application list to stop calling this method. - if( fragmentOffset_ == 0 || fragmentOffset_ >= fragmentTotalSize_ ) - { - dataSource_ = 0; - dataType_ = P2P_TYPE_NEGOTIATION; - applicationList_->unregisterDataSendingApplication( this ); - - // Now wait for the contact to ACK that it received all data. - waitingState_ = P2P_WAIT_FOR_DATA_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpBye() - Waiting for all data received ACK..." << endl; -#endif - - // no return false, will unregister the app twice. - } - - return true; -} - - - -/** - * @brief Send a P2P ACK message. - * - * This is called after each received P2P message. - * The ACK system turns the P2P communication into a stop-and-wait protocol. - * The other client waits until it receives an ACK or error before it continues with the next step. - * - * @param ackType The ACK type (flag field) to use, defaults to MSN_FLAG_ACK. - * @param originalMessageData The meta data of the original message, used to fill some parts of the ACK message. - */ -void P2PApplication::sendP2PAck(int ackType, UnAckedMessage *originalMessageData) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - if(ackType == P2PMessage::MSN_FLAG_ACK) - { - if( nextMessageID_ == 0 && getMode() != APP_MODE_ERROR_HANDLER ) - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK (INVITE-ACK)" << endl; - } - else - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK" << endl; - } - } - else if(ackType == P2PMessage::MSN_FLAG_ERROR) - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK (Error-response)" << endl; - } - else if(ackType == P2PMessage::MSN_FLAG_WAITING) - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK (Timeout-response)" << endl; - } - else if(ackType == P2PMessage::MSN_FLAG_WAITING_FOR_ACK) - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK (ACK-timeout-response)" << endl; - } - else if(ackType == P2PMessage::MSN_FLAG_ABORTED_SENDING) - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK (Aborted-myself-ACK)" << endl; - } - else if(ackType == P2PMessage::MSN_FLAG_ABORTED_RECEIVING) - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK (Aborted-you-ACK)" << endl; - } - else - { - kdDebug() << "P2PApplication::sendP2PAck() - Sending P2P ACK (Unknown-type)" << endl; - } -#endif -#ifdef KMESSTEST - ASSERT( shouldSendAck_ ); // TODO: test for control messages, which do not have to obey this rule. -#endif - - // Default to previous message if no argument is given - if( originalMessageData == 0 ) - { - originalMessageData = &lastIncomingMessage_; - } - - - // Fill the header: - // - // 0 4 8 16 24 28 32 36 40 48 - // |....|....|....|....|....|....|....|....|....|....|....|....| - // |sid |mid |offset |totalsize|size|flag|asid|auid|a-datasz | - // - - QByteArray header(48); - header.fill(0x00); - - // Determine the message ID - unsigned long messageID; - if( nextMessageID_ == 0 ) - { - // We don't have a message ID set yet, we're acknowledging - // the first INVITE message. Generate an ID - - nextMessageID_ = generateID(); - messageID = nextMessageID_; - - // Somehow, the next message we send (200 OK) should contain a messageID - 3: - // We decrement the messageID with 4 because it will be incremented in the next call. - nextMessageID_ -= 4; - } - else - { - nextMessageID_++; - messageID = nextMessageID_; - } - - // Determine the ack settings. - unsigned long ackTotalSize = 0; - unsigned long ackSessionID = 0; - unsigned long ackUniqueID = 0; - unsigned long ackDataSize = 0; - - // New ack field schema seen with Windows Live Messenger: - if( ackType == P2PMessage::MSN_FLAG_ERROR ) - { - // This ack tells the contact it should reset the session (TCP RST). - ackTotalSize = originalMessageData->totalSize; - ackSessionID = originalMessageData->ackSessionID; - } - else if( ackType == P2PMessage::MSN_FLAG_NEGATIVE_ACK ) - { -#ifdef KMESSTEST - ASSERT( ! fragmentTracker_.isEmpty() ); - ASSERT( fragmentTracker_.isInitialized( originalMessageData->messageID ) ); -#endif - // This ack tells the contact we haven't received the data properly (e.g. invalid offsets) - // TODO: guess the ackDataSize is the the last offset which was received. - ackSessionID = originalMessageData->messageID; - ackDataSize = fragmentTracker_.isInitialized( originalMessageData->messageID ) - ? fragmentTracker_.getTransferredBytes() : 0; - } - else if( ackType == P2PMessage::MSN_FLAG_ABORTED_RECEIVING ) - { - // This ack tells the contact we won't ack the data anymore, since it's aborted. - ackSessionID = originalMessageData->messageID; - ackUniqueID = generateID(); - ackDataSize = originalMessageData->totalSize; - } - else if( ackType == P2PMessage::MSN_FLAG_ABORTED_SENDING ) - { -#ifdef KMESSTEST - ASSERT( fragmentMessageID_ != 0 ); - ASSERT( originalMessageData->messageType == P2P_MSG_DATA ); - ASSERT( hasUnAckedMessage( P2P_MSG_DATA) ); -#endif - // this ack tells the contact to terminate it's ack session. - ackSessionID = originalMessageData->messageID; // must reffer to our OWN message. - } - else if( ackType == P2PMessage::MSN_FLAG_WAITING ) - { - // The ackSid seams to be random if it was waiting for an ack. - ackSessionID = originalMessageData->ackSessionID; // we give it a more precise value. - } - else - { -#ifdef KMESSTEST - ASSERT( ackType == P2PMessage::MSN_FLAG_ACK ); -#endif - // This is a normal ack which confirms the arrival. - ackSessionID = originalMessageData->messageID; - ackUniqueID = originalMessageData->ackSessionID; - ackDataSize = originalMessageData->totalSize; - } - - // Insert the bytes - P2PMessage::insertBytes(header, originalMessageData->sessionID, 0); // SessionID - P2PMessage::insertBytes(header, messageID, 4); // BaseIdentifier - // offset of 8 bytes is always 0 (position 8) - P2PMessage::insertBytes(header, ackTotalSize, 16); // Confirm total size set in previous message - // size of 4 bytes is always 0 (position 24) - P2PMessage::insertBytes(header, ackType, 28); // Set the ACK flag. - P2PMessage::insertBytes(header, ackSessionID, 32); // ID referring to a previous message. - P2PMessage::insertBytes(header, ackUniqueID, 36); // ID referring to a specific fragment. - P2PMessage::insertBytes(header, ackDataSize, 40); // reference to the Size of that message. - - // Deliver the message over the correct link (switchboard or direct connection) - applicationList_->sendMessage(this, header); - shouldSendAck_ = false; - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendP2PAck() - ACK Transmitted " - << "(flags=0x" << QString::number(ackType, 16) << ")." << endl; -#endif -} - - - -/** - * @brief Sends a P2P Message. - * - * This method constructs the P2P binary header fields. - * The constructed message is delivered to ApplicationList::sendMessage(). - * - * The following instance fields are updated automatically: - * - nextMessageID_ is generated for every new P2P message. - * - fragmentOffset_ is updated when a splitted message is sent. - * - fragmentTotalSize_ and messageOffse_ are reset when the last message fragment is sent. - * - 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(). - * - * @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. - * @return Whether the message can be sent. If the socket would block, false is returned. - * This only occurs for direct connections connections. - */ -bool P2PApplication::sendP2PMessage(const QByteArray &messageData, int flagField, uint footerCode, P2PMessageType messageType, unsigned long messageID) -{ -#ifdef KMESSTEST - ASSERT( messageData.size() <= 1202 ); -#endif - - // Initialize the header - QByteArray header(48); - header.fill(0x00); - - - // Determine the message ID, if none is given. - if( messageID == 0 ) - { - if( nextMessageID_ == 0) - { - // This is the first P2P message we send, initialize message ID - nextMessageID_ = generateID(); - } - else if(fragmentOffset_ == 0) - { - // Only increments the ID for the first message. - // Don't increment it for the next fragments (if it's a splitted message). - // Better approach: pass the desired messageID to this function. - nextMessageID_++; - } - - messageID = nextMessageID_; - } - - - // Verify we're not configured to send a splitted message. - if( fragmentTotalSize_ > 0 - && flagField != 0 - && flagField != P2PMessage::MSN_FLAG_OBJECT_DATA - && flagField != P2PMessage::MSN_FLAG_FILE_DATA ) - { - kdWarning() << "P2PApplication::sendP2PMessage() - Attempting to send splitted ACK message " - "(flags=0x" << QString::number( flagField, 16 ) << - " state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)!" << endl; - } - - - // Determine the message size: - uint messageSize = messageData.size(); - uint totalSize; - uint offsetField; - - if( fragmentTotalSize_ == 0 ) - { - // Normal message - totalSize = messageData.size(); - offsetField = 0; - } - else - { - // Splited message: total size is set. - totalSize = fragmentTotalSize_; - offsetField = fragmentOffset_; - } - - - // Generate ack session identifier for this message - unsigned long ackSessionID = generateID(); - - // Set session ID to zero when SLP messages are sent. - unsigned long sessionID = sessionID_; - if( flagField == 0 - && messageType != P2P_MSG_DATA_PREPARATION ) - { - sessionID = 0; - } - - // Update the header - P2PMessage::insertBytes(header, sessionID, 0); // 1: Session ID (zero for SLP messages). - P2PMessage::insertBytes(header, messageID, 4); // 2: BaseIdentifier (starts random [4, 4294967295]) - P2PMessage::insertBytes(header, offsetField, 8); // 3: Offset (if more then 1202 bytes to send) - P2PMessage::insertBytes(header, totalSize, 16); // 4: Total size of the message - P2PMessage::insertBytes(header, messageSize, 24); // 5: This message size, size of previous if no data - P2PMessage::insertBytes(header, flagField, 28); // 6: Message type (flags) - P2PMessage::insertBytes(header, ackSessionID, 32); // 7: Used to link ack messages (ACK session ID) -//P2PMessage::insertBytes(header, 0, 36); // 8: Field7 of previous for ACK-messages (unique ID) -//P2PMessage::insertBytes(header, 0, 40); // 9: Field4 of previous for ACK-messages (size) - - - // Deliver the message over the correct link (switchboard or direct connection) - bool writeSuccess = applicationList_->sendMessage( this, header, messageData, footerCode ); - if( ! writeSuccess ) - { - // This only happens when a direct connection transfer is congested. - // The same message will be re-sent later. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendP2PMessage() - Message sending was blocked, should try again later." << endl; -#endif - return false; - } - - - // Update unacked message queue to handle incoming ACKs - if( flagField == 0 || messageType != 0 ) - { - if( offsetField == 0 ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendP2PMessage() - Storing message fields to track the ACK response." << endl; -#endif - // First message, or single message, store new record for ACKs. - QDateTime currentTime; - UnAckedMessage *ackData = new UnAckedMessage; - ackData->sessionID = sessionID_; - ackData->messageID = messageID; - ackData->dataSize = messageSize; - ackData->totalSize = totalSize; - ackData->ackSessionID = ackSessionID; - ackData->messageType = messageType; // used later to handle certain ACKs. - ackData->sentTime = currentTime.toTime_t(); - outgoingMessages_.append(ackData); - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendP2PMessage() - Updating message fields to track the ACK response." << endl; -#endif - // Follow-up part of a splitted/fragmented message. - // Update the uniqueID aka ackSID field to handle new acks. - // TODO: it appears MSN7 uses the same ackSID for some messages, not sure - // whether that is a feature (to capture acks in a short time) or a problem in their random function. - QPtrListIterator it(outgoingMessages_); - while( it.current() != 0 ) - { - if( it.current()->messageID == messageID ) - { - it.current()->ackSessionID = ackSessionID; - break; - } - ++it; - } - } - } - - // Update the offset fields for splitted messages - if(fragmentTotalSize_ != 0) - { - // Update offset - fragmentOffset_ += messageSize; - - // If we transmitted all parts, reset the fields for the next normal message - if(fragmentOffset_ >= fragmentTotalSize_) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendP2PMessage() - All message parts sent, resetting fragmentOffset_ and fragmentTotalSize_." << endl; -#endif - - fragmentOffset_ = 0; - fragmentTotalSize_ = 0; - } - } - - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendP2PMessage() - Message transmitted " - << "(sid=" << sessionID_ - << " mid=" << messageID - << " ackSid=" << ackSessionID - << " flags=0x" << QString::number(flagField, 16) - << " size=" << messageSize - << " type=" << messageType - << ")" << endl; -#endif - - return true; -} - - - -/** - * @brief Send a SLP BYE message to close the session. - * - * This should only be called if we sent the SLP INVITE too, - * otherwise the contact should sent it. - * - * Once the BYE message is sent, it waits for the last ACK to arrive. - * The session is terminated afterwards. If the last ACK doesn't arrive - * before a timeout occurs, the application is terminated as well to avoid. - * - * See gotSlpBye() for an example of a SLP BYE message. - */ -void P2PApplication::sendSlpBye() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpBye() - Sending SLP BYE message." << endl; -#endif -#ifdef KMESSTEST - ASSERT( sessionID_ != 0 ); - ASSERT( ! callID_.isEmpty() ); - ASSERT( ! branch_.isEmpty() ); -#endif - - // Handle - 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"; - uint contentLength = content.length(); - - // Create the message - QString slpMessage; - slpMessage = "BYE MSNMSGR:" + getContactHandle() + " MSNSLP/1.0\r\n" - "To: \r\n" - "From: \r\n" - "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" // from our INVITE - "CSeq: 0\r\n" - "Call-ID: " + callID_ + "\r\n" // from our INVITE - "Max-Forwards: 0\r\n" - "Content-Type: " + contentType + "\r\n" - "Content-Length: " + QString::number(contentLength) + "\r\n" - + (contentLength > 0 ? "\r\n" : "") - + content; - - // Send the message - sendSlpMessage(slpMessage, P2P_MSG_SESSION_BYE); - setClosing(true); - - // Don't run endApplication() yet, there is one ACK we wait for... - waitingState_ = P2P_WAIT_FOR_SLP_BYE_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpBye() - Waiting for BYE ACK..." << endl; -#endif -} - - - -/** - * @brief Send an SLP error response. - * - * This can be done to decline a file tranfer or tell the other client it sent bad SLP data. - * - * The session ID can be 0 to indicate there was an error in the Content-Type. Setting the - * session ID and Content-Type to the values used in the INVITE message indicates - * the invitation is cancelled. - * - * @param statusLine The status line, for example 200 OK, or 603 Decline. - * @param sessionID The identifier of the current session (can be zero). - * @param messageContentType Contact type of the message which is in error (can be empty) - * @param messageType The message type. This is used later when an ACK is received. - */ -void P2PApplication::sendSlpError(const QString &statusLine, - const uint sessionID, const QString &messageContentType, P2PMessageType messageType) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpError() - Sending SLP error response: " << statusLine << endl; -#endif - -#ifdef KMESSTEST - // Test, as other invocations likely result in undefined client behavour - // ( - ASSERT( gotSlpMessage_ ); - ASSERT( waitingState_ == P2P_WAIT_DEFAULT ); - ASSERT( ! callID_.isEmpty() ); - ASSERT( ! branch_.isEmpty() ); -#endif - - QString myHandle = CurrentAccount::instance()->getHandle(); - - // Determine Content-Type and Content-Length fields - QString content; - QString contentType; - uint contentLength; - - if( callID_.isEmpty() || branch_.isEmpty() ) - { -#ifdef KMWSSTEST - ASSERT( ! shouldSendAck_ ); // if the caller already sent an ACK, the send sendP2PAck() call will be ignored by WLM8. -#endif - kdWarning() << "P2PApplication::sendSlpError() - attempting to send SLP error back, " - "but Call-ID or Branch is unknown! " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x08)" << endl; - sendP2PAck(P2PMessage::MSN_FLAG_ERROR); - return; - } - - // It's safe now to send the normal ACK. - // Send it if this was not done by the caller yet. - if( shouldSendAck_ ) - { - sendP2PAck(); - } - - if(sessionID == 0) - { - // Used to indicate a general error - content = QString::null; - contentType = "null"; - contentLength = 0; - } - else - { -#ifdef KMESSTEST - ASSERT(messageContentType != 0 && ! messageContentType.isEmpty()); -#endif - // Used to indicate an error in the Invite, or decline a session - content = "SessionID: " + QString::number(sessionID) + "\r\n\r\n\0"; - contentLength = content.length(); - contentType = messageContentType; - } - - // Create the message - QString slpMessage; - slpMessage = "MSNSLP/1.0 " + statusLine + "\r\n" - "To: \r\n" - "From: \r\n" - "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" // Indicates which INVITE was in error. - "CSeq: 0\r\n" - "Call-ID: " + callID_ + "\r\n" - "Max-Forwards: 0\r\n" - "Content-Type: " + contentType + "\r\n" - "Content-Length: " + QString::number(contentLength) + "\r\n" - + (contentLength > 0 ? "\r\n" : "") - + content; - - // Send the message - sendSlpMessage(slpMessage, messageType); - setClosing(true); - - // Wait for the message to be ACK-ed. - waitingState_ = P2P_WAIT_FOR_SLP_ERR_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpError() - Waiting for SLP ACK..." << endl; -#endif -} - - - -/** - * @brief Utility function to send an SLP INVITE message. - * - * Derived classes use sendSlpSessionInvitation() and sendSlpTransferInvitation() instead. - * Both functions use this method internally to send the invitation. - * - * This method is constructs the SLP headers for the INVITE message, and sends it using sendSlpMessage(). - * The Branch-ID is generated by this method, and the Call-ID is generated with the first request. - * After sending the invitation, it's waiting for the contact to accept or decline the message. - * - * @param message The SLP body fields, typically 'SessionID', 'EUF-GUID', 'AppId', and 'Context'. - * @param contentType Content-Type of the message body. - * @param messageType The message type. This is used later when an ACK is received. - */ -void P2PApplication::sendSlpInvitation(const MimeMessage &message, const QString &contentType, P2PMessageType messageType) -{ -#ifdef KMESSTEST - ASSERT(! contentType.isEmpty() ); - ASSERT( waitingState_ == P2P_WAIT_DEFAULT ); -#endif - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpInvitation() - Sending INVITE message" << endl; -#endif - - // Mime message conversion - QString mimeBody = message.getFields(); - - // Content handles - QString myHandle = CurrentAccount::instance()->getHandle(); - - // Generate identifiers - if( callID_.isNull() ) - { - // The callID remains the same between multiple invites - // It identifies the session. - callID_ = generateGUID(); - } - - // BranchID identifies this INVITE request - branch_ = generateGUID(); - - // Create the message (space after CSeq is added to emulate msn exactly) - QString slpMessage; - slpMessage = "INVITE MSNMSGR:" + getContactHandle() + " MSNSLP/1.0\r\n" - "To: \r\n" - "From: \r\n" - "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" - "CSeq: 0 \r\n" - "Call-ID: " + callID_ + "\r\n" - "Max-Forwards: 0\r\n" - "Content-Type: " + contentType + "\r\n" // Starts MSNSLP Session. - "Content-Length: " + QString::number(mimeBody.length() + 5) + "\r\n" - "\r\n" - + mimeBody + - "\r\n"; - - // Send the message - fragmentOffset_ = 0; - fragmentTotalSize_ = 0; - - sendSlpMessage(slpMessage, messageType); - - // Keep the used content type in the state variables. - // For contact-started invitations, this is used to store their type. - // In this case, it can be used to store ours. - invitationContentType_ = contentType; - - // Wait for the contact to accept - waitingState_ = P2P_WAIT_FOR_INVITE_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACCEPT, true ); // MSN 6 had a timeout of 30 sec to accept, WLM seams to have no timeout. - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpInvitation() - Waiting for contact to send INVITE ACK, and accept later..." << endl; -#endif -} - - - -/** - * @brief Utility function to send an SLP message. - * - * 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. - * - * @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. - */ -void P2PApplication::sendSlpMessage(const QString &slpMessage, P2PMessageType messageType) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpMessage() - SLP message=" << slpMessage << endl; -#endif - - // Get the raw utf8 encoded bytearray - // This converts the QCString to QByteArray directly. - // Don't try to remove the extra padded '\0' character - // (like MimeMessage::getMessage() does) - // because MSN6/7 actually relies on this. - QByteArray utf8Message = slpMessage.utf8(); - QByteArray messagePart; - - // Make sure the message gets sent in chunks of 1202 bytes. - // Only set fragmentTotalSize_ if there are chunks, for useless debug messages. - uint remainingBytes = utf8Message.size(); - fragmentOffset_ = 0; - fragmentTotalSize_ = ( remainingBytes <= 1202 ? 0 : remainingBytes ); - - do - { - // Let another QByteArray encapsulate a part of the utf8Message - char *dataPointer = utf8Message.data() + fragmentOffset_; - uint dataSize = QMIN(remainingBytes, 1202); - messagePart.setRawData( dataPointer, dataSize ); - - // Send the message with the generic sendP2PMessage() method - // fragmentOffset_ is updated automatically - sendP2PMessage(messagePart, 0, 0, messageType); - remainingBytes -= dataSize; - -#ifdef KMESSTEST - ASSERT( remainingBytes == fragmentTotalSize_ - fragmentOffset_ ); -#endif - - // Release data - messagePart.resetRawData( dataPointer, dataSize ); - } - while(remainingBytes > 0); - - // Reset for normal operations - fragmentOffset_ = 0; - fragmentTotalSize_ = 0; -} - - - -/** - * @brief Send the 200 OK message to accept the invitation. - * - * The message should contain the 'SessionID' field. It's value can - * be retreived with getInvitationSessionID(). - * - * Once the confirmation message has been sent, this class will automatically - * use the correct Session ID for following messages (since it was already read from the SLP INVITE message). - * - * See gotSlpOk() for a message example. - * Note that the 'message' parameter only needs to supply the SLP body fields. - * The SLP header will be added by this method. - * - * @param message The SLP message body. - */ -void P2PApplication::sendSlpOkMessage(const MimeMessage &message) -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpOkMessage() - Sending MSNSLP/1.0 200 OK message." << endl; -#endif -#ifdef KMESSTEST - ASSERT(! branch_.isEmpty() ); - ASSERT(! invitationContentType_.isEmpty() ); - // Waiting state is P2P_WAIT_USER_ACCEPT if contactStarted2_.. is called directly from contactStarted1_.. - // TODO: handle WLM8 invitations sent before data preparation - ASSERT( waitingState_ == P2P_WAIT_DEFAULT || waitingState_ == P2P_WAIT_USER_ACCEPT ); -#endif - - - // 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 myHandle = CurrentAccount::instance()->getHandle(); - - // Send the SLP OK message to tell the other client you'd like to start the transfer. - QString slpMessage; - slpMessage = "MSNSLP/1.0 200 OK\r\n" - "To: \r\n" - "From: \r\n" - "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" - "CSeq: " + QString::number(invitationCSeq_ + 1) + "\r\n" - "Call-ID: " + callID_ + "\r\n" - "Max-Forwards: 0\r\n" - "Content-Type: " + contentType + "\r\n" - "Content-Length: " + QString::number(content.length() + 3) + "\r\n" - "\r\n" - + content + "\r\n"; - - sendSlpMessage(slpMessage, ( gotTransferInvitation ? P2P_MSG_TRANSFER_OK : P2P_MSG_SESSION_OK ) ); - - - // Make sure it's not overwritten when the other contact invites for a DC transfer. - if( sessionID_ == 0 ) - { - // Now that we've confirmed the session, use the sessionID - // in the next messages: - sessionID_ = invitationSessionID_; - } - - - - if(gotTransferInvitation) - { - // Wait until our transfer OK message is ACK-ed - waitingState_ = P2P_WAIT_FOR_TRANSFER_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpOkMessage() - Waiting for contact to ACK the 200 transfer OK message..." << endl; -#endif - } - else - { - // Wait until our normal OK message is ACK-ed - waitingState_ = P2P_WAIT_FOR_SLP_OK_ACK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpOkMessage() - Waiting for contact to ACK the 200 OK message..." << endl; -#endif - } -} - - - -/** - * @brief Send the invitation for a normal session. - * - * It sends a normal application/x-msnmsgr-sessionreqbody message using sendSlpInvitation(). - * The session ID is stored to handle incoming messages. It can be requested with getSessionID(). - * - * Internally the remaining message fields are appended using: - * - sendSlpInvitation() - * - sendSlpMessage() - * - sendP2PMessage() - * - * See gotSlpSessionInvitation() for an example message. - * - * @param sessionID The generated session ID, can be generated with generateID(). - * @param eufGuid The EUF-GUID value identifying the application type, from getAppId(). - * @param appId The numeric app-Id value, which also identifies the application type. - * @param context The context field. - */ -void P2PApplication::sendSlpSessionInvitation(uint sessionID, const QString &eufGuid, const int appId, const QString &context) -{ - // Create the message - MimeMessage invitation; - invitation.addField( "EUF-GUID", eufGuid ); - invitation.addField( "SessionID", QString::number(sessionID) ); - invitation.addField( "AppID", QString::number(appId) ); - invitation.addField( "Context", context ); - - // Send the invitation - sendSlpInvitation( invitation, "application/x-msnmsgr-sessionreqbody", P2P_MSG_SESSION_INVITATION); - - // If the client accepts our invitation, we - // use the session ID in the next ACK message. - sessionID_ = sessionID; -} - - - -/** - * @brief Send the invitation for a direct connection. - * - * This sends a application/x-msnmsgr-transreqbody message using sendSlpInvitation(). - * The contact responds with the ipaddresses/ports we can connect to. - * - * When the direct connection attempt completed, initiateTransfer() will be called. - * It's possible the direct connection attempt failed, the clients will - * exchange file data over the switchboard instead. - * - * See gotSlpTransferInvitation() for message examples. - */ -void P2PApplication::sendSlpTransferInvitation() -{ - // Check if there is already an connection - if( applicationList_->hasAuthorizedDirectConnection() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpSessionInvitation() - Connection is already setup, " - << "re-using the current connection." << endl; -#endif - initiateTransfer(); - return; - } - - // Prepare to transfer when a connection is made by this application, or another application. - connect( applicationList_, SIGNAL( connectionAuthorized() ), // when authorized, send data - this, SLOT ( slotConnectionAuthorized() )); - connect( applicationList_, SIGNAL( connectionFailed() ), // when failed, revert to switchboard - this, SLOT ( slotConnectionFailed() )); - - // Check if there are pending connections - if( applicationList_->hasPendingConnections() || applicationList_->hasPendingConnectionInvitation() ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::sendSlpSessionInvitation() - Another application is already inviting " - << "for a direct connection, waiting for that attempt to succeed or fail..." << endl; -#endif - - waitingState_ = P2P_WAIT_FOR_CONNECTION2; - showTransferMessage( i18n("Waiting for connection") ); - return; - } - - // Only connect last slot if we're really going to make the connection ourselves. - connect( applicationList_, SIGNAL( connectionEstablished() ), // when connected, send nonce - this, SLOT ( slotConnectionEstablished() )); - - // Invite the contact to create a connection. - // This message tells the other client it can't connect to this end-host. - // Either the data needs to be sent over the switchboard, - // or the other client should initiate a direct connection server. - MimeMessage invitation; - invitation.addField("Bridges", "TCPv1"); - invitation.addField("NetID", QString::number(generateID())); - invitation.addField("Conn-Type", "IP-Restrict-NAT"); - invitation.addField("UPnPNat", "false"); - invitation.addField("ICF", "false"); - - // Send the invitation - sendSlpInvitation( invitation, "application/x-msnmsgr-transreqbody", P2P_MSG_TRANSFER_INVITATION ); - waitingState_ = P2P_WAIT_FOR_INVITE_TR_ACK; - - // Mark invitation as pending. - // This will fire an event when it's manually reset to false. - applicationList_->setPendingConnectionInvitation(true); - - - // When we include a Hashed-Nonce field, the contact also - // adds a Hashed-Nonce to it's 'transrespbody' response message. - // This may resemble http-digest authentication, but is still not researched. - - // Supported Conn-Type values: - // - Firewall - // - Direct-Connect (Same IP, same port) - // - Port-Restrict-NAT (Same IP, different port) - // - IP-Restrict-NAT (Different IP, same port) - // - Symmetric-NAT (Different IP, different port) - // - Unknown-Connect (Different IP, different port) - // The connection type can be discovered with STUN. - - // NetID is zero for Firewall/Direct-Connect, - // otherwise it's a random number. - - // Inform the user about the file transfer progress. - showTransferMessage( i18n("Negotiating options to connect") ); -} - - - -/** - * @brief Cleanup function, is used to handle timeout events. - * - * When a timeout occurs before the contact sent something we expect, - * this function terminates the application automatically. - * - * Depending on the internal "waiting state", an error message will be outputted with kdWarning(). - */ -void P2PApplication::slotCleanup() -{ - // See if the waiting time for new packets is over (like TCP's TIME_WAIT state). - if( waitingState_ == P2P_WAIT_END_APPLICATION ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotCleanup() - timer of endApplicationLater() fired, finally destroying object." << endl; -#endif - - // Directly destroy ...finally. - testUnAckedMessages( true ); - endApplication(); - return; - } - - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotCleanup() - timeout fired, cleaning up " - << "(session=" << sessionID_ << " waitingState=" << waitingState_ << ")." << endl; -#endif -#ifdef KMESSTEST - ASSERT( waitingState_ != P2P_WAIT_DEFAULT ); -#endif - - - // Not waiting for ourselves to connect. - // Not waiting for contact to accept. - // Not waiting for contact to send BYE ack. - if( waitingState_ == P2P_WAIT_FOR_CONNECTION2 - || waitingState_ == P2P_WAIT_CONTACT_ACCEPT - || waitingState_ == P2P_WAIT_FOR_SLP_BYE_ACK ) - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotCleanup() - Not sending timeout message for current waiting state." << endl; -#endif - } - else - { - if( aborting_ ) - { - // Don't send messages when aborting. This could potentially crash KMess, or cause new windows to appear. - // - suppose this is the last aborting application which requests removal. - // - ApplicationList informs the MsnSwitchboardConnection it can remove itself. - // - ChatMaster processes the putMsg() call, and attempts to deliver the message. -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotCleanup() - Not sending error message because application is aborting." << endl; -#endif - - testUnAckedMessages( false ); - } - else - { - // Tell the other client we were waiting for a message to receive! - // TODO: this is still not as it should be, but a start. - uint waitFlag = P2PMessage::MSN_FLAG_WAITING; - switch(waitingState_) - { - /* - if waiting for ack, wlm sends 0x04. - - case P2P_WAIT_FOR_SLP_OK_ACK: - case P2P_WAIT_FOR_PREPARE_ACK: - case P2P_WAIT_FOR_TRANSFER_ACK: - case P2P_WAIT_FOR_DATA_ACK: - //not P2P_WAIT_FOR_SLP_BYE_ACK: - case P2P_WAIT_FOR_SLP_ERR_ACK: - // we guess 0x06 is used as waiting-for-ack error. - waitFlag = P2PMessage::MSN_FLAG_WAITING_FOR_ACK; - break; - */ - - case P2P_WAIT_FOR_FILE_DATA: - // Waiting for file data. Application is shutting down sender right now. - waitFlag = P2PMessage::MSN_FLAG_ABORTED_RECEIVING; // 0x80 - break; - - default: break; - } - - // Send the message - sendP2PMessage(0, waitFlag, 0); // TODO: pass the original message which is unacked!! - - testUnAckedMessages( true ); - } - } - - // Important note: - // Each case calling endApplication() contains a "return;" - // All debug cases use "break;" so the final endApplication() is called. - - // Put a message at the console - switch(waitingState_) - { - case P2P_WAIT_FOR_INVITE_ACK: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting SLP INVITE ack message " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_CONTACT_ACCEPT: - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotCleanup() - Contact didn't accept the invitation, terminating manually." << endl; -#endif - - // NOTE: WLM8 has no timeout abort P2P (file transfer) invitations. - // It keeps the invitation open even if the switchboard closes. - showEventMessage( i18n("The invitation was cancelled. A timeout occured waiting for the contact to accept."), ChatMessage::CONTENT_APP_CANCELED, false ); - sendCancelMessage( CANCEL_ABORT ); // Should call sendSlpBye(). - // Can't send 0x04 timeout message because there is no session yet, and previous message is already ACKed. - // NOTE: it seams Windows Live Messenger 8.0 doesn't send a BYE ACK for this message. - return; - } - - case P2P_WAIT_FOR_CONNECTION: - { - showEventMessage( i18n("The invitation was cancelled. A timeout occured waiting for a connection to succeed or fail."), ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); - endApplication(); - break; - } - - case P2P_WAIT_FOR_CONNECTION2: - { - // Still keep waiting, DirectConnectionBase should trigger a timeout. - kdWarning() << "P2PApplication:slotCleanup() - Time-out waiting to connect to the remote system " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=return)." << endl; - return; - } - - case P2P_WAIT_FOR_SLP_OK_ACK: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for SLP OK ACK " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_FOR_PREPARE: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for data-preparation message " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_FOR_PREPARE_ACK: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for data-preparation ACK " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_FOR_TRANSFER_ACK: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for SLP transfer OK ACK " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_FOR_FILE_DATA: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for file data " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - - // The 0x80 mesage should be sent now. - - // Set "incoming" parameter to display messages like "the file you're sending.." in the future. - showEventMessage( i18n("The invitation was cancelled. A timeout occured waiting for data."), ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); - sendCancelMessage( CANCEL_FAILED ); // Should call sendSlpBye(). - return; - } - - case P2P_WAIT_FOR_DATA_ACK: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for file data received ack " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_FOR_HANDSHAKE: - { - // NOTE: we could start an initiateTransfer() here, but this is clearly a client bug. - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for DC handshake " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_FOR_HANDSHAKE_OK: - { - // NOTE: we could start an initiateTransfer() here, but this is clearly a client bug. - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for DC handshake response " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - break; - } - - case P2P_WAIT_FOR_SLP_BYE: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for BYE message " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - // No message required, already got what we wanted - endApplication(); - return; - } - - case P2P_WAIT_FOR_SLP_BYE_ACK: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for BYE-ACK " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - // No message required, already got what we wanted - endApplication(); - return; - } - - case P2P_WAIT_FOR_SLP_ERR_ACK: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting for SLP Error-ACK " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplication)." << endl; - // No message required, already got what we wanted - endApplication(); - return; - } - - default: - { - kdWarning() << "P2PApplication::slotCleanup() - Timeout waiting " - "(state=" << waitingState_ << - " session=" << sessionID_ << - " class=" << className() << - " contact=" << getContactHandle() << ")" << endl; - } - } - - // Default implementation quits - showEventMessage( i18n("The invitation was cancelled. A timeout occured waiting for data."), ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); - endApplication(); -} - - - -/** - * @brief Called when the direct connection is authorized by one of the P2P applications. - * - * This initiates the transfer by calling initiateTransfer(). - */ -void P2PApplication::slotConnectionAuthorized() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotConnectionAuthorized() - Direct connection authorized, " - "starting transfer (state=" << waitingState_ << ")." << endl; -#endif - - // Avoid posibility that this method is invoked again if - // the direct connection is closed and re-connected later by another application. - disconnect( applicationList_, 0, this, SLOT(slotConnectionAuthorized())); - - // Protect against situations which could break our internal state. - if( ! fragmentTracker_.isEmpty() ) - { - kdWarning() << "P2PApplication::slotConnectionAuthorized() - Direct connection authorized, " - "but data transfer was already started before. Won't notify derived classes " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=return)." << endl; - return; - } - - // No longer wait for packets, got connection. - waitingTimer_->stop(); - - initiateTransfer(); -} - - - -/** - * @brief Called when the direct connection is established. - * - * This sends the direct connection handshake with sendDirectConnectionHandshake(), - * or waits for the contact to send one. - */ -void P2PApplication::slotConnectionEstablished() -{ -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotConnectionEstablished() - Direct connection established." << endl; -#endif - - // Disconnect irrelevant signals. - // Connection can still fail if the nonce is invalid. - disconnect( applicationList_, 0, this, SLOT( slotConnectionEstablished() )); - - // Send the handshake if this is a new connection - bool isClient = ( ! applicationList_->getDirectConnection()->isServer() ); - if( isClient ) - { -#ifdef KMESSTEST - ASSERT( waitingState_ = P2P_WAIT_FOR_CONNECTION2 ); -#endif - - // Send the handshake - sendDirectConnectionHandshake(); - - // Start the timeout timer again. - waitingState_ = P2P_WAIT_FOR_HANDSHAKE_OK; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotConnectionEstablished() - Waiting for direct connection handshake response..." << endl; -#endif - } - else - { -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication::slotConnectionEstablished() - Waiting for contact to send connection handshake..." << endl; -#endif - - waitingState_ = P2P_WAIT_FOR_HANDSHAKE; - waitingTimer_->start( P2PAPPLICATION_TIMEOUT_ACK, true ); - } -} - - - -/** - * @brief Called when a direct connection could not be made. - * - * It initiates the transfer with initiateTransfer(). - */ -void P2PApplication::slotConnectionFailed() -{ - // Make this a warning, so users can figure out stuff when running kmess from the console. - kdWarning() << "P2PApplication::slotConnectionFailed() - A direct connection could not be made, " - "switching file transfer to slow indirect transfer " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)." << endl; - -#ifdef KMESSTEST - ASSERT( ! applicationList_->hasDirectConnection() ); - ASSERT( ! applicationList_->hasPendingConnections() ); -#endif - - // Disconnect all signals as they are not relevant anymore - disconnect( applicationList_, 0, this, SLOT( slotConnectionAuthorized() )); - disconnect( applicationList_, 0, this, SLOT( slotConnectionEstablished() )); - disconnect( applicationList_, 0, this, SLOT( slotConnectionFailed() )); - - // Inform the user about the transfer progress - showTransferMessage( i18n("Reverting to indirect file transfer (this could be slow).") ); - - // start the transfer over the switchboard - waitingTimer_->stop(); - initiateTransfer(); -} - - - -/** - * @brief Test if there are still unacked messages. - * @param sendError Whether to send an error to the client back as well. - */ -void P2PApplication::testUnAckedMessages( bool /*sendError*/ ) -{ - // Check if there are still unacked messages. - if( ! outgoingMessages_.isEmpty() ) - { - UnAckedMessage *unAcked = 0; - uint unackedCount = outgoingMessages_.count(); - - if( unackedCount == 1 ) - { - unAcked = outgoingMessages_.at(0); - - // More simple debug statement for most used case. - kdWarning() << "P2PApplication::testUnackedMessages() - " - "there is still " << unackedCount << " unacked message " - "(type=" << unAcked->messageType << - " ackSid=" << unAcked->ackSessionID << - " totalsize=" << unAcked->totalSize << - " state=" << waitingState_ << - " contact=" << getContactHandle() << - " class=" << className() << - " session=" << sessionID_ << ")" << endl; - } - else - { - kdWarning() << "P2PApplication::testUnackedMessages() - " - "there are still " << unackedCount << " unacked messages " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " class=" << className() << - " session=" << sessionID_ << ")" << endl; - - QPtrListIterator it( outgoingMessages_ ); - while( it.current() != 0 ) - { - unAcked = it.current(); - kdWarning() << "Message " << unAcked->messageID << " is unacked " - "(type=" << unAcked->messageType << - " ackSid=" << unAcked->ackSessionID << - " totalsize=" << unAcked->totalSize << ")." << endl; - - ++it; - } - } - } -} - - - -/** - * @brief Called when the user aborted the application. - * - * Displays a message using getUserAbortMessage() and notifies the contact. - * Unlike the base class, it won't terminate the application since the contact should return an ACK message first. - * - * This method may be overwritten to add additional event handling. - */ -void P2PApplication::userAborted() -{ -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::userAborted() - user requests to abort the session. state=" << waitingState_ << endl; -#endif - - // Make sure a second message is not displayed here. - if( isClosing() ) - { - kdWarning() << "P2PApplication::userAborted: Attempted to close application twice " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=endapplicationlater)" << endl; - - // Make sure the timer is started again. - endApplicationLater(); - return; - } - else if( waitingState_ == P2P_WAIT_FOR_SLP_BYE ) - { - // This is a problem when a client does not send a SLP BYE (as seen with amsn 0.97). -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::userAborted() - Ignoring request while waiting for SLP BYE." << endl; -#endif - - return; - } - - bool isTransferComplete = fragmentTracker_.isComplete(); - if( isTransferComplete ) - { - // Make sure the user won't get a "transfer complete" message - // followed by a "contact aborted" message. - // - // Currently happens when a contact restarts a switchboard (aMsn 0.97 does). - // The old switchboard is removed, and all applications abort. - // TODO: The switchboard closeConnection() call assumes it's always user initiated. - - kdWarning() << "P2PApplication::userAborted() - not displaying message because data transfer is complete. " - "The switchboard was likely closed after receiving all data. " - "(state=" << waitingState_ << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=continue)" << endl; - } - else - { - // Display abort message - showEventMessage( getUserAbortMessage(), ChatMessage::CONTENT_APP_CANCELED, false ); - } - - // Send cancel message. - // Prepares the application to abort. - sendCancelMessage( CANCEL_ABORT ); - - // Set the state to avoid crashes. - aborting_ = true; - setClosing( true ); - - // Don't end the application, instead wait for contact's client to respond too -} - - - -/** - * @brief Called when the user rejected (declined) the application. - * - * Displays a message using getUserRejectMessage() and notifies the contact. - * Unlike the base class, it won't terminate the application since the contact should return an ACK message first. - */ -void P2PApplication::userRejected() -{ -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::userRejected() - user requests to reject the invitation." << endl; -#endif - - // Send abort messages - showEventMessage( getUserRejectMessage(), ChatMessage::CONTENT_APP_CANCELED, false ); - sendCancelMessage( CANCEL_INVITATION ); - - // Set the state to avoid crashes. - aborting_ = true; - setClosing( true ); - - // Don't end the application, instead wait for contact's client to respond too -} - - - -/** - * @brief Utility function to write P2P data to a file, also deals with message offsets. - * - * When an error occurs, the required error message - * will be sent back to the other client. - * - * While Windows Live Messenger does not allow messages to be out of order, - * this method explicitly allows it because WLM itself seams to send messages out of order - * in some cases when it's switching to the direct connection (likely error prone at slow systems). - * - * @param message The P2P message with a file part. - * @param file The file to output the data to. - * @returns True if the data could be written to the file, false on error. - */ -bool P2PApplication::writeP2PDataToFile( const P2PMessage &message, QIODevice *file ) -{ - unsigned long offset = message.getDataOffset(); - - // See if the offset should be changed, - // and if so, update it. - if( offset != file->at() && ! file->at( offset ) ) - { -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "P2PApplication::writeP2PDataToFile() - data is received out of order, updating file offset." << endl; -#endif - - // File position was different and could not be changed.. - unsigned long fileSize = file->size(); - - // See if the offset is too far ahead.. (e.g. don't make us allocate 1GB) - if( offset > ( fileSize + 100000 ) ) // ~100 kB - { - kdWarning() << "P2PApplication::writeP2PDataToFile() - data offset is too far ahead of current end of file " - "(filepos=" << file->at() << - " eofpos=" << file->size() << - " offset=" << offset << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=send0x01)" << endl; - sendP2PAck( P2PMessage::MSN_FLAG_NEGATIVE_ACK ); - sendCancelMessage( CANCEL_FAILED ); // sends slp bye - return false; - } - else if( offset <= fileSize ) - { - // at( offset ) should only fail if the offset is beyond the end of the file. - // If this is not the case, moving within the file failed so abort. - kdWarning() << "P2PApplication::writeP2PDataToFile() - file pointer could not be set to message offset " - "(filepos=" << file->at() << - " eofpos=" << file->size() << - " offset=" << offset << - " contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=sendcancel)" << endl; - sendCancelMessage( CANCEL_FAILED ); - return false; - } - - // Create padding to write at the end - unsigned long remainingSize = offset - fileSize; - QByteArray padding( 4096 ); - padding.fill(0x00); - - // Add padding at the end of the file. - file->at( fileSize ); - while( remainingSize > 0 ) - { - if( file->writeBlock( padding, QMIN( 4096, remainingSize ) ) <= 0 ) - { - break; - } - remainingSize -= 4096; - } - - // Make sure the file position is correct now. - if( offset != file->at() ) - { - sendCancelMessage( CANCEL_FAILED ); - return false; - } - } - - - // Offsets are correct. - // Write the data to the file, - Q_LONG status = file->writeBlock( message.getData(), message.getDataSize() ); - if( status == -1 ) - { - kdWarning() << "P2PApplication::writeP2PDataToFile() - Failed to write the data to the file " - "(contact=" << getContactHandle() << - " session=" << sessionID_ << - " class=" << className() << - " action=sendcancel)" << endl; - - sendCancelMessage(CANCEL_FAILED); - return false; - } - - // Indicate success! - return true; -} - - - -#include "p2papplication.moc" diff --git a/kmess/network/applications/webcamtransferp2p.cpp b/kmess/network/applications/webcamtransferp2p.cpp deleted file mode 100644 index d61d61c..0000000 --- a/kmess/network/applications/webcamtransferp2p.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/*************************************************************************** - webcamtransferp2p.cpp - description - ------------------- - begin : Sun Aug 7 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 "webcamtransferp2p.h" - -#include "../mimemessage.h" - -#include "../../kmessdebug.h" - -#include -#include - - -/** - * Constructor - * - * @param applicationList The shared sources for the contact. - */ -WebcamTransferP2P::WebcamTransferP2P(ApplicationList *applicationList) -: P2PApplication(applicationList) -{ - setApplicationType( ChatMessage::TYPE_APPLICATION_WEBCAM ); -} - - -/* * - * Constructor - * - * @param applicationList The shared sources for the contact. - */ -/* -WebcamTransferP2P::WebcamTransferP2P(const QString &contactHandle, ...) -: P2PApplication(contactHandle) -{ -} -*/ - - -/** - * Destructor - */ -WebcamTransferP2P::~WebcamTransferP2P() -{ -} - - - -/** - * Step one of a contact-started chat: the contact invites the user - * - * @param message The invitation message - */ -void WebcamTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage & /*message*/) -{ -#ifdef KMESSDEBUG_WEBAPPLICATION_P2P - kdDebug() << "WebcamTransferP2P - contactStarted1_ContactInvitesUser" << endl; -#endif - -#if 0 - QString appID = message.getValue("AppID"); - QString eufGuid = message.getValue("EUF-GUID"); - QString context = message.getValue("Context"); - - // Parse the context - context += "===="; // Make sure the base64 encoded string is null padded to avoid problems with QString::fromUcs2(). - QByteArray decodedContext; - KCodecs::base64Decode(context.utf8(), decodedContext); - - // Contents is another GUID - QString contextString = QString::fromUcs2( reinterpret_cast(decodedContext.data()) ); -#endif - - // 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.") - .arg("webcam"), - ChatMessage::CONTENT_SYSTEM_NOTICE, true ); - - // Tell the contact we don't support this. - sendCancelMessage(CANCEL_NOT_INSTALLED); - -// // Everything seams OK, accept this message: -// contactStarted2_UserAccepts(); -} - - - -/** - * Return the application's GUID for "user push" invitations. - */ -QString WebcamTransferP2P::getPushAppId() -{ - return "{4BD96FC0-AB17-4425-A14A-439185962DC8}"; -} - - - -/** - * Return the application's GUID for "contact pull" invitations. - */ -QString WebcamTransferP2P::getPullAppId() -{ - return "{1C9AA97E-9C05-4583-A3BD-908A196F1E92}"; -} - diff --git a/kmess/network/applications/webcamtransferp2p.h b/kmess/network/applications/webcamtransferp2p.h deleted file mode 100644 index 02af47d..0000000 --- a/kmess/network/applications/webcamtransferp2p.h +++ /dev/null @@ -1,58 +0,0 @@ -/*************************************************************************** - webcamtransferp2p.h - description - ------------------- - begin : Wed Dec 27 2006 - copyright : (C) 2006 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 WEBCAMTRANSFERP2P_H -#define WEBCAMTRANSFERP2P_H - -#include "p2papplication.h" - - -/** - * This class handles the invitations for webcam video transfer. - * - * This is currently a STUB class. It rejects the invitation, - * but displays a better error message instead of "some MSN6 invitation is not supported". - * - * @author Diederik van der Boor - * @ingroup Applications - */ -class WebcamTransferP2P : public P2PApplication -{ - Q_OBJECT - - public: - // The constructor without application parameters (sufficient for incoming sessions) - WebcamTransferP2P(ApplicationList *applicationList); - // The constructor with application parameters to start a session -// WebcamTransferP2P(const QString &contactHandle, ...); - - // The destructor - virtual ~WebcamTransferP2P(); - - // Return the application's GUID (for the "user push" invitation) - static QString getPushAppId(); - - // Return the application's GUID (for the "contact pull" invitation) - static QString getPullAppId(); - - private: - - // Step one of a contact-started chat: the contact invites the user - void contactStarted1_ContactInvitesUser(const MimeMessage& message); -}; - -#endif diff --git a/kmess/network/configure.in.in b/kmess/network/configure.in.in deleted file mode 100644 index cd2c4d9..0000000 --- a/kmess/network/configure.in.in +++ /dev/null @@ -1,62 +0,0 @@ - -dnl ---- Additional KMess options ---- -# KPhone support is still not stable, and should be updated to something like libkcall. -# AC_ARG_ENABLE(kphone, [ --enable-kphone enable kphone. [default=no]], enable_kphone=$enableval, enable_kphone=no) - -# -- Check for KPhone ----------------------------------------- - -if test "x$enable_kphone" = "xyes" ; then - AC_MSG_NOTICE(*** Enable KPhone support ***) - AC_DEFINE_UNQUOTED(HAS_KPHONE, 1, [enable kphone?]) - - if test "${KPHONEDIR:-unset}" != "unset" ; then - AC_CHECK_FILE(${KPHONEDIR}/kphone/kphone.h, HAS_KPHONE=1) - fi - - if test "${HAS_KPHONE:-unset}" = "unset" ; then - AC_CHECK_FILE(${PWD}/../kphone/kphone/kphone.h, HAS_KPHONE=1) - if test "${HAS_KPHONE:-unset}" != "unset" ; then - KPHONEDIR="${PWD}/../kphone" - fi - fi - - if test "${HAS_KPHONE:-unset}" = "unset" ; then - echo "Cannot find kphone, please install or set KPHONEDIR and try again." - exit 1 - fi - - KPHONE_G711_OBJ="$KPHONEDIR/kphone/g711.o" - KPHONE_DTMFGENERATOR_OBJ="$KPHONEDIR/kphone/dtmfgenerator.o" - KPHONE_DSPOUTRTP_OBJ="$KPHONEDIR/kphone/dspoutrtp.o" - KPHONE_DSPOUTOSS_OBJ="$KPHONEDIR/kphone/dspoutoss.o" - KPHONE_DSPOUT_OBJ="$KPHONEDIR/kphone/dspout.o" - KPHONE_DSPAUDIO_OBJ="$KPHONEDIR/kphone/dspaudio.o" - KPHONE_DSPAUDIOIN_OBJ="$KPHONEDIR/kphone/dspaudioin.o" - KPHONE_DSPAUDIOOUT_OBJ="$KPHONEDIR/kphone/dspaudioout.o" - KPHONE_CALLAUDIO_OBJ="$KPHONEDIR/kphone/callaudio.o" - KPHONE_CALLAUDIO_MOC_OBJ="$KPHONEDIR/kphone/callaudio.moc.o" - KPHONE_AUDIOBUFFER_OBJ="$KPHONEDIR/kphone/audiobuffer.o" - - KPHONE_DISSIPATE2_LIB="$KPHONEDIR/dissipate2/dissipate2.a" - KPHONE_ILBC_LIB="$KPHONEDIR/ilbc/ilbc.a" - KPHONE_GSM_LIB="$KPHONEDIR/gsm/gsm.a" - - AC_SUBST(KPHONE_G711_OBJ) - AC_SUBST(KPHONE_DTMFGENERATOR_OBJ) - AC_SUBST(KPHONE_DSPOUTRTP_OBJ) - AC_SUBST(KPHONE_DSPOUTOSS_OBJ) - AC_SUBST(KPHONE_DSPOUT_OBJ) - AC_SUBST(KPHONE_DSPAUDIO_OBJ) - AC_SUBST(KPHONE_DSPAUDIOIN_OBJ) - AC_SUBST(KPHONE_DSPAUDIOOUT_OBJ) - AC_SUBST(KPHONE_CALLAUDIO_OBJ) - AC_SUBST(KPHONE_CALLAUDIO_MOC_OBJ) - AC_SUBST(KPHONE_AUDIOBUFFER_OBJ) - - AC_SUBST(KPHONE_DISSIPATE2_LIB) - AC_SUBST(KPHONE_ILBC_LIB) - AC_SUBST(KPHONE_GSM_LIB) - - AC_SUBST(KPHONEDIR) -fi - diff --git a/kmess/network/extra/.cvsignore b/kmess/network/extra/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/network/extra/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/network/extra/Makefile.am b/kmess/network/extra/Makefile.am deleted file mode 100644 index 895fa8f..0000000 --- a/kmess/network/extra/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDES = $(all_includes) -METASOURCES = AUTO -noinst_LIBRARIES = libextra.a -libextra_a_SOURCES = directconnectionbase.cpp directconnectionpool.cpp \ - msndirectconnection.cpp msnftpconnection.cpp p2pfragmenttracker.cpp xmlfunctions.cpp -noinst_HEADERS = directconnectionbase.h directconnectionpool.h \ - msndirectconnection.h msnftpconnection.h p2pfragmenttracker.h xmlfunctions.h diff --git a/kmess/network/extra/Makefile.in b/kmess/network/extra/Makefile.in deleted file mode 100644 index 9a5619f..0000000 --- a/kmess/network/extra/Makefile.in +++ /dev/null @@ -1,789 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libextra_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/network/extra -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libextra_a_AR = $(AR) $(ARFLAGS) -libextra_a_LIBADD = -am_libextra_a_OBJECTS = directconnectionbase.$(OBJEXT) \ - directconnectionpool.$(OBJEXT) msndirectconnection.$(OBJEXT) \ - msnftpconnection.$(OBJEXT) p2pfragmenttracker.$(OBJEXT) \ - xmlfunctions.$(OBJEXT) -#>- libextra_a_OBJECTS = $(am_libextra_a_OBJECTS) -#>+ 7 -libextra_a_final_OBJECTS = libextra_a.all_cpp.o -libextra_a_nofinal_OBJECTS = directconnectionbase.$(OBJEXT) \ - directconnectionpool.$(OBJEXT) msndirectconnection.$(OBJEXT) \ - msnftpconnection.$(OBJEXT) p2pfragmenttracker.$(OBJEXT) \ - xmlfunctions.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libextra_a_OBJECTS = $(libextra_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libextra_a_OBJECTS = $(libextra_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/directconnectionbase.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/directconnectionpool.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msndirectconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msnftpconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/p2pfragmenttracker.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/xmlfunctions.Po -#>+ 12 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/libextra_a.all_cpp.P ./$(DEPDIR)/directconnectionbase.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/directconnectionpool.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msndirectconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnftpconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/p2pfragmenttracker.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/xmlfunctions.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = ./$(DEPDIR)/directconnectionbase.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/directconnectionpool.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msndirectconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnftpconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/p2pfragmenttracker.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/xmlfunctions.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libextra_a_SOURCES) -DIST_SOURCES = $(libextra_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -INCLUDES = $(all_includes) -#>- METASOURCES = AUTO -noinst_LIBRARIES = libextra.a -libextra_a_SOURCES = directconnectionbase.cpp directconnectionpool.cpp \ - msndirectconnection.cpp msnftpconnection.cpp p2pfragmenttracker.cpp xmlfunctions.cpp - -noinst_HEADERS = directconnectionbase.h directconnectionpool.h \ - msndirectconnection.h msnftpconnection.h p2pfragmenttracker.h xmlfunctions.h - -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/extra/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/network/extra/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/extra/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/extra/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/extra/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libextra.a: $(libextra_a_OBJECTS) $(libextra_a_DEPENDENCIES) - -rm -f libextra.a - $(libextra_a_AR) libextra.a $(libextra_a_OBJECTS) $(libextra_a_LIBADD) - $(RANLIB) libextra.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directconnectionbase.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directconnectionpool.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msndirectconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnftpconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p2pfragmenttracker.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlfunctions.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -msnftpconnection.moc: $(srcdir)/msnftpconnection.h - $(MOC) $(srcdir)/msnftpconnection.h -o msnftpconnection.moc - -#>+ 2 -mocs: msnftpconnection.moc - -#>+ 3 -directconnectionbase.moc: $(srcdir)/directconnectionbase.h - $(MOC) $(srcdir)/directconnectionbase.h -o directconnectionbase.moc - -#>+ 2 -mocs: directconnectionbase.moc - -#>+ 3 -msndirectconnection.moc: $(srcdir)/msndirectconnection.h - $(MOC) $(srcdir)/msndirectconnection.h -o msndirectconnection.moc - -#>+ 2 -mocs: msndirectconnection.moc - -#>+ 3 -directconnectionpool.moc: $(srcdir)/directconnectionpool.h - $(MOC) $(srcdir)/directconnectionpool.h -o directconnectionpool.moc - -#>+ 2 -mocs: directconnectionpool.moc - -#>+ 3 -clean-metasources: - -rm -f msnftpconnection.moc directconnectionbase.moc msndirectconnection.moc directconnectionpool.moc - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/extra/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/extra/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/extra/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libextra_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/directconnectionbase.cpp $(srcdir)/directconnectionpool.cpp $(srcdir)/msndirectconnection.cpp $(srcdir)/msnftpconnection.cpp $(srcdir)/p2pfragmenttracker.cpp $(srcdir)/xmlfunctions.cpp msnftpconnection.moc directconnectionbase.moc msndirectconnection.moc directconnectionpool.moc - @echo 'creating libextra_a.all_cpp.cpp ...'; \ - rm -f libextra_a.all_cpp.files libextra_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libextra_a.all_cpp.final; \ - for file in directconnectionbase.cpp directconnectionpool.cpp msndirectconnection.cpp msnftpconnection.cpp p2pfragmenttracker.cpp xmlfunctions.cpp ; do \ - echo "#include \"$$file\"" >> libextra_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libextra_a.all_cpp.final; \ - done; \ - cat libextra_a.all_cpp.final libextra_a.all_cpp.files > libextra_a.all_cpp.cpp; \ - rm -f libextra_a.all_cpp.final libextra_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libextra_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libextra_a_OBJECTS="$(libextra_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libextra_a_OBJECTS="$(libextra_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libextra_a_OBJECTS="$(libextra_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libextra_a_OBJECTS="$(libextra_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 11 -nmcheck: -directconnectionpool.lo: directconnectionpool.moc -msnftpconnection.lo: msnftpconnection.moc -nmcheck-am: nmcheck -msndirectconnection.lo: msndirectconnection.moc -msnftpconnection.o: msnftpconnection.moc -directconnectionbase.lo: directconnectionbase.moc -msndirectconnection.o: msndirectconnection.moc -directconnectionpool.o: directconnectionpool.moc -directconnectionbase.o: directconnectionbase.moc diff --git a/kmess/network/kmessbuffer.cpp b/kmess/network/kmessbuffer.cpp deleted file mode 100644 index 5c01f64..0000000 --- a/kmess/network/kmessbuffer.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/*************************************************************************** - kmessbuffer.cpp - description - ------------------- - begin : Sat July 2 2005 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 "kmessbuffer.h" - -#include // for memcpy - -#include - - -// Constructor -KMessBuffer::KMessBuffer( unsigned int size ) - : QByteArray( size ) -{ -} - -// Destructor -KMessBuffer::~KMessBuffer() -{ -} - - -// Add data -void KMessBuffer::add( const char *data, const uint dataSize ) -{ - // Get old data - int oldSize = size(); - const char *oldBuffer = this->data(); - - // Make room for new data - int newSize = oldSize + dataSize; - char *newBuffer = new char[ newSize ]; - - // Copy the bytes - memcpy(newBuffer, oldBuffer, oldSize); // Copy old - memcpy(newBuffer + oldSize, data, dataSize); // Copy new - - // Assign to this object - assign( newBuffer, newSize ); // does the deletion automatically -} - - -// Retrieve data (peek), warn if the blockSize is larger then the buffer size -QByteArray KMessBuffer::left( const uint blockSize ) const -{ - if ( size() < blockSize ) - { - // FIXME: en ifdef - kdDebug() << "Buffer size " << size() << " < asked size " << blockSize << "!" << endl; - return QByteArray(); - } - - char *leftPart = new char[ blockSize ]; - memcpy(leftPart, data(), blockSize); - - QByteArray qbaWrapper; - qbaWrapper.assign(leftPart, blockSize); // does the deletion automatically - - return qbaWrapper; -} - - - -// Retrieve data, but return the number of bytes actually written. Removes the bytes from the buffer too. -int KMessBuffer::readBlock( char *buffer, const uint blockSize ) -{ - int actualSize = QMIN( blockSize, this->size() ); - memcpy( buffer, data(), actualSize ); - remove( actualSize ); - return actualSize; -} - - - -// Remove read data -void KMessBuffer::remove( uint blockSize ) -{ - if ( size() < blockSize ) - { - kdWarning() << "KMessBuffer::remove() - Asked to remove " << blockSize << " bytes, but the buffer is only " << size() << " bytes long!" << endl; - blockSize = size(); - } - - uint newSize = size() - blockSize; - if( newSize == 0 ) - { - truncate(0); - } - else - { - char *newBuffer = new char[ newSize ]; - memcpy(newBuffer, data() + blockSize, newSize); - - // Assign new buffer - assign( newBuffer, newSize ); // does the deletion automatically - } -} - - -// Find a newline character -int KMessBuffer::findNewline() const -{ - int index = -1; - char *data = this->data(); - - // Avoid the "index 0 out of range" errors - if(size() == 0) - { - return -1; - } - - // Keep searching until a \r is followed by a \n - do - { - // Find the next \r - index = find('\r', index + 1); - if(index == -1) - { - return -1; - } - } - while(data[index + 1] != '\n'); - - return index; -} - - -// Return the length of the buffer -uint KMessBuffer::length() const -{ - return size(); -} - diff --git a/kmess/network/kmessbuffer.h b/kmess/network/kmessbuffer.h deleted file mode 100644 index c92e80c..0000000 --- a/kmess/network/kmessbuffer.h +++ /dev/null @@ -1,53 +0,0 @@ -/*************************************************************************** - kmessbuffer.h - description - ------------------- - begin : Sat July 2 2005 - copyright : (C) 2003 by Mike K. Bennett - (C) 2005 by Diederik van der Boor - email : mkb137b@hotmail.com - 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 KMESSBUFFER_H -#define KMESSBUFFER_H - -#include - - -/** - * A buffer where received data can be stored and analysed. - * - * @author Mike K. Bennett (original work), Diederik van der Boor (made separate class) - * @ingroup NetworkCore - */ -class KMessBuffer : public QByteArray -{ - public: - // Constructor - KMessBuffer( const uint size = 0 ); - // Destructor - virtual ~KMessBuffer(); - // Add data - void add( const char *data, const uint datasize ); - // Retrieve data (peek), warn if the blockSize is larger then the buffer size - QByteArray left( const unsigned int blockSize ) const; - // Retrieve data (read), return the number of bytes actually written. Removes the bytes from the buffer too. - int readBlock( char *buffer, const uint size ); - // Remove read data - void remove( uint blockSize ); - // Find a newline character - int findNewline() const; - // Return the length of the buffer - uint length() const; -}; - -#endif diff --git a/kmess/network/msnchallengehandler.cpp b/kmess/network/msnchallengehandler.cpp deleted file mode 100644 index 228f020..0000000 --- a/kmess/network/msnchallengehandler.cpp +++ /dev/null @@ -1,176 +0,0 @@ - -/* - * This source file is used from Kopete, due the fact they've got - * it working earlier, it takes advantage of the the KDE/Qt API, - * and should work for both big and little endian systems. - * The debug lines have been replaced with KMess-style messages. - */ - - -/* - msnchallengehandler.h - Computes a msn challenge response hash key. - - Copyright (c) 2005 by Gregg Edghill - Kopete (c) 2003-2005 by The Kopete developers - - Portions taken from - http://msnpiki.msnfanatic.com/index.php/MSNP11:Challenges - - ************************************************************************* - * * - * 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 "msnchallengehandler.h" - -#include - -#include -#include - -#include "../kmessdebug.h" - - -MSNChallengeHandler::MSNChallengeHandler(const QString& productKey, const QString& productId) -{ - m_productKey = productKey; - m_productId = productId; -} - - -MSNChallengeHandler::~MSNChallengeHandler() -{ - -} - -QString MSNChallengeHandler::computeHash(const QString& challengeString) -{ - // Step One: THe MD5 Hash. - - // Combine the received challenge string with the product key. - KMD5 md5((challengeString + m_productKey).utf8()); - QCString digest = md5.hexDigest(); - -#ifdef KMESSDEBUG_CHALLENGEHANDLER - kdDebug() << "MsnChallengeHandler: md5: " << digest << endl; -#endif - - QValueVector md5Integers(4); - for(Q_UINT32 i=0; i < md5Integers.count(); i++) - { - md5Integers[i] = hexSwap(digest.mid(i*8, 8)).toUInt(0, 16) & 0x7FFFFFFF; -#ifdef KMESSDEBUG_CHALLENGEHANDLER - kdDebug() << "MsnChallengeHandler: hex " << i << " 0x" << hexSwap(digest.mid(i*8, 8)) << " = " << md5Integers[i] << endl; -#endif - } - - // Step Two: Create the challenge string key - - QString challengeKey = challengeString + m_productId; - // Pad to multiple of 8. - challengeKey = challengeKey.leftJustify(challengeKey.length() + (8 - challengeKey.length() % 8), '0'); - -#ifdef KMESSDEBUG_CHALLENGEHANDLER - kdDebug() << "MsnChallengeHandler: challenge key: " << challengeKey << endl; -#endif - - QValueVector challengeIntegers(challengeKey.length() / 4); - for(Q_UINT32 i=0; i < challengeIntegers.count(); i++) - { - QString sNum = challengeKey.mid(i*4, 4), sNumHex; - - // Go through the number string, determining the hex equivalent of each value - // and add that to our new hex string for this number. - for(uint j=0; j < sNum.length(); j++) { - sNumHex += QString::number((int)sNum[j].latin1(), 16); - } - - // swap because of the byte ordering issue. - sNumHex = hexSwap(sNumHex); - // Assign the converted number. - challengeIntegers[i] = sNumHex.toInt(0, 16); - -#ifdef KMESSDEBUG_CHALLENGEHANDLER - kdDebug() << "MsnChallengeHandler: challenge int " << sNum << (": 0x"+sNumHex) << " = " << challengeIntegers[i] << endl; -#endif - } - - // Step Three: Create the 64-bit hash key. - - // Get the hash key using the specified arrays. - Q_INT64 key = createHashKey(md5Integers, challengeIntegers); - -// #ifdef KMESSDEBUG_CHALLENGEHANDLER -// kdDebug() << "MsnChallengeHandler: key: " << key << endl; -// #endif - - // 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.rightJustify(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.rightJustify(lower.length() + (16 - lower.length() % 16), '0'); - - return (upper + lower); -} - -Q_INT64 MSNChallengeHandler::createHashKey(const QValueVector& md5Integers, - const QValueVector& challengeIntegers) -{ -#ifdef KMESSDEBUG_CHALLENGEHANDLER - kdDebug() << "MsnChallengeHandler: Creating 64-bit key." << endl; -#endif - - Q_INT64 magicNumber = 0x0E79A9C1L, high = 0L, low = 0L; - - for(uint i=0; i < challengeIntegers.count(); i += 2) - { - Q_INT64 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; - - QDataStream buffer(QByteArray(8), IO_ReadWrite); - buffer.setByteOrder(QDataStream::LittleEndian); - buffer << (Q_INT32)high; - buffer << (Q_INT32)low; - - buffer.device()->reset(); - buffer.setByteOrder(QDataStream::BigEndian); - Q_INT64 key; - buffer >> key; - - return key; -} - -QString MSNChallengeHandler::hexSwap(const QString& in) -{ - QString sHex = in, swapped; - while(sHex.length() > 0) - { - swapped = swapped + sHex.mid(sHex.length() - 2, 2); - sHex = sHex.remove(sHex.length() - 2, 2); - } - return swapped; -} - -QString MSNChallengeHandler::productId() -{ - return m_productId; -} - diff --git a/kmess/network/msnconnection.cpp b/kmess/network/msnconnection.cpp deleted file mode 100644 index 2eb701d..0000000 --- a/kmess/network/msnconnection.cpp +++ /dev/null @@ -1,900 +0,0 @@ -/*************************************************************************** - msnconnection.cpp - description - ------------------- - begin : Thu Jan 23 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 "msnconnection.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include "../currentaccount.h" -#include "../kmessdebug.h" -#include "mimemessage.h" - -#ifdef KMESSDEBUG_CONNECTION // Area-specific debug statements - #define KMESSDEBUG_CONNECTION_GENERAL - #define KMESSDEBUG_CONNECTION_SOCKET -#endif - -/** - * @brief The constructor - * - * Initializes the sockets, buffers and ping timer. - * - * @param name The Qt object name. - */ -MsnConnection::MsnConnection( const char *name ) -: QObject(0, name), - currentAccount_(0), - ack_(0), - disconnected_(false), - initialized_(false), - missedPings_(0), - sendPings_(false), - writeLocked_(false) -{ - // Create the socket - socket_ = new KExtendedSocket(); - - // Connect it up and set some defaults - socket_->setSocketFlags( KExtendedSocket::bufferedSocket ); - socket_->enableRead( true ); - socket_->setTimeout( 30 ); - - connect( socket_, SIGNAL( readyRead() ), - this, SLOT ( dataReceived() ) ); - connect( socket_, SIGNAL( connectionFailed(int) ), - this, SLOT ( connectionFailed(int) ) ); - connect( socket_, SIGNAL( closed(int) ), - this, SLOT ( connectionClosed(int) ) ); - connect( socket_, SIGNAL( lookupFinished(int) ), - this, SLOT ( lookupFinished() ) ); - connect( socket_, SIGNAL( connectionSuccess() ), - this, SLOT ( connectionSuccess() ) ); - - pingTimer_.stop(); - // Connect the ping timer to the sendPing slot - connect( &pingTimer_, SIGNAL( timeout() ), - this, SLOT ( sendPing() ) ); - - // Configure the multi packet buffer - multiPacketBuffer_.setAutoDelete(true); - -#ifdef KMESSTEST - ASSERT( socket_ != 0 ); -#endif -} - - - -/** - * @brief The destructor - * - * Closes the connection, and deletes the sockets. - */ -MsnConnection::~MsnConnection() -{ - // Disconnect from the server on exit - if(isConnected()) - { - disconnectFromServer(); - } - - // Delete the socket - delete socket_; -#ifdef KMESSDEBUG_CONNECTION - kdDebug() << "DESTROYED " << name() << endl; -#endif -} - - - -// Detect a socket error -void MsnConnection::connectionClosed(int state) -{ -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdDebug() << name() << "::connectionClosed() - state is " << state << endl; -#endif - - // Manage the disconnection in the subclasses, when needed. -} - - - -/** - * @brief Called when the connection attempt failed. - * - * Closes the connection, and displays - * the "could not connect to the MSN Messenger service." message box. - * - * @param error The system error. - */ -void MsnConnection::connectionFailed(int error) -{ -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdWarning() << "Connection: Received error " << error << " from the socket" - << " (socket status=" << socket_->status() << " systemerror=" << socket_->systemError() << ")." << endl; -#endif - - QString reason = KExtendedSocket::strError( socket_->status(), error ); // pokes sys_errlist[] / strerror() - - KMessageBox::error( 0, i18n( "KMess could not connect to the MSN Messenger service.\n" - "Please, be sure to be connected to the internet.\n" - "System error: %1 (code %2)." ).arg(reason).arg(error) ); - - - closeConnection(); - disconnectFromServer(); -} - - -/** - * @brief Connect to the given server via the socket - * - * The connection attempt is asynchronous. - * When the connection is made, connectionSuccess() is called, - * on error connectionFailed() is called. - * Connection timeouts are not detected here yet. - * - * @param server The server hostname or IP address. - * @param port The port to connect to. - * @return Whether the socket has started connecting. - */ -bool MsnConnection::connectToServer(const QString& server, const int port) -{ -#ifdef KMESSTEST - ASSERT( ( port >= 0 ) && ( port < 32768 ) ); -#endif - -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdDebug() << name() << "::connectToServer() - Connecting to server at " << server << ":" << port << "." << endl; - kdDebug() << name() << "::connectToServer() - Socket status is " << socket_->socketStatus() << "." << endl; -#endif - - // Check that we are disconnected (the socket is null) - if ( ! ( ( socket_->socketStatus() == KExtendedSocket::nothing ) - || ( socket_->socketStatus() == KExtendedSocket::done ) ) ) - { - kdWarning() << name() << "::connectToServer() - Socket is not disconnected. Already connected? Status is " << socket_->socketStatus() << "." << endl; - } - - // This seems to solve some problems with re-connecting - // to the switchboard if there is a timeout. - socket_->reset(); - - // Prepare state vars for the new connection - disconnected_ = false; - socket_->setAddress( server, port ); - - // Start the name lookup... - return ( socket_->startAsyncLookup() == 0 ); -} - - -/** - * @brief Called when data is received from the server. - * - * This method parses the incoming data for the syntax used by the MSN protocol. - * When a command is only partially received, it's buffered until the whole command is received by subsequent dataReceived() calls. - * - * A parsed message to handled to one of the following methods: - * - one-line commands are delivered to parseCommand() - * - PNG commands are handled internally. - * - MSG commands with MIME payloads are delivered to parseMessage() - * - other commands with payloads are delivered to parsePayloadMessage(). - * This uses isPayloadCommand() to detect if a command has a payload. - */ -void MsnConnection::dataReceived() -{ -#ifdef KMESSTEST - ASSERT( socket_ != 0 ); -#endif - - char rawblock[1024]; - QCString block, commandLine; - int index, noBytesRemaining, noBytesRead, payloadLength = 0; - QStringList command; - bool gotPayloadCommand = false; - bool completePayload; - QByteArray payloadData; - - // For multi-packet messages - MultiPacketMessage *multiPacketMessage = 0; - QString messageId; - - - do // while(noBytesRemaining > 0) - { - // Read data from the socket - noBytesRead = socket_->readBlock( rawblock, 1024 ); // Read one block - noBytesRemaining = socket_->bytesAvailable(); // Get number of available bytes - -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdDebug() << name() << "::dataReceived() - " << noBytesRead << " bytes read. " - << noBytesRemaining << " bytes remaining." << endl; -#endif - - // Exit if it's an error code - if( noBytesRead < 0 ) - { - return; - } - - // We've received some data, reset the ping timer - resetPingTimer(); - - // Add the block to the buffer - buffer_.add( rawblock, noBytesRead ); - - - // Keep looping until we can't find any commands - while(true) - { - // Get newline - index = buffer_.findNewline(); // Find a newline - if(index == -1) break; // Stop if it's not received yet - - // Read command and split - commandLine = buffer_.left( index ); // Fetch one line from the buffer - commandLine = commandLine.left( index ); // Not sure why this is needed (should already be this length) - command = QStringList::split(" ", QString::fromUtf8(commandLine.data(), commandLine.size())); // Split into separate fields - - // HACK: Avoids getting server commands which start or end with newlines. - command[0] = command[0].stripWhiteSpace(); - int count = command.count(); - command[ count ] = command[ count ].stripWhiteSpace(); - - gotPayloadCommand = false; - - // If it's a payload message, detect whether the full payload is received, otherwise break. - if( command[0] == "MSG" || isPayloadCommand(command[0]) ) - { - // Message is followed by a payload section. - // verify whether the full payload has arrived. - payloadLength = command[ command.count() - 1 ].toInt(); // Get payload length (last parameter) - completePayload = ( buffer_.length() >= (payloadLength + commandLine.length() + 2)); // Compare length with the size of the buffer - gotPayloadCommand = true; - - if( ! completePayload ) - { - // If the buffer doesn't contain the rest of the message, - // just wait until "dataReceived" is called again, or the top-reading-loop can read more data. -//#ifdef KMESSDEBUG_CONNECTION_SOCKET -// kdDebug() << name() << "::dataReceived() - Will wait for the rest of the message..." << endl; -//#endif - break; // Break processing loop, return to top-reading-loop. - } - } - - - // Handle debugging. -#ifdef KMESSDEBUG_SERVERMESSAGES - kdDebug() << name() << " <<< " << commandLine << endl; -#endif -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_RECEIVED( this, buffer_.left( index + 2 ) ); -#endif - - - // Remove command from buffer. - // Should be done after the "! completePayload" part, keeping messages when - buffer_.remove( index + 2 ); - - // Get payload data - if( gotPayloadCommand && payloadLength > 0 ) - { - // Remove the command from the buffer - // Read message from buffer, - // delete message from buffer - payloadData = buffer_.left(payloadLength); - buffer_.remove( payloadLength ); - } - - - // Handle debugging -#ifdef KMESS_NETWORK_WINDOW - if( payloadLength > 0 ) - { - KMESS_NET_RECEIVED( this, payloadData ); - } -#endif - - - // Parse the messages. - if( gotPayloadCommand ) - { - // It's a payload detected earlier. - // See if it's a Mime message. - if( command[0] != "MSG" ) - { - // Other payload message types are parsed in the subclasses. - parsePayloadMessage(command, payloadData); - } - else - { - // It's a mime message - // Get the message from the buffer and create the mime message - // Note we can't parse strings here, the message could contain binary p2p data. - // UTF-8 characters are translated in the MimeMessage constructor itself. - MimeMessage mimeMessage(payloadData); - - // Detect Multi-packet messages - if( ! mimeMessage.hasField("Message-ID") ) - { - // It's a normal message, parse it. - parseMessage( command, mimeMessage ); - } - else - { - // Handle multi-packet message parts. -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdDebug() << name() << "::dataReceived() - Message is a multi-packet message, buffering." << endl; -#endif - // Get associated multi-packet message buffer, create one if it doesn't exist yet. - messageId = mimeMessage.getValue("Message-ID"); - multiPacketMessage = multiPacketBuffer_.find(messageId); - if( multiPacketMessage == 0 ) - { - multiPacketMessage = new MultiPacketMessage(); - multiPacketBuffer_.insert(messageId, multiPacketMessage); - } - - // Add the message to the handler. - multiPacketMessage->addChunk(mimeMessage); - - // Parse message if complete multi-packet message is received. - if( multiPacketMessage->isComplete() ) - { - parseMessage( command, multiPacketMessage->getMessage() ); - multiPacketBuffer_.remove(messageId); // auto-deletes item. - } - } - } - } - else if( command[0] == "QNG" ) - { - // Response from the internal ping timer. - pingReceived_ = true; - missedPings_ = 0; - } - else - { - // It's a normal command, handle it in the subclass. - // Parse the command. - parseCommand( command ); - } - - -#ifdef KMESSDEBUG_CONNECTION_SOCKET - // Only display this if there's more data in the buffer - if( buffer_.length() ) - { - kdDebug() << name() << "::dataReceived() - Message parsed, buffer length is " << buffer_.length() << endl; - } -#endif - } - } - while(noBytesRemaining > 0); -} - - - -/** - * @brief Disconnect from the server - * - * This function is called after closeConnection() - * It empties all buffers, and resets the sockets. - * - * @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 MsnConnection::disconnectFromServer( bool isTransfer ) -{ - disconnected_ = true; - - // stop any more pings - setSendPings( false ); - - multiPacketBuffer_.clear(); - - // If the socket is connected... - if( isConnected() ) - { - // Send "OUT" - writeData("OUT\r\n"); - } - -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdDebug() << name() << "::disconnectFromServer() - Flush the socket." << endl; -#endif - - socket_->flush(); - -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdDebug() << name() << "::disconnectFromServer() - Close the socket." << endl; -#endif - - socket_->closeNow(); - socket_->reset(); - -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_CLOSE(this); -#endif - - // Always fire the event to update others. - if( ! isTransfer ) - { -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdDebug() << name() << "::disconnectFromServer() - Emit 'disconnected'." << endl; -#endif - emit disconnected(); - } -} - - - -/** - * @brief Return the local IP address of the socket. - * - * This is typically a LAN address, unless the system - * is directly connected to the Internet. - * - * @returns The IP address the socket uses at the system. - */ -QString MsnConnection::getLocalIp() const -{ -#ifdef KMESSDEBUG_SWITCHBOARD_FILETRANSFER - kdDebug() << name() << "::getLocalIp()" << endl; -#endif - QString ip = ""; - const KSocketAddress *address; - address = socket_->localAddress(); - if ( address != 0 ) - { - ip = address->pretty(); - // Local address gives something like "1.2.3.4 port 5" in the english - // version, and "1.2.3.4-Portnammersomething 5" in the german version. - // So, to get the port, replace any "-"'s with " " then get everything - // to the left of the first space. That should work. - ip = ip.replace( QRegExp("-"), " " ); -#ifdef KMESSDEBUG_SWITCHBOARD_FILETRANSFER - kdDebug() << name() << "::getLocalIp() - Raw IP is " << ip << endl; -#endif - if ( ip.contains(" ") ) - { - ip = ip.left( ip.find(" ") ); - } -#ifdef KMESSDEBUG_SWITCHBOARD_FILETRANSFER - kdDebug() << name() << "::getLocalIp() - IP is " << ip << endl; -#endif - } - else - { - kdWarning() << name() << "::getLocalIp() - IP not found. Local address was null?" << endl; - } -#ifdef KMESSDEBUG_SWITCHBOARD_FILETRANSFER - kdDebug() << name() << "::getLocalIp() - Done." << endl; -#endif - return ip; -} - - - -/** - * @brief Return whether or the socket is connected. - * @returns True when connected, false otherwise. - */ -bool MsnConnection::isConnected() const -{ - return ( socket_->socketStatus() == KExtendedSocket::connected ); -} - - - -/** - * @brief Return whether the given command is a payload command. - * - * This method should be re-implemented in the derived class - * to indicate which commands are payload commands. - * - * @returns True when it's a payload command, false otherwise. - */ -bool MsnConnection::isPayloadCommand(const QString &/*command*/) const -{ - // Return false by default, is overwritten in MsnNotificationConnection - return false; -} - - - -/** - * @brief Initialize the object - * - * This method should be called before the class is used. - * - * It sets the currentAccount_ reference. - * Subclasses may re-implement this method to connect - * to signals which are not available at startup in the constructor. - */ -bool MsnConnection::initialize() -{ - if ( initialized_ ) - { - kdDebug() << name() << "::initialize() - Already initialized!" << endl; - return false; - } -#ifdef KMESSTEST - ASSERT( currentAccount_ == 0 ); -#endif - currentAccount_ = CurrentAccount::instance(); - if ( currentAccount_ == 0 ) - { - kdDebug() << name() << "::initialize() - Couldn't get an instance of the current account." << endl; - return false; - } - initialized_ = true; -#ifdef KMESSTEST - ASSERT( currentAccount_ != 0 ); - ASSERT( socket_ != 0 ); -#endif - return initialized_; -} - - -/** - * @brief Start a connection to the server's IP - * - * The connection attempt is asynchronous. - */ -void MsnConnection::lookupFinished() -{ - socket_->startAsyncConnect(); -} - - - -/** - * Internal function to reset the ping timer. - * - * This stops the current timer, - * and restarts a timer to send the next PNG command. - */ -void MsnConnection::resetPingTimer() -{ - if( sendPings_ ) - { - pingTimer_.stop(); - pingTimer_.start( 30000 ); // 30s ping timer - } -} - - - -/** - * @brief Send a command to the server - * - * This function automatically inserts the ACK-number - * between the prefix and text. - * This can be used later to track error responses. - * - * @param prefix The three-letter command, which parseCommand() receives in command[0]. - * @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) -{ -#ifdef KMESSTEST - ASSERT( prefix.length() == 3 ); - if ( ( prefix != "QRY" ) && ( prefix != "MSG" ) ) - { - ASSERT( text.right( 2 ) == "\r\n" ); - } -#endif - - int ack = ack_++; - -//#ifdef KMESSDEBUG_CONNECTION_GENERAL -// kdDebug() << "MsnConnection::sendCommand: Sending " << prefix << " command (" << ack << ")." << endl; -//#endif - - // Send the data to the server - QString command = prefix + " " + QString::number( ack ) + " " + text; - writeData( command ); - - // Return the ack used - return ack; -} - - - -/** - * @brief Send a MIME message command to the server. - * @returns, returning the ack - */ -int MsnConnection::sendMimeMessage(AckType ackType, const MimeMessage &message) -{ - // Determine which type to send. - // Normally a char[4] lookup array would be sufficient, - // but this is easier to use in the string concatenation with Qt - const char *ackTypeStr = "?"; - switch(ackType) - { - case ACK_NONE: ackTypeStr = "U"; break; - case ACK_NAK_ONLY: ackTypeStr = "N"; break; - case ACK_ALWAYS: ackTypeStr = "A"; break; - case ACK_ALWAYS_P2P: ackTypeStr = "D"; break; - } - - // Create the "MSG id type length" header - QByteArray rawMessage = message.getMessage(); - QString command; - - // Build the command - int ack = ack_++; - command.sprintf("MSG %u %s %u\r\n", ack, ackTypeStr, rawMessage.size()); - -//#ifdef KMESSDEBUG_CONNECTION_GENERAL -// kdDebug() << "MsnConnection::sendMimeMessage: Sending MSG command (" << ack << ")." << endl; -//#endif - - // Write the data - writeData(command); - writeBinaryData(rawMessage); - - // Return the ack used - return ack; -} - - - - -// Send a payload command to the server, convenience function -int MsnConnection::sendPayloadMessage(const QString &prefix, const QString &arguments, const QString &payload) -{ - // Avoid converting data that has 0 bytes. - if( payload.isEmpty() ) - { - return sendPayloadMessage(prefix, arguments, QByteArray()); - } - - // Get UTF-8 encoded raw string. - QCString utf8Payload = payload.utf8(); - - // Downgrade to QByteArray. - // If this is not done manually, otherwise a '\0' will be padded. - QByteArray binPayload; - binPayload.duplicate(utf8Payload.data(), utf8Payload.length()); - - // Send payload - return sendPayloadMessage(prefix, arguments, binPayload); -} - - - -// Send a payload command to the server -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); - if( ! arguments.isEmpty() ) - { - command += " " + arguments; - } - command += " " + QString::number(payload.size()) + "\r\n"; - - // Write the data - writeData(command); - - if( payload.size() > 0 ) - { - writeBinaryData(payload); - } - - // Return the ack used - return ack; -} - - - -// Send a "ping" to the server -void MsnConnection::sendPing() -{ - QString message; - - if ( pingReceived_ == false ) - { - missedPings_ ++; - - if ( missedPings_ == 1 ) - { - message += i18n( "1 ping lost" ); - } - else - { - message += i18n( "%1 pings lost" ).arg(missedPings_); - } - - emit statusMessage( message, KMessInterface::TYPE_WARNING ); - } - else - { - emit statusMessage( i18n( "Connected" ), KMessInterface::TYPE_MESSAGE ); - } - - pingReceived_ = false; - - // Assume the connection was lost when 3 pings are missed. - if ( missedPings_ == 3 ) - { - KMessageBox::queuedMessageBox( 0, KMessageBox::Error, i18n("The connection to the server was lost.") ); - closeConnection(); - disconnectFromServer(false); - } - - writeData( "PNG\r\n" ); - - emit pingSent(); -} - - - -// Set whether we're sending pings or not (also resets ping timer) -void MsnConnection::setSendPings( bool sendPings ) -{ - sendPings_ = sendPings; - missedPings_ = 0; - - pingReceived_ = true; - - if ( sendPings_ ) - { - sendPing(); - - resetPingTimer(); - } - else - { - pingTimer_.stop(); - } -} - - - -// Write data to the socket -void MsnConnection::writeData(const QString& data) -{ -#ifdef KMESSTEST - if ( ( data.left(3) != "QRY" ) && ( data.left(3) != "MSG" ) ) - { - ASSERT( ( data.right( 2 ) ) == "\r\n" ); - } -#endif - uint noBytesWritten; - - if( ! isConnected() ) - { - if( ! disconnected_ ) - { - kdWarning() << name() << "::writeData() - Attempting to write data to a disconnected socket, closing socket." << endl; - - KMessageBox::queuedMessageBox( 0, KMessageBox::Error, i18n("The remote server has closed the connection.") ); - - // Close connection, updates GUI. - closeConnection(); - disconnectFromServer(false); - } - return; - } - - while ( writeLocked_ ) - { -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdWarning() << name() << "::writeData() - WRITE DATA IS LOCKED TO AVOID WRITING OVERLAPPING DATA TO THE SOCKET." << endl; -#endif - } - // Lock the writing of data. - writeLocked_ = true; - -#ifdef KMESSDEBUG_SERVERMESSAGES - QString debugData = data; - QRegExp removeCrLf("\r\n$"); - kdDebug() << name() << " >>> " << debugData.replace(removeCrLf, QString::null) << endl; -#endif - - QCString unicode = data.utf8(); - noBytesWritten = socket_->writeBlock( unicode.data(), unicode.length() ); - - if ( noBytesWritten != unicode.length() ) // Note that the previous code used data.length instead of unicode.length(), but I - { // changed this since that is the string we send to the socket... (could be wrong here) - kdWarning() << name() << "::writeData() - Wanted to write " << data.length() << " bytes to the socket, wrote " << noBytesWritten << "." << endl; - } - - // Unlock the writing of data. - writeLocked_ = false; - - // Append message to the network window -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_SENT( this, data.utf8() ); -#endif -} - - -// Write data to the socket without conversions -void MsnConnection::writeBinaryData(const QByteArray& data) -{ - int noBytesWritten; - - while ( writeLocked_ ) - { -#ifdef KMESSDEBUG_CONNECTION_SOCKET - kdWarning() << name() << "::writeBinaryData() - WRITE DATA IS LOCKED TO AVOID WRITING OVERLAPPING DATA TO THE SOCKET." << endl; -#endif - } - // Lock the writing of data. - writeLocked_ = true; - - if ( isConnected() ) - { -#ifdef KMESSDEBUG_SERVERMESSAGES - -// To display the entire contents: -/* - QByteArray debugData = data.copy(); // because QByteArray is explicitly shared - for(int i = 0; i < debugData.size(); i++) { if(debugData[i] < 10) debugData[i] = '?'; } - kdDebug() << name() << " >>> " << QString::fromUtf8(debugData.data(), debugData.size()) << endl; -*/ -// To display the first readable part: (removing the final \r\n) - kdDebug() << name() << " >>> " << QString(data).stripWhiteSpace() << endl; -#endif - - int dataLength = 0; - - dataLength = data.size(); - // NOTE: Assumes the caller used the right encoding already...! - // using .utf8() here breaks the ascii zero chars again. - noBytesWritten = socket_->writeBlock( data.data(), dataLength ); - - if ( noBytesWritten != dataLength ) - { - kdWarning() << name() << "::writeBinaryData() - Wanted to write " << data.size() << " bytes to the socket, wrote " << noBytesWritten << "." << endl; - } - } - else - { - kdWarning() << name() << "::writeBinaryData() - Attempting to write data to a disconnected socket." << endl; - } - - // Unlock the writing of data. - writeLocked_ = false; - - // Append the message to the network window -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_SENT(this, data); -#endif -} - - -#include "msnconnection.moc" diff --git a/kmess/network/msnnotificationconnection.cpp b/kmess/network/msnnotificationconnection.cpp deleted file mode 100644 index 4486388..0000000 --- a/kmess/network/msnnotificationconnection.cpp +++ /dev/null @@ -1,3218 +0,0 @@ -/*************************************************************************** - msnnotificationconnection.cpp - description - ------------------- - begin : Thu Jan 23 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 "msnnotificationconnection.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "../chat/chatmessage.h" -#include "../contact/contact.h" -#include "../contact/contactlist.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" -#include "../specialgroups.h" -#include "../kmessinterface.h" - -#include "mimemessage.h" -#include "msnchallengehandler.h" - -#include "soap/passportloginservice.h" -#include "soap/offlineimservice.h" - -#ifdef KMESSDEBUG_NOTIFICATION - #define KMESSDEBUG_NOTIFICATION_GENERAL -// #define KMESSDEBUG_NOTIFICATION_AUTH -// #define KMESSDEBUG_NOTIFICATION_MESSAGES -#endif - - - - -/** - * @brief The constructor - * - * Initializes the default groups of the ContactList class. - */ -MsnNotificationConnection::MsnNotificationConnection() - : MsnConnection("MsnNotificationConnection"), - initialized_(false), - noContacts_(0), - offlineImService_(0), - passportLoginService_(0), - totalNoContacts_(0) -{ - // We manage the contact list - contactList_ = new ContactList(); - - // addGroup( SpecialGroups::INDIVIDUALS, i18n("Individuals") ); // Not persistent - contactList_->addGroup( SpecialGroups::ONLINE, i18n("Online") ); - contactList_->addGroup( SpecialGroups::OFFLINE, i18n("Offline") ); - contactList_->addGroup( SpecialGroups::ALLOWED, i18n("Allowed") ); - contactList_->addGroup( SpecialGroups::REMOVED, i18n("Removed") ); - - // Automatically remove ChatInformation and OfflineImMessage objects. - openRequests_.setAutoDelete(true); - offlineImMessages_.setAutoDelete(true); - - // Connect the login timer to the checkLogin slot - connect( &loginTimer_, SIGNAL( timeout() ), - this, SLOT ( checkLogin() ) ); - // Connect the login timer to the checkLogin slot - connect( this, SIGNAL( pingSent() ), - this, SLOT( checkSwitchboardsTimeout() ) ); -} - - - -/** - * @brief The destructor - * - * Deletes the contact list. - * The base class closes the connection. - */ -MsnNotificationConnection::~MsnNotificationConnection() -{ - delete contactList_; - - // Remove all open requests. - openRequests_.clear(); - - // closeConnection() also cleans up a lot too. - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "DESTROYED Notification" << endl; -#endif -} - - - -/** - * @brief Add a contact to another group. - * - * It's possible to add a contact to multiple groups, - * typically referred to as "copy contact to group..". - * - * @param contact The contact. - * @param groupId The group ID. - */ -void MsnNotificationConnection::addContactToGroup(QString handle, QString groupId) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: adding '" << handle << " to '" << groupId << "'." << endl; -#endif - - putAdc( handle, "FL", groupId ); -} - - - -/** - * @brief Re-add a known contact to the friends list - * - * The contact will no longer appear in a "allowed contacts" - * 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. - */ -void MsnNotificationConnection::addExistingContact(QString handle) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Re-adding contact " << handle << endl; -#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" ); -} - - - -/** - * @brief Add a new contact to the list. - * - * This is the standard method to add a contact. - * - * 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. - */ -void MsnNotificationConnection::addNewContact(QString handle) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Adding contact " << handle << endl; -#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" ); -} - - - -/** - * @brief Internal function to track SOAP clients. - * - * This method connects the HttpSoapConnection::requestFailed() signal, - * and appends the client to the internal list. - * - * @param client The SOAP client class. - */ -void MsnNotificationConnection::addSoapClient( HttpSoapConnection *client ) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Adding SOAP client to list." << endl; -#endif - - // Connect signals - connect(client, SIGNAL( requestFailed(HttpSoapConnection*, const QString&) ), - this, SLOT ( soapRequestFailed(HttpSoapConnection*, const QString&) )); - connect(client, SIGNAL( requestFailed(HttpSoapConnection*, const QString&, const QString&, QDomElement) ), - this, SLOT ( soapRequestFailed(HttpSoapConnection*, const QString&, const QString&, QDomElement) )); - - // Add to list so it cleans up when the connection closes - soapClients_.append(client); -} - - - -/** - * @brief Adds the given contact to the allow list only. - * - * It allows the contact to see the online state of the user. - * The contact will not appear in the main window - * until it's also added to the friends list using addExistingContact(). - * - * This method can only be called when the contact exists - * in the reverse list only. This happens when the contact is new to the user, - * or it was completely removed. Call unblockContact() instead when the - * contact needs to be unblocked. - * - * This method is used when a new contact appears: - * - to add the contact to the friends list too, call addNewContact() - * - to allow the contact only, call this method. - * - 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). - * - * @param handle E-mail address of the contact. - */ -void MsnNotificationConnection::allowContact(QString handle) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Allowing contact " << handle << endl; -#endif - - putAdc( handle, "AL" ); -} - - - -/** - * @brief Add a new group - * - * This sends an ADG command to the server. - * When gotAdg() receives the server response, the ContactList object is updated. - * - * @param name Name of the group. - */ -void MsnNotificationConnection::addGroup(QString name) -{ - name = KURL::encode_string( name ); - sendCommand( "ADG", name + "\r\n" ); -} - - - -/** - * @brief Block the given contact - * - * When the contact also exists in the friends list, - * it will remain there with a blocked status icon. - * When the contact only exists in the "allowed contacts" group, - * it moves to the "removed contacts" group with a blocked status icon. - * - * This method can also be used when a new contact appears: - * - to add the contact to the friends list too, call addNewContact() - * - to allow the contact only, call allowContact() - * - to block the contact, call this method. - * - * 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. - */ -void MsnNotificationConnection::blockContact(QString handle) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Blocking contact " << handle << endl; -#endif - - // Block a contact by removing it from the allowed list - // and adding it to the blocked list - putRem( handle, "AL" ); - putAdc( handle, "BL" ); -} - - - -/** - * @brief Change the current media of the user. - * - * This is used to exchange the "now playing" information. - * It sends an UUX command to the server. - * More information about this command can be found - * at: http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes#UUX - * - * @param application Name of the media application, typically empty. iTunes and Winamp are known to be accepted. - * @param mediaType Type of the media, either "Music", "Games" or "Office". - * @param enabled Whether the media setting is enabled or not. - * @param formatString A .Net style formatting string, e.g. "{0} - {1}". - * @param arguments Replacements for the placeholders in the formatStrirng. - */ -void MsnNotificationConnection::changeCurrentMedia( const QString &application, const QString &mediaType, - bool enabled, const QString &formatString, - const QStringList arguments ) -{ - // Update current media string - QString media = application + "\\0" + mediaType + "\\0" + (enabled ? "1" : "0") + "\\0" - + formatString + "\\0" + arguments.join("\\0"); - lastCurrentMedia_ = QStyleSheet::escape(media); - - // Send personal status and current media - putUux(); -} - - - -/** - * @brief Called when the MSN Object of the current user changed. - * - * 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. - * - * Internally, this method calls changeStatus() because - * that same command is used to notify about MsnObject changes. - * The MsnObject is extracted from the CurrentAccount class. - */ -void MsnNotificationConnection::changedMsnObject() -{ - if(isConnected()) - { - // Send the same status message, with a new msn object - changeStatus(currentAccount_->getStatus()); - } -} - - - -/** - * @brief Change the friendly name of the user. - * - * Internally, this method uses changeProperty() to set the MFN property. - * - * @param newName The new friendly name. - */ -void MsnNotificationConnection::changeFriendlyName( QString newName ) -{ - changeProperty("MFN", 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 msn-friendly-name property. - changeProperty(handle, "MFN", newName); -} - - - -/** - * @brief Change the personal message of the user. - * - * The personal mesage typically contains a short status message - * displayed next to the contact. - * - * This method sends the UUX payload command to the server. - * - * @param newMessage The new status message. - */ -void MsnNotificationConnection::changePersonalMessage( QString newMessage ) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Changing personal message to " << newMessage << endl; -#endif - - lastPsm_ = QStyleSheet::escape(newMessage); - putUux(); -} - - - -/** - * @brief Change a user property - * - * It sends the PRP (likely short for property) command to the server. - * - * Valid property types are: - * - MFN: MSN Friendly name - * - PHH: Phone home - * - PHW: Phone work - * - PHM: Phone mobile - * - MOB: MSN Mobile authorised for others: Y or N - * - MBE: MSN Mobile enabled - * - WWE: MSN direct? - * - 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. - */ -void MsnNotificationConnection::changeProperty( QString type, QString value ) -{ - if( value.isEmpty() ) - { - sendCommand( "PRP", type + "\r\n" ); - } - else - { - value = KURL::encode_string( value ); - - // To avoid problem with a very long nick - value.truncate( 387 ); - - sendCommand( "PRP", type + " " + value + "\r\n" ); - } -} - - - -/** - * @brief Change a contact property - * - * It sends the SBP (likely short for set-buddy-property) command to the server. - * - * @param handle E-mail 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. - */ -void MsnNotificationConnection::changeProperty( QString handle, QString type, QString value ) -{ - // Get contact - const Contact *contact = contactList_->getContactByHandle(handle); - if(KMESS_NULL(contact)) return; - - // Avoid disconnects by the server - if( contact->getGuid().isEmpty() ) - { - kdWarning() << "MsnNotificationConnection::changeProperty: Can't change property, contact GUID is empty" - << " (contact=" << handle << " property=" << type << ")." << endl; - return; - } - - // First guess is that "SBP" means set-buddy-property - if( value.isEmpty() ) - { - sendCommand( "SBP", contact->getGuid() + " " + type + "\r\n" ); - } - else - { - value = KURL::encode_string( value ); - - // To avoid problem with a very long nick - value.truncate( 387 ); - - sendCommand( "SBP", contact->getGuid() + " " + type + " " + value + "\r\n" ); - } -} - - - -/** - * @brief Change the status of the user. - * - * Possible status values are: - * - NLN: online - * - AWY: away - * - BRB: be right back - * - BSY: busy - * - LUN: out to lunch - * - PHN: on the phone - * - HDN: hidden (invisible) - * - * This sends the CHG command to the user. - * This command also informs contacts the user's MsnObject and client capabilities. - * The MsnObject contains the meta-data about the user's display picture. - * The display picture itself is transferred in a chat session. - * - * Note this method advertises the supported client features, like 'winks' and 'webcam'. - * - * @param newStatus The new user status. - * @todo Possibly rename this to putChg() instead, especially when webcam support makes the capabilities dynamic. - */ -void MsnNotificationConnection::changeStatus( const QString& newStatus ) -{ - // 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. - const uint capabilities = (Contact::MSN_CAP_MSN75 | Contact::MSN_CAP_WINKS | Contact::MSN_CAP_MULTI_PACKET); - - QString objStr = KURL::encode_string( currentAccount_->getMsnObjectString() ); - - /* - // To test the old file transfer: - sendCommand( "CHG", newStatus + " 0\r\n"); - return; - */ - - if(objStr.isEmpty()) - { - // Just don't send it if we don't have it. - sendCommand( "CHG", newStatus + " " + QString::number(capabilities) + "\r\n" ); - } - else - { - sendCommand( "CHG", newStatus + " " + QString::number(capabilities) + " " + objStr + "\r\n" ); - } -} - - - -/** - * @brief Called when the login timeout exceeded. - * - * Checks whether login was successful within time limit. - * If not, the user is informed no connection could be made. - */ -void MsnNotificationConnection::checkLogin() -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Login not successful within time limit." << endl; -#endif - - closeConnection(); - - // Show a message to the user - QString message = i18n("KMess could not connect the the MSN Messenger servers. The MSN Messenger servers could be temporary unavailable or there is a problem with your Internet connection.") + "\r\n"; - dotNetMessage(message); -} - - - -// Removes any expired switchboard requests, so new ones can be made -void MsnNotificationConnection::checkSwitchboardsTimeout() -{ - // There are no pending switchboard requests, bail out - if( openRequests_.count() < 1 ) - { - return; - } - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Removing expired switchboard requests." << endl; -#endif - - ChatInformation *switchboardInfo; - QPtrListIterator it( openRequests_ ); - while( ( switchboardInfo = it.current() ) != 0 ) - { - // Delete any pending switchboard - uint now = QDateTime::currentDateTime().toTime_t(); - if( ( now - switchboardInfo->getTime() ) > 60 ) - { - openRequests_.remove( switchboardInfo ); - } - ++it; - } -} - - - -/** - * @brief Close the connection with the server - * - * This disconnects from the server. It also cleans up the - * state variables and objects associated with the session, - * e.g. contactlist data, open chat invitations, pending offline-im messages and SOAP clients. - * - * The ContactList object is saved and reset as well. - */ -void MsnNotificationConnection::closeConnection() -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Close the connection." << endl; -#endif - // Stop the login timer in case the user closed the connection during login - loginTimer_.stop(); - noContacts_ = 0; - totalNoContacts_ = 0; - - // Disconnect from the server first. - // emits the signals so other classes can clean up / save properties. - disconnectFromServer(); - - // Resetting variables, objects will be removed through soapClients_ - offlineImService_ = 0; - passportLoginService_ = 0; - - // Disconnect other possibly active SOAP sessions. - // Use deleteLater() since this method may be called from loginIncorrect() - if( ! soapClients_.isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Closing SOAP sessions." << endl; -#endif - QPtrListIterator it(soapClients_); - while( it.current() != 0 ) - { - HttpSoapConnection *soapClient = it.current(); - soapClient->closeConnection(); - soapClient->deleteLater(); - ++it; - } - soapClients_.clear(); - } - - // Remove contacts and non-special groups from the contact list - if ( contactList_ != 0 ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Resetting contactlist." << endl; -#endif - - // Save what we own. CurrentAccount only has a const reference to it for easier access. - if( ! currentAccount_->isGuestAccount() ) - { - contactList_->saveProperties( kapp->config() ); // Make sure the contactlist is saved - } - - contactList_->reset(); - // The contact list is not deleted, like this class it's being - // shared through the entire application, and attached to slots. - } - - // Reset variables - pendingOfflineImMessages_.clear(); - offlineImMessages_.clear(); - openRequests_.clear(); - if( currentAccount_ != 0 ) - { - currentAccount_->setNoEmails( 0 ); - } -} - - - -/** - * @brief Called when the socket connected. - * - * This method calls putVer() to start the version exchange. - */ -void MsnNotificationConnection::connectionSuccess() -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Connected to server, sending VER." << endl; -#endif - - // Restart the login timer for the actual MSN sign in - loginTimer_.stop(); - loginTimer_.start( 45000, true ); // 45 seconds - - putVer(); -} - - - -/** - * @brief Internal function to create the Offline-IM service - * - * This service is used to retrieve the Offline-IM messages. - * The signals are attached to receivedOfflineIm() and receivedMailData() - * - * @returns The Offline-IM webservice handler - */ -OfflineImService* MsnNotificationConnection::createOfflineImService() -{ - // Request the first offline-im message - OfflineImService *client = new OfflineImService( authT_, authP_, this ); - - // Register signals - addSoapClient( client ); // auto deletes at closeConnection() call. - connect( client, SIGNAL( messageReceived( const QString&, const QString&, const QString&, - const QDateTime&, const QString&, const QString&, int ) ), - this, SLOT ( receivedOfflineIm( const QString&, const QString&, const QString&, - const QDateTime&, const QString&, const QString&, int ) )); - connect( client, SIGNAL( metaDataReceived( QDomElement ) ), - this, SLOT ( receivedMailData( QDomElement ) )); - - return client; -} - - - -/** - * @brief Internal function to create the passport login handler. - * - * This service is used by gotUsr() to retrieve the passport authentication token. - * - * @returns The Passport login webservice handler - */ -PassportLoginService* MsnNotificationConnection::createPassportLoginService() -{ - // Create the login handler. - PassportLoginService *loginService = new PassportLoginService(); - - // Connect all login notifications - connect( loginService, SIGNAL( loginIncorrect() ), - this, SLOT ( loginIncorrect() ) ); - connect( loginService, SIGNAL( loginSucceeded(QString) ), - this, SLOT ( loginSucceeded(QString) ) ); - - return loginService; -} - - - -/** - * @brief Internal function to show the .Net MSN Messenger service status - * - * This method displays a message box with the "Show MSN Messenger Service status?" prompt, - * and opens the MSN Messenger Service status webpage. - * - * @param message Message to show before the standard "show status" question. - */ -void MsnNotificationConnection::dotNetMessage(QString message) -{ - int result; - - closeConnection(); - - message += "\n" + i18n("Show MSN Messenger Service status?"); - result = KMessageBox::questionYesNo( 0, message, i18n("Server Error") ); - if ( result == KMessageBox::Yes ) - { - kapp->invokeBrowser( "http://status.messenger.msn.com/Status.aspx" ); - } -} - - - -/** - * @brief Return the contact list - * - * @returns The contact list managed by this class. - */ -const ContactList* MsnNotificationConnection::getContactList() const -{ - return contactList_; -} - - - -/** - * @brief Called when the user is ready to go online. - * - * This method is called by gotSyn() or gotLst() when - * the entire contact list data is received. - * 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. - * Finally, the connected() signal is fired. - */ -void MsnNotificationConnection::goOnline() -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Lists received. Go online." << endl; -#endif - int ack; - - if(KMESS_NULL(currentAccount_)) return; - - // Change to the initial status -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Changing initial status to " << currentAccount_->getInitialStatus() << endl; -#endif - changeStatus( currentAccount_->getInitialStatus() ); - - // Reset status fields. - lastCurrentMedia_ = QString::null; - lastPsm_ = QString::null; - - // Start with default personal message (may be empty) - changePersonalMessage( currentAccount_->getPersonalMessage() ); - - // When the account supports e-mail (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. - - // Ask for inbox URL - ack = sendCommand("URL", "INBOX\r\n"); - currentAccount_->setInboxInformation( QString::number(ack), "", "" ); - - // Ask for compose URL - ack = sendCommand("URL", "COMPOSE\r\n"); - currentAccount_->setComposeInformation( QString::number(ack), "", "" ); - } - - // Start ping timer - setSendPings( true ); - - // Notify observers that the server is connected - loginTimer_.stop(); - emit connected(); -} - - - -/** - * @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) -{ - 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( uint i = 3; i < command.size(); i++) - { - if( command[i].startsWith("N=") ) - { - handle = command[i].mid(2).lower(); - } - else if( command[i].startsWith("F=") ) - { - friendlyName = KURL::decode_string( command[i].mid(2) ); - } - else if( command[i].startsWith("C=") ) - { - guid = command[i].mid(2); - } - else if( listType == "FL" && command[i].at(1) != '=' ) - { - groupId = command[i]; - } - else if( listType == "RL" && command[i].length() == 1 && command[0] >= '0' && command[0] <= '9' ) - { - // unknown, number at end of command list. - } - else - { - kdWarning() << "MsnNotificationConnection::gotAdc: Unknown argument encountered: '" << command[i] << "'" << endl; - } - } - - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: 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 - { - kdWarning() << "MsnNotificationConnection::gotAdc: Contact identification not found in ADC response!" << endl; - return; - } - - - if(contact == 0) - { - // 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; - - // 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() ) - { - friendlyName = handle; - } - - contact = contactList_->addContact(handle, friendlyName, listNumber, guid, groupId); - } - 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") - { - // Update the friendly name. - if( ! friendlyName.isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - if( contact->getFriendlyName() != friendlyName ) - { - kdDebug() << "MsnNotificationConnection::gotAdc: received new friendlyname, " - << "updating contact '" << handle << "'." << endl; - } -#endif - contact->setFriendlyName( friendlyName ); - } - - // Update the GUID - if( ! guid.isEmpty() ) - { - if( contact->getGuid().isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotificationConnection::gotAdc: received GUID for contact, updating contact '" << handle << "'." << endl; -#endif - } - else if( guid != contact->getGuid() ) - { - // This shouldn't happen, but debugging it helps to solve weird problems. - kdWarning() << "MsnNotificationConnection::gotAdc: 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); - } - - // If this contact was added from moveContact(), remove from source group. - QString sourceGroup = contact->getPrepareMove(); - if( ! sourceGroup.isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Detected moving operation, removing contact from old group." << endl; -#endif - putRem( contact->getHandle(), "FL", sourceGroup ); - contact->setPrepareMove(); - } - } - } - - - // 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 = KURL::decode_string( command[2] ); - QString id = command[3]; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Added group " << name << " (" << command[1] << ")." << endl; -#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) -{ - if(KMESS_NULL(currentAccount_)) return; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: User's status changed to " << command[2] << "." << endl; -#endif - // Change the user's status - currentAccount_->setStatus( command[2] ); -} - - - -// Received a challenge from the server -void MsnNotificationConnection::gotChl(const QStringList& command) -{ - // Handle challenge query - MSNChallengeHandler handler("YMM8C_H7KCQ2S_KL", "PROD0090YUAUV{2B"); - QString response = handler.computeHash(command[2]); - - // Send response - sendPayloadMessage( "QRY", handler.productId(), response ); -} - - - -// Received a version update from the server -void MsnNotificationConnection::gotCvr(const QStringList& /*command*/) -{ - if(KMESS_NULL(currentAccount_)) return; - - // Send the USR command - sendCommand( "USR", "TWN I " + currentAccount_->getHandle() + "\r\n" ); -} - - - -// Received notice that a contact went offline -void MsnNotificationConnection::gotFln(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: " << command[1] << " went offline." << endl; -#endif - - contactList_->setContactOffline( command[1].lower() ); -} - - - -// Received notice that a contact is already online -void MsnNotificationConnection::gotIln(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - - // Get the contact info from the message - QString handle = command[3].lower(); - QString friendlyName = KURL::decode_string( command[4] ); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: " << handle << " is initially " << command[2] << "." << endl; -#endif - - uint capabilities = command[5].toUInt(); - QString msnObject = KURL::decode_string( command[6] ); - - // Check if the received MSN object is empty, a "0" (Kopete), or shorter than the string "" - if( msnObject.isEmpty() || msnObject.compare( QString( "0" ) ) <= 0 || msnObject.length() < 12 ) - { - msnObject = QString::null; - } - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - if( ! msnObject.isEmpty() ) - { - kdDebug() << "Notification: This person has an msn6 picture: " << msnObject << endl; - } -#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() && friendlyName != handle ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: 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, friendlyName, command[2], 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 = KURL::decode_string( command[1] ); - QString groupId = command[2]; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Got group " << name << "(" << groupId << ")" << endl; -#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; - - //emit statusMessage( i18n("Getting lists"), KmessInterface::TYPE_WARNING ); -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Got LST : " << command.join( " " ) << endl; -#endif - - - QString handle; - QString friendlyName; - QString guid; - - uint i = 1; - for(; i < command.size(); i++) - { - if( command[i].startsWith("N=") ) - { - handle = command[i].mid(2).lower(); - } - else if( command[i].startsWith("F=") ) - { - friendlyName = KURL::decode_string( command[i].mid(2) ); - } - else if( command[i].startsWith("C=") ) - { - guid = command[i].mid(2); - } - else if( command[i].at(1) != '=' ) - { - // End of parameters. - break; - } - else - { - kdWarning() << "MsnNotificationConnection::gotLst: Unknown argument encountered: '" << command[i] << "'" << endl; - } - } - - int list = command[i].toInt(); -// int unknown = command[i + 1]; - QString groupIdsList = command[i + 2]; - - // make sure it's not an int or some other invalid parameter (should be a GUID) - QStringList groupIds; - if( ! groupIdsList.isEmpty() && groupIdsList.length() > 8 ) - { - groupIds = QStringList::split( ",", groupIdsList ); - } - - // Friendlyname is not set when contact is in the AL only (never seen online). - if( friendlyName.isEmpty() ) - { - friendlyName = handle; - } - - friendlyName = KURL::decode_string( friendlyName ); - -#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 " : ""); - kdDebug() << "Notification: Got contact " << friendlyName << "(" << handle << ") list=" << listName << "groups=" << groupIds << "." << endl; -#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 - kdDebug() << "Notification: Contact is found in pending list, adding to reverse-list." << endl; -#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 - kdDebug() << "Notification: All " << totalNoContacts_ << " were received. Go online." << endl; -#endif - goOnline(); - } -} - - - -/** - * @brief Handle the NLN command; a contact changed it's status. - * - * When a user updates it's status with the CHG command, - * all it's contact receive a NLN command. - * KMess sends the CHG command with the changeStatus() method. - * The CHG allows a contact to change it's name, client capabilities or MsnObject. - * - * The capabilities are a bitwise flag. The list of known values - * are described in the ContactBase::MsnClientCapabilities enum. - * - * The MsnObject is an identifier for the display picture. - * To download the actual picture, a client needs to initiate a chat, - * and send an invitation there. - * - * @code -<<< NLN NLN user@kmessdemo.org KMess%20Demo 1342210080 %3Cmsnobj%20Creator%3D%22user%40kmessdemo.org%22%20Size%3D%2211581%22%20Type%3D%223%22%20Location%3D%22KMess.tmp%22%20Friendly%3D%22AA%3D%3D%22%20SHA1D%3D%223VfOMCTTkuYHDjJhPx4sSlPiM%2Bs%3D%22%20SHA1C%3D%22ULeT2WGsdabLGNP3RgbWYw7ve80%3D%22/%3E -@endcode - * - * @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. - */ -void MsnNotificationConnection::gotNln(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - - // Get the contact info from the message - QString status = command[1]; - QString handle = command[2].lower(); - QString friendlyName = KURL::decode_string( command[3] ); - uint capabilities = command[4].toUInt(); - QString msnObject = KURL::decode_string( command[5] ); - - // For some reason an empty MSNObject is sent as "0" with MSNP12 - if( msnObject == "0" ) - { - msnObject = QString::null; - } - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: " << handle << " is now " << status << "." << endl; -#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() && friendlyName != handle ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: 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, friendlyName, status, capabilities, msnObject ); -} - - - -// Received notice of disconnetion 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" ) - { - KMessageBox::queuedMessageBox( 0, KMessageBox::Error, i18n("You have been disconnected because you connected from another MSN Messenger client or from another location.") ); - } - closeConnection(); -} - - - -// Received a propertu change (friendly name, phone number, etc..) -void MsnNotificationConnection::gotPrp(const QStringList& command) -{ - QString propertyName = command[1]; - QString propertyValue = KURL::decode_string( command[2] ); - - if( propertyName == "MFN" ) - { - currentAccount_->setFriendlyName( propertyValue ); - } - else if( propertyName == "MBE" ) - { - // Unimplemented. - // indicates whether MSN Mobile is enabled. - } - else if( propertyName == "WWE" ) - { - // Unimplemented - // indicates whether MSN Direct is enabled. - } - else - { -// kdWarning() << "MsnNotificationConnection::gotPrp: Received unsupported property name/value: " << propertyName << " " << propertyValue << "!" << endl; - } -} - - - -// Received confirmation of change in a group's name -void MsnNotificationConnection::gotReg(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - - QString groupId = command[2]; - QString name = KURL::decode_string( command[3] ); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Group " << groupId << " renamed to " << name << "." << endl; -#endif - // Pass the info to the group list - contactList_->renameGroup( groupId, name ); -} - - - -/** - * @brief Handle the REM command; confirmation of a contacts's removal from list or group. - * - * @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].lower(); - contact = contactList_->getContactByHandle( handle ); - } - - // Check whether contact is null. - if(contact == 0) - { - kdDebug() << "MsnNotificationConnection::gotRem: Couldn't find contact " << handle << guid << " in the contact list." << endl; - return; - } - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Contact " << contact->getHandle() << " removed from " << listType << " " << groupId << "." << endl; -#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 - kdDebug() << "Notification: Remove group " << command[2] << "." << endl; -#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) -{ - // 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].lower(); -// QString friendlyName = KURL::decode_string( command[6] ); - - QString server = serverAndPort.section(':', 0, 0); - QString portString = serverAndPort.section(':', 1, 1); - bool goodPort; - int port = portString.toInt( &goodPort ); - if ( !goodPort ) - { - kdDebug() << "Notification::gotRng - WARNING - Couldn't get port from string " << portString << endl; - return; - } -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: " << handle << " is requesting a chat at: " - << server << ":" << port << " id=" << chatId << " auth=" << auth << "." << endl; -#endif - - // Send connection information object - emit startedSwitchboard( 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[3].toInt(); - - // The login was successful, stop timer now already. - // When the authentication part was slow KMess could disconnect while the contactlist is being downloaded. - loginTimer_.stop(); - - // Allow the contactlist to be downloaded within 2 minutes, should be more then enough. - loginTimer_.start(120000, true); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Got SYN. # of contacts is " << totalNoContacts_ << endl; -#endif - - // Go online if contactlist is empty (new account) - if(totalNoContacts_ == 0) - { - goOnline(); - } -} - - - -// Received information about a contact's personal message -void MsnNotificationConnection::gotUbx(const QStringList &command, const QByteArray &payload) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Got UBX information." << endl; -#endif - - Contact *contact = contactList_->getContactByHandle( command[1].lower() ); - if(KMESS_NULL(contact)) return; - - if(command[2].toInt() == 0) - { - // Size is 0, no personal message - contact->setPersonalStatus( QString::null ); - } - else - { - // Load XML parser - QDomDocument xml; - if( ! xml.setContent(payload) ) - { - kdWarning() << "MsnNotificationConnection::gotUbx: Could not parse personal status message (invalid XML, contact=" << command[1] << ")!" << endl; - } - - // Parse payload - QDomElement root = xml.namedItem("Data").toElement(); - QString psm = root.namedItem("PSM").toElement().text(); - QString currentMedia = root.namedItem("CurrentMedia").toElement().text(); - QString mediaType; - - // Append current media if set. - if( currentMedia.length() > 0 ) - { - // From http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes: - // - // Media string can be something like: - // \0Music\01\0{0} - {1}\0Title\0Artist\0Album\0\0 - // \0Games\01\0Playing {0}\0Game Name\0 - // \0Office\01\0Office Message\0Office App Name\0 - // - // The literal "\0" is the separator char. - // Fields are: application, mediatype, enabled, formatstring, arg1, arg2, arg3 - - // Split media string - QStringList media = QStringList::split( "\\0", currentMedia, true ); - mediaType = media[1]; - - // Check if media is enabled, to find out what this means. - if( media[2] != "1" ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: CurrentMedia is set, but not enabled." << endl; -#endif - currentMedia = QString::null; - } - else - { - // Replace fields in .Net style format string - currentMedia = media[3]; // format - for( uint i = 4; i < media.count(); i++ ) - { - currentMedia = currentMedia.replace( "{" + QString::number(i - 4) + "}", media[i] ); - } - } - } - - // Store personal message - contact->setPersonalStatus( psm, mediaType, currentMedia ); - } -} - - - -// Received the folder and command info for Hotmail's inbox or compose -void MsnNotificationConnection::gotUrl(const QStringList& command) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Got URL information." << endl; -#endif - if(KMESS_NULL(currentAccount_)) return; - - // Check the inbox and compose URLs to see if they're storing this ack - if ( currentAccount_->getInboxCommand() == command[1] ) - { - // 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] ); - } -} - - - -// Received user authentication information -void MsnNotificationConnection::gotUsr(const QStringList& command) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Got USR information." << endl; -#endif - if(KMESS_NULL(currentAccount_)) return; - - // This is either asking for authentication or confirming it - if ( command[2] == "TWN" ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: USR authentication." << endl; -#endif - - QString parameters = KURL::decode_string( command[4] ); - - // Change statusbar - emit statusMessage( i18n("Authenticating"), KMessInterface::TYPE_WARNING ); - - // Get the right password value - QString password; - if( ! currentAccount_->getTemporaryPassword().isEmpty() ) - { - // Login from InitialView. Try to login with the newly entered password - password = currentAccount_->getTemporaryPassword(); - } - else - { - // Login from menu. Use the current password. - password = currentAccount_->getPassword(); - } - - // Start the passport based login - passportLoginService_ = createPassportLoginService(); - addSoapClient( passportLoginService_ ); - passportLoginService_->login( parameters, currentAccount_->getHandle(), password ); - } - else if ( command[2] == "OK" ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: USR confirmation." << endl; -#endif - // This is a confirmation message. Get the user's friendly name from the message. - bool isVerified = (command[4].toInt() == 1); - currentAccount_->setVerified( isVerified ); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - if( ! isVerified ) - { - kdWarning() << "Notification: Passport account of the user is not verified yet." << endl; - } -#endif - - // When users choose an existing account in the InitialView dialog, - // they may alter the password. This value is stored as temporary password. - // The password may be overwritten now, because the login was succesful. - currentAccount_->saveTemporaryPassword(); - - // Update the status - emit statusMessage( i18n("Received user confirmation"), KMessInterface::TYPE_WARNING ); - - // 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? - -// 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..."), KMessInterface::TYPE_WARNING ); - - // 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, true ); // 60 seconds - } -} - - - -// Received version information -void MsnNotificationConnection::gotVer(const QStringList& command) -{ -#ifdef KMESSTEST - 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" ); -} - - - -// Received server transfer information -void MsnNotificationConnection::gotXfr(const QStringList& command) -{ - // Get parameters - int transactionId = command[1].toInt(); - QString serverType = command[2]; // Server Type (NS or SB) - QString serverAndPort = command[3]; // server:port part -#ifdef KMESSTEST - ASSERT( serverAndPort.contains(":") ); -#endif - - // Get the server from that - QString server = serverAndPort.left( serverAndPort.find(":") ); - QString portString = serverAndPort.right( serverAndPort.length() - serverAndPort.findRev(":") - 1 ); - - // Convert the port to an integer - bool goodPort; - int port = portString.toInt( &goodPort ); -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Got " << serverType << " transfer to " << server << ":" << port << "." << endl; -#endif - if( ! goodPort ) - { - kdDebug() << "Notfication: Got bad port number : " << portString << "." << endl; - return; - } - - - if( serverType == "NS" ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Disconnecting from old server." << endl; -#endif - // Disconnect from the existing server. - disconnectFromServer( true ); -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Connecting to new server." << endl; -#endif - // This is a notification server transfer. Switch this socket to the given server. - emit statusMessage( i18n("Transfer to notification server"), KMessInterface::TYPE_WARNING ); - -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_INIT(this, "NS " + server); -#endif - - // Connect to the new server. - if( ! connectToServer( server, port ) ) - { - kdDebug() << "Notification: WARNING - Couldn't connect to new server." << endl; - } - } - else if( serverType == "SB" ) - { -#ifdef KMESSTEST - ASSERT( openRequests_.count() > 0 ); - uint noChatsBefore = openRequests_.count(); -#endif - - // This is a switchboard server. This message should be in response to - // a user-requested chat. Look for the pending chat information. - - ChatInformation *switchboardInfo; - QPtrListIterator it( openRequests_ ); - while( ( switchboardInfo = it.current() ) != 0 && switchboardInfo->getTransactionId() != transactionId ) - { - ++it; - } - if( switchboardInfo == 0 ) - { - kdDebug() << "MsnNotificationConnection - Got a switchboard, but there are no corresponding open requests." << endl; - return; - } - // Debug the transaction ID. Let the chat continue, if - // there are errors it can be traced back in the console. - if( switchboardInfo->getTransactionId() != transactionId ) - { - kdWarning() << "MsnNotificationConnection: received XFR response, but transaction-ID differs!" << endl; - } - - // Update the server information - switchboardInfo->setServerInformation( server, port, command[5] ); -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: emitting startedSwitchboard() signal." << endl; -#endif - - // Signal the new connection - emit startedSwitchboard( *switchboardInfo ); - - // Remove the first item from the active requests list - // Automatically removes the ChatInformation object. - openRequests_.remove( switchboardInfo ); -#ifdef KMESSTEST - ASSERT( openRequests_.count() == ( noChatsBefore - 1 ) ); -#endif - } -} - - - -// Initialize the object -bool MsnNotificationConnection::initialize() -{ - if ( initialized_ ) - { - kdDebug() << "Notification Connection already initialized!" << endl; - return false; - } - if ( !MsnConnection::initialize() ) - { - kdDebug() << "Notification Connection: Couldn't initialize parent." << endl; - return false; - } - - // currentAccount_ is initialized now. - // Pass the current contactlist reference to the currentaccount - // so other classes can access contacts from a central point. - currentAccount_->setContactList( contactList_ ); - - initialized_ = true; - return initialized_; -} - - - -// Test whether the given command is a payload command -bool MsnNotificationConnection::isPayloadCommand(const QString &command) const -{ - return (command == "UBX" // contact personal status message - || command == "GCF" // server config file - || command == "NOT" // msn alerts, msn calendar - || command == "IPG" // contact page - ); -} - - - -// The passport login failed, username/password was incorrect -void MsnNotificationConnection::loginIncorrect() -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotificationConnection: Passport login was incorrect." << endl; -#endif - - // 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) -{ -#ifdef KMESSDEBUG_NOTIFICATION_AUTH - kdDebug() << "Notification - Authentication is " << authentication << endl; -#endif - - // Delete the login handler - // Delay deletion so it can complete the method. - soapClients_.remove( passportLoginService_ ); - QTimer::singleShot( 10, passportLoginService_, SLOT(deleteLater()) ); - passportLoginService_ = 0; - - // Send login command. - sendCommand( "USR", "TWN S " + authentication + "\r\n" ); - - // Extract the 't' and 'p' values from the 'authentication' string, - // these are needed later for webservice calls (e.g. Offline-IM) - QStringList fields = QStringList::split("&", authentication); - for( QStringList::Iterator it = fields.begin(); it != fields.end(); ++it ) - { - QString field = *it; - if( field.startsWith("t=") ) - { - authT_ = field.mid(2); - } - else if( field.startsWith("p=") ) - { - authP_ = field.mid(2); - } -#ifdef KMESSDEBUG_NOTIFICATION - else - { - kdWarning() << "MsnNotificationConnection: Could not parse authentication string!" << endl; - } -#endif - } - - if( authP_.isEmpty() || authT_.isEmpty() ) - { - kdWarning() << "MsnNotificationConnection: Could not parse passport authentication response, 'p' and 't' fields not detected!" << endl; - } -} - - - -// Move the contact to another group. -void MsnNotificationConnection::moveContact(QString handle, QString fromGroupId, QString toGroupId) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Moving '" << handle << "' from '" << fromGroupId << "' to '" << toGroupId << "'." << endl; -#endif - - Contact *contact = contactList_->getContactByHandle(handle); - if(contact == 0) - { - kdDebug() << "MsnNotificationConnection - moveContact() - Couldn't find the contact." << endl; - return; - } - - if(fromGroupId == toGroupId) - { - // Would remove the contact otherwise. (re-added to original group, removed from original group afterwards) - kdDebug() << "MsnNotificationConnection - moveContact() - Attempted to move contact to same group." << endl; - 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 - kdDebug() << "MsnNotificationConnection: waiting for ack " << /*movingAck_ <<*/ " to remove contact from group." << endl; -#endif - } -} - - - -// Open a connection to the server -bool MsnNotificationConnection::openConnection() -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Opening connection." << endl; -#endif - if ( !initialized_ ) - { - kdDebug() << "Notification: ERROR - Notification should be initialized before attempting to connect." << endl; - return false; - } - -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_INIT(this, "NS messenger.hotmail.com"); -#endif - - emit statusMessage( i18n( "Connecting..." ), KMessInterface::TYPE_WARNING ); - - // Attempt to connect to the main MSN server - if( ! connectToServer( "messenger.hotmail.com", 1863 ) ) - { - kdDebug() << "Notification: Couldn't connect to the server." << endl; - return false; - } - - // Start the login timer for the name resolution and socket connection - loginTimer_.start( 10000, true ); // 10 seconds - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: Socket started connecting to the server. Started timer." << endl; -#endif - - return true; -} - - - -// Parse a regular command -void MsnNotificationConnection::parseCommand(const QStringList& command) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotificationConnection::parseCommand() - Parsing command '" << command[0] << "'." << endl; -#endif - - if(command[0].toInt() != 0) - { - // I've decided to always print these messages, should make "error-resolving" easier. - kdWarning() << "MsnNotificationConnection::parseCommand() - Received error code " << command[0] << " from server." << endl; - - // 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(); - QPtrListIterator it( openRequests_ ); - while( it.current() != 0 ) - { - ChatInformation *chatInvite = it.current(); - if( chatInvite->getTransactionId() == transactionId ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotificationConnection::parseCommand: Removing chat invitation from list." << endl; -#endif - openRequests_.remove( chatInvite ); - break; - } - ++it; - } - } - } - - // 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 ( 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 - kdWarning() << "MsnNotificationConnection::parseCommand() - Unknown command '" << command[0] << "'! Full string: " << command.join( " " ) << endl; -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - KMessageBox::error( 0, i18n("KMess received an unknown command from the server: %1").arg(command[0]) ); -#endif - } - - return; - } - - - // All possible commands have been trapped. At this point we can have only - // received an error code. - // See: http://www.hypothetic.org/docs/msn/reference/error_list.php for details - - bool isWarning = false; // Not really errors, will be displayed on the status bar - bool isServerError = false; - QString errorMessage = QString::null; - - // Client side errors. - // These errors are usually generated by misbehavior on kmess' or the user's side. - switch( command[0].toInt() ) - { - case 200: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Invalid command syntax"); - break; - case 201: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Invalid command parameter"); - break; - case 205: - errorMessage = i18n("The email you have tried to add is not a MSN Messenger account"); - break; - case 206: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Domain name missing"); - break; - case 207: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Already logged in"); - break; - case 208: - errorMessage = i18n("The account name given is invalid"); - 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"); - break; - case 213: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Invalid SBP parameter"); - break; - case 215: - errorMessage = i18n("This contact is already on your list"); - break; - case 216: - errorMessage = i18n("This contact is not on your list"); - break; - case 217: - errorMessage = i18n("This contact is not online"); - break; - case 218: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Already in this mode"); - break; - case 219: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Contact is in the opposite list"); - break; - case 223: - errorMessage = i18n("Your contact list has too many groups"); - break; - case 224: - errorMessage = i18n("This group can't be changed"); - break; - case 227: - errorMessage = i18n("This group is not empty"); - break; - case 228: - errorMessage = i18n("The group name is already in use by your Messenger or Hotmail contact list"); - break; - case 229: - errorMessage = i18n("The group name is too long"); - break; - case 230: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Attempted to change group \"0\""); - break; - case 231: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Invalid Group"); - break; - case 280: - errorMessage = i18n("Switchboard server failed"); - break; - case 281: - errorMessage = i18n("Transfer to switchboard server failed"); - break; - case 282: - errorMessage = i18n("Direct connection (MSNSLP) error, connection failed"); - break; - case 300: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Required field missing"); - break; - case 302: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Not logged in"); - break; - case 402: - case 403: - errorMessage = i18n("Error accessing contact list, try again later"); - break; - case 502: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Command is disabled"); - break; - case 511: - errorMessage = i18n("Your account is banned."); - closeConnection(); - break; - case 540: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Challenge response failed"); - break; - case 713: - // Too many CAL's - errorMessage = i18n("You're opening sessions too rapidly"); - break; - case 714: - errorMessage = i18n("You have too many sessions opened"); - 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. - errorMessage = i18n("There was an internal error in KMess: %1").arg("Unexpected command sequence"); - break; - case 717: - errorMessage = i18n("Bad friend name"); - break; - case 731: - // Sent in response to a badly formatted CVR - errorMessage = i18n("There was an internal error in KMess: %1").arg("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. - errorMessage = i18n("The server reports KMess is flooding it with too many data"); - isWarning = true; - break; - case 911: - // User/pass was probably correct, TWN ticket was incorrect - errorMessage = i18n("There was an internal error in KMess: %1").arg("Authentication ticket was incorrect"); - closeConnection(); - break; - case 913: - errorMessage = i18n("You can't start a chat with someone while you are invisible."); - break; - case 923: - errorMessage = i18n("You have a kids passport, you need parental consent to chat online."); - closeConnection(); - break; - case 924: - errorMessage = i18n("Your passport needs to be verified first."); - closeConnection(); - break; - case 928: - errorMessage = i18n("There was an internal error in KMess: %1").arg("Bad USR ticket"); - break; - - default: - // It wasn't an user error. So, probably, it's a server error. - isServerError = true; - break; - } - - // We've received a warning message: don't interrupt the user for it, show it on the Status Bar instead. - if( isWarning ) - { - emit statusMessage( errorMessage, KMessInterface::TYPE_WARNING ); - return; - } - else if( !isServerError ) - { - // Display an User Error message. - KMessageBox::error( 0, errorMessage, i18n( "KMess - MSN error" ) ); - return; - } - - // Server side errors. - // These are generated without any intervention from us. - switch( command[0].toInt() ) - { - 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 - errorMessage = i18n("There was an internal server error"); - closeConnection(); - break; - case 600: - case 910: - case 912: - case 918: - case 919: - case 921: - case 922: - errorMessage = i18n("The server is too busy"); - closeConnection(); - break; - case 601: - case 605: - errorMessage = i18n("The server is unavailable"); - break; - case 602: - errorMessage = i18n("Peer notification server down"); - closeConnection(); - break; - case 604: - errorMessage = i18n("The server is going down"); - break; - case 640: - errorMessage = i18n("The server is going down soon"); - isWarning = true; - break; - case 711: - errorMessage = i18n("Write is blocking"); - break; - case 712: - errorMessage = i18n("Session is overloaded"); - break; - case 914: - case 915: - case 916: - errorMessage = i18n("The server is not available"); - break; - case 917: - errorMessage = i18n("Authentication failed"); - break; - case 920: - errorMessage = i18n("Not accepting new principals"); - break; - - default: - // It was not an user error, not a server error.. what was it then? - - // No need to bugger the users with strange error messages - kdWarning() << "MsnNotificationConnection::parseCommand() - Unknown error '" << command[0] << "'! Full string: " << command.join( " " ) << endl; -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - KMessageBox::error( 0, i18n("KMess received an unknown error message from the server: %1").arg(command[0]) ); -#endif - return; - } - - // We've received a server warning message: don't interrupt the user for it, show it on the Status Bar instead. - if( isWarning ) - { - emit statusMessage( errorMessage, KMessInterface::TYPE_WARNING ); - return; - } - - // Display the Server Error message. - dotNetMessage( errorMessage ); -} - - - -// Parse a message command -void MsnNotificationConnection::parseMessage(const QStringList& /*command*/, const MimeMessage &mainMessage) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotification - Got " << mainMessage.getSubValue("Content-Type") << "." << endl; -#endif - - QString contentType = mainMessage.getSubValue("Content-Type"); - MimeMessage message( mainMessage.getBody() ); - -#ifdef KMESSDEBUG_NOTIFICATION_MESSAGES - mainMessage.print(); - kdDebug() << "MsnNotification - Message body as mime:" << endl; - message.print(); -#endif - - // Check the message type - if ( contentType == "text/x-msmsgsprofile" ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotification - Load profile information." << endl; -#endif - uint externalPort = mainMessage.getValue("ClientPort").toUInt(); - externalPort = ((externalPort & 0x00ff) << 8) | ((externalPort & 0xff00) >> 8); // Byte swapped - - currentAccount_->setAccountInformation( mainMessage.getValue("MSPAuth"), - mainMessage.getValue("preferredEmail"), - mainMessage.getValue("sid"), - mainMessage.getValue("EmailEnabled") == "1", - mainMessage.getValue("ClientIP"), - externalPort, - getLocalIp() ); - } - else if ( contentType == "text/x-msmsgsinitialmdatanotification" - || contentType == "text/x-msmsgsinitialemailnotification" - || contentType == "text/x-msmsgsoimnotification" ) - { - // Parse both messages the same way, - // the x-msmsgsinitialmdatanotification message is an extended version of x-msmsgsoimnotification - // description of the fields: http://msnpiki.msnfanatic.com/index.php/MSNP13:Offline_IM - - // Parse the URL fields (msmsgsinitialmdatanotification messages). - if( message.hasField("Post-URL") ) - { - currentAccount_->setEmailUrl( message.getValue("Post-URL") ); - } - - // Parse the Mail-Data field. - QString mailDataSrc = message.getValue("Mail-Data"); - if( mailDataSrc == "too-large" ) - { - // After a certain ammount of messages, the XML is replaced with "too-large". - // Use SOAP to request the actual mail data. - if( offlineImService_ == 0 ) - { - offlineImService_ = createOfflineImService(); - } - offlineImService_->getMetaData(); - } - else - { - // Mail-Data was received directly in the message. - QDomDocument mailData; - if( ! mailData.setContent(message.getValue("Mail-Data")) ) - { - kdWarning() << "MsnNotificationConnection: Could not parse XML Mail-Data field!" << endl; - return; - } - - receivedMailData( mailData.namedItem("MD").toElement() ); - } - } - else if ( contentType == "text/x-msmsgsemailnotification" ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "Notification: An email was received" - << " from \"" << message.getValue("From") << "\"" - << " with the subject \"" << message.getValue("Subject") << "\"" - << " in the folder \"" << message.getValue("Dest-Folder") << "\"." << endl; -#endif - - // If a message delta is to the active folder, emails were moved into it, so use a negative deletion - if ( message.getValue("Dest-Folder") == "ACTIVE" ) - { - // Received in the inbox - currentAccount_->changeNoEmails( 1 ); - } - - emit newEmail( message.decodeRFC2047String( message.getValue("From").data() ), - message.decodeRFC2047String( message.getValue("Subject").data() ), - (message.getValue("Dest-Folder") == "ACTIVE"), - message.getValue("id"), - message.getValue("Message-URL"), - message.getValue("Post-URL") ); - } - else if ( contentType == "text/x-msmsgsactivemailnotification" ) - { - int messageDelta = message.getValue("Message-Delta").toInt(); - - // If a message delta is from the active folder, emails were deleted - if ( message.getValue("Src-Folder") == "ACTIVE" ) - { - currentAccount_->changeNoEmails( -1 * messageDelta ); - } - // If a message delta is to the active folder, emails were moved into it - else if ( message.getValue("Dest-Folder") == "ACTIVE" ) - { - currentAccount_->changeNoEmails( messageDelta ); - } - - // When deleting Offline-IM messages, this message contains: - // Src-Folder: .!!OIM - // Dest-Folder: .!!trAsH - // Message-Delta: - } - else if( contentType == "application/x-msmsgssystemmessage" ) - { - // This is a maintenance info message from the server. - - if( message.getValue("Type") == "1" ) - { - if( message.getValue("Arg1").toInt() < 2 ) - { - emit statusMessage( i18n( "Warning: Server closes for maintenance in 1 minute!" ), KMessInterface::TYPE_WARNING ); -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - KMessageBox::information( 0, i18n( "The MSN Server has reported it will be going down in one minute for maintenance." ) ); -#endif - } - else - { - emit statusMessage( i18n("Warning: Server closes for maintenance in %1 minutes!").arg( message.getValue("Arg1") ), KMessInterface::TYPE_WARNING ); - } - } - } - else - { - kdWarning() << "MsnNotification: Content-Type '" << contentType << "' not reconized, message ignored." << endl; - } -} - - - -// Parse a payload command -void MsnNotificationConnection::parsePayloadMessage(const QStringList &command, const QByteArray &payload) -{ - if( command[0] == "UBX" ) - { - gotUbx(command, payload); - } - else if( command[0] == "GCF" ) - { - // Ignore this - // Contains policy information, requesting clients - // to disable certain features or possibly block - // certain filenames/contents. -#ifdef KMESSDEBUG_NOTIFICATION_MESSAGES - kdDebug() << "MsnNotificationConnection::parsePayloadMessage() - Ignoring security configuration file, message dump follows." << endl << QString::fromUtf8( payload.data(), payload.size() ) << endl; -#endif - } - else if( command[0] == "NOT" ) - { - // Ignore "notification" messages coming from MSN Calendar, MSN Alerts, and MSN Mobile. -#ifdef KMESSDEBUG_NOTIFICATION_MESSAGES - kdDebug() << "MsnNotificationConnection::parsePayloadMessage() - Ignoring text event notification, message dump follows." << endl << QString::fromUtf8( payload.data(), payload.size() ) << endl; -#endif - } - else - { - kdWarning() << "MsnNotificationConnection::parsePayloadMessage: Unhandled payload command: " << command[0] << "!" - << " (message dump follows)\n" << QString::fromUtf8(payload.data(), payload.size()) << endl; - } -} - - - -/** - * @brief Internal function to add a contact to a list or group. - * - * This function is used internally by the high-level contact list methods: - * - addContactToGroup() - * - addExistingContact() - * - addNewContact() - * - allowContact() - * - blockContact() - * - moveContact() - * - removeContact() - * - unblockContact() - * - * 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 - ASSERT( list == "FL" || list == "AL" || list == "BL" || list == "RL" ); -#endif - QString arguments; - - // Check for old features from previous MSNP9 support - if( groupId == "0" ) - { - kdWarning() << "MsnNotificationConnection::putAdc: got implicit group 0!" << endl; - 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 - 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 ); - } -} - - - -// Send the version command -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" ); -} - - - -// Received the Mail-Data field over SOAP or at the notification connection. -void MsnNotificationConnection::receivedMailData( QDomElement mailData ) -{ -#ifdef KMESSTEST - ASSERT( mailData.tagName() == "MD" ); -#endif - - QDomNodeList childNodes = mailData.childNodes(); - for( uint i = 0; i < childNodes.count(); i++ ) - { - QDomElement childNode = childNodes.item(i).toElement(); - QString childName = childNode.nodeName(); - - if( childName == "E" ) - { - // Found an initial e-mail status notification. -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotification - Load initial email information." << endl; -#endif - - QDomElement inboxUnread = childNode.namedItem("IU").toElement(); - QDomElement othersUnread = childNode.namedItem("OU").toElement(); - - if( inboxUnread.isNull() || othersUnread.isNull() ) - { - kdWarning() << "MsnNotificationConnection: Reveived e-mail notification, but 'IU' and 'OU' elements are missing!" << endl; - } - -#ifdef KMESSTEST - ASSERT( ! inboxUnread.isNull() ); - ASSERT( ! othersUnread.isNull() ); -#endif - - currentAccount_->setInitialEmailInformation( inboxUnread.text().toInt(), - othersUnread.text().toInt() ); - } - else if( childName == "M" ) - { - // Using this for-loop, multiple 'M' elements are supported. - - // Extract the message ID. - QString messageId = childNode.namedItem("I").toElement().text(); - if( messageId.isEmpty() ) - { - kdWarning() << "Unable to parse Mail-Data payload, offline-im message-id not found." << endl; - return; - } - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotification - Received offline-IM notification '" << messageId << "'" << endl; -#endif - - // Create a SOAP client to request the Offline-IM - pendingOfflineImMessages_.append(messageId); - } - else if( childName == "Q" ) - { - // Not implemented - } - else - { - // Warn for unsupported tags. - kdWarning() << "Unsupported tag '" << childName << "' encountered in Mail-Data payload!" << endl; - } - } - - // Start a new client if there are pending messages, and no OfflineImService is active - if( ! pendingOfflineImMessages_.isEmpty() ) - { - // Initialize on demand - if( offlineImService_ == 0 ) - { - offlineImService_ = createOfflineImService(); - } - - // Request the first offline-im message if the current class was - // not processing already. (otherwise receivedOfflineIm() picks the next one). - if( offlineImService_->isIdle() ) - { - offlineImService_->getMessage( pendingOfflineImMessages_.first(), false ); - // Processing continues at receivedOfflineIm() - } - } -} - - - -// An Offline-IM message was downloaded -void MsnNotificationConnection::receivedOfflineIm( const QString &messageId, const QString &from, const QString &to, - const QDateTime &date, const QString &body, - const QString &runId, int sequenceNum ) -{ -#ifdef KMESSDEBUG_NOTIFICATION - kdDebug() << "MsnNotificationConnection::receivedOfflineIm: Received an offline IM message " - << "(from=" << from - << " runid=" << runId - << " sequenceNum=" << sequenceNum << ")" << endl; -#endif -#ifdef KMESSTEST - ASSERT( to == currentAccount_->getHandle() ); -#else - Q_UNUSED( to ); // Avoid compiler warning -#endif - - // Find the SOAP client to send the next request - if( KMESS_NULL(offlineImService_) ) - { - KMessageBox::error(0, i18n("KMess could not process Offline-IM messages.\n\nDetails: %1") - .arg("Lost reference to SOAP client")); - offlineImMessages_.clear(); - pendingOfflineImMessages_.clear(); // auto deletes, no longer useful - return; - } - - // Store message until all messages are received. - OfflineImMessage *offlineIm = new OfflineImMessage; - offlineIm->messageId = messageId; - offlineIm->body = body; - offlineIm->date = date; - offlineIm->from = from; - offlineIm->runId = runId; - offlineIm->sequenceNum = sequenceNum; - - // Order by date - uint insertPos = 0; - QPtrListIterator it(offlineImMessages_); - while( it.current() != 0 ) - { - if( (*it)->sequenceNum > sequenceNum ) - { -#ifdef KMESSDEBUG_NOTIFICATION - kdDebug() << "MsnNotificationConnection: inserted message '" << date << "', #" << sequenceNum << " " - << "before '" << (*it)->date << "', #" << (*it)->sequenceNum << "." << endl; -#endif - break; - } - - insertPos++; - ++it; - } - offlineImMessages_.insert( insertPos, offlineIm ); - - - // Remove from pending list - if( pendingOfflineImMessages_.remove(messageId) == 0 ) - { - kdWarning() << "MsnNotificationConnection::receivedOfflineIm: Could not remove " - << "message '" << messageId << "' from the list!" << endl; - } - - - // If there are more messages, request the next one. - if( ! pendingOfflineImMessages_.isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION - kdDebug() << "MsnNotificationConnection: Requesting the next offline-im message." << endl; -#endif - - // Not all messages are received yet, request next - offlineImService_->getMessage( pendingOfflineImMessages_.first(), false ); - return; - } - - - // All messages received, and sorted, - // display the messages in the chat windows. - -#ifdef KMESSDEBUG_NOTIFICATION - kdDebug() << "MsnNotificationConnection: All messages received, displaying messages in chat window." << endl; -#endif - - const ContactBase *contact = 0; - QString name; - QString picture; - QStringList messageIds; - - it.toFirst(); - while( it.current() != 0 ) - { - offlineIm = *it; - - messageIds.append( offlineIm->messageId ); - - // Get contact details - // Re-use previous results if message is from the same contact - if( contact == 0 || contact->getHandle() != offlineIm->from ) - { - contact = CurrentAccount::instance()->getContactByHandle(offlineIm->from); - if( contact != 0 ) - { - name = contact->getFriendlyName(); - picture = contact->getContactPicturePath(); - } - else - { - name = from; - picture = QString::null; - } - } - - // Send out the chat message - emit offlineMessage( ChatMessage( ChatMessage::TYPE_OFFLINE_INCOMING, - ChatMessage::CONTENT_MESSAGE, - true, - offlineIm->body, - offlineIm->from, - name, - picture, - QFont(), - QString::null, - offlineIm->date ) ); - ++it; - } - - // Delete all local messages - offlineImMessages_.clear(); // auto deletes - - // Delete all remove offline-IM messages - offlineImService_->deleteMessages( messageIds ); - // Keep reference so the connection is re-used for other messages. -} - - - -// Remove a contact from the contact list completely -void MsnNotificationConnection::removeContact(QString handle, bool block) -{ - Contact *contact = contactList_->getContactByHandle(handle); - if(KMESS_NULL(contact)) return; - - if(block) - { - // 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" ); - } - } - - if(contact->isFriend()) - { - // If contact was on the friends list, remove it there. To do this, first remove it from all the groups it is in. - QStringList groups = contact->getGroupIds(); - for(uint i = 0; igetGuid() + " " + groups[i] + "\r\n"); - } - putRem( handle, "FL" ); - } -} - - - -//remove a contact from a single group -void MsnNotificationConnection::removeContactFromGroup(QString handle, QString groupId) -{ - putRem( handle, "FL", groupId ); -} - - - -// Remove the current media advertising in the personal status. -void MsnNotificationConnection::removeCurrentMedia() -{ - lastCurrentMedia_ = QString::null; - putUux(); -} - - - -// Remove a group -void MsnNotificationConnection::removeGroup(QString id) -{ -#ifdef KMESSTEST - bool goodGroupId; - id.toInt( &goodGroupId ); - ASSERT( goodGroupId ); -#endif - sendCommand( "RMG", id + "\r\n" ); -} - - - -// Rename a group -void MsnNotificationConnection::renameGroup(QString id, QString newName) -{ - newName = KURL::encode_string( newName ); - sendCommand( "REG", id + " " + newName + " 0\r\n"); -} - - - -// Request a switchboard for a chat with a contact -void MsnNotificationConnection::requestSwitchboard( QString handle, ChatInformation::ConnectionType type ) -{ - // Protect again invalid uses. - if( handle.isEmpty() ) - { - kdWarning() << "MsnNotificationConnection::requestSwitchboard() - no contact handle set!." << endl; - return; - } - - // See if there is a open chat request. - QPtrListIterator it(openRequests_); - while( it.current() != 0 ) - { - if( it.current()->getContactHandle() == handle ) - { -#ifdef KMESSDEBUG_NOTIFICATION - kdDebug() << "MsnNotificationConnection::requestSwitchboard() - A pending switchboard for contact " - << handle << " is already present." << endl; -#endif - return; - } - - ++it; - } - - // Send the command - int transactionId = sendCommand( "XFR", "SB\r\n" ); - - // Store the pending request information so the return value can be handled. - openRequests_.append( new ChatInformation( this, handle, transactionId, type ) ); -} - - - -// Save contact list properties -void MsnNotificationConnection::saveProperties(KConfig *config) -{ -#ifdef KMESSDEBUG_NOTIFICATION - kdDebug() << "Notification - saving properties" << endl; -#endif - - if( ! currentAccount_->isGuestAccount() ) - { - contactList_->saveProperties( config ); - } -} - - - -// A SOAP request failed with an error message -void MsnNotificationConnection::soapRequestFailed(HttpSoapConnection *client, const QString &reason) -{ -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kdDebug() << "MsnNotificationConnection: SOAP request failed: " << reason << endl; -#endif - if(KMESS_NULL(client)) return; - - // Display an error message - const QString &clientName = client->className(); - //const QString &lastAction = client->getSoapAction(); - - if( clientName == "OfflineImService" ) - { - // No need to request more, it just failed. - offlineImMessages_.clear(); - KMessageBox::error(0, i18n("KMess could not process Offline-IM messages.\n\nDetails: %1").arg( reason )); - } - else if( clientName == "PassportLoginService" ) - { - // NOTE: a similar thing also happens in loginIncorrect(), - // but for fatal SOAP errors. - - // Show a message to the user, before deleting the object! - KMessageBox::error( 0, i18n("Authentication failed, KMess could not process the passport login.\n\nDetails: %1").arg( reason ) ); - - // Close the connection attempt. - closeConnection(); - } - else - { - KMessageBox::error(0, i18n("KMess could not access the remote webservice.\n\nDetails: %1").arg(reason)); - } -} - - - -// A SOAP request failed with an SOAP fault -void MsnNotificationConnection::soapRequestFailed(HttpSoapConnection *client, const QString &faultCode, - const QString &faultString, QDomElement /*faultNode*/) -{ - if(KMESS_NULL(client)) return; - soapRequestFailed(client, faultCode + ": " + faultString); -} - - - -// 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" ); -} - -#include "msnnotificationconnection.moc" diff --git a/kmess/network/msnswitchboardconnection.cpp b/kmess/network/msnswitchboardconnection.cpp deleted file mode 100644 index 375409f..0000000 --- a/kmess/network/msnswitchboardconnection.cpp +++ /dev/null @@ -1,2048 +0,0 @@ -/*************************************************************************** - msnswitchboardconnection.cpp - description - ------------------- - begin : Fri Jan 24 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 "msnswitchboardconnection.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../chat/chatmessage.h" -#include "../contact/contact.h" -#include "../contact/contactlist.h" -#include "../contact/invitedcontact.h" // for cast -#include "../currentaccount.h" -#include "../kmessapplication.h" -#include "../kmessdebug.h" -#include "../msnobject.h" -#include "../emoticonmanager.h" -#include "msnnotificationconnection.h" -#include "chatinformation.h" -#include "mimemessage.h" -#include "p2pmessage.h" -#include "applications/applicationlist.h" - -#ifdef KMESSDEBUG_SWITCHBOARD - #define KMESSDEBUG_SWITCHBOARD_GENERAL - #define KMESSDEBUG_SWITCHBOARD_P2P - #define KMESSDEBUG_SWITCHBOARD_EMOTICONS -// #define KMESSDEBUG_SWITCHBOARD_CONTACTS -// #define KMESSDEBUG_SWITCHBOARD_KEEPALIVE -// #define KMESSDEBUG_SWITCHBOARD_ACKS -#endif - - - -// The constructor -MsnSwitchboardConnection::MsnSwitchboardConnection() - : MsnConnection("MsnSwitchboardConnection"), - abortingApplications_(false), - acksPending_(0), - autoDeleteLater_(false), - backgroundConnection_(true), - closingConnection_(false), - connectionState_(SB_DISCONNECTED), - initialized_(false), - userStartedChat_(false), - keepAliveTimer_(0), - keepAlivesRemaining_(0) -{ - contactsInChat_.clear(); - pendingInvitations_.clear(); - pendingMessages_.setAutoDelete(true); -} - - - -// The destructor -MsnSwitchboardConnection::~MsnSwitchboardConnection() -{ -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: entering destructor" << endl; -#endif - - // Close the connection - closeConnection(); - - emit deleteMe( this ); - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "DESTROYED Switchboard" << endl; -#endif -} - - - -// Initialize or restart the last activity timer, for keep alive messages -void MsnSwitchboardConnection::activity() -{ - // Keepalives are not needed in multi-user chats. - if( ! isConnected() || contactsInChat_.count() > 1 ) - { - return; - } - - // Initialize the timer on demand. - if( keepAliveTimer_ == 0 ) - { - keepAliveTimer_ = new QTimer( this, "keepalive-msgs" ); - - // 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() ) ); - } - } - - // Reset the number of remaining keep alives. - if( ! backgroundConnection_ ) - { - // A chat connection with a contact will be kept open at least for 15 minutes. - keepAlivesRemaining_ = 18; - } - else - { - // We're much more strict when managing background connections. Make them last at most 5 minutes without activity. - keepAlivesRemaining_ = 6; - } - - // Reset the timer. - keepAliveTimer_->stop(); - keepAliveTimer_->start( 50000, false ); - -#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kdDebug() << "MsnSwitchboardConnection::activity(): " << ( backgroundConnection_ ? "Background" : "Chatting" ) - << " keepalive session restarted." << endl; -#endif -} - - - -// Clean the old unacked messages -void MsnSwitchboardConnection::cleanUnackedMessages() -{ - // Standard chat messages are sent with a 'ACK_NAK_ONLY' flag. - // When the messages is received, nothing is sent. - // When the messsage can't be delivered,. a 'NAK' is returned. - // KMess caches the chat messages for 5 minutes to show the - // "the following message could not be delivered:" messages. - // This method cleans up that cache for messages that did not receive a NAK after 5 minutes. - -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - uint mapCount = unAckedMessages_.count(); -#endif - - uint minTime = QDateTime::currentDateTime().toTime_t() - ( 5 * 60 ); - - // Find find the entries, then delete. - QValueList removeAcks; - for( QMap< int, UnAckedMessage >::iterator it = unAckedMessages_.begin(); it != unAckedMessages_.end(); ++it ) - { - // Get message info - const UnAckedMessage &unAcked = it.data(); - if( unAcked.time < minTime ) - { - // Message is expired, remove it. - removeAcks.append( it.key() ); - } - } - - - // Remove list - if( ! removeAcks.isEmpty() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - QString join; - for( QValueList::iterator it = removeAcks.begin(); it != removeAcks.end(); ++it ) - { - if( join.isEmpty() ) join += ","; - join += QString::number( *it ); - } - kdDebug() << "MsnSwitchboardConnection::cleanUnackedMessages: removing expired messages " << join << "." << endl; -#endif - - for( QValueList::iterator it = removeAcks.begin(); it != removeAcks.end(); ++it ) - { - unAckedMessages_.remove( *it ); - } - } - - -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - kdDebug() << "MsnSwitchboardConnection::cleanUnackedMessages: " - << "removed " << ( mapCount - unAckedMessages_.count() ) << " messages, " - << "kept " << unAckedMessages_.count() << " messages until those expire." << endl; -#endif -} - - - -// Close the connection -void MsnSwitchboardConnection::closeConnection() -{ - // If there are still contacts, it means contactLeft() was not initiated, - // and the user closed the chat window earlier. - if( contactsInChat_.count() > 0 ) - { - // Keep a default for re-connecting. - lastContact_ = contactsInChat_[0]; - - // Make sure all contacts are removed, which will also abort their applications in ApplicationList. - QValueList::iterator it; - for( it = contactsInChat_.begin(); it != contactsInChat_.end(); ++it ) - { - ContactBase *contact = currentAccount_->getContactByHandle(*it); - if(! KMESS_NULL(contact)) - { - contact->removeSwitchboardConnection(this, true); // could cause applications to abort. - } - } - - contactsInChat_.clear(); - } - - - if( isConnected() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard::closeConnection: still connected, sending BYE." << endl; -#endif - // Send a "bye" - sendCommand( "BYE", "\r\n"); - disconnectFromServer(); - } - - // Reset state, so messages are queued when the connection - // is back up but the contact is not yet in the chat. - connectionState_ = SB_DISCONNECTED; - closingConnection_ = false; - - // Also stop the activity timer - if( keepAliveTimer_ != 0 ) - { - keepAliveTimer_->stop(); - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::closeConnection(): Session ended." << endl; -#endif -} - - - -// Clean up, close the connection, destroy this object -void MsnSwitchboardConnection::closeConnectionLater(bool autoDelete) -{ -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard::closeConnectionLater(): aborting applications nicely and closing connection." << endl; -#endif - - ContactBase *contact; - bool hasAbortingApplications = false; - closingConnection_ = true; - - // this method is called when the user wants to close the chat window (allowing everything to close nicely). - // If there are no contacts in the chat, we can close directly. - if( ! contactsInChat_.isEmpty() ) - { - // There are still contacts. - // Verify whether they still have applications running. - // Allow those applications to abort, and report back when the connection can be closed. - QPtrList contactsToRemove; - for( QStringList::Iterator it = contactsInChat_.begin(); it != contactsInChat_.end(); ++it ) - { - contact = currentAccount_->getContactByHandle(*it); - if( ! KMESS_NULL(contact) && contact->hasApplicationList() ) - { - ApplicationList *appList = contact->getApplicationList(); - bool aborting = appList->contactLeavingChat(this, true); - if( aborting ) - { - connect(appList, SIGNAL( applicationsAborted(const QString&) ), - this, SLOT ( slotApplicationsAborted(const QString&) )); - hasAbortingApplications = true; - } - else - { - contactsToRemove.append(contact); - } - } - } - - // All contacts that don't need any aborting are removed now (not in the iterator loop) - // The remaining ones are removed in slotApplicationsAborted(). - for( QPtrList::Iterator it = contactsToRemove.begin(); it != contactsToRemove.end(); ++it) - { - contact = *it; - if( ! KMESS_NULL(contact) ) - { - contactsInChat_.remove( contact->getHandle() ); - contact->removeSwitchboardConnection( this, true ); - } - } - } - - - if( hasAbortingApplications ) - { - // Wait for all applications to abort. - // Set variables to use in slotApplicationsAborted. - abortingApplications_ = true; - autoDeleteLater_ = autoDelete; - } - else - { - // No applications are aborting. - // Close the connection directly - closeConnection(); - - // Automatically delete ourself - if(autoDelete) - { - this->deleteLater(); - } - } -} - - - -// The socket connected, so send the version command. -void MsnSwitchboardConnection::connectionSuccess() -{ -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Connected to server, sending authentication." << endl; -#endif -#ifdef KMESSTEST - ASSERT( connectionState_ == SB_CONNECTING || connectionState_ == SB_REQUESTING_CHAT ); -#endif - - connectionState_ = SB_AUTHORIZING; - - if( userStartedChat_ ) - { // This is a user-initiated chat - // Set the usr information to the server. - sendCommand( "USR", currentAccount_->getHandle() + " " + authorization_ + "\r\n" ); - } - else - { // This is a contact-initiated chat - // Answer the chat with the authorization - sendCommand( "ANS", currentAccount_->getHandle() + " " + authorization_ + " " + chatId_ + "\r\n" ); - } -} - - - -// Do what's required when a contact joined -void MsnSwitchboardConnection::contactJoined(const QString& handle, const QString& friendlyName, const uint capabilities) -{ -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Contact " << handle << " has joined." << endl; -#endif - - // Update states - connectionState_ = SB_CHAT_STARTED; - - // Add the contact to the list if the contact isn't there already - if ( ! contactsInChat_.contains( handle ) ) - { - contactsInChat_.append( handle ); - } - - // Indicate the contact is active in this session. - ContactBase *contact = currentAccount_->getContactByHandle(handle); - if( contact == 0 ) - { - contact = currentAccount_->addInvitedContact(handle, friendlyName, capabilities); - } - - // Add switchboard connection to the contact. - if( ! KMESS_NULL(contact) ) - { - contact->addSwitchboardConnection(this); - } - - // Inform the contact about our version - // Also do this when the contact left and re-entered the chat, it might connect with a different client. - sendClientCaps(); - - // Send all pending messages - sendPendingMessages(); - - // Notify the join to the Chat Master. - emit contactJoinedChat( handle, friendlyName ); -} - - - -// Remove a contact from the list of contacts in the chat -void MsnSwitchboardConnection::contactLeft(const QString& handle) -{ -#ifdef KMESSTEST - ASSERT( connectionState_ == SB_CHAT_STARTED ); -#endif -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Contact " << handle << " has left." << endl; -#endif - - QValueList::iterator it; - - // Check if the contact is in the chat.. - if( contactsInChat_.contains( handle ) ) - { - // Find the contact in the chat - for( it = contactsInChat_.begin(); it != contactsInChat_.end(); ++it ) - { - if( (*it) == handle ) - { - // Remove from the chat - contactsInChat_.remove( it ); - break; - } - } - } - - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection: emitting that '" << handle << "' left chat." << endl; -#endif - - // Indicate the contact is not active anymore in this session. - ContactBase *contact = currentAccount_->getContactByHandle(handle); - if(! KMESS_NULL(contact)) - { - contact->removeSwitchboardConnection(this, false); - } - - // 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 ); - } -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - else - { - kdDebug() << "MsnSwitchboardConnection::contactLeft() - Not sending contactLeftChat() signal for background chats." << endl; - } -#endif - - // Check if all contacts went away - if( contactsInChat_.count() == 0 ) - { - // Store contact to have a default when re-connecting. - lastContact_ = handle; - - // The last contact left the chat. - connectionState_ = SB_CONTACTS_LEFT; - - // NOTE: Behavior changed since WLM 8+, emoticon data must be sent every time. - // Reset the list of sent emoticons, so they will be sent again if the chat restarts - // sentEmoticons_.clear(); - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection: last contact left chat, closing connection." << endl; -#endif - // No contacts left in the chat, close connection since it is of little use. - // - the connection can still be used to 'CAL' the last contact again - // - when the contact resumes the connection, it uses a different server, - // so startChat() needs to reconnect. - closeConnection(); - } -} - - - -// Convert an html format (#RRGGBB) color to an msn format (BBGGRR) color -void MsnSwitchboardConnection::convertHtmlColorToMsnColor(QString &color) const -{ -#ifdef KMESSTEST - 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); - - // Reassemble the color - if ( blue != "00" ) - { - color = blue + green + red; - } - else if ( green != "00" ) - { - color = green + red; - } - else if ( red != "00" ) - { - color = red; - } - else - { - color = "0"; - } -#ifdef KMESSTEST - ASSERT( color.length() < 7 ); -#endif -} - - - -// Convert and msn format color (BBGGRR) to an html format (#RRGGBB) color -void MsnSwitchboardConnection::convertMsnColorToHtmlColor(QString &color) const -{ -#ifdef KMESSTEST - ASSERT( color.length() < 7 ); -#endif - if ( color == "0" ) - { - color = "#000000"; - } - else - { - // Fill the color out to six characters - while ( color.length() < 6 ) - { - color = "0" + color; - } - // Get the color components - QString blue = color.mid(0, 2); - QString green = color.mid(2, 2); - QString red = color.mid(4, 2); - // Reassemble the components - color = "#" + red + green + blue; - } -#ifdef KMESSTEST - ASSERT( color.length() == 7 ); -#endif -} - - - -// Make a list of the contacts in the chat -QStringList MsnSwitchboardConnection::getContactsInChat() const -{ - if( contactsInChat_.isEmpty() ) - { - return QStringList( lastContact_ ); - } - - // Note this object may contain no contacts at all, and lastContact_ has the last one to re-invite. - return contactsInChat_; -} - - - -// Get a font from the message -void MsnSwitchboardConnection::getFontFromMessageFormat(QFont &font, const MimeMessage& message) const -{ - QString family = message.getSubValue("X-MMS-IM-Format", "FN"); - QString effects = message.getSubValue("X-MMS-IM-Format", "EF"); - family = KURL::decode_string( family ); - - font.setFamily( family ); - if ( effects.contains("B") ) - font.setBold(true); - else - font.setBold(false); - if ( effects.contains("I") ) - font.setItalic(true); - else - font.setItalic(false); - if ( effects.contains("U") ) - font.setUnderline(true); - else - font.setUnderline(false); -} - - - -// Get an html font color from the message -void MsnSwitchboardConnection::getFontColorFromMessageFormat(QString &color, const MimeMessage& message) const -{ - color = message.getSubValue("X-MMS-IM-Format", "CO"); - convertMsnColorToHtmlColor( color ); -} - - - -// Return the first contact the chat started with. -const QString & MsnSwitchboardConnection::getFirstContact() const -{ - return firstContact_; -} - - -// Return the last contact who left the chat. -const QString & MsnSwitchboardConnection::getLastContact() const -{ - return lastContact_; -} - - - -// Return whether the user started the chat -bool MsnSwitchboardConnection::getUserStartedChat() const -{ - return userStartedChat_; -} - - - -// Received a positive delivery message. -void MsnSwitchboardConnection::gotAck(const QStringList& command) -{ -#ifdef KMESSTEST - ASSERT( unAckedMessages_.count() > 0 ); -#endif - - // Remove the ACKed message from the queue. - int ackNumber = command[1].toUInt(); - if( ! unAckedMessages_.contains(ackNumber) ) - { - kdWarning() << "MsnSwitchboardConnection: Received an ACK message but message is not in sent queue." << endl; - return; - } - - unAckedMessages_.remove( ackNumber ); - acksPending_--; - -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - kdDebug() << "MsnSwitchboardConnection: Received one ACK message, still " << acksPending_ << " unacked." << endl; -#endif - - // Signal that the switchboard is no longer busy and can accept new application messages. - if( acksPending_ < 2 ) - { - emit readySend(); - } -} - - - -// Received notification that a contact is no longer in session. -void MsnSwitchboardConnection::gotBye(const QStringList& command) -{ - contactLeft( command[1].lower() ); -} - - - -// Received the initial roster information for new contacts joining a session. -void MsnSwitchboardConnection::gotIro(const QStringList& command) -{ - QString handle = command[4].lower(); - QString friendlyName = KURL::decode_string( command[5] ); - uint capabilities = command[6].toUInt(); - - QString altFriendlyName = currentAccount_->getContactFriendlyNameByHandle( handle ); - if( ! altFriendlyName.isEmpty() ) - { - friendlyName = altFriendlyName; - } - - contactJoined( handle, friendlyName, capabilities ); -} - - - -// Received notification of a new client in the session. -void MsnSwitchboardConnection::gotJoi(const QStringList& command) -{ - QString handle = command[1].lower(); - QString friendlyName = KURL::decode_string( command[2] ); - uint capabilities = command[3].toUInt(); - - QString altFriendlyName = currentAccount_->getContactFriendlyNameByHandle( handle ); - if( ! altFriendlyName.isEmpty() ) - { - friendlyName = altFriendlyName; - } - - contactJoined( handle, friendlyName, capabilities ); -} - - - -// Received a negative acknowledgement of the receipt of a message. -void MsnSwitchboardConnection::gotNak(const QStringList& command) -{ -#ifdef KMESSTEST - ASSERT( unAckedMessages_.count() > 0 ); -#endif - - // Check if the ACK exists in the map. - int ackNumber = command[1].toUInt(); - if( ! unAckedMessages_.contains(ackNumber) ) - { - kdWarning() << "MsnSwitchboardConnection: Received a NAK message but message is not in sent queue." << endl; - return; - } - - // Get message from queue and remove it. - UnAckedMessage unAcked = unAckedMessages_[ackNumber]; - unAckedMessages_.remove(ackNumber); - acksPending_--; - -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - kdDebug() << "MsnSwitchboardConnection: Received one NAK message, still " << acksPending_ << " unacked." << endl; -#endif - - - - // Signal that the switchboard is no longer busy and can accept new application messages. - if( acksPending_ < 2 ) - { - emit readySend(); - } - - // Do not notify errors for background connections - if( backgroundConnection_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - kdDebug() << "MsnSwitchboardConnection::gotNak() - Not displaying undelivered message for background chats." << endl; -#endif - return; - } - - QString sender = unAcked.message.getValue( "To" ); - if( sender.isNull() ) - { - sender = unAcked.message.getValue( "P2P-Dest" ); - if( sender.isNull() ) - { - return; - } - } - - ContactBase *contact = CurrentAccount::instance()->getContactByHandle( sender ); - if( contact == 0 ) - { - 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() ); -} - - - -// Received notification of the termination of a client-server session. -void MsnSwitchboardConnection::gotOut(const QStringList& /*command*/) -{ -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard - got OUT." << endl; -#endif - - closeConnection(); -} - - - -// Received a client-server authentication message. -void MsnSwitchboardConnection::gotUsr(const QStringList& command) -{ -#ifdef KMESSTEST - ASSERT( ! firstContact_.isEmpty() ); - ASSERT( connectionState_ == SB_AUTHORIZING ); -#endif - - // This should just be a confirmation - if ( command[2] != "OK" ) - { - kdWarning() << "MsnSwitchboardConnection: Switchboard authentication failed" << endl; - return; - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard - authentication successful, inviting " << firstContact_ << endl; -#endif - - connectionState_ = SB_INVITING_CONTACTS; - - // Now call the other user to the conversation. - sendCommand( "CAL", firstContact_ + "\r\n" ); - - // If there are other pending invites, send them now - if( pendingInvitations_.count() > 0 ) - { - for( QStringList::Iterator it = pendingInvitations_.begin(); it != pendingInvitations_.end(); ++it ) - { - inviteContact( *it ); - pendingInvitations_.remove( *it ); - } - } -} - - - -// Initialize the object -bool MsnSwitchboardConnection::initialize() -{ - if ( initialized_ ) - { - kdDebug() << "Switchboard Connection already initialized!" << endl; - return false; - } - if ( !MsnConnection::initialize() ) - { - kdDebug() << "Switchboard Connection: Couldn't initialize base class." << endl; - return false; - } - - initialized_ = true; - return true; -} - - - -// Invite a contact into the chat -void MsnSwitchboardConnection::inviteContact( QString handle ) -{ - if( handle.isEmpty() ) - { - return; - } - - if( ! isConnected() ) - { - // Request a new switchboard session - emit requestNewSwitchboard( lastContact_ ); - // Add this contact to the list of pending invitations - pendingInvitations_.append( lastContact_ ); - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::inviteContact() - Added pending invitation for contact " << handle << endl; -#endif - - return; - } - - sendCommand("CAL", handle + "\r\n"); - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::inviteContact() - Invited contact " << handle << endl; -#endif -} - - - -// Check if a certain contact is in the chat -bool MsnSwitchboardConnection::isContactInChat( const QString& handle ) const -{ -#ifdef KMESSDEBUG_SWITCHBOARD_CONTACTS - kdDebug() << "MsnSwitchboardConnection::isContactInChat() - Checking handle " << handle << " - participants are: " << contactsInChat_.join(",") << " - lastContact: " << lastContact_ << endl; - kdDebug() << "MsnSwitchboardConnection::isContactInChat() - returning " << ( ( (contactsInChat_.count() == 0) ? (lastContact_ == handle) : (contactsInChat_.contains( handle )) ) ? "true" : "false" ) << endl; -#endif - - return ( (contactsInChat_.count() == 0) ? (lastContact_ == handle) : (contactsInChat_.contains( handle )) ); -} - - - -// Check whether the switchboard is buzy (has too many pending messages) -bool MsnSwitchboardConnection::isBusy() const -{ - // unAckedMessages_ also contains messages what have a "NAK_ONLY" flag. - // keep a special variable that only lists the normal ACKs. - return acksPending_ > 3; -} - - - -// Check if all contacts left -bool MsnSwitchboardConnection::isEmpty() const -{ - return contactsInChat_.empty(); -} - - - -// Check if only the given contact is in the chat -bool MsnSwitchboardConnection::isExclusiveChatWithContact(const QString& handle) const -{ -#ifdef KMESSDEBUG_SWITCHBOARD_CONTACTS - kdDebug() << "MsnSwitchboardConnection::isExclusiveChatWithContact() - Checking if chat is exclusive with " << handle - << " (contacts=" << contactsInChat_.join(",") << ", lastContact=" << lastContact_ << ")" << endl; -#endif - - // 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); - -#ifdef KMESSDEBUG_SWITCHBOARD_CONTACTS - kdDebug() << "MsnSwitchboardConnection::isExclusiveChatWithContact() - returning " << ( result ? "true" : "false" ) << endl; -#endif - - return result; -} - - - -// Check whether the switchboard is currently not connected, nor trying to connect. -bool MsnSwitchboardConnection::isInactive() const -{ - return connectionState_ == SB_DISCONNECTED; -} - - - -// Parse a regular command -void MsnSwitchboardConnection::parseCommand(const QStringList& command) -{ - if ( command[0] == "ACK" ) - { - gotAck( command ); - } - else if ( command[0] == "ANS" ) - { - // Do nothing. - } - else if ( command[0] == "BYE" ) - { - gotBye( command ); - } - else if ( command[0] == "CAL" ) - { - // Do nothing - } - else if ( command[0] == "IRO" ) - { - gotIro( command ); - } - else if ( command[0] == "JOI" ) - { - gotJoi( command ); - } - else if ( command[0] == "NAK" ) - { - gotNak( command ); - } - else if ( command[0] == "OUT" ) - { - gotOut( command ); - } - else if ( command[0] == "USR" ) - { - 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 - kdDebug() << "MsnSwitchboardConnection::parseCommand() - ignoring message 'the person is offline or invisible' in background chats." << endl; -#endif - return; - } - - emit chatMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_NOTICE, - true, - i18n("This person is offline or invisible."), - QString::null ) ); - } - else if ( command[0] == "282" ) - { - // Got it once when I sent a bad P2P message or something. - kdDebug() << "Switchboard got unknown 282 error response." << endl; - } - else if ( command[0] == "911" ) - { - kdDebug() << "Switchboard authentication failed." << endl; - } - else - { - kdDebug() << "Switchboard got unhandled command " << command[0] << " (contacts=" << contactsInChat_ << ")." << endl; - } -} - - - -// Parse a datacast message (e.g. nudge or voice clip) -void MsnSwitchboardConnection::parseDatacastMessage(const QString &contactHandle, const MimeMessage &message) -{ - int dataType = message.getValue("ID").toInt(); - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Parsing datacast message (ID=" << dataType << ")" << endl; -#endif - - // Get the contact - ContactBase *contact = CurrentAccount::instance()->getContactByHandle( contactHandle ); - if( KMESS_NULL(contact) ) return; - - QString contactFriendlyName = contact->getFriendlyName(); - - // Request a chat window when the chat is still in the background. - if( backgroundConnection_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: chat is still in the background, requesting chat window." << endl; -#endif - backgroundConnection_ = false; - emit requestChatWindow( this ); - emit contactJoinedChat( contactHandle, contactFriendlyName ); - } - - // Each ID has a different meaning. - if(dataType == 1) - { - // A nudge - emit receivedNudge(contactHandle); - } - else if(dataType == 2) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Datacast message contains an msn object (wink), signalling ChatMaster to download it." << endl; -#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 - kdDebug() << "SwitchBoard got unhandled datacast message type (ID=" << dataType << " contact=" << contactHandle << ")." << endl; - 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 ) ); - } -} - - - -// Parse an emoticon message -void MsnSwitchboardConnection::parseEmoticonMessage(const QString &contactHandle, const QString &messageBody) -{ -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::parseEmoticonMessage() - Received custom emoticon list for " << contactHandle << "." << endl; -#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_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::parseEmoticonMessage() - Chat is still in the background, requesting chat window." << endl; -#endif - backgroundConnection_ = false; - emit requestChatWindow( this ); - emit contactJoinedChat( contact->getHandle(), contact->getFriendlyName() ); - } - - // 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______| - - // Extract emoticon definitions and msn objects - QStringList msnObjects = QStringList::split("\t", messageBody.stripWhiteSpace(), false); - for( QStringList::Iterator it = msnObjects.begin(); it != msnObjects.end(); ++it ) - { - emoticonCode = *it; - - ++it; - - // If the number of fields is odd, this custom emoticons list contains errors. - if( it == msnObjects.end() ) - { - kdWarning() << "MsnSwitchboardConnection::parseEmoticonMessage() - Emoticon message has an unexpected format: odd number of fields! " - << "(ignoring msnobject, contact=" << contactHandle << ")." << endl; - break; - } - - msnObjectData = *it; - - // Perform a syntax check. - if( msnObjectData.length() < 20 ) - { - kdWarning() << "MsnSwitchboardConnection::parseEmoticonMessage() - Emoticon message has an unexpected format " - << "(ignoring msnobject, contact=" << contactHandle << ", message='" << msnObjectData << "')." << endl; - continue; - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::parseEmoticonMessage() - Adding emoticon code " << emoticonCode << "." << endl; -#endif - - // Store the emoticon code for the contact. - MsnObject msnObject(msnObjectData); - contact->addEmoticonDefinition(emoticonCode, msnObject.getDataHash()); - - // Ask the ChatMaster to download emoticons. - emit gotMsnObject(msnObjectData, contactHandle); - } -} - - - -// Parse a message command -void MsnSwitchboardConnection::parseMessage(const QStringList& command, const MimeMessage &message) -{ - // Get the message type from the head - QString contentType = message.getSubValue( "Content-Type" ); -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Received mime message of type '" << contentType << "'." << endl; -#endif - - // Get the sender's handle and friendly name - QString contactHandle = command[1]; - QString friendlyName; - QString contactPicture; - - // Get the contact details - ContactBase *contact = currentAccount_->getContactByHandle( contactHandle ); - if( contact == 0 ) - { - // There was no current friendly name, so get one from the message - friendlyName = KURL::decode_string( command[2] ); - } - else - { - // get name from contact - friendlyName = contact->getFriendlyName(); - contactPicture = contact->getContactPicturePath(); - } - - - // Link a chat window to this switchboard if it's needed. - 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" ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: chat is still in the background, requesting chat window." << endl; -#endif - backgroundConnection_ = false; - emit requestChatWindow( this ); - emit contactJoinedChat( contactHandle, friendlyName ); - } - } - - - if( contentType == "text/plain" ) - { - // This is a regular text message to the user - QFont font; - QString color; - if( message.hasField( "P4-Context" ) ) - { - // 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 friendlyNameP4 = message.getValue( "P4-Context" ); - if( ! friendlyNameP4.isEmpty() ) - { - friendlyName = friendlyNameP4; - } - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Got message by " << contactHandle << ": " << message.getBody() << endl; -#endif - - // Get the font and color from the format string - getFontFromMessageFormat ( font, message ); - getFontColorFromMessageFormat( color, message ); - - // Send the chat message - emit chatMessage( ChatMessage( ChatMessage::TYPE_INCOMING, - ChatMessage::CONTENT_MESSAGE, - true, - message.getBody(), - contactHandle, - friendlyName, - contactPicture, - font, - color ) ); - } - else if( contentType == "text/x-msmsgscontrol" ) - { - // Avoid crashes due race conditions - if( closingConnection_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Not emitting typing message because switchboard is closing." << endl; -#endif - return; - } - - // The contact informs it's typing a normal message - QString typingUser = message.getValue( "TypingUser" ); - // Check the contact list for a more current friendly name - QString typingName = currentAccount_->getContactFriendlyNameByHandle( typingUser ); - if( typingName.isEmpty() ) - { - typingName = typingUser; - } - emit contactTyping( typingUser, typingName ); - } - else if( contentType == "text/x-msmsgsinvite" ) - { - // This is a mime application message, the old format for invitations. - // Extract the actual MIME message from the body of the Mime container. - MimeMessage subMessage( message.getBody() ); - emit gotMessage( subMessage, contactHandle ); - } - else if( contentType == "application/x-msnmsgrp2p" ) - { - // This is an p2p message, the new format for invitations. - // First see if the message was direct to us (the switchboad is a "broadcast" channel for all messages) - 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 (also has To: set) - // Also observed with amsn 0.97 once. - kdWarning() << "SwitchBoard: Unable to handle P2P message, P2P-Dest field is empty " - "(contact=" << contactHandle << ")." << endl; - return; - } - else if(p2pDest != currentAccount_->getHandle()) - { - // Ignore messages ment for other contacts -#ifdef KMESSDEBUG_SWITCHBOARD_P2P - kdDebug() << "SwitchBoard: Received a P2P message, but it's for '" << p2pDest << "'." << endl; -#endif - return; - } - - // 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() ); - emit gotMessage( subMessage, contactHandle ); - } - else if( contentType == "text/x-mms-emoticon" || contentType == "text/x-mms-animemoticon" ) - { - // Message contains the MSN objects for the emoticons. - parseEmoticonMessage( contactHandle, message.getBody() ); - } - 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() ); - parseDatacastMessage( contactHandle, subMessage ); - } - else if( contentType == "text/x-clientcaps" ) - { - // This is a message exchanged by a lot of third party clients. -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Got third-party client info message. (message dump follows)" << endl - << message.getMessage().data() << endl; - - // Retrieve client identifier from message and store in Contact Extension - QString messageData = message.getMessage().data(); - int start = messageData.find("Client-Name: "); - int end = messageData.find("\r\n", start); - - // cut message parts we don't need - messageData = messageData.mid(start, end-start); - messageData = messageData.section(' ', 1); - - // store in contact extension - Contact *contact = currentAccount_->getContactList()->getContactByHandle( contactHandle ); - if( contact != 0 ) - { - contact->getExtension()->setClientName( messageData ); - } - - // An example of an x-clientcaps message: - // Client-Name: Client-Name/Version-Major.Version-Minor - // Chat-Logging: Y (Nonsecure logging is enabled), S (log is encrypted), N (client is not logging conversation) -#endif - } - else if( contentType == "text/x-keepalive" ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kdDebug() << "Switchboard: Keep alive message from " << contactHandle << "." << endl; -#endif - } - else - { - kdDebug() << "SwitchBoard got unhandled message type (type=" << contentType << " contact=" << contactHandle << ")." << endl; - } - - // Messages which are part of the switchboard session management, will not be considered "activity" - if( contentType != "text/x-clientcaps" ) - { - // Signal presence of activity - activity(); - } -} - - - -// Parse a payload command -void MsnSwitchboardConnection::parsePayloadMessage(const QStringList &command, const QByteArray &/*payload*/) -{ - // Switchboard has no payload commands yet. - // This method is added because the functionality is generic in the base class. - kdWarning() << "MsnSwitchboardConnection::parsePayloadMessage: Unhandled payload command: " << command[0] << "!" << endl; -} - - - -// Deliver a message for an P2PApplication object. -void MsnSwitchboardConnection::sendApplicationMessage( const MimeMessage &message ) -{ -#ifdef KMESSTEST - ASSERT( ! isBusy() ); -#endif - - // Check which type of message is sent - QString contentType = message.getValue("Content-Type"); - if( contentType == "application/x-msnmsgrp2p" ) - { - // Message contains binary P2P message data -#ifdef KMESSTEST - ASSERT( message.getBinaryBody().size() >= 52 ); // header is 48, footer is 4 -#endif - - sendMimeMessageWhenReady( ACK_ALWAYS_P2P, message ); - } - else if( contentType == "text/x-msmsgsinvite" - || contentType.section(";", 0, 0) == "text/x-msmsgsinvite" ) // for ; charset= suffix - { - // Message contains old-style invitation fields. - sendMimeMessageWhenReady( ACK_NAK_ONLY, message ); - } - else - { - kdWarning() << "MsnSwitchboardConnection::sendApplicationMessage: unknown message type " - "'" << contentType << "', can't send message!" << endl; - return; - } - - // Signal the presence of activity on this switchboard - activity(); -} - - -/** - * Send a message to the contact(s) - * - * 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) -{ - if ( currentAccount_ == 0 ) - { - kdWarning() << "MsnSwitchboardConnection::sendChatMessage - currentAccount_ is null!" << endl; - return; - } - - // Check if any custom emoticon is being sent in the message. - // This has to be sent first so the receiving client will be aware that - // 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 ); - - // We'll loop until we reach the end of the string or there are no more emoticons to parse - if( ! emoticonRegExp.isEmpty() ) - { - while( true ) - { - // First find if there's any custom emoticon - matchStart = emoticonRegExp.search( text, lastPos ); - if( matchStart == -1 ) - { - break; - } - - // 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 ) ) - { - continue; - } - else - { - sentEmoticons_.append( code ); - } - */ - - // No match? Strange.. but go on anyways - if( pictureFile.isEmpty() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_EMOTICONS - kdDebug() << "MsnSwitchboardConnection::sendChatMessage() - Custom emoticon '" << code << "' not found!" << endl; -#endif - - continue; - } - -#ifdef KMESSDEBUG_SWITCHBOARD_EMOTICONS - kdDebug() << "MsnSwitchboardConnection::sendChatMessage() - Found custom emoticon '" << code << "' which file is '" - << ( emoticonThemePath + pictureFile ) << "'." << endl; -#endif - - QFile iFile( emoticonThemePath + pictureFile ); - if( ! iFile.open( IO_ReadOnly ) ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_EMOTICONS - kdDebug() << "MsnSwitchboardConnection::sendChatMessage() - Unable to read picture '" << pictureFile << "'!" << endl; -#endif - iFile.close(); - continue; - } - - // Read the file and create an MSNObject of the emoticon - QByteArray data = iFile.readAll(); - iFile.close(); - MsnObject test( currentAccount_->getHandle(), pictureFile, QString::null, MsnObject::EMOTICON, data ); - - // Only divide items between each other - if( ! emoticonObjects.isEmpty() ) - { - emoticonObjects += "\t"; - } - - emoticonObjects += code + "\t" + test.objectString(); - } - } - - // Don't send the message if there is no emoticon to send - if( ! emoticonObjects.isEmpty() ) - { - MimeMessage emoticonMessage; - emoticonMessage.addField("MIME-Version", "1.0"); - emoticonMessage.addField("Content-Type", "text/x-mms-emoticon"); - emoticonMessage.setBody( emoticonObjects ); - - sendMimeMessageWhenReady( ACK_NAK_ONLY, emoticonMessage ); - } - - // Then send the real text message - - // Get parameters - QFont font = currentAccount_->getFont(); - QString fontFamily = font.family(); - QString color = currentAccount_->getFontColor(); - - // Convert data - fontFamily = KURL::encode_string( fontFamily ); - convertHtmlColorToMsnColor( color ); - - // Determine effects - 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" : ""; - - // Create the message - MimeMessage message; - message.addField("MIME-Version", "1.0"); - message.addField("Content-Type", "text/plain; charset=UTF-8"); - message.addField("X-MMS-IM-Format", "FN=" + fontFamily + "; EF=" + effects + "; CO=" + color + "; CS=0; PF=0" + rtl); - message.setBody(text); - - // Send the message - sendMimeMessageWhenReady(ACK_NAK_ONLY, message); - - // Signal the presence of activity on this switchboard - activity(); -} - - - -// Send a client caps message to the contacts -void MsnSwitchboardConnection::sendClientCaps() -{ - // All third-party clients send this message. - // It also makes debugging easier. - MimeMessage message; - message.addField("MIME-Version", "1.0"); - message.addField("Content-Type", "text/x-clientcaps"); - message.setBody( "Client-Name: KMess/" + kapp->aboutData()->version() + "\r\n" ); - sendMimeMessageWhenReady( ACK_NONE, message ); -} - - - -// Send a "ping" to avoid MSN closing the connection -void MsnSwitchboardConnection::sendKeepAlive() -{ - // Stop the keepalive sending if it's passed too much time - if( keepAlivesRemaining_ < 1 ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kdDebug() << "MsnSwitchboardConnection::sendKeepAlive(): Session has expired, letting it timeout." << endl; -#endif - - if( keepAliveTimer_ != 0 ) - { - keepAliveTimer_->stop(); - } - - return; - } - else - { - keepAlivesRemaining_--; - } - - // Sending messages to keep a connection open makes no sense if there's no connection, isn't it - if( ! isConnected() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kdDebug() << "MsnSwitchboardConnection::sendKeepAlive(): Cannot send keep alive while disconnected!" << endl; -#endif - return; - } - - // Also check if there actually is a receiver for the message - if( contactsInChat_.isEmpty() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kdDebug() << "MsnSwitchboardConnection::sendKeepAlive(): Not sending keep alive, no contacts in chat." << endl; -#endif - return; - } - -#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kdDebug() << "MsnSwitchboardConnection::sendKeepAlive(): Sending a keep alive message (" << keepAlivesRemaining_ << " left before close)." << endl; -#endif - - // Build the keepalive message - MimeMessage message; - message.addField( "MIME-Version", "1.0" ); - message.addField( "Content-Type", "text/x-keepalive" ); - - sendMimeMessage( ACK_NONE, message ); -} - - - -// Send a message to the contact(s), or leave it pending until a connection is restored -void MsnSwitchboardConnection::sendMimeMessageWhenReady(AckType ackType, const MimeMessage &message) -{ - // If the connection is ready, send the message - if( isConnected() && ! contactsInChat_.empty() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Sending mime message of type '" << message.getValue("Content-Type") << "'." << endl; -#endif -#ifdef KMESSTEST - ASSERT( connectionState_ == SB_CHAT_STARTED ); -#endif - - // Send and store for acknowledgement. - int ack = sendMimeMessage(ackType, message); - storeMessageForAcknowledgement(ack, ackType, message); - - // Clean cache of old entries, it does not need to run with every storeMessage..() call. - cleanUnackedMessages(); - } - else - { - // otherwise, store as pending message -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Chat is not active, queueing message to send later." << endl; -#endif - - // Store the message - pendingMessages_.append( new QPair(ackType, message) ); - - - // See what needs to be done to restore the chat. - if( ! isConnected() ) - { - // 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 ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Already waiting for MsnNotificationConnection to request a new chat." << endl; -#endif - } - else if( connectionState_ == SB_CONNECTING ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Already waiting for connection to establish..." << endl; -#endif - } - else if( connectionState_ == SB_CHAT_STARTED ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Contact disconnected while joining, delivering error message." << endl; -#endif - // Do not notify errors for background connections - if( backgroundConnection_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - kdDebug() << "MsnSwitchboardConnection::sendMimeMessageWhenReady() - Not displaying undelivered message for background chats." << endl; -#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!").arg( message.getBody() ), - message.getValue( "To" ) ) ); - } - } - else - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Connection is closed, requesting a new chat from the notification server..." << endl; -#endif -#ifdef KMESSTEST - 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 - kdDebug() << "Switchboard: Already waiting for the connection to authorize..." << endl; -#endif - } - else if( connectionState_ == SB_INVITING_CONTACTS ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Already waiting for contacts to join the chat..." << endl; -#endif - } - else - { -#ifdef KMESSTEST - ASSERT( connectionState_ == SB_CONTACTS_LEFT ); -#endif - if( contactsInChat_.count() > 1 ) - { - kdWarning() << "Switchboard failed to re-connect; multiple contacts are left in chat!" << endl; - return; - } - - if( message.hasField("P2P-Dest") && message.getValue("P2P-Dest") != lastContact_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: All contacts left the chat, calling the contact from the P2P-Dest field." << endl; -#endif - connectionState_ = SB_INVITING_CONTACTS; - sendCommand( "CAL", message.getValue("P2P-Dest") + "\r\n"); - } - else - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: All contacts left the chat, calling the last contact left." << endl; -#endif - - if( lastContact_.isEmpty() ) - { - kdWarning() << "Switchboard failed to re-connect; no contact left to invite!" << endl; - return; - } - - connectionState_ = SB_INVITING_CONTACTS; - sendCommand( "CAL", lastContact_ + "\r\n"); - } - } - } - } -} - - - -// Send messages that weren't sent because a contact had to be re-called -void MsnSwitchboardConnection::sendPendingMessages() -{ -#ifdef KMESSTEST - ASSERT( connectionState_ == SB_CHAT_STARTED ); -#endif - - QPair *pendingMessage; - - // A contact should be connected already, but check to make sure - // The switchboard should still be (re-)initializing - if( contactsInChat_.isEmpty() ) - { - kdWarning() << "MsnSwitchboardConnection::sendPendingMessages: No contacts available in the chat." << endl; - return; - } - - // Send all messages - pendingMessage = pendingMessages_.first(); - while( pendingMessage != 0 ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard - Sending pending messages, " << ( pendingMessages_.count() -1 ) << " remaining." << endl; -#endif - - // Send the message - int ack = sendMimeMessage( pendingMessage->first, pendingMessage->second ); - storeMessageForAcknowledgement( ack, pendingMessage->first, pendingMessage->second ); - - // get next message - pendingMessage = pendingMessages_.next(); - } - - // Clear the pending messages - pendingMessages_.setAutoDelete(true); - pendingMessages_.clear(); - - // Clean cache of old entries, it does not need to run with every storeMessage..() call. - cleanUnackedMessages(); -} - - - -// The user is typing so send a typing message -void MsnSwitchboardConnection::sendTypingMessage() -{ - if( contactsInChat_.isEmpty() ) - { - if( lastContact_.isEmpty() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::sendTypingMessage: Not sending typing notification, no contacts in chat, nor one to re-invite." << endl; -#endif - return; - } - - - // When we need to re-invite a contact to send the typing message, see if the contact is offline - // This avoids repeated "the contact is offline" typing messages. - const ContactBase *contact = currentAccount_->getContactByHandle(lastContact_); - if( contact == 0 || contact->isOffline() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::sendTypingMessage: Not sending typing notification, last contact is offline." << endl; -#endif - return; - } - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: Sending typing notification." << endl; -#endif - - // Build the typing notification message - MimeMessage message; - message.addField("MIME-Version", "1.0"); - message.addField("Content-Type", "text/x-msmsgscontrol"); - message.addField("TypingUser", currentAccount_->getHandle()); - - // if disconnected, reconnect to send the typing message - // (maybe the other contact still has it's window open) - sendMimeMessageWhenReady(ACK_NONE, message); - - // Signal the presence of activity on this switchboard - activity(); -} - - - -// An ApplicationList object indicated it aborted all it's applications. -void MsnSwitchboardConnection::slotApplicationsAborted(const QString &handle) -{ -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::slotApplicationsAborted: All applications of contact '" << handle << "' have been aborted." << endl; -#endif -#ifdef KMESSTEST - ASSERT( abortingApplications_ ); -#endif - - // Remove the contact from the chat now. - contactsInChat_.remove(handle); - - // Disconnect from signal source again. - ContactBase *contact = currentAccount_->getContactByHandle(handle); - if( ! KMESS_NULL(contact) ) - { - if( ! KMESS_NULL(contact->getApplicationList()) ) - { - disconnect(contact->getApplicationList(), SIGNAL( applicationsAborted(const QString&) ), - this, SLOT ( slotApplicationsAborted(const QString&) )); - } - - // Remove the reference to the switchboard here or we could get crashes later! - contact->removeSwitchboardConnection(this, true); - } - - - // If all contacts have aborted, close connection. - if( contactsInChat_.isEmpty() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::slotApplicationsAborted: No other contacts need to abort, closing connection." << endl; -#endif - - abortingApplications_ = false; - closeConnection(); - - // If the switchboard should clean up afterwards, do so. - if( autoDeleteLater_ ) - { - this->deleteLater(); - } - } - else - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "MsnSwitchboardConnection::slotApplicationsAborted: Waiting for applications of " << contactsInChat_.count() << " other contacts to abort..." << endl; -#endif - } -} - - - -// Start a switchboard connection -void MsnSwitchboardConnection::connectTo( const ChatInformation &chatInfo ) -{ -#ifdef KMESSTEST - ASSERT( currentAccount_ != 0 ); -#endif - - if(isConnected()) - { - if( ! contactsInChat_.isEmpty() && ! isExclusiveChatWithContact(chatInfo.getContactHandle())) - { - kdWarning() << "Switchboard is already connected, " - << "can't start new chat with '" << chatInfo.getContactHandle() << "'!" << endl; - return; - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard - Resuming a connection with a different server, reconnecting." << endl; -#endif - closeConnection(); - } - - // Remove any contact from this switchboard session. - if( ! contactsInChat_.isEmpty() ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard - Deleting active contacts: " << contactsInChat_.join(",") << endl; -#endif - - // Make sure all contacts are removed, which will also abort their applications in ApplicationList. - ContactBase *contact; - QValueList::iterator it; - for( it = contactsInChat_.begin(); it != contactsInChat_.end(); ++it ) - { - if( ! KMESS_NULL( *it ) ) - { - contactsInChat_.remove( *it ); - contact = currentAccount_->getContactByHandle( *it ); - contact->removeSwitchboardConnection(this, true); // could cause applications to abort. - } - } - } - - // Prepare the class for the new connection, setting some values to good defaults - // sentEmoticons_.clear(); // NOTE: Behavior changed since WLM 8+, emoticon data must be sent every time. - closingConnection_ = false; - firstContact_ = // Assign chatInfo.getContactHandle() to both first and last contact. - lastContact_ = chatInfo.getContactHandle(); - - // If requested, start an offline connection instead of a normal one - if( chatInfo.getType() == ChatInformation::CONNECTION_OFFLINE ) - { -#ifdef KMESSTEST - ASSERT( connectionState_ == SB_DISCONNECTED ); -#endif - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard - Initializing offline connection with " << chatInfo.getContactHandle() << "." << endl; -#endif - - // lastContact_ gets set even when making offline connections, so isExclusiveChatWithContact() returns true; - // otherwise a chat window would be spawned for every offline message. - - backgroundConnection_ = false; - return; - } - - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << " - Switchboard - Initializing connection with " << chatInfo.getContactHandle() - << ": Connecting to SB " << chatInfo.getIp() << ":" << chatInfo.getPort() << "." << endl; -#endif - - // Store information from the chatinfo object - authorization_ = chatInfo.getAuthorization(); - chatId_ = chatInfo.getChatId(); - userStartedChat_ = chatInfo.getUserStartedChat(); - - // Connect to the server. -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_INIT(this, "SB " + chatInfo.getIp()); -#endif - - connectionState_ = SB_CONNECTING; - if( ! connectToServer( chatInfo.getIp(), chatInfo.getPort() ) ) - { - kdWarning() << "Switchboard couldn't connect to the server." << endl; - connectionState_ = SB_DISCONNECTED; - } - - // Link a chat window to this switchboard if it's needed. - if( backgroundConnection_ && chatInfo.getType() == ChatInformation::CONNECTION_CHAT ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kdDebug() << "Switchboard: requesting chat window for initiated chat invitation." << endl; -#endif - emit requestChatWindow( this ); - backgroundConnection_ = false; - } -} - - - -// Send a nudge to a contact -void MsnSwitchboardConnection::sendNudge() -{ - // Create the message - MimeMessage message; - message.addField( "MIME-Version", "1.0" ); - message.addField( "Content-Type", "text/x-msnmsgr-datacast" ); - message.setBody( "ID: 1\r\n" ); // ID 1 indicates it's a nudge - - // Sent the message, re-establishing the connection if it was lost. - sendMimeMessageWhenReady( ACK_NAK_ONLY, message ); - - // Signal the presence of activity on this switchboard - activity(); -} - - - -// Store a message for later acknowledgement -void MsnSwitchboardConnection::storeMessageForAcknowledgement(int ack, AckType ackType, const MimeMessage& message) -{ - // don't store if the ack-type indicates so - if(ackType == ACK_NONE) return; - - // Only update pending ack list when we'll always get an ack back. - if(ackType == ACK_ALWAYS || ackType == ACK_ALWAYS_P2P) - { - acksPending_++; - } - - // Create a record of the unacked message - UnAckedMessage unAcked; - unAcked.ackType = ackType; - unAcked.time = QDateTime::currentDateTime().toTime_t(); - unAcked.message = message; // no problem with data size, uses shared reference. - - // Add to QMap - unAckedMessages_.insert( ack, unAcked ); - -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - kdDebug() << "Switchboard: Stored message for acknowledgement. " - << "There are currently " << unAckedMessages_.count() << " messages kept, " - << acksPending_ << " need to be ACKed." << endl; -#endif -} - - - -// 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 - kdDebug() << "MsnSwitchboardConnection::timeoutConnection(): Session has expired, closing it." << endl; -#endif - - if( keepAliveTimer_ != 0 ) - { - keepAliveTimer_->stop(); - } - - closeConnectionLater( true ); - return; - } - else - { - keepAlivesRemaining_--; - } -} - - - -#include "msnswitchboardconnection.moc" diff --git a/kmess/network/soap/Makefile.am b/kmess/network/soap/Makefile.am deleted file mode 100644 index 90ed00e..0000000 --- a/kmess/network/soap/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -INCLUDES = $(all_includes) -METASOURCES = AUTO -noinst_LIBRARIES = libsoap.a -libsoap_a_SOURCES = httpsoapconnection.cpp msnappdirectoryservice.cpp offlineimservice.cpp passportloginservice.cpp soapmessage.cpp -noinst_HEADERS = httpsoapconnection.h msnappdirectoryservice.h offlineimservice.h passportloginservice.h soapmessage.h diff --git a/kmess/network/soap/Makefile.in b/kmess/network/soap/Makefile.in deleted file mode 100644 index 0b57b48..0000000 --- a/kmess/network/soap/Makefile.in +++ /dev/null @@ -1,779 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libsoap_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/network/soap -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libsoap_a_AR = $(AR) $(ARFLAGS) -libsoap_a_LIBADD = -am_libsoap_a_OBJECTS = httpsoapconnection.$(OBJEXT) \ - msnappdirectoryservice.$(OBJEXT) offlineimservice.$(OBJEXT) \ - passportloginservice.$(OBJEXT) soapmessage.$(OBJEXT) -#>- libsoap_a_OBJECTS = $(am_libsoap_a_OBJECTS) -#>+ 6 -libsoap_a_final_OBJECTS = libsoap_a.all_cpp.o -libsoap_a_nofinal_OBJECTS = httpsoapconnection.$(OBJEXT) \ - msnappdirectoryservice.$(OBJEXT) offlineimservice.$(OBJEXT) \ - passportloginservice.$(OBJEXT) soapmessage.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libsoap_a_OBJECTS = $(libsoap_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libsoap_a_OBJECTS = $(libsoap_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/httpsoapconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/msnappdirectoryservice.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/offlineimservice.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/passportloginservice.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/soapmessage.Po -#>+ 10 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/libsoap_a.all_cpp.P ./$(DEPDIR)/httpsoapconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnappdirectoryservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/offlineimservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/passportloginservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/soapmessage.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = ./$(DEPDIR)/httpsoapconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/msnappdirectoryservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/offlineimservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/passportloginservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/soapmessage.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libsoap_a_SOURCES) -DIST_SOURCES = $(libsoap_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -INCLUDES = $(all_includes) -#>- METASOURCES = AUTO -noinst_LIBRARIES = libsoap.a -libsoap_a_SOURCES = httpsoapconnection.cpp msnappdirectoryservice.cpp offlineimservice.cpp passportloginservice.cpp soapmessage.cpp -noinst_HEADERS = httpsoapconnection.h msnappdirectoryservice.h offlineimservice.h passportloginservice.h soapmessage.h -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/soap/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/network/soap/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/soap/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/soap/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/soap/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libsoap.a: $(libsoap_a_OBJECTS) $(libsoap_a_DEPENDENCIES) - -rm -f libsoap.a - $(libsoap_a_AR) libsoap.a $(libsoap_a_OBJECTS) $(libsoap_a_LIBADD) - $(RANLIB) libsoap.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpsoapconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnappdirectoryservice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/offlineimservice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passportloginservice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soapmessage.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -msnappdirectoryservice.moc: $(srcdir)/msnappdirectoryservice.h - $(MOC) $(srcdir)/msnappdirectoryservice.h -o msnappdirectoryservice.moc - -#>+ 2 -mocs: msnappdirectoryservice.moc - -#>+ 3 -httpsoapconnection.moc: $(srcdir)/httpsoapconnection.h - $(MOC) $(srcdir)/httpsoapconnection.h -o httpsoapconnection.moc - -#>+ 2 -mocs: httpsoapconnection.moc - -#>+ 3 -offlineimservice.moc: $(srcdir)/offlineimservice.h - $(MOC) $(srcdir)/offlineimservice.h -o offlineimservice.moc - -#>+ 2 -mocs: offlineimservice.moc - -#>+ 3 -passportloginservice.moc: $(srcdir)/passportloginservice.h - $(MOC) $(srcdir)/passportloginservice.h -o passportloginservice.moc - -#>+ 2 -mocs: passportloginservice.moc - -#>+ 3 -clean-metasources: - -rm -f msnappdirectoryservice.moc httpsoapconnection.moc offlineimservice.moc passportloginservice.moc - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/soap/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/soap/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/soap/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libsoap_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/httpsoapconnection.cpp $(srcdir)/msnappdirectoryservice.cpp $(srcdir)/offlineimservice.cpp $(srcdir)/passportloginservice.cpp $(srcdir)/soapmessage.cpp msnappdirectoryservice.moc httpsoapconnection.moc passportloginservice.moc offlineimservice.moc - @echo 'creating libsoap_a.all_cpp.cpp ...'; \ - rm -f libsoap_a.all_cpp.files libsoap_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libsoap_a.all_cpp.final; \ - for file in httpsoapconnection.cpp msnappdirectoryservice.cpp offlineimservice.cpp passportloginservice.cpp soapmessage.cpp ; do \ - echo "#include \"$$file\"" >> libsoap_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libsoap_a.all_cpp.final; \ - done; \ - cat libsoap_a.all_cpp.final libsoap_a.all_cpp.files > libsoap_a.all_cpp.cpp; \ - rm -f libsoap_a.all_cpp.final libsoap_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libsoap_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libsoap_a_OBJECTS="$(libsoap_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libsoap_a_OBJECTS="$(libsoap_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libsoap_a_OBJECTS="$(libsoap_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libsoap_a_OBJECTS="$(libsoap_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 11 -nmcheck: -httpsoapconnection.lo: httpsoapconnection.moc -httpsoapconnection.o: httpsoapconnection.moc -msnappdirectoryservice.o: msnappdirectoryservice.moc -passportloginservice.lo: passportloginservice.moc -msnappdirectoryservice.lo: msnappdirectoryservice.moc -nmcheck-am: nmcheck -offlineimservice.o: offlineimservice.moc -passportloginservice.o: passportloginservice.moc -offlineimservice.lo: offlineimservice.moc diff --git a/kmess/network/soap/httpsoapconnection.cpp b/kmess/network/soap/httpsoapconnection.cpp deleted file mode 100644 index 8eac296..0000000 --- a/kmess/network/soap/httpsoapconnection.cpp +++ /dev/null @@ -1,811 +0,0 @@ -/*************************************************************************** - httpsoapconnection.cpp - description - ------------------- - begin : Sun Sep 25 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 "httpsoapconnection.h" - -#include "soapmessage.h" -#include "../extra/xmlfunctions.h" - -#include "../mimemessage.h" -#include "../../kmessdebug.h" - -#include -#include - -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION -#define KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL -#endif - - - -/** - * @brief The constructor - * - * 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. - * @param name The Qt object name, for debugging signals. - */ -HttpSoapConnection::HttpSoapConnection( const QString &endpoint, QObject *parent, const char *name ) - : TcpConnectionBase(parent, name) - , keepAlive_(false) - , parseError_(false) - , requestActive_(false) - , responseCode_(0) - , responseLength_(0) -{ -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "CREATED HttpSoapConnection(endpoint=" << endpoint << ")" << endl; -#endif -#ifdef KMESSTEST - ASSERT( endpoint.startsWith("http://") || endpoint.startsWith("https://") ); -#endif - - endpoint_ = endpoint; -} - - - -/** - * @brief The destructor. - * - * Closes the sockets if these are still open. - */ -HttpSoapConnection::~HttpSoapConnection() -{ -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "DESTROYED HttpSoapConnection" << endl; -#endif - - closeConnection(); -} - - - -/** - * @brief Close the connection, or the connection got closed by the server. - */ -void HttpSoapConnection::closeConnection() -{ - // Reset statew vars - requestActive_ = false; - keepAlive_ = false; - - // Close the connection - TcpConnectionBase::closeConnection(); -} - - - -/** - * @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 Connect to the endpoint. - * @return Whether the connection request is pending, or it failed. - */ -bool HttpSoapConnection::connectToEndpoint() -{ - // Determine the port - int port; - if( endpoint_.port() != 0 ) - { - port = endpoint_.port(); - } - else if( endpoint_.protocol() == "http" ) - { - port = 80; - } - else if( endpoint_.protocol() == "https" ) - { - port = 443; - } - else - { - kdWarning() << "HttpSoapConnection::sendRequest: Invalid protocol for endpoint set " - << "(endpoint=" << endpoint_ << ")." << endl; - emit requestFailed( this, i18n("There was an internal error in KMess: %1") - .arg("Unable to create a socket") ); - return false; - } - - // Start connecting - if( ! openConnection( endpoint_.host(), port, (endpoint_.protocol() == "https") ) ) - { - kdWarning() << "HttpSoapConnection: unable to create a socket to endpoint: " << endpoint_ << "!" << endl; - emit requestFailed( this, i18n("There was an internal error in KMess: %1") - .arg("Unable to create a socket") ); - return false; - } - - return true; -} - - - -/** - * @brief Return the endpoint - * @return Returns the endpoint given with the constructor. - */ -QString HttpSoapConnection::getEndpoint() const -{ - return endpoint_.url(); -} - - - -/** - * @brief Return the received HTTP status code - * @return The HTTP status code, like 200 or 500. - */ -int HttpSoapConnection::getHttpStatusCode() const -{ - return responseCode_; -} - - - -/** - * @brief Return the last request ID - * - * This parameter is not used internally, but allows other classes to - * distinguish between requests, or pass user-data for callbacks. - * - * @return The last request ID. - */ -const QString & HttpSoapConnection::getRequestId() const -{ - return requestId_; -} - - - -/** - * @brief Return the last SOAP action - * @return The last SOAP action sent. - */ -const QString & HttpSoapConnection::getSoapAction() const -{ - return soapAction_; -} - - - -/** - * @brief Return whether the connection is idle. - * @return Returns true when the connection is idle, false when a SOAP request is pending / being processed. - */ -bool HttpSoapConnection::isIdle() -{ - return ( ! requestActive_ ); -} - - - -/** - * @brief Parse the HTTP header - * - * This method can be overwritten to implement custom parsing, - * e.g. support different content-types and status codes. - * This default method only checks whether the the status code - * is 200 OK and the Content-Type is text/xml. - * Use getHttpStatusCode() to read the status code. - * - * @param preamble The HTTP status-line/preamble - * @param header The HTTP header fields. - * @return Whether the parsing should continue. When false, the class aborts with an error. - */ -bool HttpSoapConnection::parseHttpHeader( const QString &/*preamble*/, const MimeMessage &header ) -{ - // Check the response code. - if( responseCode_ != 200 ) - { - kdWarning() << "HttpSoapConnection: Received HTTP status line: " << responseCode_ << endl; - return false; - } - - // Parse the Content-Type - QString contentType = header.getValue("Content-Type"); - if( contentType.contains(";") ) - { - //QString charset = contentType.section(';', 1, 1); - contentType = contentType.section(';', 0, 0); - } - - // Content-Type should be text/xml - if( contentType != "text/xml" ) - { - kdWarning() << "HttpSoapConnection: Invalid Content-Type received: " << contentType << ", " - << "expected text/xml (endpoint=" << endpoint_ << ")!" << endl; - return false; - } - - return true; -} - - - -/** - * @brief Parse the received server response. - * - * This body extracts the XML message from the body. - * It detects SOAP Faults automatically. - * Other responses are returned to parseSoapResult(). - * - * @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 - kdDebug() << "HttpSoapConnection: Request finished, pasing body." << endl; -#endif - - // Attempt to convert to XML - QString xmlError; - QDomDocument xml; - if( ! xml.setContent( responseBody, true, &xmlError ) ) - { - kdWarning() << "HttpSoapConnection: Unable to parse XML " - << "(error='" << xmlError << "' endpoint=" << endpoint_ << ")" << endl; - return false; - } - - // See if there is a header element - QDomElement headerNode = XmlFunctions::getNode(xml, "/Envelope/Header").firstChild().toElement(); - - // See if there is a Fault in the main Envelope (happens with passport RST service). - QDomElement faultNode = XmlFunctions::getNode(xml, "/Envelope/Fault").toElement(); - if( ! faultNode.isNull() ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Found soap fault outside the body!" << endl; -#endif - closeConnection(); - parseSoapFault( faultNode, headerNode ); - return true; // no parsing error, it's a valid response. - } - - // Get the main body node - QDomElement resultNode = XmlFunctions::getNode(xml, "/Envelope/Body").firstChild().toElement(); - if( resultNode.isNull() ) - { - kdWarning() << "HttpSoapConnection: Unable to parse response: result node is null " - << "(root=" << xml.nodeName() << " endpoint=" << endpoint_ << ")." << endl; - return false; - } - - // See if it's a soap error message - if( resultNode.nodeName() == "Fault" ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Found soap fault." << endl; -#endif - closeConnection(); - parseSoapFault( resultNode, headerNode ); - return true; // no parsing error, it's a valid response. - } - - // 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(); - if( resultNodeName.endsWith("Response") - && resultNode.childNodes().length() == 1 - && resultNode.firstChild().nodeName() == resultNodeName.replace("Response", "Result") ) - { - resultNode = resultNode.firstChild().toElement(); - } - - // Request completed, indicate derived class and listeners. -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Request finished, signalling to start parsing " - << "(main node=" << resultNodeName << ")" << endl; -#endif - requestActive_ = false; - - // Notify listeners - parseSoapResult( resultNode, headerNode ); - return true; -} - - - -/** - * @brief Parse the SOAP fault. - * - * This method extracts the node data, and emits a requestFailed() 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. - */ -void HttpSoapConnection::parseSoapFault( const QDomElement &faultNode, const QDomElement &/*headerNode*/ ) -{ - QString faultCode = XmlFunctions::getNodeValue( faultNode, "/faultcode" ); - QString faultString = XmlFunctions::getNodeValue( faultNode, "/faultstring" ); - -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Signalling the request failed, " - << faultCode << ": " << faultString << endl; -#endif - - emit requestFailed( this, faultCode, faultString, faultNode ); -} - - - -/** - * @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. - * @param requestId The ID of the request, allowing callbacks to distinguish between requests. - */ -void HttpSoapConnection::sendRawPostRequest( const QString &content, const QString &soapAction, const QString &requestId ) -{ - // Set once, used a lot - bool connected = isConnected(); - - // Protect against parallel usage. - // It's easy to create a pendingRequests_ list, the problem however is: - // - should the next request be sent if the previous one failed badly? (e.g. http parse error) - // - would you like to see dozens of "Could not parse" error messages at the same time? - if( connected ) - { - if( requestActive_ ) - { - kdWarning() << "HttpSoapConnection: unable to send another SOAP request " - << "(soapAction=" << soapAction << ")." << endl; - return; - } - else - { -#ifdef KMESSTEST - ASSERT( keepAlive_ ); -#endif - // No request active, connection was kept alive and idle - requestActive_ = true; - } - } - - // Create the HTTP request - QString soapActionLine; - if( ! soapAction.isNull() ) - { - soapActionLine = "SoapAction: \"" + soapAction + "\"\r\n"; - } - - // Create HTTP header - QCString rawPostData = content.utf8(); - QString httpHeader = "POST " + endpoint_.path() + " HTTP/1.1\r\n" - "Accept: */*\r\n" - + soapActionLine + - "Content-Type: text/xml; charset=utf-8\r\n" - "Content-Length: " + QString::number(rawPostData.length()) + "\r\n" - "User-Agent: KMess " + kapp->aboutData()->version() + "\r\n" - "Host: " + endpoint_.host() + "\r\n" - "Connection: Keep-Alive\r\n" - "Cache-Control: no-cache\r\n" - "\r\n"; - - // Store HTTP header to send when the connection is established - request_ = httpHeader.utf8() + rawPostData; - parseError_ = false; - - // When not connected, connect first - if( ! connected && ! connectToEndpoint() ) - { - // Connection attempt failed. - return; - } - // else Keep waiting until slotConnectionEstablished() or slotConnectionFailed() is called. - - - // Initialize state vars - soapAction_ = soapAction_; - requestActive_ = true; - requestId_ = requestId; - -#ifdef KMESS_NETWORK_WINDOW - KURL soapActionUrl = soapAction; - if( soapAction.isEmpty() || ! soapActionUrl.isValid() ) - { - KMESS_NET_INIT(this, "SOAP " + endpoint_.path() ); - } - else - { - KMESS_NET_INIT(this, "SOAP " + soapActionUrl.filename() ); - } -#endif - - // When the connection was already active (kept alive), send request now. - if( connected ) - { - slotConnectionEstablished(); - } -} - - - -/** - * @brief Send a SOAP request to the webservice. - * - * This is a convenience function for sendRawPostRequest(). - * The message is generated by SoapMessage::getMessage(). - * - * @param soapAction The SOAPAction header to send, may be QString::null to omit the header. - * @param message The SOAP message to send. - * @param requestId The ID of the request, allowing callbacks to distinguish between requests. - */ -void HttpSoapConnection::sendRequest(const QString &soapAction, const SoapMessage &message, const QString &requestId ) -{ - sendRawPostRequest( message.getMessage(), soapAction, requestId ); -} - - - -/** - * @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. - * @param requestId The ID of the request, allowing callbacks to distinguish between requests. - */ -void HttpSoapConnection::sendRequest(const QString &soapAction, const QString &messageBody, const QString &messageHeader, const QString &requestId) -{ -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Connecting to endpoint for SOAP action '" << soapAction << "'." << endl; -#endif - - // Build the SOAP request - QString postData = "\n" - "\n"; - - // Append header - if( ! messageHeader.isEmpty() ) - { - postData += " \n" + messageHeader + "\n \n"; - } - - // Append body - postData += " \n" + messageBody + "\n \n\n"; - - sendRawPostRequest( postData, soapAction, requestId ); -} - - - -/** - * @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 - kdDebug() << "Changing HttpSoapConnection endpoint from " << endpoint_ << " to " << endpoint << endl; -#endif -#ifdef KMESSTEST - ASSERT( endpoint.startsWith("http://") || endpoint.startsWith("https://") ); - ASSERT( ! isConnected() ); -#endif - - endpoint_ = endpoint; -} - - - -/** - * @brief Called when the connection is established - * - * This method sends the SOAP request. - */ -void HttpSoapConnection::slotConnectionEstablished() -{ -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Socket connected, sending SOAP request." << endl; -#endif - - // Reset all state variables - parseError_ = false; - responseCode_ = 0; - responseLength_ = 0; - - // Send the entire request - // Explictly use length because a \0 from QCString->QByteArray conversion should not be included - bool writeSuccess = writeBlock( request_.data(), request_.length() ); - - // If the block could not be written, it's possible the remote server - // has closed the connection unexpectedly. Reconnect to the server. - if( ! writeSuccess && keepAlive_ ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Write failed, connection is likely closed but Keep-Alive was set, reconnecting." << endl; -#endif - - closeSockets(); // reset sockets, but don't reset state - keepAlive_ = false; // avoid a second attempt - requestActive_ = true; - connectToEndpoint(); - } -} - - - -/** - * @brief Called when the connection could not be made. - * - * This method emits a requestFailed() signal. - */ -void HttpSoapConnection::slotConnectionFailed() -{ -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Connection failed, socket error: " << getSocketError() << "." << endl; -#endif - - requestActive_ = false; - - // Inform listeners the request failed. - emit requestFailed( this, i18n("Unable to make a connection: %1").arg(getSocketError()) ); -} - - - -/** - * @brief Called when the connection received data. - * - * This method parses the HTTP preamble, and detects whether the full header and body are received. - * The methods parseHttpHeader() and parseHttpBody() are called to process the header and body. - * The Connection and Content-Length fields are handled internally as well. - */ -void HttpSoapConnection::slotDataReceived() -{ - // Check the number of bytes available. - // It returns -2 when the socket is closed - // (this event was still in the event queue) - int availableBytes = getAvailableBytes(); - if( availableBytes < 0 ) - { - kdWarning() << "HttpSoapConnection::slotDataReceived: could not read data " - << "(code=" << availableBytes << " endpoint=" << endpoint_ << ")" << endl; - return; - } - - // If the length of the response - if( responseLength_ == 0 ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Connection received first data block, parsing HTTP header." << endl; -#endif - - // Reset states until proven otherwise - keepAlive_ = false; - - - QByteArray buffer( QMIN(4000, availableBytes) ); - // Attempt to parse the next part of the header. - int bytesRead = peekBlock( &buffer ); - if( bytesRead <= 0 ) - { - kdWarning() << "HttpSoapConnection::slotDataReceived: No data read from HTTP header " - << "(endpoint=" << endpoint_ << " syserror=" << getSocketError() << ")!" << endl; - parseError_ = true; - closeConnection(); - emit requestFailed( this, i18n("There was an internal error in KMess: %1") - .arg("Could not read HTTP header") ); - return; - } - - - // The data is peeked. To avoid repeated output in the network window, - // it will only be displayed when the connection is either closed directly, - // or the full header is received. - - QString header = QString::fromLatin1( buffer.data(), bytesRead ); - int endPos = header.find("\r\n\r\n"); - if( endPos == -1 ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: End of header not found in the first " << bytesRead << " bytes" << endl; -#endif - // Rely on base class to keep the first part in the buffer - // Wait for another slotDataReceived() call. - return; - } - - // Consume HTTP header, truncate to exact end. - bytesRead = readBlock( &buffer, endPos + 4 ); - header = QString::fromLatin1( buffer.data(), bytesRead ); - -#ifdef KMESS_NETWORK_WINDOW - // display header in network window. - QByteArray wrapper; - wrapper.setRawData( buffer.data(), bytesRead ); - KMESS_NET_RECEIVED(this, wrapper); - wrapper.resetRawData( buffer.data(), bytesRead ); -#endif - - // Find the HTTP preamble. - int preambleEnd = header.find("\r\n"); - if( preambleEnd == -1 ) - { -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_RECEIVED(this, buffer); -#endif - - kdWarning() << "httpSoapConnection: End of HTTP preamble not found " - << "(endpoint=" << endpoint_ << " syserror=" << getSocketError() << ")!" << endl; - closeConnection(); - emit requestFailed( this, i18n("There was an internal error in KMess: %1") - .arg("Could not parse HTTP response header") ); - return; - } - - // Parse the HTTP preamble. - QString preamble = header.left( preambleEnd ); - float protocol = preamble.section( ' ', 0, 0 ).section('/', 1, 1).toFloat(); - responseCode_ = preamble.section( ' ', 1, 1 ).toUInt(); // HTTP/1.0 200 OK - - // Parse the Content-Length - MimeMessage httpHeaders( header.mid( preambleEnd + 2, endPos - preambleEnd - 2) ); - responseLength_ = httpHeaders.getValue("Content-Length").toUInt(); - bool headerOk = parseHttpHeader( preamble, httpHeaders ); - - if( ! headerOk ) - { -#ifdef KMESSTEST - // Deal with aborting later when full body is displayed in the network window. - parseError_ = true; -#else - // Close when it's no longer important. - closeConnection(); - emit requestFailed( this, i18n("There was an internal error in KMess: %1") - .arg("Could not parse SOAP response") ); - return; -#endif - } - - // Test whether the server requested to keep the connection open. - // For HTTP 1.0: only keep alive is explicitly stated. - // For HTTP 1.1: always keep alive unless closed explictly - if( protocol <= 1.0 ) - { - // See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.2 - keepAlive_ = httpHeaders.hasField("Connection") && - httpHeaders.getValue("Connection") == "Keep-Alive"; - } - else - { - // See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.6.2 - keepAlive_ = ! httpHeaders.hasField("Connection") || - httpHeaders.getValue("Connection") != "close"; - } - -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Header parsed, Keep-Alive: " << keepAlive_ - << " (protocol version=" << protocol << ")" << endl; -#endif - - // When header is parsed, continue to parse the next - // received part of the body. - } - - - // Header successfully processed -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: Received " << getAvailableBytes() - << " of " << responseLength_ << " bytes" << endl; -#endif - - // Http header parsed, check whether the full response has arrived - if( responseLength_ > (uint) getAvailableBytes() ) - { - return; - } - - - // Read all data from the socket. - QByteArray xmlData( getAvailableBytes() ); - readBlock( &xmlData ); - //QByteArray xmlData = readAll(); - //QString allBody = QString::fromUtf8( xmlData.data(), xmlData.size() ); - -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_RECEIVED(this, xmlData); -#endif -#ifdef KMESSTEST - // When the response was not a 200 OK, it will be aborted immediately. - // For debugging the connection is left open so the full response - // can be displayed in the network window (particulary useful for SSL). - // Then close - if( parseError_ ) - { - kdDebug() << "HttpSoapConnection: Closing connection due parsing errors " - << "(delayed so full body is displayed in network window)." << endl; - closeConnection(); - emit requestFailed( this, i18n("There was an internal error in KMess: %1") - .arg("Could not parse SOAP response") ); - return; - } -#endif - - // Close connection unless server allowed it to remain open. - // Avoids problems when a listener starts a new request from the slot. - if( ! keepAlive_ ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: connection should not be kept alive, closing." << endl; -#endif - closeConnection(); - } - - // Parse the received HTTP body - bool bodyOk = parseHttpBody( xmlData ); - -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kdDebug() << "HttpSoapConnection: completed response handling." << endl; -#endif - -#ifdef KMESSTEST - // when a crash occurs here, it likely means a listener deleted the object from a parseHttpBody() signal. - // this is why every soap fault is preceeded by a closeConnection() call. - ASSERT( keepAlive_ == isConnected() ); -#endif - - // emit later, so the caller can destroy this class - if( ! bodyOk ) - { - closeConnection(); - emit requestFailed( this, i18n("There was an internal error in KMess: %1") - .arg("Unable to parse SOAP response") ); - } -} - - - -#include "httpsoapconnection.moc" diff --git a/kmess/network/soap/httpsoapconnection.h b/kmess/network/soap/httpsoapconnection.h deleted file mode 100644 index cf8e1f0..0000000 --- a/kmess/network/soap/httpsoapconnection.h +++ /dev/null @@ -1,151 +0,0 @@ -/*************************************************************************** - httpsoapconnection.h - description - ------------------- - begin : Sun Sep 25 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. * - * * - ***************************************************************************/ - -#ifndef HTTPSOAPCONNECTION_H -#define HTTPSOAPCONNECTION_H - -#include "../tcpconnectionbase.h" - -#include - -#include - -class SoapMessage; -class MimeMessage; - - -/** - * @brief SOAP transport over a HTTP connection. - * - * The SOAP protocol is used to implement webservices. - * It's commonly used by .Net applications, - * MSN Messenger is not an exception here. - * SOAP is used for new features like: - * - games / activities. - * - offline-im. - * - passport 3.0 authentication. - * - addressbook data (as of Windows Live Messenger). - * - * The class implements SOAP at a basic level. - * - it operates much like the XmlHttpRequest class works in web browsers. - * - sniffed XML strings can be sent directly with sendRequest(). - * - no need to translate XML to SOAP encodings. - * - no need to reverse engineer a WSDL to send SOAP messages. - * - 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. - * - * @author Diederik van der Boor - * @ingroup NetworkSoap - */ -class HttpSoapConnection : public TcpConnectionBase -{ - Q_OBJECT - - public: // public methods - // The constructor - HttpSoapConnection( const QString &endpoint, QObject *parent = 0, const char *name = "HttpSoapConnection" ); - // The destructor - virtual ~HttpSoapConnection(); - - // Close the connection - virtual void closeConnection(); - - // Return the endpoint - QString getEndpoint() const; - // Whether the connection is idle, not processing a SOAP request/response - bool isIdle(); - // Return the received HTTP status code - int getHttpStatusCode() const; - // Return the last request ID - const QString & getRequestId() const; - // Return the last SOAP action - const QString & getSoapAction() const; - - protected: - // Escape a string for inclusion in XML - QString escapeString( QString value ) const; - // Parse the HTTP header - virtual bool parseHttpHeader( const QString &preamble, const MimeMessage &header ); - // The connection received the full response - virtual bool parseHttpBody( const QByteArray &responseBody ); - // The connection received the full response - virtual void parseSoapResult( const QDomElement &resultNode, const QDomElement &headerNode ) = 0; - // Parse the SOAP fault - virtual void parseSoapFault( const QDomElement &faultNode, const QDomElement &headerNode ); - // Send a SOAP request - void sendRawPostRequest( const QString &content, const QString &soapAction = QString::null, const QString &requestId = QString::null ); - // Send a SOAP request - void sendRequest( const QString &soapAction, const SoapMessage &message, const QString &requestId = QString::null ); - // Send a SOAP request - void sendRequest( const QString &soapAction, const QString &messageBody, const QString &messageHeader = QString::null, const QString &requestId = QString::null ); - // Change the SOAP endpoint. - void setEndpoint( const QString &endpoint ); - // The connection failed - virtual void slotConnectionFailed(); - - private: - // Connect to the endpoint - bool connectToEndpoint(); - // The connection is established - void slotConnectionEstablished(); - // The connection received data - void slotDataReceived(); - - private: // private attributes - /// The endpoint for the request - KURL endpoint_; - /// Whether the server requests to keep the connection alive - bool keepAlive_; - /// Whether there is a parsing error. - bool parseError_; - /// The message to be sent - QCString request_; - /// Whether there is an request active. - bool requestActive_; - /// The remote ID of the request. - QString requestId_; - /// The response code - uint responseCode_; - /// The length of the response - uint responseLength_; - /// 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. - */ - void requestFailed( HttpSoapConnection *client, const QString &reason ); - - /** - * @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. - */ - void requestFailed( HttpSoapConnection *client, const QString &faultCode, - const QString &faultString, QDomElement faultNode ); -}; - -#endif diff --git a/kmess/network/soap/msnappdirectoryservice.cpp b/kmess/network/soap/msnappdirectoryservice.cpp deleted file mode 100644 index ff9284a..0000000 --- a/kmess/network/soap/msnappdirectoryservice.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/*************************************************************************** - msnappdirectoryservice.cpp - description - ------------------- - begin : Sun Sep 25 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 "msnappdirectoryservice.h" - -#include "httpsoapconnection.h" -#include "soapmessage.h" - -#include "../extra/xmlfunctions.h" -#include "../../kmessdebug.h" - -#ifdef KMESSDEBUG_APPDIRECTORYSERVICE -#define KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL -#endif - - -// Constructor -MsnAppDirectoryService::MsnAppDirectoryService( QObject *parent ) - : HttpSoapConnection("http://appdirectory.messenger.msn.com/AppDirectory/AppDirectory.asmx", parent, "MsnAppDirectoryService") -{ -#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL - kdDebug() << "CREATED MsnAppDirectoryService" << endl; -#endif -} - - - -// Destructor -MsnAppDirectoryService::~MsnAppDirectoryService() -{ -#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL - kdDebug() << "DESTROYED MsnAppDirectoryService" << endl; -#endif -} - - - -// Return an application entry with a certain ID -const MsnAppDirectoryService::Entry * MsnAppDirectoryService::getEntryById(int entryId) -{ - QPtrListIterator it(entries_); - while(! it.atLast()) - { - if(it.current()->entryId == entryId) - { - return it.current(); - } - - ++it; - } - - return 0; -} - - - -// Return all entries -const QPtrList& MsnAppDirectoryService::getEntries() const -{ - return entries_; -} - - - -// A soap request finished -void MsnAppDirectoryService::parseSoapResult( const QDomElement &resultRoot, const QDomElement &headerNode ) -{ - Q_UNUSED( headerNode ); // Avoid compiler warning - -#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL - kdDebug() << "MsnAppDirectoryService: Got query response" << endl; -#endif - - // Parse the list of result entries - QDomNode dataSet = XmlFunctions::getNode( resultRoot, "diffgram/NewDataSet" ); - QDomNodeList entries = dataSet.childNodes(); - for(uint i = 0; i < entries.count(); i++) - { - QDomNode entryProperties = entries.item(i); - - int entryId = XmlFunctions::getNodeValue(entryProperties, "EntryID").toInt(); - if(getEntryById(entryId) != 0) - { - // Ignore entries that are already present - continue; - } - - // 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"; - -#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL - kdDebug() << "MsnAppDirectoryService: Received entry " << entry->name << "." << endl; -#endif - - // Add to the list - entries_.append( entry ); - } - -#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL - kdDebug() << "MsnAppDirectoryService: Emitting that request was successful" << endl; -#endif -} - - - -// Request a list of all services -void MsnAppDirectoryService::queryServiceList(MsnAppDirectoryServiceType type) -{ -#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL - kdDebug() << "MsnAppDirectoryService: Querying service list" << endl; -#endif - - SoapMessage message; - message.setAction("GetFilteredDataSet2", QString::null, - "http://www.msn.com/webservices/Messenger/Client"); - message.addField("locale", "en-us"); - message.addField("Page", "1"); - message.addField("Kids", "-1"); - message.addField("AppType", QString::number(type)); // 0=games, 1=activities - - sendRequest("http://www.msn.com/webservices/Messenger/Client/GetFilteredDataSet2", message); -} - - -#include "msnappdirectoryservice.moc" diff --git a/kmess/network/soap/offlineimservice.cpp b/kmess/network/soap/offlineimservice.cpp deleted file mode 100644 index 14f0818..0000000 --- a/kmess/network/soap/offlineimservice.cpp +++ /dev/null @@ -1,282 +0,0 @@ -/*************************************************************************** - offlineimservice.cpp - description - ------------------- - begin : Thu Sep 07 2006 - copyright : (C) 2006 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 "offlineimservice.h" - -#include "../../kmessdebug.h" -#include "../../chat/chatmessage.h" -#include "../mimemessage.h" - -#include - -#include -#include - -#ifdef KMESSDEBUG_OFFLINE_IM -#define KMESSDEBUG_OFFLINE_IM_GENERAL -#endif - - - -/** - * @brief The constructor. - * - * Initializes the client for the Offline-IM webservice. - * - * @param authT The t value of the passport cookie. - * @param authP The p value of the passport cookie. - * @param parent The Qt parent object, when it's destroyed this class will be cleaned up automatically too. - */ -OfflineImService::OfflineImService( const QString &authT, const QString &authP, QObject *parent ) - : HttpSoapConnection("https://rsi.hotmail.com/rsi/rsi.asmx", parent, "OfflineImService") - , authT_(authT) - , authP_(authP) -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kdDebug() << "CREATED OfflineImService" << endl; -#endif - - // Initialize the header once. - passportCookieHeader_ = - " \n" - " " + escapeString(authT) + "\n" - "

" + escapeString(authP) + "

\n" - "
"; -} - - - -/** - * @brief The destructor. - */ -OfflineImService::~OfflineImService() -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kdDebug() << "DESTROYED OfflineImService" << endl; -#endif -} - - - -/** - * @brief SOAP call to delete messages from the remote storage. - * @param messageIds List of messages to delete. - */ -void OfflineImService::deleteMessages( const QStringList &messageIds ) -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kdDebug() << "OfflineImService: requesting deletion of messages: '" << messageIds.join("', '") << "'" << endl; -#endif -#ifdef KMESSTEST - 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" - " "; - sendRequest( soapAction, soapBody, passportCookieHeader_ ); -} - - - -/** - * @brief Internal function to extract the e-mail 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. - */ -QString OfflineImService::extractRFC822Address( const QString &address ) -{ - if( address.endsWith(">") ) - { - int pos = address.findRev('<'); - if( pos != -1 ) - { - return address.mid( pos + 1, address.length() - pos - 2 ); - } - } - - return address; -} - - - -/** - * @brief SOAP call to download an offline message. - * - * The message ID can be extracted from - * the following messages types received at the notification connection: - * - text/x-msmsgsoimnotification - * - text/x-msmsgsinitialmdatanotification - * - * The messageReceived() signal is fired when the webservice returns the message. - * - * @param messageId The ID of the message. - * @param markAsRead Whether the message should be marked as read. - */ -void OfflineImService::getMessage( const QString &messageId, bool markAsRead ) -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kdDebug() << "OfflineImService: requesting message '" << messageId << "'" << endl; -#endif - - // Initialize request - QString soapAction = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage"; - QString soapBody = - " \n" - " " + escapeString(messageId) + "\n" - " " + (markAsRead ? "true" : "false") + "\n" - " "; - sendRequest( soapAction, soapBody, passportCookieHeader_, messageId ); -} - - - -/** - * @brief SOAP call to download the value of the Mail-Data field. - * - * The value of the Mail-Data field is normally received by the notification server. - * If there are many offline-IM messages, the value of this field is literally too-large. - * In that case, the message data can be downloaded using this method. - * - * The metaDataReceived() signal is fired when the webservice returns the data. - */ -void OfflineImService::getMetaData() -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kdDebug() << "OfflineImService: requesting Mail-Data field" << endl; -#endif - - QString soapAction = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMetadata"; - QString soapBody = " "; - sendRequest( soapAction, soapBody, passportCookieHeader_ ); -} - - - -/** - * @brief Internal function to process the response of the webservice. - * - * This handles the following response nodes: - * - GetMessageResult is handled by processGetMessageResult(). - * - GetMetadataResponse is sent with the metaDataReceived() signal. - * - DeleteMessagesResponse is ignored because it's always empty. - * - * Other unrecognized response types result in a warning message at the console. - * - * @param resultRoot The result root of the SOAP response. - */ -void OfflineImService::parseSoapResult( const QDomElement &resultRoot, const QDomElement &/*headerNode*/ ) -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kdDebug() << "OfflineImService: parsing SOAP response." << endl; -#endif - - QString resultName = resultRoot.nodeName(); - if( resultName == "GetMessageResult" ) - { - processGetMessageResult( resultRoot ); - } - else if( resultName == "GetMetadataResponse" ) - { - emit metaDataReceived( resultRoot.namedItem("MD").toElement() ); - } - else if( resultName == "DeleteMessagesResponse" ) - { - // do nothing - } - else - { - kdWarning() << "OfflineImService::slotRequestFinished: Unknown response type received " - << "(rootnode=" << resultName << " endpoint=" << getEndpoint() << ")" << endl; - } -} - - - -/** - * @brief Internal function to process the response of the getMessage() call. - * - * This method parses the XML data, extracts the relevant fields, - * and fires the messageReceived() signal with the results. - * - * @param resultRoot The GetMessageResult node of the response. - */ -void OfflineImService::processGetMessageResult( const QDomElement &resultRoot ) -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kdDebug() << "OfflineImService: parsing downloaded Offline-IM message." << endl; -#endif - - // Parse as MIME message. - MimeMessage message( resultRoot.text() ); - - // Extract the fields - QString from = message.decodeRFC2047String( message.getValue("From").data() ); - QString to = message.decodeRFC2047String( message.getValue("To").data() ); - QString dateString = message.getValue("Date"); - QString runId = message.getValue("X-OIM-Run-Id"); - int sequenceNum = message.getValue("X-OIM-Sequence-Num").toInt(); - - // Convert the 'From' and 'To' lines, it's something like "Contactname " - from = extractRFC822Address( from ); - to = extractRFC822Address( to ); - - // Convert the date, is something like "15 Nov 2005 14:24:27 -0800" - QDateTime date; - date.setTime_t( KRFCDate::parseDate( dateString ) ); - - // Validate content type - QString contentType = message.getValue("Content-Type"); - if( contentType.lower() != "text/plain; charset=utf-8" ) - { - kdWarning() << "OfflineImService: received unexpected content type: " << contentType << endl; - } - - // Validate transfer encoding - QString transferEncoding = message.getValue("Content-Transfer-Encoding"); - if( transferEncoding != "base64" ) - { - kdWarning() << "OfflineImService: received unexpected transfer encoding: " << transferEncoding << endl; - } - - // Validate message type - QString messageType = message.getValue("X-OIM-Message-Type"); - if( messageType != "OfflineMessage" ) - { - kdWarning() << "OfflineImService: received unexpected message type: " << messageType << endl; - } - - // Process the body - QCString decodedBody = KCodecs::base64Decode( message.getBody().utf8() ); - 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( getRequestId(), from, to, date, body, runId, sequenceNum ); -} - - -#include "offlineimservice.moc" diff --git a/kmess/network/soap/passportloginservice.cpp b/kmess/network/soap/passportloginservice.cpp deleted file mode 100644 index 47e2fd4..0000000 --- a/kmess/network/soap/passportloginservice.cpp +++ /dev/null @@ -1,500 +0,0 @@ -/*************************************************************************** - passportloginservice.cpp - description - ------------------- - begin : Sun Apr 22 2007 - copyright : (C) 2007 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 "passportloginservice.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "../../kmessdebug.h" -#include "../mimemessage.h" -#include "../extra/xmlfunctions.h" - - -/* - * 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, "PassportLoginService") -, redirects_(0) -{ - // RST stands for "Request Security Token" - // This class is called "PassportLoginService" since "RequestSecurityTokenService" is too hard to understand. -} - - - -/** - * @brief The destructor - */ -PassportLoginService::~PassportLoginService() -{ - -} - - - -/** - * @brief Start the login process - * - * The loginSucceeded() signal is fired when the webservice accepted the login data. - * 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 password The account password in plain text. - */ -void PassportLoginService::login( const QString ¶meters, const QString &handle, const QString &password ) -{ -#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE - kdDebug() << "PassportLoginService - Starting login with parameters " << parameters << "." << endl; -#endif - - // Store the given data - authenticationParameters_ = parameters; - handle_ = handle; - password_ = password; - - // Create the request - requestMultipleSecurityTokens(); -} - - - -/** - * @brief Internal method to parse the HTTP header. - * - * This method is overwritten to relax the allowed HTTP Content-Type values. - * For some reason, the response is marked as text/html. - * - * @param preamble The HTTP preamble, something like "HTTP/1.1 200 OK". - * @param header The fields of the HTTP header. - */ -bool PassportLoginService::parseHttpHeader( const QString &/*preamble*/, const MimeMessage &header ) -{ - int statusCode = getHttpStatusCode(); - - // Check the response code. - if( statusCode != 200 ) - { - kdWarning() << "PassportLoginService: Received HTTP status line: " << statusCode << endl; - return false; // Parse error! - } - - // Parse the Content-Type - QString contentType = header.getValue("Content-Type"); - if( contentType.contains(";") ) - { - contentType = contentType.section(';', 0, 0); - } - - // Content-Type should be text/xml, but the service returns text/html too for SOAP responses..! - if( contentType != "text/xml" - && contentType != "text/html" ) - { - kdWarning() << "PassportLoginService: Invalid Content-Type received: " << contentType << ", " - << "expected text/xml or text/html (endpoint=" << getEndpoint() << ")!" << endl; - return false; - } - - return true; // no parse error. -} - - - -/** - * @brief Internal function to parse the SOAP fault. - * - * This method detects the faultcode wsse:FailedAuthentication, - * to fire a loginIncorrect() signal instead of requestFailed(). - * - * It also traps SOAP fauls which are used to redirect the client. - * So far this has been observed with @msn.com passport accounts. - * - * The SOAP fault for an incorrect login looks like: - * @code - - - - - 1 - 0x80048800 - 0x80048821 - BAYPPLOGN2B32 2006.10.31.02.02.43 - - - - - - wsse:FailedAuthentication - Authentication Failure - - - * @endcode - * - * The SOAP fault for a redirect looks like: - * @code - - - - - 1 - 0x80048800 - 0x80048852 - BAYPPLOGN2A01 2007.04.23.14.59.31 - - - - - - psf:Redirect - https://msnia.login.live.com/pp450/RST.srf - Authentication Failure - - -@endcode - * - * 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. - */ -void PassportLoginService::parseSoapFault( const QDomElement &faultNode, const QDomElement &headerNode ) -{ - // Detect if the login failed. - QString faultCode = XmlFunctions::getNodeValue( faultNode, "faultcode" ); - if( faultCode == "wsse:FailedAuthentication" ) - { - emit loginIncorrect(); - } - else if( faultCode == "psf:Redirect" ) - { - QString redirectUrl = XmlFunctions::getNodeValue( faultNode, "redirectUrl" ); -#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE - kdDebug() << "PassportLoginService: received redirect to " << redirectUrl << endl; -#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 ); - requestMultipleSecurityTokens(); - } - else - { - HttpSoapConnection::parseSoapFault( faultNode, headerNode ); - } -} - - - -/** - * @brief Internal function to process 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 - - - - - 1 - 0006000087144D8E - 3.100.2199.0 - 3.0.869.0 - 0x48803 - 0x0 - BAYPPLOGN2B29 2007.04.23.14.59.31 - - - MH=; path=/; domain=.msn.com; expires=Wed, 30-Dec-2037 16:00:00 GMT - MHW=; path=/; domain=.msn.com; expires=Thu, 30-Oct-1980 16:00:00 GMT - MH=; path=/; domain=.live.com; expires=Wed, 30-Dec-2037 16:00:00 GMT - MHW=; path=/; domain=.live.com; expires=Thu, 30-Oct-1980 16:00:00 GMT - - - - - true - e95c54c3221ebb92 - - - - - - - - - urn:passport:legacy - - - http://Passport.NET/tb - - - - 2007-04-29T11:30:36Z - 2007-04-30T11:30:36Z - - - - - - http://Passport.NET/STS - - - ...some kind of long key... - - - - - - - - - ...some kind of key... - - - - urn:passport:legacy - - - messenger.msn.com - - - - 2007-04-29T11:30:36Z - 2007-04-29T11:38:56Z - - - ...the token for the USR command... - - - - - - - - - -@endcode - * - * @param resultRoot The result root of the SOAP response. - * @param headerNode The SOAP header node. - */ -void PassportLoginService::parseSoapResult( const QDomElement &resultRoot, const QDomElement &/*headerNode*/ ) -{ - QString resultType = resultRoot.nodeName(); - -#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE - kdDebug() << "PassportLoginService::slotRequestFinished: Parsing result node '" << resultType << "'" << endl; -#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" ) - { - // Received the response for our "RequestMultipleSecurityTokens" request. - QDomNodeList authTokens = resultRoot.elementsByTagName("BinarySecurityToken"); - if( authTokens.count() == 0 ) - { - // Likely an login error. - emit loginIncorrect(); - } - else - { - if( authTokens.count() > 1 ) - { - kdWarning() << "PassportLoginService::slotRequestFinished: Multiple authentication tokens found, " - << "using first one!" << endl; - } - - // The 't=...&p=..." like should be in the "BinarySecurityToken" element. - emit loginSucceeded( authTokens.item(0).toElement().text() ); - } - } - else - { - kdWarning() << "PassportLoginService::slotRequestFinished: Could not parse response " - << "(type=" << resultType - << " endpoint=" << getEndpoint() << ")" << endl; - emit requestFailed( this, "Unexpected response type" ); // not translated, see MsnNotificationConnection::soapRequestFailed - } -} - - - -/** - * @brief SOAP call to request the login tokens. - * - * This method is called by login(). - * It sends a huge binary blob which looks like this: - * @code - - - - - {7108E71A-9926-4FCB-BCC9-9A9D3F32E423} - 4 - 1 - - AQAAAAIAAABsYwQAAAAzMDg0 - - - - ...the login() username... - ...the login() password... - - - - - - - http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue - - - http://Passport.NET/tb - - - - - http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue - - - messenger.msn.com - - - - - - - -@endcode - */ -void PassportLoginService::requestMultipleSecurityTokens() -{ -#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE - kdDebug() << "PassportLoginService - Step 1. Requesting authentication data." << endl; -#endif - - QString authParams = KURL::decode_string( authenticationParameters_ ) - .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 body = "\n" - " \n" - " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" - " \n" - " \n" - " http://Passport.NET/tb\n" - " \n" - " \n" - " \n" - - " \n" - " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" - " \n" - " \n" - " messenger.msn.com\n" - " \n" - " \n" - " \n" - " \n" - - ""; - - sendRequest( QString::null, body, header ); -} - - -#include "passportloginservice.moc" diff --git a/kmess/network/soap/passportloginservice.h b/kmess/network/soap/passportloginservice.h deleted file mode 100644 index 8854026..0000000 --- a/kmess/network/soap/passportloginservice.h +++ /dev/null @@ -1,87 +0,0 @@ -/*************************************************************************** - passportloginservice.h - description - ------------------- - begin : Sun Apr 22 2007 - copyright : (C) 2007 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 SSLLOGINHANDLER_H -#define SSLLOGINHANDLER_H - -#include "httpsoapconnection.h" - - -/** - * @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 replaces the SSL-based Passport 1.4 login. - * The old class used a simple HTTP header to send results, - * this class has to send an large XML blob instead. - * The webservice is actually called "RST", which likely stands - * for "Request Security Token" considering the XML contents. - * - * For additional documentation about Passport 3.0, see - * http://msnpiki.msnfanatic.com/index.php/MSNP13:SOAPTweener - * - * @author Diederik van der Boor - * @ingroup NetworkSoap - */ -class PassportLoginService : public HttpSoapConnection -{ - Q_OBJECT - - public: - // The constructor - PassportLoginService( QObject *parent = 0 ); - // The destructor - ~PassportLoginService(); - // Start the login process - void login( const QString ¶meters, const QString &handle, const QString &password ); - - private: - // Parse the HTTP header - bool parseHttpHeader( const QString &preamble, const MimeMessage &header ); - // Parse the SOAP fault - void parseSoapFault( const QDomElement &resultRoot, const QDomElement &headerNode ); - // Process server responses - void parseSoapResult( const QDomElement &resultRoot, const QDomElement &headerNode ); - // Send the authentication request - void requestMultipleSecurityTokens(); - - 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_; - - signals : // Public signals - /** - * @brief Fired when the login failed because a wrong username/password was used. - */ - void loginIncorrect(); - - /** - * @brief Fired when the login succeeded. - */ - void loginSucceeded( QString authentication ); -}; - -#endif diff --git a/kmess/network/soap/soapmessage.cpp b/kmess/network/soap/soapmessage.cpp deleted file mode 100644 index 0121719..0000000 --- a/kmess/network/soap/soapmessage.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/*************************************************************************** - soapmessage.cpp - description - ------------------- - begin : Sun Jul 24 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 "soapmessage.h" -#include "../extra/xmlfunctions.h" -#include "../../kmessdebug.h" - -#include -#include - -#ifdef KMESSDEBUG_SOAPMESSAGE - #define KMESSDEBUG_SOAPMESSAGE_GENERAL -#endif - - - -// The soap message constructor -SoapMessage::SoapMessage() -: errorCode_(0) -{ -} - - - -// The constructor for action SoapMessages -SoapMessage::SoapMessage(const QString &message) -: errorCode_(0) -{ - parseMessage(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_.findIndex(field); - if(index == -1) - { - addField(field, value); - } - else - { - values_[index]= value; - } -} - - - -// Return the message action -const QString& SoapMessage::getAction() const -{ - return action_; -} - - - -// Return the message action namespace prefix -const QString& SoapMessage::getActionPrefix() const -{ - return actionPrefix_; -} - - - -// Return the message action namespace -const QString& SoapMessage::getActionNamespace() const -{ - return actionNs_; -} - - - -// Return the error code -int SoapMessage::getErrorCode() const -{ - return errorCode_; -} - - - -// Return the error description -const QString& SoapMessage::getErrorDescription() const -{ - return errorDescription_; -} - - - -// Return the entire message as string -QString SoapMessage::getMessage() const -{ - // Create the data message - QString soapMessage = ""; - - // Add the body tag - if(actionPrefix_.isEmpty()) - { - soapMessage += "<" + action_; - if(! actionNs_.isEmpty()) - { - soapMessage += " xmlns=\"" + actionNs_ + "\""; - } - soapMessage += ">"; - } - else - { - // Create a tag - soapMessage += "<" + actionPrefix_ + ":" + action_; - if(! actionNs_.isEmpty()) - { - soapMessage += " xmlns:" + actionPrefix_ + "=\"" + actionNs_ + "\""; - } - soapMessage += ">"; - } - - // If we received a tree of result nodes, include that - if(! responseBody_.isNull()) - { - QString str; - QTextStream ts( &str, IO_WriteOnly ); - ts << responseBody_; - soapMessage += str; - } - else - { - // Otherwise, add the parsed field/value pairs - - // Add the fields and values - for ( uint i = 0; i < fields_.count(); i++ ) - { - soapMessage += "<" + fields_[i] + ">" + values_[i] + ""; - } - } - - // Add the body closing tag - if(actionPrefix_.isEmpty()) - { - soapMessage += ""; - } - else - { - soapMessage += ""; - } - - // Add the remaining tags - soapMessage += ""; - - // Return the message - return soapMessage; -} - - - -// The total number of fields -uint SoapMessage::getNoFields() const -{ - return fields_.count(); -} - - - -// Get a value given a field -const QString& SoapMessage::getValue(const QString& field ) const -{ - int index = fields_.findIndex( field ); - - // Warn if not found - if(index == -1) - { - kdWarning() << "SoapMessage: This message does not have a field named '" << field << "'." << endl; - return QString::null; - } - - return values_[index]; -} - - - -// Return the response xml tree -const QDomNode& SoapMessage::getResponseBody() const -{ - return responseBody_; -} - - - -// Test whether a given field exists in the message header -bool SoapMessage::hasField(const QString& field) const -{ - return (fields_.findIndex( field ) == -1); -} - - - -// Return whether this was an error response -bool SoapMessage::isErrorMessage() const -{ - return (errorCode_ != 0); -} - - - -// Parse the incoming message -void SoapMessage::parseMessage(const QString &message) -{ - QDomDocument xml; - - // Parse the XML - QString errorMessage; - bool error = ! xml.setContent(message, true, &errorMessage); - - // Handle errors first - if(error) - { - kdWarning() << "SoapMessage::parseMessage - XML Parsing failed: '" << errorMessage << "'." << endl; - // Create a dummy the error message - errorCode_ = 1; - errorDescription_ = errorMessage; - return; - } - - // Get the body child node - QDomNode resultNode = XmlFunctions::getNode(xml, "/Envelope/Body").firstChild(); - QString resultNodeName = resultNode.toElement().nodeName(); - - if(resultNode.isNull()) - { - kdWarning() << "SoapMessage::parseMessage - XML Parsing failed: result node is null." << endl; - // Create a dummy the error message - errorCode_ = 1; - errorDescription_ = "result node is null"; - 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(uint 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/kmess/network/soap/soapmessage.h b/kmess/network/soap/soapmessage.h deleted file mode 100644 index 15774e8..0000000 --- a/kmess/network/soap/soapmessage.h +++ /dev/null @@ -1,109 +0,0 @@ -/*************************************************************************** - soapmessage.h - description - ------------------- - begin : Sun Sep 25 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. * - * * - ***************************************************************************/ - -#ifndef SOAPMESSAGE_H -#define SOAPMESSAGE_H - -#include -#include -#include -#include -#include - - -/** - * A class to parse SOAP messages. - * These messages can be sent to a remote server with the HttpSoapConnection class. - * - * @author Diederik van der Boor - * @ingroup NetworkSoap - */ -class SoapMessage -{ - public: // public methods - // The constructor to create messages - SoapMessage(); - // The constructor to parse incoming messages - SoapMessage(const QString &message); - // 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 error code - int getErrorCode() const; - // Return the error description - const QString& getErrorDescription() const; - // Return the entire message as string - QString getMessage() const; - // The total number of fields - uint getNoFields() const; - // Get a value given a field - const 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); - - - 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_; - - // 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_; -}; - -#endif diff --git a/kmess/network/tcpconnectionbase.cpp b/kmess/network/tcpconnectionbase.cpp deleted file mode 100644 index 8b6d5f5..0000000 --- a/kmess/network/tcpconnectionbase.cpp +++ /dev/null @@ -1,819 +0,0 @@ -/*************************************************************************** - tcpconnectionbase.cpp - description - ------------------- - begin : Tue Sep 03 2006 - 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 "tcpconnectionbase.h" - -#include "../kmessdebug.h" - -#include -#include -#include -#include -#include - -#ifdef KMESSDEBUG_TCPCONNECTION - #define KMESSDEBUG_TCPCONNECTION_GENERAL -#endif - - -/** - * @brief The constructor - * @param parent The Qt object parent. - * @param name The Qt object name, for debugging signals. - */ -TcpConnectionBase::TcpConnectionBase( QObject *parent, const char *name) - : QObject(parent, name) - , connectTimeout_(10) - , socket_(0) - , ssl_(0) - , timeout_(false) -{ - connect( &connectionTimer_, SIGNAL( timeout() ), - this, SLOT ( slotConnectionTimeout() )); -} - - - -/** - * @brief The destructor - * - * Closes the sockets and clears the buffer. - */ -TcpConnectionBase::~TcpConnectionBase() -{ - // Close and clean up - if( socket_ != 0 ) - { - closeConnection(); - delete socket_; - socket_ = 0; - } - - readBuffer_.truncate(0); - -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "DESTROYED TcpConnectionBase" << endl; -#endif -} - - - -/** - * @brief Close the connection. - */ -void TcpConnectionBase::closeConnection() -{ - // Internal function to disconnect, useful for derived classes. - closeSockets(); -} - - - -/** - * @brief Close the sockets. - * - * This is a protected function called internally from closeConnection(). - * This allows derived classes to make a distinction between internal disconnects and external closeConnection() requests. - * - * @return Returns whether the socket had to be closed; e.g. when the socket was already closed it returns false. - */ -bool TcpConnectionBase::closeSockets() -{ - // Reset globals - connectionTimer_.stop(); - - // Close buffers - readBuffer_.truncate(0); - - // Close and delete the socket - if( socket_ != 0 ) - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: closing sockets" << endl; -#endif - - if( ssl_ != 0 ) - { - ssl_->close(); - //ssl_->reInitialize(); - delete ssl_; - ssl_ = 0; - } - - socket_->flush(); - socket_->closeNow(); // also calls cancelAsyncConnect() - delete socket_; - socket_ = 0; - -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_CLOSE(this); -#endif - - return true; - } - else - { - return false; - } -} - - - -/** - * @brief Return the number of bytes which are already received in the local buffer - * - * @return The number of bytes in the buffer, or a negative number in case of an error. - */ -int TcpConnectionBase::getAvailableBytes() const -{ - if(KMESS_NULL(socket_)) return -2; // same as KExtendedSocket API, means "invalid state" - - if( ssl_ != 0 ) - { - return readBuffer_.size(); - } - else - { - return socket_->bytesAvailable(); - } -} - - - -/** - * @brief Return the connect timeout in seconds. - * @return The connection timeout. - */ -int TcpConnectionBase::getConnectTimeout() const -{ - return connectTimeout_; -} - - - -/** - * @brief Get the remote ip the socket is connected with. - * @returns The remote IP. - */ -QString TcpConnectionBase::getRemoteIp() const -{ - if(socket_ == 0) - { - return QString::null; - } - else if( socket_->peerAddress() == 0 ) - { - return QString::null; - } - else - { - return socket_->peerAddress()->nodeName(); - } -} - - - -/** - * @brief Get the remote port the socket is connected with. - * @returns The remote port. - */ -QString TcpConnectionBase::getRemotePort() const -{ - if(socket_ == 0) - { - return QString::null; - } - else if( socket_->peerAddress() == 0 ) - { - return QString::null; - } - else - { - return socket_->peerAddress()->serviceName(); - } -} - - - -/** - * @brief Get a description of the socket error. - * - * This is only useful in slotConnectionFailed(). - * - * @return The error description. - */ -QString TcpConnectionBase::getSocketError() const -{ - if( timeout_ ) - { - return i18n("Connection timeout"); - } - else if(socket_ == 0) - { - return QString::null; - } - else - { - // The return value of systemError() is the "errno" value from errno.h at the - // time the socket system-call failed. This function hides the low-level stuff - // like "errno" (see man:errno(3)) and perror() (see man:perror(3)) - return KExtendedSocket::strError( socket_->status(), socket_->systemError() ); - } -} - - - -/** - * @brief Return true if a connection is active. - * @returns True when connected, false when disconnected. - */ -bool TcpConnectionBase::isConnected() const -{ - return (socket_ != 0 && socket_->socketStatus() == KExtendedSocket::connected); -} - - - -/** - * @brief Connect to a remote host. - * @param host IP-address or hostname to connect to. - * @param port TCP-port to connect to. - * @param ssl Whether to use SSL or not. - * @param async Use asychonous connections, or not. If false, the application blocks until the connection is made or failed. - */ -bool TcpConnectionBase::openConnection(const QString &host, const int port, bool ssl, bool async) -{ -#ifdef KMESSTEST - ASSERT( socket_ == 0 ); - ASSERT( ssl_ == 0 ); - ASSERT( port != 0 ); - ASSERT( ! host.isEmpty() ); -#endif - - // Test for sources of unexplainable errors. - if( host.isEmpty() || port == 0 ) - { - kdWarning() << "TcpConnectionBase::openConnection: No ipAddress or port given!" << endl; - return false; - } - -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Connecting to " << host << " port " << port << " (ssl=" << ssl << ")." << endl; -#endif - - // Configure the socket for asynchronous operation - // Note that a buffered socket only emits the readyRead() signal when data is really received. - // The socket is made non-blocking, so the connectionSuccess() signal tells us when the connection is made. - // Otherwise KMess would freeze until a connection is made or fails. - socket_ = new KExtendedSocket(host, port, ( ssl ? KExtendedSocket::streamSocket : KExtendedSocket::bufferedSocket ) ); // not buffering because KSSL/OpenSSL accesses the socket directly. - socket_->enableRead(true); - socket_->enableWrite(false); - socket_->setBlockingMode(false); // avoid blocking until connect() returns - socket_->setTimeout( connectTimeout_ ); - connect( socket_, SIGNAL( readyRead() ), this, SLOT( slotSocketReadyRead() )); - connect( socket_, SIGNAL( readyWrite() ), this, SLOT( slotSocketReadyWrite() )); - connect( socket_, SIGNAL( connectionFailed(int) ), this, SLOT( slotSocketFailed(int) )); - connect( socket_, SIGNAL( connectionSuccess() ), this, SLOT( slotSocketConnected() )); - - // Update state variables - timeout_ = false; - connectingTo_ = host + ":" + QString::number(port); - - // Connect the socket - int connectResult = (async ? socket_->startAsyncConnect() : socket_->connect()); - - // Connect the socket - if(connectResult != 0) - { - kdWarning() << "TcpConnectionBase: Couldn't connect new socket to " << connectingTo_ << endl; - delete socket_; - socket_ = 0; - return false; - } - - // Start timer, as the asyncConnect doesn't seam to honor the timeout value. - connectionTimer_.start( connectTimeout_ * 1000, true ); // because KExtendedSocket uses seconds, not miliseconds - - // Initialize SSL - if( ssl ) - { - ssl_ = new KSSL(); - } - - // The code continues with slotSocketConnected() or slotSocketFailed() - return true; -} - - - -/** - * @brief Generate data/size values from a QByteArray buffer. - * - * This is used by peekBlock() and readBlock(). - * The returned bufferStart and bufferSize values respect the allocated size of the buffer, - * even if maxSize / bufferOffset exceed the buffer size. An error will be displayed at the - * console when this occurs. - * - * @param buffer The buffer to fill. - * @param maxSize The maximum number of bytes to fill. - * @param bufferOffset The starting position where bytes should be written. - * @param bufferStart Output value, the 'data' pointer to use. - * @param blockSize Output value, the 'size' value to use. - * @return Whether the output values are set or not. - */ -bool TcpConnectionBase::parseBuffer( QByteArray *buffer, const int maxSize, const int bufferOffset, char **bufferStart, int *blockSize ) -{ - // Determine the maximum number of bytes we can write to the buffer - int bufferSpace = buffer->size() - bufferOffset; - - // API usage check. - // Warn if certain sizes get a unusual value - if(buffer->size() == 0) - { - kdWarning() << "TcpConnectionBase::readBlock: buffer is not initialized!" << endl; - return false; - } - else if(bufferSpace < 0) - { - kdWarning() << "TcpConnectionBase::readBlock: offset of " << bufferOffset << " bytes" - << " exceeds the buffer size of " << buffer->size() << " bytes!" << endl; - } - else if(bufferSpace < maxSize) - { - kdWarning() << "TcpConnectionBase::readBlock: maximum allowed read size" - << " exceeds the buffer size of " << buffer->size() << " bytes!" << endl; - } - - // Fill the buffer from the give offset, - // size argument is limited to what the buffer can/may sustain. - *bufferStart = buffer->data() + bufferOffset; - *blockSize = (maxSize == 0 ? bufferSpace : QMIN(bufferSpace, maxSize)); - return true; -} - - - -/** - * @brief Peek data from the socket. - * - * The contents in the buffer is overwritten with the socket data. - * - * Unlike readBlock(), the data is not removed from the buffer. - * It can be peeked or read later. This method is useful to - * search in incoming data for an expected end marking (e.g. newline). - * - * @param buffer Buffer to fill with the data. - * @param size Size of the buffer; the maximum number of bytes which can be written to it. - * @return The number of bytes which could be written to the buffer. A negative value is returned when an error occured. - */ -int TcpConnectionBase::peekBlock( char *buffer, int size ) -{ -#ifdef KMESSTEST - ASSERT( size > 0 ); -#endif - - // Avoid crashes - if(KMESS_NULL(socket_)) return -1; - if(KMESS_NULL(buffer)) return -1; - - // Fill the buffer - if( ssl_ != 0 ) - { - // KMessBuffer::left warns if the size exceeds the buffer, peek manually. - // data is already stored into a buffer because SSL socket is unbuffered. - uint realBytes = QMIN( readBuffer_.size(), (uint) size ); - if( realBytes == 0 ) - { - return 0; - } - else - { - memcpy( buffer, readBuffer_.data(), realBytes ); - return realBytes; - } - } - else - { - return socket_->peekBlock( buffer, size ); - } -} - - - -/** - * @brief Peek data from the socket. - * - * The contents of the QByteArray is overwritten with the socket data. - * The value of QByteArray::size() is used as buffer size, maxSize can only be - * used to limit the number of bytes that should be written, not extend it. - * - * This is a convenience function which uses a QByteArray as buffer to avoid buffer overflows. - * - * @param buffer The buffer to fill with socket data. - * @param maxSize The maximum number of bytes that should be written to the buffer, in case the buffer is larger. - * @param bufferOffset The offset in the buffer, the byte position where the new data should be written to. - * @return The number of bytes which could be written to the buffer. A negative value is returned when an error occured. - */ -int TcpConnectionBase::peekBlock( QByteArray *buffer, const int maxSize, const int bufferOffset ) -{ - // Avoid crashes - if(KMESS_NULL(socket_)) return -1; - if(KMESS_NULL(buffer)) return -1; - - char *bufferStart = 0; - int blockSize = 0; - - if( ! parseBuffer( buffer, maxSize, bufferOffset, &bufferStart, &blockSize ) ) - { - return -1; - } - - return peekBlock( bufferStart, blockSize ); -} - - - -/** - * @brief Return all data available in the read buffer. - * @returns All data in the buffer. - */ -QByteArray TcpConnectionBase::readAll() -{ - if( ssl_ != 0 ) - { - QByteArray data = readBuffer_; // creates explicitly shared copy. - data.detach(); // force deep copy, avoid sharing the same data. - readBuffer_.truncate(0); - return data; - } - else - { - return socket_->readAll(); - } -} - - - -/** - * @brief Read data from the socket. - * - * In constrast to the peekBlock() function, this function - * also removes the returned data from the read buffer. - * - * @param buffer Buffer to fill with the data. - * @param size Size of the buffer; the maximum number of bytes which can be written to it. - * @return The number of bytes which could be written to the buffer. A negative value is returned when an error occured. - */ -int TcpConnectionBase::readBlock( char *buffer, int size ) -{ -#ifdef KMESSTEST - ASSERT( size > 0 ); -#endif - - // Avoid crashes - if(KMESS_NULL(socket_)) return -1; - if(KMESS_NULL(buffer)) return -1; - - // Fill the buffer - if( ssl_ != 0 ) - { -#ifdef KMESSDEBUG_TCPCONNECTION - kdDebug() << "TcpConnectionBase: read buffer has " << readBuffer_.size() << " bytes available, " - << "requesting " << size << " bytes." << endl; -#endif - // data is already stored into a buffer because SSL socket is unbuffered. - int bytesRead = readBuffer_.readBlock( buffer, size ); - return bytesRead; - } - else - { - return socket_->readBlock( buffer, size ); - } -} - - - -/** - * @brief Read data from the socket. - * - * The contents of the QByteArray is overwritten with the socket data. - * The value of QByteArray::size() is used as buffer size, maxSize can only be - * used to limit the number of bytes that should be written, not extend it. - * - * This is a convenience function which uses a QByteArray as buffer to avoid buffer overflows. - * - * @param buffer The buffer to fill with socket data. - * @param maxSize The maximum number of bytes that should be written to the buffer, in case the buffer is larger. - * @param bufferOffset The offset in the buffer, the byte position where the new data should be written to. - * @return The number of bytes which could be written to the buffer. A negative value is returned when an error occured. - */ -int TcpConnectionBase::readBlock( QByteArray *buffer, const int maxSize, const int bufferOffset ) -{ - // Avoid crashes - if(KMESS_NULL(socket_)) return -1; - if(KMESS_NULL(buffer)) return -1; - - char *bufferStart = 0; - int blockSize = 0; - - if( ! parseBuffer( buffer, maxSize, bufferOffset, &bufferStart, &blockSize ) ) - { - return -1; - } - - int bytesRead = readBlock( bufferStart, blockSize ); - return bytesRead; -} - - - -/** - * @brief Set the connect timeout - * @param seconds The new timeout value. - */ -void TcpConnectionBase::setConnectTimeout( int seconds ) -{ - connectTimeout_ = seconds; -} - - - -/** - * @brief Called when an error occured while connecting. - * - * Either a connection timeout occured, or the remote host refused the connection. - */ -void TcpConnectionBase::slotConnectionFailed() -{ - // This method is added for derived classes to overload. - - QString sysError = getSocketError(); // avoids poking sys_errlist[] manually - - if( ! sysError.isNull() ) - { - kdWarning() << "TcpConnectionBase: Failed to connect to " << connectingTo_ << ", system error: " << sysError << "." << endl; - } - else - { - kdWarning() << "TcpConnectionBase: Failed to connect to " << connectingTo_ << "!" << endl; - } -} - - - -/** - * @brief Called when timeout occured while connecting to a remote host. - * - * This method stops the timeout detection, closes the sockets - * and calls slotConnectionFailed(). - */ -void TcpConnectionBase::slotConnectionTimeout() -{ - if( isConnected() ) - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase::slotConnectionTimeout: Timer fired but connection already established, ignore." << endl; -#endif - return; - } - - -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Timer fired before connection was established." << endl; -#endif - - // Delete sockets, no connectionClosed events in derived classes. - closeSockets(); - - // Set state for getSocketError(); - timeout_ = true; - - // Inform derived class - connectionTimer_.stop(); - slotConnectionFailed(); -} - - - -/** - * @brief Called when the socket connected. - * - * This method stops the timeout detection, initializes the buffers - * and calls slotConnectionEstablished(). - */ -void TcpConnectionBase::slotSocketConnected() -{ - // This is called when the socket in openConnection() was connected. -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Connected with host" << endl; -#endif - - // Connect SSL - if( ssl_ != 0 ) - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Connecting SSL" << endl; -#endif - int sslStatus = ssl_->connect( socket_->fd() ); - if( sslStatus != 1 ) - { - kdWarning() << "TcpConnectionBase::slotSocketConnected: SSL Connection failed " - << "(endpoint=" << connectingTo_ << " sslerror=" << sslStatus << ")" << endl; - return; - } - } - - // Update state - connectionTimer_.stop(); - readBuffer_.truncate(0); - - // Inform derived class - slotConnectionEstablished(); -} - - - -/** - * @brief Called when the connection could not be made. - * - * This method stops the timeout detection - * and calls slotConnectionFailed(). - * - * @param error The system error code. - */ -void TcpConnectionBase::slotSocketFailed(int error) -{ - // This is called when the socket in openConnection() failed. -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Failed to connect to host: " << getSocketError() << endl; -#endif -#ifdef KMESSTEST - ASSERT( socket_->systemError() == error ); -#else - Q_UNUSED( error ); // Avoid compiler warning -#endif - - // Inform derived class - connectionTimer_.stop(); - slotConnectionFailed(); -} - - - -/** - * @brief Called when new data is available to read. - * - * This method calls slotDataReceived(). - * - * For SSL-based sockets, this method buffers the SSL data before notifying the derived class. - * While KExtendedSocket implements read buffers, KSSL does not. - * For SSL negotiation messages, it's possible KSSL consumes all data. - * The slotDataReceived() method won't be called in that situation. - */ -void TcpConnectionBase::slotSocketReadyRead() -{ - if( KMESS_NULL(socket_) ) return; - - // When SSL is used, the socket is unbuffered. - // Read all data from the socket into the local buffer. - if( ssl_ != 0 ) - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: socket is ready, ssl has " << ssl_->pending() << " bytes pending for immediate read." << endl; -#endif - - // Attempt to read all data available. - char buffer[512]; - int bytesRead = 0; - int totalBytesRead = false; - do - { - bytesRead = ssl_->read(buffer, 512); - if( bytesRead < 0 ) - { - kdWarning() << className() << ": SSL read returned " << bytesRead << endl; - return; - } - else if( bytesRead > 0 ) - { - // Move pointer to end to write, move - readBuffer_.add( buffer, bytesRead ); - totalBytesRead += bytesRead; - } - } - while( bytesRead == 512 || ssl_->pending() > 0 ); - - // Notify subclass when data is available. - if( totalBytesRead > 0 ) - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Read " << totalBytesRead << " bytes from the SSL layer." << endl; -#endif - slotDataReceived(); - } - } - else - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Socket has " << socket_->bytesAvailable() << " bytes available." << endl; -#endif - slotDataReceived(); - } -} - - - -/** - * @brief Called when the socket can write new data. - * - * This is currently a STUB for an event-based writing methods. - */ -void TcpConnectionBase::slotSocketReadyWrite() -{ - // STUB. - // Flush the write buffer, call enableWrite(false) when the buffer is empty. -} - - - -/** - * @brief Stop the connection timeout detection. - */ -void TcpConnectionBase::stopTimeoutDetection() -{ - connectionTimer_.stop(); -} - - - -/** - * @brief Write data to the socket - * @param block The data to write. - * @param size The size of the data. - * @return Whether the bytes could be written to the socket. - */ -bool TcpConnectionBase::writeBlock( const char *block, const int size ) -{ - if(KMESS_NULL(socket_)) return false; - - int noBytesWritten; - - if( ssl_ != 0 ) - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Writing " << size << " bytes to the SSL layer." << endl; -#endif - - noBytesWritten = ssl_->write( block, size ); - } - else - { -#ifdef KMESSDEBUG_TCPCONNECTION_GENERAL - kdDebug() << "TcpConnectionBase: Writing " << size << " bytes to the socket buffer." << endl; -#endif - - noBytesWritten = socket_->writeBlock( block, size ); - } - -#ifdef KMESS_NETWORK_WINDOW - QByteArray wrapper; - wrapper.setRawData( block, size ); - KMESS_NET_SENT(this, wrapper); - wrapper.resetRawData( block, size ); -#endif - - // Return true if the data was indeed written. - return ( noBytesWritten == size ); -} - - - -/** - * @brief Write data to the socket. - * - * This is a convience function. - * - * @param block The data to write - * @return Whether the bytes could be written to the socket. - */ -bool TcpConnectionBase::writeBlock( const QByteArray &block ) -{ - return writeBlock( block.data(), block.size() ); -} - - -#include "tcpconnectionbase.moc" diff --git a/kmess/network/tcpconnectionbase.h b/kmess/network/tcpconnectionbase.h deleted file mode 100644 index 2acdb18..0000000 --- a/kmess/network/tcpconnectionbase.h +++ /dev/null @@ -1,164 +0,0 @@ -/*************************************************************************** - tcpconnectionbase.h - description - ------------------- - begin : Tue Sep 03 2006 - 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. * - * * - ***************************************************************************/ - -#ifndef TCPCONNECTIONBASE_H -#define TCPCONNECTIONBASE_H - -#include "kmessbuffer.h" - -#include -#include -#include -#include - -class KExtendedSocket; -class KSSL; - -/** - * @brief A base for socket handling. - * - * This class implements a base for connection handling. - * - * It implements the following features: - * - buffering - * - async-connect - * - SSL support - * - timeout detection - * - signal handling - * - * Internally, KExtendedSocket is used for compatibility with older KDE versions. - * - * The following methods are especially useful for derived classes: - * - openConnection() - * - closeConnection() - * - getAvailableBytes() - * - readBlock() - * - peekBlock() - * - writeBlock() - * - * Derived classes should overwrite the following methods to implement the event handling: - * - slotConnectionEstablished() - * - slotConnectionFailed() - * - slotDataReceived() - * - closeConnection() - * - closeSockets() - * - * @author Diederik van der Boor - * @ingroup NetworkCore - */ -class TcpConnectionBase : public QObject -{ - Q_OBJECT - - public: - // The constructor - TcpConnectionBase(QObject *parent = 0, const char *name = 0); - // The destructor - virtual ~TcpConnectionBase(); - - // Close the connection - virtual void closeConnection(); - // Return true if a connection is active - bool isConnected() const; - // Get the remote ip the socket is connected with. - QString getRemoteIp() const; - // Get the remote port the socket is connected with. - QString getRemotePort() const; - // Return the error description - QString getSocketError() const; - // Connect to a host - bool openConnection(const QString &host, int port, bool ssl = false, bool async = true); - - protected slots: - /** - * @brief Called when the connection is established - */ - virtual void slotConnectionEstablished() = 0; - - // Called when the connection could not be made. - virtual void slotConnectionFailed(); - - /** - * @brief Called when data is received from the socket. - * - * Derived classes can use getBytesAvailable(), peekBlock(), readBlock() and readAll() - * to read and process the incoming data. - * Note the method should read all socket data unless it's known more data will arrive. - * Otherwise, the application is ignoring incoming data too long. - */ - virtual void slotDataReceived() = 0; - - private slots: - // A timeout occured to connect a socket - void slotConnectionTimeout(); - // The connection was established - void slotSocketConnected(); - // The connection could not be made. - void slotSocketFailed(int error); - // The socket can read new data - void slotSocketReadyRead(); - // The socket can write new data - void slotSocketReadyWrite(); - - protected: // Protected methods - // Close the sockets - virtual bool closeSockets(); - // Return the number of bytes which are already received in the local buffer - int getAvailableBytes() const; - // Return the connect timeout - int getConnectTimeout() const; - // Peek data from the socket - int peekBlock( char *buffer, const int size ); - // Peek data from the socket (uses the QByteArray size() as block size) - int peekBlock( QByteArray *buffer, const int maxSize = 0, const int offset = 0 ); - // Return everything that's in the read buffer. - QByteArray readAll(); - // Read data from the socket - int readBlock( char *buffer, const int size ); - // Read data from the socket (uses the QByteArray size() as block size) - int readBlock( QByteArray *buffer, const int maxSize = 0, const int offset = 0 ); - // Set the connect timeout - void setConnectTimeout( int seconds ); - // Stop the timeout detection - void stopTimeoutDetection(); - // Write data to the socket - bool writeBlock( const char *block, const int size ); - // Write data to the socket - bool writeBlock( const QByteArray &block ); - - private: // Private methods - // Convert a QByteArray to data/size fields. - bool parseBuffer( QByteArray *buffer, const int maxSize, const int bufferOffset, char **bufferStart, int *blockSize ); - - private: // Private attributes - /// The location openConnection() is connecting to, for debugging - QString connectingTo_; - /// The connect timeout - int connectTimeout_; - /// The timeout handling for openConnection() - QTimer connectionTimer_; - /// The buffer for read data - KMessBuffer readBuffer_; - /// The socket over which data is sent or received. - KExtendedSocket *socket_; - /// The SSL presentation wrapper - KSSL *ssl_; - /// Whether an timeout occured - bool timeout_; -}; - -#endif diff --git a/kmess/network/upnp/.cvsignore b/kmess/network/upnp/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/network/upnp/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/network/upnp/Makefile.am b/kmess/network/upnp/Makefile.am deleted file mode 100644 index a195b2c..0000000 --- a/kmess/network/upnp/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDES = $(all_includes) -METASOURCES = AUTO -noinst_LIBRARIES = libupnp.a -libupnp_a_SOURCES = layer3forwardingservice.cpp rootservice.cpp \ - wanconnectionservice.cpp service.cpp igdcontrolpoint.cpp ssdpconnection.cpp manager.cpp -noinst_HEADERS = layer3forwardingservice.h rootservice.h wanconnectionservice.h \ - service.h igdcontrolpoint.h ssdpconnection.h manager.h diff --git a/kmess/network/upnp/Makefile.in b/kmess/network/upnp/Makefile.in deleted file mode 100644 index aa444df..0000000 --- a/kmess/network/upnp/Makefile.in +++ /dev/null @@ -1,790 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libupnp_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/network/upnp -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libupnp_a_AR = $(AR) $(ARFLAGS) -libupnp_a_LIBADD = -am_libupnp_a_OBJECTS = layer3forwardingservice.$(OBJEXT) \ - rootservice.$(OBJEXT) wanconnectionservice.$(OBJEXT) \ - service.$(OBJEXT) igdcontrolpoint.$(OBJEXT) \ - ssdpconnection.$(OBJEXT) manager.$(OBJEXT) -#>- libupnp_a_OBJECTS = $(am_libupnp_a_OBJECTS) -#>+ 7 -libupnp_a_final_OBJECTS = libupnp_a.all_cpp.o -libupnp_a_nofinal_OBJECTS = layer3forwardingservice.$(OBJEXT) \ - rootservice.$(OBJEXT) wanconnectionservice.$(OBJEXT) \ - service.$(OBJEXT) igdcontrolpoint.$(OBJEXT) \ - ssdpconnection.$(OBJEXT) manager.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libupnp_a_OBJECTS = $(libupnp_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libupnp_a_OBJECTS = $(libupnp_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/igdcontrolpoint.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/layer3forwardingservice.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/manager.Po ./$(DEPDIR)/rootservice.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/service.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/ssdpconnection.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/wanconnectionservice.Po -#>+ 12 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/libupnp_a.all_cpp.P ./$(DEPDIR)/igdcontrolpoint.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/layer3forwardingservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/manager.Po ./$(DEPDIR)/rootservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/service.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/ssdpconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/wanconnectionservice.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = ./$(DEPDIR)/igdcontrolpoint.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/layer3forwardingservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/manager.Po ./$(DEPDIR)/rootservice.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/service.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/ssdpconnection.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/wanconnectionservice.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libupnp_a_SOURCES) -DIST_SOURCES = $(libupnp_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -INCLUDES = $(all_includes) -#>- METASOURCES = AUTO -noinst_LIBRARIES = libupnp.a -libupnp_a_SOURCES = layer3forwardingservice.cpp rootservice.cpp \ - wanconnectionservice.cpp service.cpp igdcontrolpoint.cpp ssdpconnection.cpp manager.cpp - -noinst_HEADERS = layer3forwardingservice.h rootservice.h wanconnectionservice.h \ - service.h igdcontrolpoint.h ssdpconnection.h manager.h - -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/upnp/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/network/upnp/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/upnp/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/upnp/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/upnp/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libupnp.a: $(libupnp_a_OBJECTS) $(libupnp_a_DEPENDENCIES) - -rm -f libupnp.a - $(libupnp_a_AR) libupnp.a $(libupnp_a_OBJECTS) $(libupnp_a_LIBADD) - $(RANLIB) libupnp.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/igdcontrolpoint.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer3forwardingservice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/manager.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rootservice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/service.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssdpconnection.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wanconnectionservice.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -ssdpconnection.moc: $(srcdir)/ssdpconnection.h - $(MOC) $(srcdir)/ssdpconnection.h -o ssdpconnection.moc - -#>+ 2 -mocs: ssdpconnection.moc - -#>+ 3 -igdcontrolpoint.moc: $(srcdir)/igdcontrolpoint.h - $(MOC) $(srcdir)/igdcontrolpoint.h -o igdcontrolpoint.moc - -#>+ 2 -mocs: igdcontrolpoint.moc - -#>+ 3 -service.moc: $(srcdir)/service.h - $(MOC) $(srcdir)/service.h -o service.moc - -#>+ 2 -mocs: service.moc - -#>+ 3 -manager.moc: $(srcdir)/manager.h - $(MOC) $(srcdir)/manager.h -o manager.moc - -#>+ 2 -mocs: manager.moc - -#>+ 3 -clean-metasources: - -rm -f ssdpconnection.moc igdcontrolpoint.moc service.moc manager.moc - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/network/upnp/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/network/upnp/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/network/upnp/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libupnp_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/layer3forwardingservice.cpp $(srcdir)/rootservice.cpp $(srcdir)/wanconnectionservice.cpp $(srcdir)/service.cpp $(srcdir)/igdcontrolpoint.cpp $(srcdir)/ssdpconnection.cpp $(srcdir)/manager.cpp igdcontrolpoint.moc ssdpconnection.moc service.moc manager.moc - @echo 'creating libupnp_a.all_cpp.cpp ...'; \ - rm -f libupnp_a.all_cpp.files libupnp_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libupnp_a.all_cpp.final; \ - for file in layer3forwardingservice.cpp rootservice.cpp wanconnectionservice.cpp service.cpp igdcontrolpoint.cpp ssdpconnection.cpp manager.cpp ; do \ - echo "#include \"$$file\"" >> libupnp_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libupnp_a.all_cpp.final; \ - done; \ - cat libupnp_a.all_cpp.final libupnp_a.all_cpp.files > libupnp_a.all_cpp.cpp; \ - rm -f libupnp_a.all_cpp.final libupnp_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libupnp_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libupnp_a_OBJECTS="$(libupnp_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libupnp_a_OBJECTS="$(libupnp_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libupnp_a_OBJECTS="$(libupnp_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libupnp_a_OBJECTS="$(libupnp_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 11 -nmcheck: -igdcontrolpoint.o: igdcontrolpoint.moc -manager.o: manager.moc -nmcheck-am: nmcheck -igdcontrolpoint.lo: igdcontrolpoint.moc -ssdpconnection.lo: ssdpconnection.moc -service.o: service.moc -ssdpconnection.o: ssdpconnection.moc -service.lo: service.moc -manager.lo: manager.moc diff --git a/kmess/network/upnp/ssdpconnection.cpp b/kmess/network/upnp/ssdpconnection.cpp deleted file mode 100644 index 6afe142..0000000 --- a/kmess/network/upnp/ssdpconnection.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/*************************************************************************** - ssdpconnection.cpp - description - ------------------- - begin : Fri Jul 29 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 "ssdpconnection.h" - -#include -#include -#include - -#include - -#include - -#include -#include "../../kmessdebug.h" - -#ifdef KMESSDEBUG_UPNP -#define KMESSDEBUG_UPNP_GENERAL -#endif - -namespace UPnP -{ - - -// The constructor -SsdpConnection::SsdpConnection() -: QObject() -{ - // Create a UDP socket sending messages to a special broadcast address - - // Not using KExtendedSocket here, because it's: a. obsolete b. not documented well - // In newer KDE versions we could use KNetwork::KDatagramSocket - socket_ = new QSocketDevice(QSocketDevice::Datagram); - - notifier_ = new QSocketNotifier(socket_->socket(), QSocketNotifier::Read); - connect(notifier_, SIGNAL( activated(int) ) , - this, SLOT( slotDataReceived() ) ); -} - - -// The destructor -SsdpConnection::~SsdpConnection() -{ - delete notifier_; - if(socket_ != 0) - { - socket_->close(); - delete socket_; - } -} - - - -// Data was received by the socket -void SsdpConnection::slotDataReceived() -{ -#ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::SsdpConnection: received " << socket_->bytesAvailable() << " bytes." << endl; -#endif - - // Get the HTTP-like content - // TODO: How to handle multiple packets arriving from different devices? - QByteArray response = socket_->readAll(); - - // Response from my Acatel router: - // - // HTTP/1.1 200 OK - // CACHE-CONTROL:max-age=1800 - // EXT: - // LOCATION:http://10.0.0.138:80/IGD.xml - // SERVER:SpeedTouch 510 4.0.2.0.0 UPnP/1.0 (0313QZ6S2) - // ST:upnp:rootdevice - // USN:uuid:UPnP-SpeedTouch510-1_00-90-D0-8E-A1-6F::upnp:rootdevice - // - - QString sspdResponse = QString::fromUtf8(response.data(), response.size()); - - // Find the location field manually, MimeMessage is not required - int locationStart = sspdResponse.find("LOCATION:",0,false); // case insensitive - int locationEnd = sspdResponse.find("\r\n",locationStart); - - locationStart += 9; // length of field name - QString location = sspdResponse.mid(locationStart, locationEnd - locationStart); - - // Parse the URL syntax using KURL - KURL url(location); - - // Emit success - emit deviceFound(url.host(), url.port(), url.path()); -} - - -// Send a broadcast to detect all devices -void SsdpConnection::queryDevices(int bindPort) -{ -#ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::SsdpConnection: Sending broadcast packet." << endl; -#endif - - // Send a packet to a broadcast address - QHostAddress address; - address.setAddress("239.255.255.250"); - - QString data = "M-SEARCH * HTTP/1.1\r\n" - "Host:239.255.255.250:1900\r\n" - // "ST:upnp:rootdevice\r\n" - "ST:urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n" - "Man:\"ssdp:discover\"\r\n" - "MX:3\r\n" - "\r\n"; - - // Bind the socket to a certain port - bool success = socket_->bind(QHostAddress(), bindPort); - if(! success) - { - kdWarning() << "UPnP::SsdpConnection: Failed to bind to port " << bindPort << "." << endl; - } - - // Send the data - QCString dataBlock = data.utf8(); - int bytesWritten = socket_->writeBlock(dataBlock.data(), dataBlock.size(), address, 1900); - - if(bytesWritten == -1) - { - kdWarning() << "UPnP::SsdpConnection: Failed to send the UPnP broadcast packet." << endl; - } -} - - - -} // end of namespace - -#include "ssdpconnection.moc" diff --git a/kmess/notification/.cvsignore b/kmess/notification/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/notification/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/notification/Makefile.am b/kmess/notification/Makefile.am deleted file mode 100644 index ba07177..0000000 --- a/kmess/notification/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libnotification.a - -INCLUDES = $(all_includes) - -libnotification_a_METASOURCES = AUTO - -libnotification_a_SOURCES = notificationchat.cpp notificationcontactstatus.cpp \ - notificationmanager.cpp notificationnewemail.cpp passivepopup.cpp passivepopupinterface.ui \ - passivepopupview.cpp passivepopupwidget.cpp - - -EXTRA_DIST = - -####### kdevelop will overwrite this part!!! (end)############ -noinst_HEADERS = notificationchat.h notificationcontactstatus.h \ - notificationmanager.h notificationnewemail.h passivepopupview.h passivepopupwidget.h diff --git a/kmess/notification/Makefile.in b/kmess/notification/Makefile.in deleted file mode 100644 index b3067ab..0000000 --- a/kmess/notification/Makefile.in +++ /dev/null @@ -1,860 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libnotification_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/notification -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libnotification_a_AR = $(AR) $(ARFLAGS) -libnotification_a_LIBADD = -am_libnotification_a_OBJECTS = notificationchat.$(OBJEXT) \ - notificationcontactstatus.$(OBJEXT) \ - notificationmanager.$(OBJEXT) notificationnewemail.$(OBJEXT) \ - passivepopup.$(OBJEXT) passivepopupview.$(OBJEXT) \ - passivepopupwidget.$(OBJEXT) -#>- libnotification_a_OBJECTS = $(am_libnotification_a_OBJECTS) -#>+ 8 -libnotification_a_final_OBJECTS = libnotification_a.all_cpp.o -libnotification_a_nofinal_OBJECTS = notificationchat.$(OBJEXT) \ - notificationcontactstatus.$(OBJEXT) \ - notificationmanager.$(OBJEXT) notificationnewemail.$(OBJEXT) \ - passivepopup.$(OBJEXT) passivepopupview.$(OBJEXT) \ - passivepopupwidget.$(OBJEXT) passivepopupinterface.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libnotification_a_OBJECTS = $(libnotification_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libnotification_a_OBJECTS = $(libnotification_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/notificationchat.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/notificationcontactstatus.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/notificationmanager.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/notificationnewemail.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/passivepopup.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/passivepopupview.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/passivepopupwidget.Po -#>+ 14 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/passivepopupinterface.P $(DEPDIR)/libnotification_a.all_cpp.P ./$(DEPDIR)/notificationchat.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/notificationcontactstatus.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/notificationmanager.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/notificationnewemail.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/passivepopup.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/passivepopupview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/passivepopupwidget.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/passivepopupinterface.P ./$(DEPDIR)/notificationchat.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/notificationcontactstatus.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/notificationmanager.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/notificationnewemail.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/passivepopup.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/passivepopupview.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/passivepopupwidget.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libnotification_a_SOURCES) -DIST_SOURCES = $(libnotification_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libnotification.a -INCLUDES = $(all_includes) -#>- libnotification_a_METASOURCES = AUTO -#>- libnotification_a_SOURCES = notificationchat.cpp notificationcontactstatus.cpp \ -#>- notificationmanager.cpp notificationnewemail.cpp passivepopup.cpp passivepopupinterface.ui \ -#>- passivepopupview.cpp passivepopupwidget.cpp -#>+ 3 -libnotification_a_SOURCES=notificationchat.cpp notificationcontactstatus.cpp \ - notificationmanager.cpp notificationnewemail.cpp passivepopup.cpp \ - passivepopupview.cpp passivepopupwidget.cpp passivepopupinterface.cpp - -EXTRA_DIST = - -####### kdevelop will overwrite this part!!! (end)############ -noinst_HEADERS = notificationchat.h notificationcontactstatus.h \ - notificationmanager.h notificationnewemail.h passivepopupview.h passivepopupwidget.h - -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/notification/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/notification/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/notification/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/notification/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/notification/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libnotification.a: $(libnotification_a_OBJECTS) $(libnotification_a_DEPENDENCIES) - -rm -f libnotification.a - $(libnotification_a_AR) libnotification.a $(libnotification_a_OBJECTS) $(libnotification_a_LIBADD) - $(RANLIB) libnotification.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notificationchat.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notificationcontactstatus.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notificationmanager.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notificationnewemail.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passivepopup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passivepopupview.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passivepopupwidget.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-ui clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -notificationchat.moc: $(srcdir)/notificationchat.h - $(MOC) $(srcdir)/notificationchat.h -o notificationchat.moc - -#>+ 2 -mocs: notificationchat.moc - -#>+ 3 -passivepopupwidget.moc: $(srcdir)/passivepopupwidget.h - $(MOC) $(srcdir)/passivepopupwidget.h -o passivepopupwidget.moc - -#>+ 2 -mocs: passivepopupwidget.moc - -#>+ 3 -notificationmanager.moc: $(srcdir)/notificationmanager.h - $(MOC) $(srcdir)/notificationmanager.h -o notificationmanager.moc - -#>+ 2 -mocs: notificationmanager.moc - -#>+ 3 -notificationcontactstatus.moc: $(srcdir)/notificationcontactstatus.h - $(MOC) $(srcdir)/notificationcontactstatus.h -o notificationcontactstatus.moc - -#>+ 2 -mocs: notificationcontactstatus.moc - -#>+ 3 -passivepopupview.moc: $(srcdir)/passivepopupview.h - $(MOC) $(srcdir)/passivepopupview.h -o passivepopupview.moc - -#>+ 2 -mocs: passivepopupview.moc - -#>+ 3 -notificationnewemail.moc: $(srcdir)/notificationnewemail.h - $(MOC) $(srcdir)/notificationnewemail.h -o notificationnewemail.moc - -#>+ 2 -mocs: notificationnewemail.moc - -#>+ 3 -passivepopup.moc: $(srcdir)/passivepopup.h - $(MOC) $(srcdir)/passivepopup.h -o passivepopup.moc - -#>+ 2 -mocs: passivepopup.moc - -#>+ 3 -clean-metasources: - -rm -f notificationchat.moc passivepopupwidget.moc notificationmanager.moc notificationcontactstatus.moc passivepopupview.moc notificationnewemail.moc passivepopup.moc - -#>+ 2 -KDE_DIST=passivepopupinterface.ui Makefile.in Makefile.am passivepopup.h - -#>+ 4 -clean-ui: - -rm -f \ - passivepopupinterface.cpp passivepopupinterface.h passivepopupinterface.moc - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/notification/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/notification/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/notification/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libnotification_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/notificationchat.cpp $(srcdir)/notificationcontactstatus.cpp $(srcdir)/notificationmanager.cpp $(srcdir)/notificationnewemail.cpp $(srcdir)/passivepopup.cpp $(srcdir)/passivepopupview.cpp $(srcdir)/passivepopupwidget.cpp passivepopupinterface.cpp passivepopupwidget.moc notificationchat.moc notificationcontactstatus.moc passivepopupinterface.moc notificationnewemail.moc notificationmanager.moc passivepopupview.moc passivepopup.moc - @echo 'creating libnotification_a.all_cpp.cpp ...'; \ - rm -f libnotification_a.all_cpp.files libnotification_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libnotification_a.all_cpp.final; \ - for file in notificationchat.cpp notificationcontactstatus.cpp notificationmanager.cpp notificationnewemail.cpp passivepopup.cpp passivepopupview.cpp passivepopupwidget.cpp passivepopupinterface.cpp ; do \ - echo "#include \"$$file\"" >> libnotification_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libnotification_a.all_cpp.final; \ - done; \ - cat libnotification_a.all_cpp.final libnotification_a.all_cpp.files > libnotification_a.all_cpp.cpp; \ - rm -f libnotification_a.all_cpp.final libnotification_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libnotification_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libnotification_a_OBJECTS="$(libnotification_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libnotification_a_OBJECTS="$(libnotification_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libnotification_a_OBJECTS="$(libnotification_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libnotification_a_OBJECTS="$(libnotification_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 24 -passivepopup.o: passivepopup.moc -$(srcdir)/passivepopupwidget.cpp: passivepopupinterface.h -notificationmanager.o: notificationmanager.moc -notificationchat.lo: notificationchat.moc -notificationmanager.lo: notificationmanager.moc -passivepopupwidget.o: passivepopupwidget.moc -$(srcdir)/passivepopup.cpp: passivepopupinterface.h -$(srcdir)/passivepopupview.cpp: passivepopupinterface.h -$(srcdir)/notificationmanager.cpp: passivepopupinterface.h -passivepopupview.o: passivepopupview.moc -passivepopupwidget.lo: passivepopupwidget.moc -notificationnewemail.o: notificationnewemail.moc -notificationcontactstatus.o: notificationcontactstatus.moc -$(srcdir)/notificationchat.cpp: passivepopupinterface.h -$(srcdir)/notificationcontactstatus.cpp: passivepopupinterface.h -nmcheck: -notificationchat.o: notificationchat.moc -nmcheck-am: nmcheck -notificationcontactstatus.lo: notificationcontactstatus.moc -passivepopup.lo: passivepopup.moc -$(srcdir)/notificationnewemail.cpp: passivepopupinterface.h -notificationnewemail.lo: notificationnewemail.moc -passivepopupview.lo: passivepopupview.moc - -#>+ 15 -passivepopupinterface.cpp: $(srcdir)/passivepopupinterface.ui passivepopupinterface.h passivepopupinterface.moc - rm -f passivepopupinterface.cpp - echo '#include ' > passivepopupinterface.cpp - echo '#include ' >> passivepopupinterface.cpp - $(UIC) -tr ${UIC_TR} -i passivepopupinterface.h $(srcdir)/passivepopupinterface.ui > passivepopupinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" passivepopupinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_passivepopupinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> passivepopupinterface.cpp ;\ - rm -f passivepopupinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "passivepopupinterface.moc"' >> passivepopupinterface.cpp; else rm -f passivepopupinterface.cpp ; exit $$ret ; fi - -passivepopupinterface.h: $(srcdir)/passivepopupinterface.ui - rm -rf passivepopupinterface.h; - $(UIC) $(srcdir)/passivepopupinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> passivepopupinterface.h ; -passivepopupinterface.moc: passivepopupinterface.h - $(MOC) passivepopupinterface.h -o passivepopupinterface.moc diff --git a/kmess/notification/notificationchat.cpp b/kmess/notification/notificationchat.cpp deleted file mode 100644 index f188d95..0000000 --- a/kmess/notification/notificationchat.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/*************************************************************************** - notificationchat.cpp - notifies when a - contact communicates with the user - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "notificationchat.h" - -#include -#include -#include - -#include -#include -#include - -#include "../kmessdebug.h" -#include "../currentaccount.h" -#include "../contact/contactbase.h" - - -#define MAX_BALLOON_MESSAGE_SIZE 128 - - - -// Class constructor -NotificationChat::NotificationChat( NotificationManager* manager ) - : enableChatStart_(true) - , enableChatMessages_(false) - , manager_(manager) -{ -} - - - -// Trigger this event's action (Raise the chat window for the calling contact) -void NotificationChat::activate( QStringList /*stringList*/, QObject *object ) -{ - ChatWindow *chatWindow = static_cast( object ); - if ( chatWindow != 0 ) - { - // Force the window to be raised to front and focused - emit raiseChat( chatWindow, true ); - } - else - { -#ifdef KMESSDEBUG_NOTIFICATIONCHAT - kdDebug() << "NotificationChat::activate() - The given chat window was not valid." << endl; -#endif - } -} - - - -// Notify the user about this event (a contact has contacted the user) -void NotificationChat::notify( const ChatMessage &message, ChatWindow *chatWindow ) -{ - // End if the event is coming from us instead of from a contact - if( ! message.isIncoming() ) - { -#ifdef KMESSDEBUG_NOTIFICATIONCHAT - kdDebug() << "NotificationChat::notify() - Not displaying a popup for an outgoing message." << endl; -#endif - return; - } - - // Check the chat window pointer, we need it - if( ! chatWindow ) - { -#ifdef KMESSDEBUG_NOTIFICATIONCHAT - kdDebug() << "NotificationChat::notify() - Invalid pointer to chat window." << endl; -#endif - return; - } - - // First send the sound notification; even if the balloon is disabled. - if( chatWindow->isChatFirstMessage() ) - { -#if KDE_IS_VERSION(3,2,0) - KNotifyClient::event( chatWindow->winId(), "chat start" ); -#else - KNotifyClient::event( "chat start" ); -#endif - } - else - { -#if KDE_IS_VERSION(3,2,0) - KNotifyClient::event( chatWindow->winId(), "new message" ); -#else - KNotifyClient::event( "new message" ); -#endif - } - - // If all possible notifications for this event are disabled, do nothing. - if( ! enableChatStart_ && ! enableChatMessages_ ) - { -#ifdef KMESSDEBUG_NOTIFICATIONCHAT - kdDebug() << "NotificationChat::notify() - Start and messages notifications are off, skipping." << endl; -#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_NOTIFICATIONCHAT - kdDebug() << "NotificationChat::notify() - Messages notification is off and it's not the first message, skipping." << endl; -#endif - return; - } - - - QString text; - QString friendlyName, status; - QString body = QStyleSheet::escape( message.getBody() ); - const QString &handle = message.getContactHandle(); - CurrentAccount *currentAccount = CurrentAccount::instance(); - ContactBase *contact = currentAccount->getContactByHandle( handle ); - -#ifdef KMESSDEBUG_NOTIFICATIONCHAT - kdDebug() << "NotificationChat::notify() - Contact " << message.getContactHandle() << endl; -#endif - - // Check for a contact handle, we need it for the popup - if( handle.isEmpty() ) - { - kdWarning() << "NotificationChat::notify() - Cannot notify chat event, no contact handle given!" << endl; - return; - } - - if( contact ) - { - friendlyName = QStyleSheet::escape( contact->getFriendlyName() ); - status = contact->getStatus(); - } - else - { - friendlyName = handle; - status = ""; // 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 ) - { - body.truncate( MAX_BALLOON_MESSAGE_SIZE ); - body += " ..."; - } - - - // 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" ).arg( friendlyName ).arg( body ); - break; - case ChatMessage::TYPE_INCOMING: - text = i18n( "%1 says:
'%2'" ).arg( friendlyName ).arg( body ); - break; - case ChatMessage::TYPE_OFFLINE_INCOMING: - text = i18n( "%1 has sent you an offline message:
'%2'" ).arg( friendlyName ).arg( body ); - break; - case ChatMessage::TYPE_APPLICATION: - case ChatMessage::TYPE_APPLICATION_WEBCAM: - case ChatMessage::TYPE_APPLICATION_FILE: - case ChatMessage::TYPE_APPLICATION_AUDIO: - text = i18n( "%1's chat requests attention!" ).arg( friendlyName ); - break; - - case ChatMessage::TYPE_SYSTEM: - default: - text = i18n( "%1:
%2" ).arg( friendlyName ).arg( body ); - break; - } - - switch( message.getContentsClass() ) - { - case ChatMessage::CONTENT_NOTIFICATION_NUDGE: - text = i18n( "%1 has sent you a nudge!" ).arg( friendlyName ); - break; - case ChatMessage::CONTENT_NOTIFICATION_WINK: - text = i18n( "%1 has sent you a wink!" ).arg( friendlyName ); - break; - - case ChatMessage::CONTENT_APP_INVITE: - switch( messageType ) - { - case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 wants to use the webcam!" ).arg( friendlyName ); break; - case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "%1 is sending you a file!" ).arg( friendlyName ); break; - default: text = i18n( "%1 has sent you an invitation!" ).arg( friendlyName ); break; - } - break; - case ChatMessage::CONTENT_APP_CANCELED: - switch( messageType ) - { - case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 has canceled the webcam session!" ).arg( friendlyName ); break; - case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "%1 has canceled the file transfer!" ).arg( friendlyName ); break; - default: text = i18n( "%1's activity has been canceled!" ).arg( friendlyName ); break; - } - break; - case ChatMessage::CONTENT_APP_STARTED: - switch( messageType ) - { - case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 has accepted to use the webcam!" ).arg( friendlyName ); break; - case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "%1 has accepted the file transfer!" ).arg( friendlyName ); break; - default: text = i18n( "%1 has accepted your invitation!" ).arg( friendlyName ); break; - } - break; - case ChatMessage::CONTENT_APP_ENDED: - switch( messageType ) - { - case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 has ended the webcam session!" ).arg( friendlyName ); break; - case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "The file transfer with %1 is done!" ).arg( friendlyName ); break; - default: text = i18n( "%1's activity has ended!" ).arg( friendlyName ); break; - } - break; - case ChatMessage::CONTENT_APP_FAILED: - switch( messageType ) - { - case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1's webcam session has failed!" ).arg( friendlyName ); break; - case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "The file transfer with %1 has failed!" ).arg( friendlyName ); break; - default: text = i18n( "%1's activity has ended with an error!" ).arg( friendlyName ); break; - } - break; - - default: - break; - } - - - // 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 = 0; - props.destObject = chatWindow; - - manager_->notify( this, props ); -} - - - -// Enable or disable the chat notifications -void NotificationChat::setEnabled( bool enableChatStart, bool enableChatMessages ) -{ - enableChatStart_ = enableChatStart; - enableChatMessages_ = enableChatMessages; -} - - - -#include "notificationchat.moc" diff --git a/kmess/notification/notificationcontactstatus.cpp b/kmess/notification/notificationcontactstatus.cpp deleted file mode 100644 index f0badfb..0000000 --- a/kmess/notification/notificationcontactstatus.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/*************************************************************************** - notificationcontactstatus.cpp - notifies when a - contact changes their msn status - ------------------- - begin : Saturday July 28 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "notificationcontactstatus.h" - -#include -#include -#include - -#include -#include - -#include -#include - -#include "../kmessdebug.h" - - - -// Class constructor -NotificationContactStatus::NotificationContactStatus( NotificationManager* manager ) - : enableNotifyOnline_(true) - , enableNotifyOffline_(false) - , enableNotifyStatus_(false) - , manager_(manager) -{ -} - - - -// Trigger this event's action -void NotificationContactStatus::activate( QStringList stringList, QObject */*object*/ ) -{ -#ifdef KMESSDEBUG_NOTIFICATIONCONTACTSTATUS - kdDebug() << "NotificationContactStatus::activate() - Starting chat." << endl; -#endif - - if( stringList[1] == "FLN" ) - { - return; - } - - emit startChat( stringList[0], ChatInformation::CONNECTION_CHAT ); -} - - - -// Obtains a status string like "contact has come online" for a MSN status code -QString NotificationContactStatus::getStatusString( QString status ) -{ - if ( status == "AWY" ) return i18n( "%1 has gone away" ); - else if( status == "BRB" ) return i18n( "%1 will be right back" ); - else if( status == "BSY" ) return i18n( "%1 is now busy" ); - else if( status == "FLN" ) return i18n( "%1 has logged out" ); - else if( status == "HDN" ) return i18n( "%1 has become invisible" ); // Is this one even possible?! - else if( status == "IDL" ) return i18n( "%1 has gone idle" ); - else if( status == "LUN" ) return i18n( "%1 is out for lunch" ); - else if( status == "PHN" ) return i18n( "%1 is on the phone" ); - else return i18n( "%1 is now online" ); -} - - - -// Notify the user about this event (a contact has changed its status) -void NotificationContactStatus::notify( Contact *contact, bool isNeeded ) -{ - if( contact == 0 ) - { - kdWarning() << "NotificationContactStatus::notify() - Contact is null!" << endl; - return; - } - - if( ! KMESS_NULL(contact->getExtension()) && ! contact->getExtension()->getNotifyOnline() ) - { -#ifdef KMESSDEBUG_NOTIFICATIONCONTACTSTATUS - kdDebug() << "NotificationContactStatus::notify() - Skipping, notification disabled for " << contact->getHandle() << "." << endl; -#endif - return; - } - - // If notification for this event is disabled, don't show a balloon. - if( ! isNeeded ) - { -#ifdef KMESSDEBUG_NOTIFICATIONCONTACTSTATUS - kdDebug() << "NotificationContactStatus::notify() - Not needed, skipping." << endl; -#endif - return; - } - - - QString text; - QString status = contact->getStatus(); - QString lastStatus = contact->getLastStatus(); - -#ifdef KMESSDEBUG_NOTIFICATIONCONTACTSTATUS - kdDebug() << "NotificationContactStatus::notify() - Contact: " << contact->getHandle() << ", status: " << lastStatus << "->" << status << " - " - << "Online: " << ( enableNotifyOnline_ ? "true" : "false" ) << ", " - << "Offline: " << ( enableNotifyOffline_ ? "true" : "false" ) << ", " - << "Status: " << ( enableNotifyStatus_ ? "true" : "false" ) << endl; -#endif - - // When contacts go online, whichever may be their status, just show an 'is now online'. - if( lastStatus == "FLN" && status != "FLN" && enableNotifyOnline_ ) - text = getStatusString( "NLN" ); - else - text = getStatusString( status ); - - // The resulting string is a i18n'ed string, with the contact friendly name as argument. - text = text.arg( QStyleSheet::escape( contact->getFriendlyName() ) ); - - - - // Play a sound - 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 == "FLN" && status != "FLN" ) notifyUser = enableNotifyOnline_; - else if( lastStatus != "FLN" && status == "FLN" ) notifyUser = enableNotifyOffline_; - else notifyUser = enableNotifyStatus_; - - if( ! notifyUser ) - { -#ifdef KMESSDEBUG_NOTIFICATIONCONTACTSTATUS - kdDebug() << "NotificationContactStatus::notify() - Event popup disabled, skipping." << endl; -#endif - - return; - } - - // If a custom audio file exists, play it - if ( soundFile.exists() ) - { -#ifdef KMESSDEBUG_NOTIFICATIONCONTACTSTATUS - kdDebug() << "NotificationContactStatus::notify() - Play sound " << soundPath << endl; -#endif - - // Play the custom sound instead of the generic sound - KAudioPlayer::play( soundPath ); - } - else - { -#ifdef KMESSDEBUG_NOTIFICATIONCONTACTSTATUS - kdDebug() << "NotificationContactStatus::notify() - Play the default sound." << endl; -#endif - - QString statusText; - - if( lastStatus == "FLN" ) - { - statusText = "contact online"; - } - else if( status == "FLN" ) - { - statusText = "contact offline"; - } - else - { - statusText = "contact status"; - } - -#if KDE_IS_VERSION(3,2,0) - KNotifyClient::event( manager_->getTrayWidget()->winId(), statusText, text ); -#else - KNotifyClient::event( statusText, text ); -#endif - } - - // 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() << status; - props.destObject = 0; - - manager_->notify( this, props ); -} - - - -// Enable or disable the contact offline notifications -void NotificationContactStatus::setEnabled( bool enableNotifyOnline, bool enableNotifyOffline, bool enableNotifyStatus ) -{ - enableNotifyOnline_ = enableNotifyOnline; - enableNotifyOffline_ = enableNotifyOffline; - enableNotifyStatus_ = enableNotifyStatus; -} - - - -#include "notificationcontactstatus.moc" diff --git a/kmess/notification/notificationmanager.cpp b/kmess/notification/notificationmanager.cpp deleted file mode 100644 index a7fd247..0000000 --- a/kmess/notification/notificationmanager.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/*************************************************************************** - notificationmanager.cpp - manage the notifications - stack and updates them as needed - ------------------- - begin : Thursday April 19 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "notificationmanager.h" - -#include "../currentaccount.h" -#include "../xautolock.h" - -#include -#include -#include - -// Initialize the instance to zero -NotificationManager* NotificationManager::instance_(0); - - - -// Class constructor -NotificationManager::NotificationManager() -{ - // Initialize the interfaces to screen saver and fullscreen apps checks - autoLock_ = new XAutoLock(); - kWinModule_ = new KWinModule(); - - stack_.setAutoDelete( true ); -} - - - -// Class destructor -NotificationManager::~NotificationManager() -{ - QDictIterator it( stack_ ); - for( ; it.current(); ++it ) - delete it.current(); - - delete autoLock_; - delete kWinModule_; -} - - - -// Return the current tray widget object -QWidget *NotificationManager::getTrayWidget() -{ - return trayWidget_; -} - - -// Insert a new popup in the stack if needed, or change an existing one -void NotificationManager::notify( QObject *caller, PassivePopup::PopupProperties props ) -{ - // Check if the screen saver is running - if( autoLock_->isScreenSaverActive() ) - { -#ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kdDebug() << "NotificationManager::notify() - Screen saver/locker is active, not showing balloons." << endl; -#endif - return; - } - - // Check if a full screen application is running by querying the window manager and asking - // the state of the currently active window - WId activeWindow = kWinModule_->activeWindow(); - KWin::WindowInfo info = KWin::windowInfo( activeWindow ); - - if( ! kWinModule_->hasWId( activeWindow ) || ! info.valid() ) - { -#ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kdDebug() << "NotificationManager::notify() - Couldn't get active window info, showing balloons." << endl; -#endif - } - else if( info.hasState( NET::FullScreen ) ) - { - // The active window is full screen: the user may be watching a movie or something. - // Don't display balloons. - -#ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kdDebug() << "NotificationManager::notify() - Active window is full screen, not showing balloons." << endl; -#endif - return; - } -#ifdef KMESSDEBUG_NOTIFICATIONMANAGER - else - { - kdDebug() << "NotificationManager::notify() - Active window is not full screen, showing balloon." << endl; - } -#endif - - - // We have to show a popup - - PassivePopup *popup; - - if( stack_[ props.source ] ) - { -#ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kdDebug() << "NotificationManager::notify() - a popup for " << props.source << " is already in the stack, updating it" << endl; -#endif - - popup = stack_[ props.source ]; - popup->change( props ); - - popup->show(); - - return; - } - -#ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kdDebug() << "NotificationManager::notify() - creating new popup for " << props.source << " in the stack" << endl; -#endif - - // Set the new popup's position - int minY = INT_MAX, current; - QDictIterator it( stack_ ); - for( ; it.current(); ++it ) - { - current = it.current()->getPosition().y(); - if( current < minY ) - minY = current; - } - props.position = trayWidget_->mapToGlobal( QPoint( 0, 0 ) ); - if( minY != INT_MAX ) - { - // 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::instance()->getNotificationDuration() * 1000; - - popup = new PassivePopup( trayWidget_, props ); - stack_.insert( props.source, popup ); - - connect( popup, SIGNAL( activate( QStringList, QObject * ) ), - caller, SLOT( activate( QStringList, QObject * ) ) ); - connect( popup, SIGNAL( dying( QString ) ), - this, SLOT( remove( QString ) ) ); - - popup->show(); -} - - - -// Return a singleton instance of the current account -NotificationManager* NotificationManager::instance() -{ - // If the instance is null, create a new manager and return that. - if ( instance_ == 0 ) - { - instance_ = new NotificationManager(); - } - return instance_; -} - - - -// Remove a timed out popup from the stack -void NotificationManager::remove( QString source ) -{ - stack_.remove( source ); - -#ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kdDebug() << "NotificationManager::remove() - deleted popup for " << source << " from the stack" << endl; -#endif -} - - - -// Set the tray widget object that will be used -void NotificationManager::setTrayWidget( QWidget *widget ) -{ - trayWidget_ = widget; -} - - - -#include "notificationmanager.moc" diff --git a/kmess/notification/notificationmanager.h b/kmess/notification/notificationmanager.h deleted file mode 100644 index e2dd473..0000000 --- a/kmess/notification/notificationmanager.h +++ /dev/null @@ -1,80 +0,0 @@ -/*************************************************************************** - notificationmanager.h - manage the notifications - stack and updates them as needed - ------------------- - begin : Thursday April 19 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 NOTIFICATIONMANAGER_H -#define NOTIFICATIONMANAGER_H - -#include -#include "passivepopup.h" - - -// Forward declarations -class XAutoLock; -class KWinModule; - - - -/** - * @brief Manages the notifications stack - * - * Notification balloons are handled as a vertical stack to avoid overlapping. - * - * @author Valerio Pilo - */ -class NotificationManager : public QObject -{ - Q_OBJECT - - public: // Public methods - // Class constructor - NotificationManager(); - // Class destructor - ~NotificationManager(); - - public: // Public methods - // Insert a new popup in the stack if needed, or change an existing one - void notify( QObject *caller, PassivePopup::PopupProperties props ); - // Return the current tray widget object - QWidget *getTrayWidget(); - // Set the tray widget object that will be used - void setTrayWidget( QWidget *widget ); - - public: // Public static methods - // Return a singleton instance of the current account - static NotificationManager *instance(); - - public slots: - // Remove a timed out popup from the stack - void remove( QString source ); - - private: // Private properties - // Autolock instance, used to check for screensaver/locker presence when showing popups - XAutoLock *autoLock_; - // Stack of popups currently on screen - QDict stack_; - // The System Tray widget to which the popups will refer - QWidget *trayWidget_; - // The instance of the singleton manager - static NotificationManager *instance_; - // KWin Module interface instance, used to find out if fullscreen apps are running - KWinModule *kWinModule_; -}; - - - -#endif diff --git a/kmess/notification/notificationnewemail.cpp b/kmess/notification/notificationnewemail.cpp deleted file mode 100644 index a1598ae..0000000 --- a/kmess/notification/notificationnewemail.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/*************************************************************************** - notificationnewemail.cpp - notifies when a - new email has arrived - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "notificationnewemail.h" - -#include -#include -#include - -#include -#include - -#include -#include - -#include "../kmessdebug.h" - - - -// Class constructor -NotificationNewEmail::NotificationNewEmail( NotificationManager* manager ) - : isEnabled_(true) - , manager_(manager) -{ -} - - - -// Notify the user about this event (a new email has arrived) -void NotificationNewEmail::notify( QString sender, QString subject, bool inInbox, QString command, QString folder, QString url ) -{ - // If notifications are disabled, do nothing. - if( !isEnabled_ ) - return; - - currentAccount_ = CurrentAccount::instance(); - - if( !inInbox && !currentAccount_->getShowOtherFolders() ) - { -#ifdef KMESSDEBUG_NOTIFICATIONNEWEMAIL - kdDebug() << "NotificationNewEmail:notify() - New email notification disabled for non-inbox messages." << endl; -#endif - return; - } - -#ifdef KMESSDEBUG_NOTIFICATIONNEWEMAIL - kdDebug() << "NotificationNewEmail:notify() - New email from " << sender << " in inbox: " << inInbox << "." << endl; -#endif - - - QString text; - QStringList stringList; - stringList.append( command ); - stringList.append( folder ); - stringList.append( url ); - - text = i18n( "New email:
'%1'
by '%2'" ) - .arg( QStyleSheet::escape( subject ) ) - .arg( QStyleSheet::escape( sender ) ); - - - // Display a popup for this event - PassivePopup::PopupProperties props; - props.source = sender; - props.message = text; - props.icon = "envelope"; - props.status = ""; - props.destMessages = stringList; - props.destObject = 0; - - manager_->notify( this, props ); - - - // Also play a sound -#ifdef KMESSDEBUG_NOTIFICATIONNEWEMAIL - kdDebug() << "NotificationNewEmail::notify() - Play the default sound." << endl; -#endif - KNotifyClient::event( manager_->getTrayWidget()->winId(), "new email", text ); -} - - - -// Trigger this event's action (Open the mailbox where the new mail is) -void NotificationNewEmail::activate( QStringList stringList, QObject */*object*/ ) -{ - // Open hotmail at the given email - currentAccount_->openMail( stringList[0], stringList[1], stringList[2] ); -} - - - -// Enable or disable the new email notifications -void NotificationNewEmail::setEnabled( bool enable ) -{ - isEnabled_ = enable; -} - - - -#include "notificationnewemail.moc" diff --git a/kmess/notification/passivepopup.cpp b/kmess/notification/passivepopup.cpp deleted file mode 100644 index 0fae407..0000000 --- a/kmess/notification/passivepopup.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/*************************************************************************** - passivepopup.cpp - KMess' Notification Popup - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "kdeversion.h" -#include - - - -// Class constructor -PassivePopup::PassivePopup( QWidget *parent, PopupProperties props ) - : properties_(props) -{ - popup_ = new PassivePopupWidget( parent ); - viewWidget_ = new PassivePopupView( popup_, properties_.icon, properties_.message, properties_.status ); - - popup_->setTimeout( properties_.timeout ); - - popup_->setView( viewWidget_ ); - - connect( popup_, SIGNAL( leftClicked() ), - this, SLOT( leftClicked() ) ); - connect( popup_, SIGNAL( rightClicked() ), - this, SLOT( rightClicked() ) ); - connect( popup_, SIGNAL( dying() ), - this, SLOT( forwardDeath() ) ); - -} - - - -// Change the popup's properties -bool PassivePopup::change( PopupProperties newProps ) -{ - if( properties_.source != newProps.source ) - { -#ifdef KMESSDEBUG_PASSIVEPOPUP - kdDebug() << "PassivePopup::change() - Tried to update a popup for " << newProps.source << ", but i'm made for " << properties_.source << "!" << endl; -#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 ); - } - - - return true; -} - - - -// Obtain the current popup position -QPoint PassivePopup::getPosition() -{ - return popup_->pos(); -} - - - -// Display the popup -void PassivePopup::show() -{ - popup_->show(); - -#if KDE_IS_VERSION(3,5,0) - popup_->setAnchor( properties_.position ); -#endif -} - - - -// Called when it's being destroyed, to remove the popup from the stack -void PassivePopup::forwardDeath() -{ -#ifdef KMESSDEBUG_PASSIVEPOPUP - kdDebug() << "PassivePopup:forwardDeath() - killing popup for " << properties_.source << endl; -#endif - - // Disconnect all signals which go from or to this object - emit dying( properties_.source ); -} - - - -// Called when the popup gets left-clicked with the mouse; emits the activate() signal -void PassivePopup::leftClicked() -{ - emit activate( properties_.destMessages, properties_.destObject ); - - popup_->hide(); - -#ifdef KMESSDEBUG_PASSIVEPOPUP - kdDebug() << "PassivePopup::leftClicked() - activated popup for " << properties_.source << endl; -#endif -} - - - -// Called when the popup gets right-clicked with the mouse; does no actions -void PassivePopup::rightClicked() -{ - popup_->hide(); - -#ifdef KMESSDEBUG_PASSIVEPOPUP - kdDebug() << "PassivePopup::rightClicked() - hidden popup for " << properties_.source << endl; -#endif -} - - -#include "passivepopup.moc" diff --git a/kmess/notification/passivepopup.h b/kmess/notification/passivepopup.h deleted file mode 100644 index e4b405b..0000000 --- a/kmess/notification/passivepopup.h +++ /dev/null @@ -1,93 +0,0 @@ -/*************************************************************************** - passivepopup.h - KMess' Notification Popup - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 "passivepopupview.h" -#include "passivepopupwidget.h" - - - -/** - * @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 - */ -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 - QString 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 dying( QString source ); - - private slots: - // Called when it's being destroyed, to remove the popup from the stack - void forwardDeath(); - // 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/kmess/notification/passivepopupinterface.ui b/kmess/notification/passivepopupinterface.ui deleted file mode 100644 index 655ae34..0000000 --- a/kmess/notification/passivepopupinterface.ui +++ /dev/null @@ -1,321 +0,0 @@ - -PassivePopupInterface - - - PassivePopupInterface - - - - 0 - 0 - 263 - 109 - - - - - 3 - 3 - 0 - 0 - - - - - 230 - 64 - - - - - 32767 - 32767 - - - - - 310 - 100 - - - - 13 - - - KMess Notification - - - - unnamed - - - 0 - - - 2 - - - Minimum - - - - layout11 - - - - unnamed - - - - displayPicture_ - - - - 0 - 0 - 0 - 0 - - - - - 48 - 48 - - - - - 48 - 48 - - - - StyledPanel - - - Raised - - - 2 - - - 1 - - - true - - - AlignCenter - - - - - spacer3 - - - Vertical - - - Maximum - - - - 20 - 15 - - - - - - statusPixmap_ - - - - 0 - 0 - 0 - 0 - - - - - 16 - 16 - - - - - 16 - 16 - - - - PaletteBackground - - - NoFrame - - - 0 - - - true - - - AlignTop|AlignHCenter - - - - - spacer1 - - - Vertical - - - Expanding - - - - 20 - 10 - - - - - - - - layout3 - - - - unnamed - - - 2 - - - - message_ - - - - 3 - 3 - 0 - 0 - - - - - 120 - 30 - - - - - 1 - - - - NoFrame - - - 1 - - - popupMessage - - - AutoText - - - true - - - WordBreak|AlignTop - - - 0 - - - - - - - layout10 - - - - unnamed - - - 0 - - - - kMessLogo_ - - - - 0 - 0 - 0 - 0 - - - - - 24 - 24 - - - - - 24 - 24 - - - - PaletteBackground - - - NoFrame - - - 0 - - - true - - - AlignTop|AlignRight - - - - - spacer2 - - - Vertical - - - Expanding - - - - 20 - 10 - - - - - - - - - clicked() - - - diff --git a/kmess/notification/passivepopupview.cpp b/kmess/notification/passivepopupview.cpp deleted file mode 100644 index 433fa3c..0000000 --- a/kmess/notification/passivepopupview.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*************************************************************************** - passivepopupview.cpp - Displays the passive popup - contents - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 -#include - - - -// Class constructor -PassivePopupView::PassivePopupView( QWidget *parent, QString icon, QString message, QString status ) - : PassivePopupInterface(parent, "PassivePopupView") -{ - iconLoader_ = KGlobal::iconLoader(); - - 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", KIcon::Desktop, KIcon::SizeHuge ) ); -} - - - -// 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", KIcon::User ); - } - - displayPicture_->setPixmap( picture ); -} - - - -// Changes the popup status icon -void PassivePopupView::changeStatusIcon( QString status ) -{ - if( status.isNull() || status.isEmpty() ) - { - return; - } - - if ( status == "AWY" ) status = "away"; - else if( status == "BRB" ) status = "berightback"; - else if( status == "BSY" ) status = "busy"; - else if( status == "FLN" ) status = "offline"; - else if( status == "HDN" ) status = "invisible"; - else if( status == "IDL" ) status = "away"; - else if( status == "LUN" ) status = "lunch"; - else if( status == "PHN" ) status = "onthephone"; - else status = "online"; - - statusPixmap_->setPixmap( iconLoader_->loadIcon( status, KIcon::User ) ); -} - - - -// Changes the popup message -void PassivePopupView::changeMessage( QString message ) -{ - message_->setText( message ); -} - - - -#include "passivepopupview.moc" diff --git a/kmess/notification/passivepopupview.h b/kmess/notification/passivepopupview.h deleted file mode 100644 index e135a5c..0000000 --- a/kmess/notification/passivepopupview.h +++ /dev/null @@ -1,59 +0,0 @@ -/*************************************************************************** - passivepopupview.h - Displays the passive popup - contents - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 - -#ifndef PASSIVEPOPUPINTERFACE_H -#include "passivepopupinterface.h" -#endif - -#include -#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 - */ -class PassivePopupView : public PassivePopupInterface -{ - Q_OBJECT - - public: // Public methods - // Class constructor - PassivePopupView( QWidget *parent, QString icon, QString message, QString status = QString::null ); - // Changes the popup icon - void changeIcon( QString icon ); - // Changes the popup status icon - void changeStatusIcon( QString status ); - // Changes the popup message - void changeMessage( QString message ); - - private: // Private properties - // Icons loader - KIconLoader *iconLoader_; -}; - -#endif diff --git a/kmess/notification/passivepopupwidget.cpp b/kmess/notification/passivepopupwidget.cpp deleted file mode 100644 index d598304..0000000 --- a/kmess/notification/passivepopupwidget.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************** - passivepopupwidget.cpp - Implements the passive - popups widget - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 -#include - - - -// Class constructor -PassivePopupWidget::PassivePopupWidget( QWidget *parent ) -#if KDE_IS_VERSION(3,5,0) - : KPassivePopup( KPassivePopup::Balloon, parent, "PassivePopup" ) -#else - : KPassivePopup( parent, "PassivePopup" ) -#endif -{ - setAutoDelete( true ); -} - - - -// Class destructor -PassivePopupWidget::~PassivePopupWidget() -{ - emit dying(); -} - - - -// Handles mouse events for the balloon -void PassivePopupWidget::mouseReleaseEvent( QMouseEvent *e ) -{ - if( e->button() == Qt::LeftButton ) - { - emit leftClicked(); - } - else if( e->button() == Qt::RightButton ) - { - emit rightClicked(); - } -} - - - -#include "passivepopupwidget.moc" diff --git a/kmess/notification/passivepopupwidget.h b/kmess/notification/passivepopupwidget.h deleted file mode 100644 index 75b40df..0000000 --- a/kmess/notification/passivepopupwidget.h +++ /dev/null @@ -1,58 +0,0 @@ -/*************************************************************************** - passivepopupwidget.h - Defines the passive - popups widget - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net - ***************************************************************************/ - -/*************************************************************************** - * * - * 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 - */ -class PassivePopupWidget : public KPassivePopup -{ - Q_OBJECT - - public: // Public methods - // Class constructor - PassivePopupWidget( QWidget *parent ); - // Class destructor - ~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(); - // Emitted when it's being destroyed, to remove this popup from the stack - void dying(); - - private: // Private methods - // Handles mouse events for the balloon - void mouseReleaseEvent( QMouseEvent *e ); - -}; - -#endif diff --git a/kmess/nowlisteningclient.cpp b/kmess/nowlisteningclient.cpp deleted file mode 100644 index d2dcf51..0000000 --- a/kmess/nowlisteningclient.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/*************************************************************************** - nowlisteningclient.cpp - description - ------------------- - begin : Sat Nov 4 2006 - copyright : (C) 2006 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 "nowlisteningclient.h" - -#include "kmessdebug.h" - -#include -#include - -#include - -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT -#define KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL -#endif - - -// This code is inspired by the "now listening" plugin of Kopete. -// Therefore some parts are also -// (c) 2002-2006 the by Kopete developers - - -/** - * Constructor. - */ -NowListeningClient::NowListeningClient() -: playing_(false) -{ - // Create client. - client_ = kapp->dcopClient(); - - // Connect timer event. - connect( &timer_, SIGNAL(timeout()), this, SLOT(slotUpdate()) ); -} - - -/** - * Destructor - */ -NowListeningClient::~NowListeningClient() -{ - -} - - - -/** - * Make a call to a boolean function. - */ -bool NowListeningClient::callDcop( const QCString &app, const QCString &object, const QCString &method, - const QByteArray &args, bool &returnValue ) const -{ - QCString replyType; - QByteArray replyData; - - // Make call - if( ! client_->call( app, object, method, args, replyType, replyData ) ) - { - kdWarning() << "NowlisteningClient: DCOP call '" << app << " " << object << " " << method << "' failed!" << endl; - return false; // failed - } - - // Check reply type - if( replyType != "bool" ) - { - kdWarning() << "NowlisteningClient: DCOP call '" << app << " " << object << " " << method - << " returned unexpected data type: " << replyType << "!" << endl; - return false; - } - - // Extract data - QDataStream reply( replyData, IO_ReadOnly ); - reply >> returnValue; - - return true; -} - - - -/** - * Make a call to a integer function. - */ -bool NowListeningClient::callDcop( const QCString &app, const QCString &object, const QCString &method, - const QByteArray &args, int &returnValue ) const -{ - QCString replyType; - QByteArray replyData; - - // Make call - if( ! client_->call( app, object, method, args, replyType, replyData ) ) - { - kdWarning() << "NowlisteningClient: DCOP call '" << app << " " << object << " " << method << "' failed!" << endl; - return false; // failed - } - - // Check reply type - if( replyType != "int" ) - { - kdWarning() << "NowlisteningClient: DCOP call '" << app << " " << object << " " << method - << " returned unexpected data type: " << replyType << "!" << endl; - return false; - } - - // Extract data - QDataStream reply( replyData, IO_ReadOnly ); - reply >> returnValue; - - return true; -} - - - -/** - * Make a call to a QString function. - */ -bool NowListeningClient::callDcop( const QCString &app, const QCString &object, const QCString &method, - const QByteArray &args, QString &returnValue ) const -{ - QCString replyType; - QByteArray replyData; - - // Make call - if( ! client_->call( app, object, method, args, replyType, replyData ) ) - { - kdWarning() << "NowlisteningClient: DCOP call '" << app << " " << object << " " << method << "' failed!" << endl; - return false; // failed - } - - // Check reply type - if( replyType != "QString" ) - { - kdWarning() << "NowlisteningClient: DCOP call '" << app << " " << object << " " << method << "'" - << " returned unexpected data type: " << replyType << "!" << endl; - return false; - } - - // Extract data - QDataStream reply( replyData, IO_ReadOnly ); - reply >> returnValue; - - return true; -} - - -/** - * Make a call to a QString function with QString argument. - */ -bool NowListeningClient::callDcop( const QCString &app, const QCString &object, const QCString &method, - const QString &arg1, QString &returnValue ) const -{ - // Fill parameters - QByteArray args; - QDataStream arg( args, IO_WriteOnly ); - arg << arg1; - - // Call real QString method - if( ! callDcop( app, object, method, args, returnValue ) ) - { - kdWarning() << "NowlisteningClient: DCOP call '" << app << " " << object << " " << method << "' failed!" << endl; - return false; - } - - return true; -} - - - -/** - * Find a DCOP application that starts with the given app name. - */ -QCString NowListeningClient::findDcopApplication( const QCString &appName ) const -{ - // See if full name is registered. - if( client_->isApplicationRegistered( appName ) ) - { - return appName; - } - - // Find app which DCOP name starts with the appname. - int nameLength = appName.length(); - QCStringList appNames = client_->registeredApplications(); - for( QCStringList::iterator it = appNames.begin(); it != appNames.end(); it++ ) - { - if( (*it).left( nameLength ) == appName ) // QString has startsWith(), QCString not. - { - return (*it); - } - } - - return QCString(); -} - - - -/** - * Enable or disable the update interval timer. - */ -void NowListeningClient::setEnabled( bool enable ) -{ - if( enable ) - { - if( ! timer_.isActive() ) - { - // Query directly so the GUI is up to date - slotUpdate(); - - // check every 5 seconds - timer_.start( 5000, false ); - } - } - else - { - //emit a null changedSong signal to clean the GUI - emit changedSong( QString::null, QString::null, QString::null, false ); - timer_.stop(); - } -} - - - -/** - * Update the current song - */ -void NowListeningClient::slotUpdate() -{ - // Detect changes to reduce signal calls. - QString prevArtist = artist_; - QString prevAlbum = album_; - QString prevTrack = track_; - bool prevPlaying = playing_; - - // Reset until proven otherwise. - playing_ = false; - - // Query all apps. - if( queryKsCD() - || queryNoatun() - || queryJuk() - || queryAmarok() - || queryKaffeine() ) - { - // Found active media player! - -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: found song " << artist_ << " - " << track_ << " (album=" << album_ << " playing=" << playing_ << ")" << endl; -#endif - - // App found and playing, detect change. - if( playing_ ) - { - if( prevArtist != artist_ - || prevAlbum != album_ - || prevTrack != track_ - || ! prevPlaying ) - { -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: playing information changed, emitting changedSong()." << endl; -#endif - emit changedSong( artist_, album_, track_, playing_ ); - } - } - } - - // Emit a signal when the player was stopped. - if( prevPlaying && ! playing_ ) - { -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: player was stopped, emitting changedSong()." << endl; -#endif - emit changedSong( QString::null, QString::null, QString::null, false ); - } -} - - - -/** - * Query Amarok for track information. - */ -bool NowListeningClient::queryAmarok() -{ - QByteArray args; - - // See if the application is registered. - if( ! client_->isApplicationRegistered( "amarok" ) ) - { - return false; - } - -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: querying Amarok for now listening information..." << endl; -#endif - - // See if Amarok is playing. - // use status() call first, if not supported (amaroK 1.0 or earlier), use isPlaying - int status = 0; - if( ! callDcop( "amarok", "player", "status()", args, status ) ) - { - // Failed, try isPlaying() - if( ! callDcop( "amarok", "player", "isPlaying()", args, playing_ ) ) - { - return false; // completely failed. - } - } - else - { - playing_ = (status != 0); - } - - // Get data - if( playing_ - && callDcop( "amarok", "player", "artist()", args, artist_ ) - && callDcop( "amarok", "player", "album()", args, album_ ) - && callDcop( "amarok", "player", "title()", args, track_ ) ) - { - return true; // got track - } - - return false; // failed -} - - - -/** - * Query Juk for track information. - */ -bool NowListeningClient::queryJuk() -{ - QByteArray args; - - // See if the application is registered. - if( ! client_->isApplicationRegistered( "juk" ) ) - { - return false; - } - -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: querying Juk for now listening information..." << endl; -#endif - - // Get data - if( callDcop( "juk", "Player", "playing()", args, playing_ ) - && playing_ - && callDcop( "juk", "Player", "trackProperty(QString)", "Album", album_ ) - && callDcop( "juk", "Player", "trackProperty(QString)", "Artist", artist_ ) - && callDcop( "juk", "Player", "trackProperty(QString)", "Title", track_ ) ) - { - return true; // success! - } - - - return false; // failed -} - - - -/** - * Query Kaffeine for track information. - */ -bool NowListeningClient::queryKaffeine() -{ - QByteArray args; - - // See if the application is registered. - if( ! client_->isApplicationRegistered( "kaffeine" ) ) - { - return false; - } - -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: querying Kaffeine for now listening information..." << endl; -#endif - - // Get data - if( callDcop( "kaffeine", "KaffeineIface", "isPlaying()", args, playing_ ) - && playing_ - && callDcop( "kaffeine", "KaffeineIface", "artist()", args, artist_ ) - && callDcop( "kaffeine", "KaffeineIface", "album()", args, album_ ) - && callDcop( "kaffeine", "KaffeineIface", "title()", args, track_ ) ) - { - return true; // got track - } - - return false; // failed -} - - - -/** - * Query KsCD for track information. - */ -bool NowListeningClient::queryKsCD() -{ - QByteArray args; - - // See if the application is registered. - if( ! client_->isApplicationRegistered( "kscd" ) ) - { - return false; - } - -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: querying KsCD for now listening information..." << endl; -#endif - - // See if the player is active. - if( ! callDcop( "kscd", "CDPlayer", "playing()", args, playing_ ) ) - { - // Call failed, playing() method not available. - playing_ = true; - } - - // Get data - if( playing_ - && callDcop( "kscd", "CDPlayer", "currentArtist()", args, artist_ ) - && callDcop( "kscd", "CDPlayer", "currentAlbum()", args, album_ ) - && callDcop( "kscd", "CDPlayer", "currentTrackTitle()", args, track_ ) ) - { - return true; // got track - } - - return false; // failed -} - - - -/** - * Query Noatun for track information. - */ -bool NowListeningClient::queryNoatun() -{ - QByteArray args; - - // Real appname may have a numeric suffix, because noatun may have multiple instances open. - QCString appName = findDcopApplication( QCString("noatun") ); - if( appName.isNull() ) - { - return false; - } - -#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL - kdDebug() << "NowListeningClient: querying Noatun for now listening information..." << endl; -#endif - - // See if the player is active. - int state = 0; - if( ! callDcop(appName, "Noatun", "state()", args, state ) ) - { - return false; - } - - playing_ = (state == 2); - - // Get data - // Title can be empty (no ID3 tag), fallback to filename instead - QString title; - if( playing_ - && callDcop( appName, "Noatun", "currentProperty(QString)", "author", artist_ ) - && callDcop( appName, "Noatun", "currentProperty(QString)", "album", album_ ) - && callDcop( appName, "Noatun", "currentProperty(QString)", "title", track_ ) - && ( ! track_.isEmpty() || callDcop( appName, "Noatun", "title()", args, track_ ) ) ) - { - return true; - } - - return true; -} - - - -#include "nowlisteningclient.moc" diff --git a/kmess/pics/.cvsignore b/kmess/pics/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/pics/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/pics/Makefile.am b/kmess/pics/Makefile.am deleted file mode 100644 index ccc98a4..0000000 --- a/kmess/pics/Makefile.am +++ /dev/null @@ -1,100 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -# General pics -generalpicsdir = $(kde_datadir)/kmess/pics -generalpics_DATA = away.png background.png berightback.png blocked.png busy.png \ - emoticons.png empty.png invisible.png kmesslogo.png kmesslogo2.png kmesspic.png lunch.png \ - offline.png online.png onthephone.png unknown.png - -# Emoticons -# emoticonsdir = $(kde_datadir)/kmess/emoticons -emoticonsdir = $(datadir)/emoticons/KMess-new -emoticons_DATA = emoticons.xml \ - smile.png \ - airplane.png \ - angel.png \ - angry.png \ - arrogant.png \ - asl.png \ - automobile.png \ - baringteeth.png \ - bat.png \ - beer.png \ - bowl.png \ - boy.png \ - brb.png \ - cake.png \ - camera.png \ - cat.png \ - cigarette.png \ - clock.png \ - cocktail.png \ - computer.png \ - confused.png \ - cry.png \ - cup.png \ - devil.png \ - dog.png \ - dude_hug.png \ - embarrassed.png \ - envelope.png \ - eyeroll.png \ - film.png \ - fingerscrossed.png \ - gameconsole.png \ - girl_hug.png \ - girl.png \ - handcuffs.png \ - highfive.png \ - huh.png \ - island.png \ - kiss.png \ - lightbulb.png \ - lightning.png \ - love.png \ - megasmile.png \ - messenger.png \ - mobilephone.png \ - money.png \ - moon.png \ - nerd.png \ - note.png \ - omg.png \ - party.png \ - phone.png \ - pizza.png \ - plate.png \ - present.png \ - rainbow.png \ - regular.png \ - rose.png \ - sad.png \ - sarcastic.png \ - secret.png \ - shade.png \ - sheep.png \ - sick.png \ - sleepy.png \ - snail.png \ - soccer.png \ - sshh.png \ - star.png \ - storm.png \ - sun.png \ - teeth.png \ - thinking.png \ - thumbs_down.png \ - thumbs_up.png \ - tongue.png \ - turtle.png \ - ugly.png \ - umbrella.png \ - unhappy.png \ - unlove.png \ - wilted_rose.png \ - wink.png - -# Icons for applications -appicons16x16dir = $(kde_datadir)/kmess/icons/hicolor/16x16/apps -appicons16x16_DATA = gnomemeeting.png - diff --git a/kmess/pics/Makefile.in b/kmess/pics/Makefile.in deleted file mode 100644 index 9bae805..0000000 --- a/kmess/pics/Makefile.in +++ /dev/null @@ -1,731 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/pics -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(appicons16x16dir)" "$(DESTDIR)$(emoticonsdir)" "$(DESTDIR)$(generalpicsdir)" -appicons16x16DATA_INSTALL = $(INSTALL_DATA) -emoticonsDATA_INSTALL = $(INSTALL_DATA) -generalpicsDATA_INSTALL = $(INSTALL_DATA) -DATA = $(appicons16x16_DATA) $(emoticons_DATA) $(generalpics_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -# General pics -generalpicsdir = $(kde_datadir)/kmess/pics -generalpics_DATA = away.png background.png berightback.png blocked.png busy.png \ - emoticons.png empty.png invisible.png kmesslogo.png kmesslogo2.png kmesspic.png lunch.png \ - offline.png online.png onthephone.png unknown.png - - -# Emoticons -# emoticonsdir = $(kde_datadir)/kmess/emoticons -emoticonsdir = $(datadir)/emoticons/KMess-new -emoticons_DATA = emoticons.xml \ - smile.png \ - airplane.png \ - angel.png \ - angry.png \ - arrogant.png \ - asl.png \ - automobile.png \ - baringteeth.png \ - bat.png \ - beer.png \ - bowl.png \ - boy.png \ - brb.png \ - cake.png \ - camera.png \ - cat.png \ - cigarette.png \ - clock.png \ - cocktail.png \ - computer.png \ - confused.png \ - cry.png \ - cup.png \ - devil.png \ - dog.png \ - dude_hug.png \ - embarrassed.png \ - envelope.png \ - eyeroll.png \ - film.png \ - fingerscrossed.png \ - gameconsole.png \ - girl_hug.png \ - girl.png \ - handcuffs.png \ - highfive.png \ - huh.png \ - island.png \ - kiss.png \ - lightbulb.png \ - lightning.png \ - love.png \ - megasmile.png \ - messenger.png \ - mobilephone.png \ - money.png \ - moon.png \ - nerd.png \ - note.png \ - omg.png \ - party.png \ - phone.png \ - pizza.png \ - plate.png \ - present.png \ - rainbow.png \ - regular.png \ - rose.png \ - sad.png \ - sarcastic.png \ - secret.png \ - shade.png \ - sheep.png \ - sick.png \ - sleepy.png \ - snail.png \ - soccer.png \ - sshh.png \ - star.png \ - storm.png \ - sun.png \ - teeth.png \ - thinking.png \ - thumbs_down.png \ - thumbs_up.png \ - tongue.png \ - turtle.png \ - ugly.png \ - umbrella.png \ - unhappy.png \ - unlove.png \ - wilted_rose.png \ - wink.png - - -# Icons for applications -appicons16x16dir = $(kde_datadir)/kmess/icons/hicolor/16x16/apps -appicons16x16_DATA = gnomemeeting.png -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/pics/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/pics/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/pics/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/pics/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/pics/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-appicons16x16DATA: $(appicons16x16_DATA) - @$(NORMAL_INSTALL) - test -z "$(appicons16x16dir)" || $(mkdir_p) "$(DESTDIR)$(appicons16x16dir)" - @list='$(appicons16x16_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(appicons16x16DATA_INSTALL) '$$d$$p' '$(DESTDIR)$(appicons16x16dir)/$$f'"; \ - $(appicons16x16DATA_INSTALL) "$$d$$p" "$(DESTDIR)$(appicons16x16dir)/$$f"; \ - done - -uninstall-appicons16x16DATA: - @$(NORMAL_UNINSTALL) - @list='$(appicons16x16_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(appicons16x16dir)/$$f'"; \ - rm -f "$(DESTDIR)$(appicons16x16dir)/$$f"; \ - done -install-emoticonsDATA: $(emoticons_DATA) - @$(NORMAL_INSTALL) - test -z "$(emoticonsdir)" || $(mkdir_p) "$(DESTDIR)$(emoticonsdir)" - @list='$(emoticons_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(emoticonsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(emoticonsdir)/$$f'"; \ - $(emoticonsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(emoticonsdir)/$$f"; \ - done - -uninstall-emoticonsDATA: - @$(NORMAL_UNINSTALL) - @list='$(emoticons_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(emoticonsdir)/$$f'"; \ - rm -f "$(DESTDIR)$(emoticonsdir)/$$f"; \ - done -install-generalpicsDATA: $(generalpics_DATA) - @$(NORMAL_INSTALL) - test -z "$(generalpicsdir)" || $(mkdir_p) "$(DESTDIR)$(generalpicsdir)" - @list='$(generalpics_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(generalpicsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(generalpicsdir)/$$f'"; \ - $(generalpicsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(generalpicsdir)/$$f"; \ - done - -uninstall-generalpicsDATA: - @$(NORMAL_UNINSTALL) - @list='$(generalpics_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(generalpicsdir)/$$f'"; \ - rm -f "$(DESTDIR)$(generalpicsdir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(appicons16x16dir)" "$(DESTDIR)$(emoticonsdir)" "$(DESTDIR)$(generalpicsdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-appicons16x16DATA install-emoticonsDATA \ - install-generalpicsDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-appicons16x16DATA uninstall-emoticonsDATA \ - uninstall-generalpicsDATA uninstall-info-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-appicons16x16DATA install-data install-data-am \ - install-emoticonsDATA install-exec install-exec-am \ - install-generalpicsDATA install-info install-info-am \ - install-man install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am uninstall-appicons16x16DATA \ - uninstall-emoticonsDATA uninstall-generalpicsDATA \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=sshh.png kmesslogo.png envelope.png soccer.png tongue.png computer.png online.png arrogant.png baringteeth.png megasmile.png secret.png readme.txt omg.png blocked.png pizza.png messenger.png offline.png empty.png moon.png teeth.png regular.png sarcastic.png confused.png handcuffs.png asl.png film.png beer.png turtle.png huh.png party.png thumbs_up.png clock.png plate.png highfive.png angry.png cocktail.png rose.png cry.png sick.png unhappy.png angel.png thinking.png lightbulb.png island.png smile.png ugly.png emoticons.png umbrella.png kmesslogo2.png cup.png background.png sad.png sun.png airplane.png cat.png kmesspic.xcf kmesspic.png wilted_rose.png girl.png bowl.png automobile.png girl_hug.png fingerscrossed.png gameconsole.png cigarette.png love.png bat.png phone.png nerd.png eyeroll.png thumbs_down.png dog.png camera.png gnomemeeting.png snail.png money.png star.png berightback.png lightning.png sheep.png Makefile.in invisible.png boy.png onthephone.png mobilephone.png rainbow.png busy.png unknown.png embarrassed.png dude_hug.png note.png devil.png lunch.png kiss.png away.png brb.png present.png storm.png sleepy.png cake.png Makefile.am emoticons.xml shade.png unlove.png wink.png - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/pics/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/pics/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/pics/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/pics/background.png b/kmess/pics/background.png deleted file mode 100644 index 36a6dba..0000000 Binary files a/kmess/pics/background.png and /dev/null differ diff --git a/kmess/pics/kmesslogo.png b/kmess/pics/kmesslogo.png deleted file mode 100644 index f894c2b..0000000 Binary files a/kmess/pics/kmesslogo.png and /dev/null differ diff --git a/kmess/pics/kmesslogo2.png b/kmess/pics/kmesslogo2.png deleted file mode 100644 index a9823dc..0000000 Binary files a/kmess/pics/kmesslogo2.png and /dev/null differ diff --git a/kmess/pics/kmesspic.png b/kmess/pics/kmesspic.png deleted file mode 100644 index 37a70e5..0000000 Binary files a/kmess/pics/kmesspic.png and /dev/null differ diff --git a/kmess/pics/kmesspic.xcf b/kmess/pics/kmesspic.xcf deleted file mode 100644 index 9594f33..0000000 Binary files a/kmess/pics/kmesspic.xcf and /dev/null differ diff --git a/kmess/settings/.cvsignore b/kmess/settings/.cvsignore deleted file mode 100644 index 6ff38df..0000000 --- a/kmess/settings/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -.deps -Makefile.in - diff --git a/kmess/settings/Makefile.am b/kmess/settings/Makefile.am deleted file mode 100644 index d9bf65e..0000000 --- a/kmess/settings/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libsettings.a - -INCLUDES = $(all_includes) - -libsettings_a_METASOURCES = AUTO - -libsettings_a_SOURCES = accountswidgetinterface.ui accountswidget.cpp \ - emailwidget.ui chattingwidget.ui chatloggingwidget.ui \ - alertswidget.ui settingsdialog.cpp emoticonwidgetinterface.ui \ - emoticonwidget.cpp - -noinst_HEADERS = emoticonwidget.h accountswidget.h - -####### kdevelop will overwrite this part!!! (end)############ diff --git a/kmess/settings/Makefile.in b/kmess/settings/Makefile.in deleted file mode 100644 index 1af629d..0000000 --- a/kmess/settings/Makefile.in +++ /dev/null @@ -1,877 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -SOURCES = $(libsettings_a_SOURCES) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/settings -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libsettings_a_AR = $(AR) $(ARFLAGS) -libsettings_a_LIBADD = -am_libsettings_a_OBJECTS = accountswidget.$(OBJEXT) \ - settingsdialog.$(OBJEXT) emoticonwidget.$(OBJEXT) -#>- libsettings_a_OBJECTS = $(am_libsettings_a_OBJECTS) -#>+ 5 -libsettings_a_final_OBJECTS = libsettings_a.all_cpp.o -libsettings_a_nofinal_OBJECTS = accountswidget.$(OBJEXT) \ - settingsdialog.$(OBJEXT) emoticonwidget.$(OBJEXT) accountswidgetinterface.$(OBJEXT) emailwidget.$(OBJEXT) chattingwidget.$(OBJEXT) chatloggingwidget.$(OBJEXT) alertswidget.$(OBJEXT) emoticonwidgetinterface.$(OBJEXT) -@KDE_USE_FINAL_FALSE@libsettings_a_OBJECTS = $(libsettings_a_nofinal_OBJECTS) -@KDE_USE_FINAL_TRUE@libsettings_a_OBJECTS = $(libsettings_a_final_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/admin/depcomp -am__depfiles_maybe = depfiles -#>- @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/accountswidget.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/emoticonwidget.Po \ -#>- @AMDEP_TRUE@ ./$(DEPDIR)/settingsdialog.Po -#>+ 6 -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/accountswidgetinterface.P $(DEPDIR)/emailwidget.P $(DEPDIR)/chattingwidget.P $(DEPDIR)/chatloggingwidget.P $(DEPDIR)/alertswidget.P $(DEPDIR)/emoticonwidgetinterface.P $(DEPDIR)/libsettings_a.all_cpp.P ./$(DEPDIR)/accountswidget.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonwidget.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_TRUE@ @AMDEP_TRUE@ ./$(DEPDIR)/settingsdialog.Po -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/accountswidgetinterface.P $(DEPDIR)/emailwidget.P $(DEPDIR)/chattingwidget.P $(DEPDIR)/chatloggingwidget.P $(DEPDIR)/alertswidget.P $(DEPDIR)/emoticonwidgetinterface.P ./$(DEPDIR)/accountswidget.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/emoticonwidget.Po \ -@AMDEP_TRUE@@KDE_USE_FINAL_FALSE@ @AMDEP_TRUE@ ./$(DEPDIR)/settingsdialog.Po -#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 2 -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ -#>- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -#>- $(AM_CXXFLAGS) $(CXXFLAGS) -#>+ 3 -LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) -CXXLD = $(CXX) -#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ -#>- $(AM_LDFLAGS) $(LDFLAGS) -o $@ -#>+ 2 -CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libsettings_a_SOURCES) -DIST_SOURCES = $(libsettings_a_SOURCES) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ - -####### kdevelop will overwrite this part!!! (begin)########## -noinst_LIBRARIES = libsettings.a -INCLUDES = $(all_includes) -#>- libsettings_a_METASOURCES = AUTO -#>- libsettings_a_SOURCES = accountswidgetinterface.ui accountswidget.cpp \ -#>- emailwidget.ui chattingwidget.ui chatloggingwidget.ui \ -#>- alertswidget.ui settingsdialog.cpp emoticonwidgetinterface.ui \ -#>- emoticonwidget.cpp -#>+ 4 -libsettings_a_SOURCES= accountswidget.cpp \ - \ - settingsdialog.cpp \ - emoticonwidget.cpp accountswidgetinterface.cpp emailwidget.cpp chattingwidget.cpp chatloggingwidget.cpp alertswidget.cpp emoticonwidgetinterface.cpp - -noinst_HEADERS = emoticonwidget.h accountswidget.h -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/settings/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/settings/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/settings/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/settings/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/settings/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libsettings.a: $(libsettings_a_OBJECTS) $(libsettings_a_DEPENDENCIES) - -rm -f libsettings.a - $(libsettings_a_AR) libsettings.a $(libsettings_a_OBJECTS) $(libsettings_a_LIBADD) - $(RANLIB) libsettings.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accountswidget.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emoticonwidget.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settingsdialog.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ -#>- mostlyclean-am -#>+ 2 -clean-am: clean-metasources clean-ui clean-bcheck clean-final clean-generic clean-libtool clean-noinstLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - - -####### kdevelop will overwrite this part!!! (end)############ -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 3 -accountswidget.moc: $(srcdir)/accountswidget.h - $(MOC) $(srcdir)/accountswidget.h -o accountswidget.moc - -#>+ 2 -mocs: accountswidget.moc - -#>+ 3 -emoticonwidget.moc: $(srcdir)/emoticonwidget.h - $(MOC) $(srcdir)/emoticonwidget.h -o emoticonwidget.moc - -#>+ 2 -mocs: emoticonwidget.moc - -#>+ 3 -settingsdialog.moc: $(srcdir)/settingsdialog.h - $(MOC) $(srcdir)/settingsdialog.h -o settingsdialog.moc - -#>+ 2 -mocs: settingsdialog.moc - -#>+ 3 -clean-metasources: - -rm -f accountswidget.moc emoticonwidget.moc settingsdialog.moc - -#>+ 2 -KDE_DIST=accountswidgetinterface.ui chattingwidget.ui emailwidget.ui alertswidget.ui chatloggingwidget.ui emoticonwidgetinterface.ui settingsdialog.h Makefile.in Makefile.am - -#>+ 9 -clean-ui: - -rm -f \ - accountswidgetinterface.cpp accountswidgetinterface.h accountswidgetinterface.moc \ - emailwidget.cpp emailwidget.h emailwidget.moc \ - chattingwidget.cpp chattingwidget.h chattingwidget.moc \ - chatloggingwidget.cpp chatloggingwidget.h chatloggingwidget.moc \ - alertswidget.cpp alertswidget.h alertswidget.moc \ - emoticonwidgetinterface.cpp emoticonwidgetinterface.h emoticonwidgetinterface.moc - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/settings/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/settings/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/settings/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 11 -libsettings_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/accountswidget.cpp $(srcdir)/settingsdialog.cpp $(srcdir)/emoticonwidget.cpp accountswidgetinterface.cpp emailwidget.cpp chattingwidget.cpp chatloggingwidget.cpp alertswidget.cpp emoticonwidgetinterface.cpp alertswidget.moc emailwidget.moc emoticonwidget.moc chattingwidget.moc chatloggingwidget.moc accountswidget.moc accountswidgetinterface.moc emoticonwidgetinterface.moc settingsdialog.moc - @echo 'creating libsettings_a.all_cpp.cpp ...'; \ - rm -f libsettings_a.all_cpp.files libsettings_a.all_cpp.final; \ - echo "#define KDE_USE_FINAL 1" >> libsettings_a.all_cpp.final; \ - for file in accountswidget.cpp settingsdialog.cpp emoticonwidget.cpp accountswidgetinterface.cpp emailwidget.cpp chattingwidget.cpp chatloggingwidget.cpp alertswidget.cpp emoticonwidgetinterface.cpp ; do \ - echo "#include \"$$file\"" >> libsettings_a.all_cpp.files; \ - test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libsettings_a.all_cpp.final; \ - done; \ - cat libsettings_a.all_cpp.final libsettings_a.all_cpp.files > libsettings_a.all_cpp.cpp; \ - rm -f libsettings_a.all_cpp.final libsettings_a.all_cpp.files - -#>+ 3 -clean-final: - -rm -f libsettings_a.all_cpp.cpp - -#>+ 3 -final: - $(MAKE) libsettings_a_OBJECTS="$(libsettings_a_final_OBJECTS)" all-am - -#>+ 3 -final-install: - $(MAKE) libsettings_a_OBJECTS="$(libsettings_a_final_OBJECTS)" install-am - -#>+ 3 -no-final: - $(MAKE) libsettings_a_OBJECTS="$(libsettings_a_nofinal_OBJECTS)" all-am - -#>+ 3 -no-final-install: - $(MAKE) libsettings_a_OBJECTS="$(libsettings_a_nofinal_OBJECTS)" install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 12 -nmcheck: -emoticonwidget.o: emoticonwidget.moc -emoticonwidget.lo: emoticonwidget.moc -$(srcdir)/emoticonwidget.cpp: accountswidgetinterface.h emailwidget.h chattingwidget.h chatloggingwidget.h alertswidget.h emoticonwidgetinterface.h -nmcheck-am: nmcheck -$(srcdir)/settingsdialog.cpp: accountswidgetinterface.h emailwidget.h chattingwidget.h chatloggingwidget.h alertswidget.h emoticonwidgetinterface.h -accountswidget.o: accountswidget.moc -settingsdialog.o: settingsdialog.moc -settingsdialog.lo: settingsdialog.moc -accountswidget.lo: accountswidget.moc -$(srcdir)/accountswidget.cpp: accountswidgetinterface.h emailwidget.h chattingwidget.h chatloggingwidget.h alertswidget.h emoticonwidgetinterface.h - -#>+ 90 -chatloggingwidget.cpp: $(srcdir)/chatloggingwidget.ui chatloggingwidget.h chatloggingwidget.moc - rm -f chatloggingwidget.cpp - echo '#include ' > chatloggingwidget.cpp - echo '#include ' >> chatloggingwidget.cpp - $(UIC) -tr ${UIC_TR} -i chatloggingwidget.h $(srcdir)/chatloggingwidget.ui > chatloggingwidget.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" chatloggingwidget.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_chatloggingwidget,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> chatloggingwidget.cpp ;\ - rm -f chatloggingwidget.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "chatloggingwidget.moc"' >> chatloggingwidget.cpp; else rm -f chatloggingwidget.cpp ; exit $$ret ; fi - -chatloggingwidget.h: $(srcdir)/chatloggingwidget.ui - rm -rf chatloggingwidget.h; - $(UIC) $(srcdir)/chatloggingwidget.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> chatloggingwidget.h ; -chatloggingwidget.moc: chatloggingwidget.h - $(MOC) chatloggingwidget.h -o chatloggingwidget.moc - -alertswidget.cpp: $(srcdir)/alertswidget.ui alertswidget.h alertswidget.moc - rm -f alertswidget.cpp - echo '#include ' > alertswidget.cpp - echo '#include ' >> alertswidget.cpp - $(UIC) -tr ${UIC_TR} -i alertswidget.h $(srcdir)/alertswidget.ui > alertswidget.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" alertswidget.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_alertswidget,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> alertswidget.cpp ;\ - rm -f alertswidget.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "alertswidget.moc"' >> alertswidget.cpp; else rm -f alertswidget.cpp ; exit $$ret ; fi - -alertswidget.h: $(srcdir)/alertswidget.ui - rm -rf alertswidget.h; - $(UIC) $(srcdir)/alertswidget.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> alertswidget.h ; -alertswidget.moc: alertswidget.h - $(MOC) alertswidget.h -o alertswidget.moc - -accountswidgetinterface.cpp: $(srcdir)/accountswidgetinterface.ui accountswidgetinterface.h accountswidgetinterface.moc - rm -f accountswidgetinterface.cpp - echo '#include ' > accountswidgetinterface.cpp - echo '#include ' >> accountswidgetinterface.cpp - $(UIC) -tr ${UIC_TR} -i accountswidgetinterface.h $(srcdir)/accountswidgetinterface.ui > accountswidgetinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" accountswidgetinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_accountswidgetinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> accountswidgetinterface.cpp ;\ - rm -f accountswidgetinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "accountswidgetinterface.moc"' >> accountswidgetinterface.cpp; else rm -f accountswidgetinterface.cpp ; exit $$ret ; fi - -accountswidgetinterface.h: $(srcdir)/accountswidgetinterface.ui - rm -rf accountswidgetinterface.h; - $(UIC) $(srcdir)/accountswidgetinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> accountswidgetinterface.h ; -accountswidgetinterface.moc: accountswidgetinterface.h - $(MOC) accountswidgetinterface.h -o accountswidgetinterface.moc - -emoticonwidgetinterface.cpp: $(srcdir)/emoticonwidgetinterface.ui emoticonwidgetinterface.h emoticonwidgetinterface.moc - rm -f emoticonwidgetinterface.cpp - echo '#include ' > emoticonwidgetinterface.cpp - echo '#include ' >> emoticonwidgetinterface.cpp - $(UIC) -tr ${UIC_TR} -i emoticonwidgetinterface.h $(srcdir)/emoticonwidgetinterface.ui > emoticonwidgetinterface.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" emoticonwidgetinterface.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_emoticonwidgetinterface,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> emoticonwidgetinterface.cpp ;\ - rm -f emoticonwidgetinterface.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "emoticonwidgetinterface.moc"' >> emoticonwidgetinterface.cpp; else rm -f emoticonwidgetinterface.cpp ; exit $$ret ; fi - -emoticonwidgetinterface.h: $(srcdir)/emoticonwidgetinterface.ui - rm -rf emoticonwidgetinterface.h; - $(UIC) $(srcdir)/emoticonwidgetinterface.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> emoticonwidgetinterface.h ; -emoticonwidgetinterface.moc: emoticonwidgetinterface.h - $(MOC) emoticonwidgetinterface.h -o emoticonwidgetinterface.moc - -chattingwidget.cpp: $(srcdir)/chattingwidget.ui chattingwidget.h chattingwidget.moc - rm -f chattingwidget.cpp - echo '#include ' > chattingwidget.cpp - echo '#include ' >> chattingwidget.cpp - $(UIC) -tr ${UIC_TR} -i chattingwidget.h $(srcdir)/chattingwidget.ui > chattingwidget.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" chattingwidget.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_chattingwidget,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> chattingwidget.cpp ;\ - rm -f chattingwidget.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "chattingwidget.moc"' >> chattingwidget.cpp; else rm -f chattingwidget.cpp ; exit $$ret ; fi - -chattingwidget.h: $(srcdir)/chattingwidget.ui - rm -rf chattingwidget.h; - $(UIC) $(srcdir)/chattingwidget.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> chattingwidget.h ; -chattingwidget.moc: chattingwidget.h - $(MOC) chattingwidget.h -o chattingwidget.moc - -emailwidget.cpp: $(srcdir)/emailwidget.ui emailwidget.h emailwidget.moc - rm -f emailwidget.cpp - echo '#include ' > emailwidget.cpp - echo '#include ' >> emailwidget.cpp - $(UIC) -tr ${UIC_TR} -i emailwidget.h $(srcdir)/emailwidget.ui > emailwidget.cpp.temp ; ret=$$?; \ - $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" emailwidget.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_emailwidget,g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> emailwidget.cpp ;\ - rm -f emailwidget.cpp.temp ;\ - if test "$$ret" = 0; then echo '#include "emailwidget.moc"' >> emailwidget.cpp; else rm -f emailwidget.cpp ; exit $$ret ; fi - -emailwidget.h: $(srcdir)/emailwidget.ui - rm -rf emailwidget.h; - $(UIC) $(srcdir)/emailwidget.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> emailwidget.h ; -emailwidget.moc: emailwidget.h - $(MOC) emailwidget.h -o emailwidget.moc diff --git a/kmess/settings/accountswidget.cpp b/kmess/settings/accountswidget.cpp deleted file mode 100644 index d3b4083..0000000 --- a/kmess/settings/accountswidget.cpp +++ /dev/null @@ -1,517 +0,0 @@ -/*************************************************************************** - accountswidget.cpp - description - ------------------- - copyright : (C) 2004 by Madelman - (C) 2006 by Diederik van der Boor - email : mkb137b@hotmail.com - "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 "accountswidget.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#if KDE_IS_VERSION(3,4,0) - #include -#else -#endif - -#include -#include -#include -#include -#include - - - -/** - * Constructor - */ -AccountsWidget::AccountsWidget( QWidget* parent, const char* name, WFlags fl ) -: AccountsWidgetInterface( parent, name, fl ), - hasTempImage_(false) -{ - - // Find the default image - KStandardDirs *dirs = KGlobal::dirs(); - QString defaultImage = dirs->findResource( "data", "kmess/pics/kmesspic.png" ); - - // Load the image in the X-Server: - defaultPixmap_ = QPixmap(defaultImage); - customPixmap_ = defaultPixmap_; - - // Create the "Change..." button actions -#if KDE_IS_VERSION(3,4,0) - KPopupMenu *browsePopup = new KPopupMenu( this, "browsemenu" ); - KAction *browseSimple = new KAction( i18n("Browse..."), "folder_open", 0, this, "browsesimple" ); - KAction *browseResize = new KAction( i18n("Browse and crop image..."), "editcut", 0, this, "browseresize" ); - connect( browseSimple, SIGNAL(activated()), this, SLOT(pictureBrowseSimple() ) ); - connect( browseResize, SIGNAL(activated()), this, SLOT(pictureBrowseResize() ) ); - - // Plug the items into the browse menu button - browseSimple->plug( browsePopup ); - browseResize->plug( browsePopup ); - - // Assign the new popup to the button and detach old connection - browseButton_->setPopup( browsePopup ); - disconnect( browseButton_, SIGNAL( clicked() ) ); -#endif - - // Add the items to the initial status combo box - QStringList statuses; - statuses << i18n("Online") - << i18n("Away") - << i18n("Be Right Back") - << i18n("Busy") - << i18n("Out to Lunch") - << i18n("On the Phone") - << i18n("Invisible"); - initialStatus_->insertStringList( statuses ); -} - - - -/** - * Destructor - */ -AccountsWidget::~AccountsWidget() -{ - // Clean up the temp file. - if(hasTempImage_) - { - QFile::remove(tempImageFile_); - } - - // no need to delete child widgets, Qt does it all for us -} - - - -// Return the filename of the currently selected image. -QString AccountsWidget::getPictureFileName() const -{ - if( hasTempImage_ ) - { - return tempImageFile_; - } - else - { - return imageFile_; - } -} - - - -/** - * Load the dialog settings. - */ -void AccountsWidget::loadSettings(Account *account, bool isCurrentAccount) -{ - bool showImage; - - // Read settings - myHandle_ = account->getHandle(); - imageFile_ = account->getCustomImagePath(); - tempImageFile_ = account->getCustomImagePath() + ".tmp"; - showImage = account->getShowImage(); - - // Load default properties - friendlyNameEdit_ ->setText( account->getFriendlyName() ); - handleEdit_ ->setText( myHandle_ ); - passwordEdit_ ->setText( QString::null ); - - autologinCheckBox_ ->setChecked( account->getUseAutologin() ); - - - // Make sure the drop down list matches the user's initial status - int item; - QString status = account->getInitialStatus(); - if( status == "AWY" ) - { // Change status to AWAY - item = 1; - } - else if( status == "BRB" ) - { // Change status to BE RIGHT BACK - item = 2; - } - else if( status == "BSY" ) - { // Change status to BUSY - item = 3; - } - else if( status == "LUN" ) - { // Change status to OUT TO LUNCH - item = 4; - } - else if( status == "PHN" ) - { // Change status to ON THE PHONE - item = 5; - } - else if( status == "HDN" ) - { // Change status to INVISIBLE - item = 6; - } - else - { // Change status to ONLINE - item = 0; - } - initialStatus_->setCurrentItem( item ); - - - // The friendly name edit should only be enabled if this is the current account, and the passport account is verified; - // the "register" text and link make sense only if this is not the current account; - // the "verify" text and link should only be visible if the currently logged in account has not been verified. - if( isCurrentAccount ) - { - if( account->isVerified() ) - { - friendlyNameEdit_ ->setEnabled( true ); - registerLabel_ ->hide(); - registerButton_ ->hide(); - verifyLabel_ ->hide(); - verifyButton_ ->hide(); - } - else - { - friendlyNameEdit_ ->setEnabled( false ); - registerLabel_ ->hide(); - registerButton_ ->hide(); - verifyLabel_ ->show(); - verifyButton_ ->show(); - } - } - else - { - friendlyNameEdit_ ->setEnabled( false ); - registerLabel_ ->show(); - registerButton_ ->show(); - verifyLabel_ ->hide(); - verifyButton_ ->hide(); - } - - // When the account is a guest account, offer a method to upgrade to a real account. - if( account->isGuestAccount() ) - { - // Disable settings that require a real account which is saved in the config file. - rememberMeToggled(false); - } - else - { - // Hide the upgrade function - rememberCheckbox_->hide(); - } - - // Load the custom pixmap if we have one. - customPixmap_ = QPixmap( imageFile_ ); - - if(customPixmap_.isNull()) - { - // Failed to load - customPixmap_ = defaultPixmap_; - imageFile_ = QString::null; - } - - // Load the pixmap - pictureLabel_->setPixmap(customPixmap_); - - // Set the "Show Image" checkbox - // Run the event manually this time to update the GUI. - noPictureCheckbox_->setChecked( ! showImage ); - showImageToggled( ! showImage ); -} - - - -// Show the normal browse dialog to change display picture -void AccountsWidget::pictureBrowseSimple() -{ - selectImage( false ); -} - - - -// Show the browse dialog to change display picture and then allow the user to crop it -void AccountsWidget::pictureBrowseResize() -{ - selectImage( true ); -} - - - -/** - * Save the settings in the account object. - */ -void AccountsWidget::saveSettings( Account *account ) -{ - QString password; - QString imageName = 0; - QString tempImageName = 0; - QString initialStatus; - QString newFriendlyName; - QDir imageFolder; - bool showImage; - bool success; - - // Read settings - showImage = ! noPictureCheckbox_->isChecked(); - - // When the account is a guest account, see if the user wanted to "upgrade" it. - if( account->isGuestAccount() ) - { - if( rememberCheckbox_->isChecked() ) - { - account->setGuestAccount(false); - } - } - - // If the account is not verified, don't change the nickname. - if( ! account->isVerified() ) - { - newFriendlyName = account->getFriendlyName(); - } - else - { - newFriendlyName = friendlyNameEdit_->text(); - } - - // Update the settings - account->setLoginInformation( handleEdit_->text(), newFriendlyName, passwordEdit_->password() ); - account->setUseAutologin( autologinCheckBox_->isChecked() ); - account->setShowImage( showImage ); - - // Update the initial status - initialStatus = initialStatus_->currentText(); - if( initialStatus == i18n("Away") ) - { // Change status to AWAY - initialStatus = "AWY"; - } - else if( initialStatus == i18n("Be Right Back") ) - { // Change status to BE RIGHT BACK - initialStatus = "BRB"; - } - else if( initialStatus == i18n("Busy") ) - { // Change status to BUSY - initialStatus = "BSY"; - } - else if( initialStatus == i18n("Invisible") ) - { // Change status to INVISIBLE - initialStatus = "HDN"; - } - else if( initialStatus == i18n("Out to Lunch") ) - { // Change status to OUT TO LUNCH - initialStatus = "LUN"; - } - else if( initialStatus == i18n("On the Phone") ) - { // Change status to ON THE PHONE - initialStatus = "PHN"; - } - else - { // Change status to ONLINE - initialStatus = "NLN"; - } - account->setInitialStatus( initialStatus ); - - // Update the picture if we have one. - if(hasTempImage_) - { - if( ! showImage) - { - // The temporary file is no longer needed. - QFile::remove(tempImageFile_); - hasTempImage_ = false; - } - else - { - imageName = account->getNewCustomImagePath(); - - // Rename the temp file, place it over the new file - imageFolder = QDir( QFileInfo(imageName).dir() ); - success = imageFolder.rename( tempImageFile_, imageName ); - hasTempImage_ = false; - - if( ! success ) - { - kdWarning() << "The display picture file could not be renamed from \"" << tempImageFile_ << "\" to \"" << imageName << "\"." << endl; - } - } - } - - // Create the MSN Object again. - account->updateMsnObject(); -} - - - -/** - * The user toggled the remember me option - */ -void AccountsWidget::rememberMeToggled(bool noGuest) -{ - autologinCheckBox_->setEnabled( noGuest ); - initialStatus_->setEnabled( noGuest ); -} - - - -/* - * Allow the user to select an image, and convert it to 96x96, place it in a temp file. - */ -void AccountsWidget::selectImage( bool resize ) -{ - // This code is partially borrowed from Kopete. - - KStandardDirs *dirs = KGlobal::dirs(); - bool isRemoteFile = false; - QString safeHandle = 0; - KURL filePath = 0; - QString localFilePath = 0; - QString tempImageName = 0; - QImage imageData = 0; - - // all images: dirs->findAllResources("data", "kdm/pics/users/*.png") - // default dir: dirs->findResource("data", "kdm/pics/users/"); - - // Get the resourcedir which contains the largest collection of images. - // 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; - uint fileCount = 0; - for( QStringList::Iterator it = kdmDirs.begin(); it != kdmDirs.end(); ++it ) - { - kdmDir.setPath(*it); - QStringList pngFiles = kdmDir.entryList("*.png"); - if( pngFiles.size() > fileCount ) - { - fileCount = pngFiles.size(); - startDir = *it; - } - } - - // Show the open file dialog - filePath = KFileDialog::getImageOpenURL( startDir, this, i18n( "Display Picture" ) ); - if(filePath.isEmpty()) - { - return; - } - - // Read the path. - if(filePath.isLocalFile()) - { - localFilePath = filePath.path(); - } - else - { - // File is remote, download it to a local folder - // first because QPixmap doesn't have KIO magic. - // KIO::NetAccess::download fills the localFilePath field. -#if KDE_IS_VERSION(3,2,0) - if(! KIO::NetAccess::download(filePath, localFilePath, this )) -#else - if(! KIO::NetAccess::download(filePath, localFilePath )) -#endif - { - KMessageBox::sorry(this, i18n("Downloading of display image failed"), i18n("KMess")); - return; - } - - isRemoteFile = true; - } - - - // Convert the image to the correct format. - // We use a temporary filename first and replace the original if you press OK. - imageData = QImage(localFilePath); // Load image data - -#if KDE_IS_VERSION(3,4,0) - // Allow the user to select a region of the image - if( resize ) - { - imageData = KPixmapRegionSelectorDialog::getSelectedImage( QPixmap(imageData), 96, 96, this ); - } -#else - resize = false; // Avoid a compiler warning about unused variables. -#endif - - imageData = imageData.smoothScale(96, 96, QImage::ScaleMax); // Makes smallest edge 96 pixels, preserving aspect ratio - - if(! imageData.isNull() && (imageData.width() != 96 || imageData.height() != 96)) - { - // Copy the middle part of the image. - imageData = imageData.copy( (imageData.width() - 96) / 2, // X - (imageData.height() - 96) / 2, // Y - 96, 96 ); - } - - - if(! imageData.isNull() && imageData.save(tempImageFile_, "PNG") ) - { - // Sucess! Update the preview image - customPixmap_ = QPixmap(tempImageFile_); - pictureLabel_->setPixmap(customPixmap_); - hasTempImage_ = true; - } - else - { - KMessageBox::sorry( this, - i18n( "An error occurred when trying to change the display picture.\n" - "Make sure that you have selected a correct image file" ), - i18n( "KMess" ) ); - } - - // Remove any temporary files - if(isRemoteFile) - { - KIO::NetAccess::removeTempFile(localFilePath); - } -} - - - -// Slot running when the "Show image" checkbox was toggled. -void AccountsWidget::showImageToggled(bool noImage) -{ - browseButton_ -> setEnabled( ! noImage ); - pictureLabel_ -> setEnabled( ! noImage ); -} - - - -// The user pressed the "Create new account" button -void AccountsWidget::showRegisterPassport() -{ - kapp->invokeBrowser("https://accountservices.passport.net/reg.srf"); -} - - -#include "accountswidget.moc" diff --git a/kmess/settings/accountswidget.h b/kmess/settings/accountswidget.h deleted file mode 100644 index 1d69454..0000000 --- a/kmess/settings/accountswidget.h +++ /dev/null @@ -1,76 +0,0 @@ -/*************************************************************************** - accountswidget.h - description - ------------------- - begin : 03-08-2004 - copyright : (C) 2004 by Madelman - (C) 2006 by Diederik van der Boor - email : mkb137b@hotmail.com - "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 ACCOUNTSWIDGET_H -#define ACCOUNTSWIDGET_H - - -#include "accountswidgetinterface.h" -#include "../account.h" - -#include -#include - - -class AccountsWidget : public AccountsWidgetInterface -{ - Q_OBJECT - - public: - // Constructor - AccountsWidget( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); - // Destructor - virtual ~AccountsWidget(); - // Return the filename of the currently selected image. - QString getPictureFileName() const; - // Request to load the settings - void loadSettings( Account *account, bool isCurrentAccount ); - // Request to save the settings - void saveSettings( Account *account ); - - public slots: - // Show the normal browse dialog to change display picture - void pictureBrowseSimple(); - // Show the browse dialog to change display picture and then allow the user to crop it - void pictureBrowseResize(); - // The user toggled the remember me option - void rememberMeToggled(bool noGuest); - // The user pressed the browse image button - void selectImage( bool resize ); - // The user togged the show image checkbox - void showImageToggled(bool noImage); - // The user pressed the "Create new account" button - void showRegisterPassport(); - - private: - // The handle of the account - QString myHandle_; - // The image file of the account - QString imageFile_; - // The location for the custom image. - QString tempImageFile_; - // Do we have a custom image or not? - bool hasTempImage_; - // The pixmap for the default kmess icon - QPixmap defaultPixmap_; - // The pixmap for the custom user icon - QPixmap customPixmap_; -}; - -#endif // ACCOUNTSWIDGET_H diff --git a/kmess/settings/accountswidgetinterface.ui b/kmess/settings/accountswidgetinterface.ui deleted file mode 100644 index 7c0e5df..0000000 --- a/kmess/settings/accountswidgetinterface.ui +++ /dev/null @@ -1,529 +0,0 @@ - -AccountsWidgetInterface - - - AccountsWidgetInterface - - - - 0 - 0 - 598 - 474 - - - - Accounts - - - - unnamed - - - - friendlyNameLabel_ - - - Your friendly name: - - - Enter the name other contacts should see when you're online. - - - - - friendlyNameEdit_ - - - - - handleLabel_ - - - Your email address: - - - Enter the e-mail address of your MSN Passport account. You can register a new account at http://register.passport.com/ - - - - - handleEdit_ - - - - - passwordLabel_ - - - Your password: - - - Enter the password of your MSN Passport account. You can register a new account at http://register.passport.com/ - - - - - passwordEdit_ - - - - - previewLabel_ - - - - 1 - 5 - 0 - 0 - - - - - 75 - 0 - - - - Display picture: - - - - - layout23 - - - - unnamed - - - - pictureLabel_ - - - - 0 - 0 - 0 - 0 - - - - - 96 - 96 - - - - - 96 - 96 - - - - PopupPanel - - - Raised - - - true - - - - - spacer9 - - - Horizontal - - - Minimum - - - - 16 - 20 - - - - - - layout22 - - - - unnamed - - - - spacer10 - - - Vertical - - - Minimum - - - - 20 - 62 - - - - - - browseButton_ - - - - 1 - 0 - 0 - 0 - - - - C&hange... - - - Alt+H - - - - - - - spacer12 - - - Horizontal - - - Expanding - - - - 349 - 20 - - - - - - - - noPictureCheckbox_ - - - Don't show a displa&y picture - - - Alt+Y - - - - - rememberCheckbox_ - - - Remember the settings of this account - - - 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). - - - - - autologinCheckBox_ - - - Login &with this account automatically at start-up - - - Alt+W - - - If enabled, KMess automatically logs in with this account. - - - - - textLabel1 - - - Status to set at login: - - - - - layout11 - - - - unnamed - - - - initialStatus_ - - - - - spacer12_2 - - - Horizontal - - - Expanding - - - - 360 - 20 - - - - - - - - spacer17 - - - Vertical - - - Expanding - - - - 20 - 100 - - - - - - verifyLayout_ - - - - unnamed - - - - verifyLabel_ - - - You can't change your friendly name because your passport e-mail address is not verified. - - - WordBreak|AlignVCenter - - - 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. - - - - - layout9 - - - - unnamed - - - - spacer4 - - - Vertical - - - Minimum - - - - 20 - 0 - - - - - - verifyButton_ - - - - 4 - 5 - 0 - 0 - - - - NoFocus - - - Request verification email - - - AlignBottom - - - https://accountservices.passport.net/ - - - Go to accountservices.passport.net - - - true - - - true - - - - - - - - - registerLayout_ - - - - unnamed - - - - registerLabel_ - - - To connect to the MSN Messenger service, you will need to register an e-mail address as Passport account. - - - WordBreak|AlignVCenter - - - 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. - - - - - layout8 - - - - unnamed - - - - spacer3 - - - Vertical - - - Minimum - - - - 20 - 0 - - - - - - registerButton_ - - - - 4 - 5 - 0 - 0 - - - - NoFocus - - - Register new account - - - AlignBottom - - - http://register.passport.com/ - - - Go to register.passport.com - - - true - - - true - - - - - - - - - - - - - browseButton_ - clicked() - AccountsWidgetInterface - pictureBrowseSimple() - - - noPictureCheckbox_ - toggled(bool) - AccountsWidgetInterface - showImageToggled(bool) - - - registerButton_ - leftClickedURL() - AccountsWidgetInterface - showRegisterPassport() - - - rememberCheckbox_ - toggled(bool) - AccountsWidgetInterface - rememberMeToggled(bool) - - - - friendlyNameEdit_ - handleEdit_ - passwordEdit_ - - - showRegisterPassport() - showImageToggled(bool) - pictureBrowseSimple() - rememberMeToggled(bool) - - - - kpassdlg.h - kpushbutton.h - kurllabel.h - kurllabel.h - - diff --git a/kmess/settings/alertswidget.ui b/kmess/settings/alertswidget.ui deleted file mode 100644 index 875faf1..0000000 --- a/kmess/settings/alertswidget.ui +++ /dev/null @@ -1,400 +0,0 @@ - -AlertsWidget - - - AlertsWidget - - - - 0 - 0 - 549 - 508 - - - - Alerts - - - - unnamed - - - - buttonGroup1 - - - - 5 - 0 - 0 - 0 - - - - Popup notifications - - - - unnamed - - - - textLabel1 - - - Show notifications when your contacts: - - - - - showOnlineNotificationsCheckBox_ - - - &Go online - - - Alt+G - - - true - - - If enabled, a popup message is shown when one of your contacts connects to MSN. - - - - - showChatStartNotificationsCheckBox_ - - - Start a &chat with you - - - Alt+C - - - true - - - If enabled, a popup message is shown when one of your contacts starts a conversation with you. - - - - - showChatMessagesNotificationsCheckBox_ - - - S&end you a message - - - Alt+E - - - If enabled, a popup message is shown every time one of your contacts sends you a message. - - - - - showStatusNotificationsCheckBox_ - - - Change their &status - - - Alt+S - - - If enabled, a popup message is also shown when your contacts change their MSN status. - - - - - showOfflineNotificationsCheckBox_ - - - Go o&ffline - - - Alt+F - - - If enabled, a popup message is also shown when one of your contacts goes offline. - - - - - spacer6_2_3_2 - - - Vertical - - - Fixed - - - - 10 - 10 - - - - - - showEmailsNotificationsCheckBox_ - - - Show notifications when you recei&ve an email - - - Alt+V - - - true - - - If enabled, a popup message is also shown when one of your contacts goes offline. - - - - - spacer6_2_3 - - - Vertical - - - Fixed - - - - 10 - 10 - - - - - - layout23 - - - - unnamed - - - - textLabel5 - - - Hide popups after - - - AlignVCenter|AlignRight - - - Controls the number of seconds before popups are hidden. - - - - - notificationDurationSpinBox_ - - - - - textLabel6 - - - seconds - - - - - spacer16 - - - Horizontal - - - Expanding - - - - 51 - 20 - - - - - - - - - - spacer6_3 - - - Vertical - - - Minimum - - - - 20 - 20 - - - - - - shakeNudgeCheckBox_ - - - Shake the chat &window when a nudge is received or sent - - - Alt+W - - - <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> - - - - - nowListeningCheckBox_ - - - Inform 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 applications. - - - - - spacer6_3_2 - - - Vertical - - - Minimum - - - - 20 - 20 - - - - - - useIdleTimerCheckBox_ - - - Change status to "Awa&y-Idle" when inactive - - - Alt+Y - - - If enabled, your status will be changed automatically to "Away-Idle" when you're not using the computer for a few minutes. - - - - - layout22 - - - - unnamed - - - - spacer17 - - - Horizontal - - - Fixed - - - - 20 - 20 - - - - - - textLabel3 - - - Become idle after - - - AlignVCenter|AlignRight - - - Controls the number of minutes before KMess changes the status to "Away-Idle". - - - - - idleTimeSpinBox_ - - - - - textLabel4 - - - minutes - - - - - spacer17 - - - Horizontal - - - Expanding - - - - 71 - 20 - - - - - - - - spacer6_2_2 - - - Vertical - - - MinimumExpanding - - - - 20 - 20 - - - - - - - diff --git a/kmess/settings/chatloggingwidget.ui b/kmess/settings/chatloggingwidget.ui deleted file mode 100644 index aebec09..0000000 --- a/kmess/settings/chatloggingwidget.ui +++ /dev/null @@ -1,210 +0,0 @@ - -ChatLoggingWidget - - - ChatLoggingWidget - - - - 0 - 0 - 600 - 480 - - - - Chat Logging - - - - unnamed - - - - layout9 - - - - unnamed - - - - logChatsCheckBox_ - - - Log &all chats - - - If enabled, chat conversations will be saved in a specified directory. - - - - - layout8 - - - - unnamed - - - - spacer11 - - - Horizontal - - - Fixed - - - - 16 - 20 - - - - - - layout18 - - - - unnamed - - - 0 - - - 6 - - - - textLabel7 - - - Save chat files in this parent directory: - - - Choose the directory on your system where you'd like to save the chat logs. - - - - - chatSavePathButton_ - - - - 22 - 0 - - - - ... - - - - - chatSavePathEdit_ - - - - - - - - - organizeButtonGroup_ - - - 6 - - - Organize chat folders by: - - - true - - - KMess automatically creates subdirectories when you choose the organize the chat folder by year, month or day. - - - - unnamed - - - - yearRadioButton_ - - - Year - - - 1 - - - - - monthRadioButton_ - - - Month - - - - - dayRadioButton_ - - - Day - - - 1 - - - - - singleDirectoryRadioButton_ - - - Save all chats in the parent directory - - - false - - - 1 - - - - - - - spacer12 - - - Vertical - - - Expanding - - - - 16 - 196 - - - - - - - - - logChatsCheckBox_ - chatSavePathEdit_ - yearRadioButton_ - monthRadioButton_ - dayRadioButton_ - singleDirectoryRadioButton_ - - - diff --git a/kmess/settings/chattingwidget.ui b/kmess/settings/chattingwidget.ui deleted file mode 100644 index 36fb1c2..0000000 --- a/kmess/settings/chattingwidget.ui +++ /dev/null @@ -1,477 +0,0 @@ - -ChattingWidget - - - ChattingWidget - - - - 0 - 0 - 557 - 449 - - - - ChattingWidget - - - - unnamed - - - - textLabel2 - - - - 5 - 4 - 0 - 0 - - - - Your message font: - - - This is the font style and color used in your chat messages. - - - - - layout18 - - - - unnamed - - - - fontButton_ - - - - 250 - 0 - - - - - - - - - fontColorButton_ - - - - 1 - 4 - 0 - 0 - - - - - 80 - 32767 - - - - - - - - - spacer11 - - - Horizontal - - - Expanding - - - - 351 - 20 - - - - - - - - spacer8_2 - - - Vertical - - - Fixed - - - - 20 - 16 - - - - - - useContactFontCheckBox_ - - - Force contacts' messages to use this font: - - - Allows to override the font style and color of your contacts' messages with a the chosen font style and color below. - - - - - layout19 - - - - unnamed - - - - contactFontButton_ - - - - 250 - 0 - - - - - - - - - contactFontColorButton_ - - - - 1 - 4 - 0 - 0 - - - - - 80 - 32767 - - - - - - - - - spacer12 - - - Horizontal - - - Expanding - - - - 331 - 20 - - - - - - - - spacer9 - - - Vertical - - - Fixed - - - - 20 - 16 - - - - - - layout5 - - - - unnamed - - - - textLabel1 - - - Chat style: - - - Allows you to change the theme KMess uses to display all chat messages. - - - - - chatStyle_ - - - - 200 - 0 - - - - - - spacer10_2 - - - Horizontal - - - Expanding - - - - 211 - 20 - - - - - - - - khtmlPlaceholder_ - - - - 5 - 2 - 0 - 0 - - - - - 0 - 150 - - - - StyledPanel - - - Sunken - - - 0 - - - - - layout17 - - - - unnamed - - - - useEmoticonsCheckBox_ - - - &Show graphics in chat messages - - - Alt+S - - - Enables the appearance of emoticons in the chat conversations. - - - - - pixmapLabel1_ - - - - 0 - 0 - 0 - 0 - - - - - 20 - 20 - - - - - 20 - 20 - - - - true - - - - - pixmapLabel2_ - - - - 0 - 0 - 0 - 0 - - - - - 20 - 20 - - - - - 20 - 20 - - - - true - - - - - pixmapLabel3_ - - - - 0 - 0 - 0 - 0 - - - - - 20 - 20 - - - - - 20 - 20 - - - - true - - - - - spacer8 - - - Horizontal - - - Expanding - - - - 310 - 16 - - - - - - - - showTimeCheckbox_ - - - S&how time in chat messages - - - Alt+H - - - Enables the appearance of a timestamp in each chat message. - - - - - useFontEffectsCheckBox_ - - - Use font &effects in messages, i.e. *bold*, /italic/, and _underline_ - - - Alt+E - - - Enables the use of font effects. Typing *bold*, /italic/, and _underline_ causes those words appear in a bold, italics or underlined font respectively. - - - - - groupFollowupCheckbox_ - - - &Group follow-up messages from the same contact - - - Alt+G - - - 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. - - - - - - - - fontButton_ - fontColorButton_ - useContactFontCheckBox_ - contactFontButton_ - contactFontColorButton_ - chatStyle_ - useEmoticonsCheckBox_ - showTimeCheckbox_ - useFontEffectsCheckBox_ - groupFollowupCheckbox_ - - - - kcolorbutton.h - kcolorbutton.h - - diff --git a/kmess/settings/emailwidget.ui b/kmess/settings/emailwidget.ui deleted file mode 100644 index ec8881d..0000000 --- a/kmess/settings/emailwidget.ui +++ /dev/null @@ -1,186 +0,0 @@ - -EmailWidget - - - EmailWidget - - - - 0 - 0 - 600 - 480 - - - - EmailWidget - - - - unnamed - - - - layout42 - - - - unnamed - - - - clientButtonGroup_ - - - - 5 - 0 - 0 - 0 - - - - 6 - - - Mail Client - - - true - - - Allows you to choose which e-mail program KMess should open to view e-mail messages. - - - - unnamed - - - - useHotmailRadioButton_ - - - Use Hotmail - - - - - useCommandRadioButton_ - - - Use a specified command: - - - - - layout40 - - - - unnamed - - - - spacer1 - - - Horizontal - - - Fixed - - - - 20 - 20 - - - - - - emailCommandEdit_ - - - - - - - - - notificationButtonGroup_ - - - - 5 - 0 - 0 - 0 - - - - 6 - - - Email Notification - - - false - - - - unnamed - - - - showEmailInfoCheckBox_ - - - Show email information - - - 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. - - - - - showOtherFoldersCheckBox_ - - - Show a notification when email is received in "other folders" - - - If enabled, a popup message also appears when e-mail is received in other folders. This option is only available for Hotmail accounts. - - - - - - - spacer26 - - - Vertical - - - MinimumExpanding - - - - 20 - 111 - - - - - - - - - useHotmailRadioButton_ - useCommandRadioButton_ - emailCommandEdit_ - showEmailInfoCheckBox_ - showOtherFoldersCheckBox_ - - - diff --git a/kmess/settings/emoticonwidget.cpp b/kmess/settings/emoticonwidget.cpp deleted file mode 100644 index 370faa8..0000000 --- a/kmess/settings/emoticonwidget.cpp +++ /dev/null @@ -1,390 +0,0 @@ -/*************************************************************************** - emoticonwidget.cpp - description - ------------------- - begin : Sun Dev 11 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 "emoticonwidget.h" - -#include -#include -#include -#include -#include - -#include -#include - -#include "../account.h" -#include "../kmessdebug.h" -#include "../emoticonmanager.h" -#include "../dialogs/addemoticondialog.h" - - - -#ifdef KMESSDEBUG_EMOTICONS -#define KMESSDEBUG_EMOTICONS_SETTINGS -#endif - - - -/** - * Constructor - * - * @param parent Parent widget - * @param name Qt object name - */ -EmoticonWidget::EmoticonWidget( QWidget* parent, const char* name ) - : EmoticonWidgetInterface(parent, name) - , emoticonTheme_(0) -{ - connect( addEmoticonButton_, SIGNAL( clicked() ), - this, SLOT( showAddEmoticonDialog() ) ); - connect( renameEmoticonButton_, SIGNAL( clicked() ), - this, SLOT( renameCustomEmoticon() ) ); - connect( removeEmoticonButton_, SIGNAL( clicked() ), - this, SLOT( removeCustomEmoticon() ) ); - - connect( customEmoticonsView_, SIGNAL( itemRenamed(QIconViewItem*) ), - this, SLOT( customEmoticonRenamed(QIconViewItem*) ) ); - connect( customEmoticonsView_, SIGNAL( selectionChanged() ), - this, SLOT( customEmoticonSelected() ) ); - - // the other properties of the widget are initialized - // in the loadSettings() method -} - - - -/** - * Destructor - */ -EmoticonWidget::~EmoticonWidget() -{ - if( emoticonTheme_ != 0 ) - { -#ifdef KMESSDEBUG_EMOTICONS_SETTINGS - kdDebug() << "EmoticonWidget::~EmoticonWidget() - Deleting temporary theme." << endl; -#endif - delete emoticonTheme_; - } -} - - - -/** - * Rename the currently selected custom emoticon - * - * @param item The changed item - * @param name New item's name - */ -void EmoticonWidget::customEmoticonRenamed( QIconViewItem *item ) -{ - Emoticon *emoticon; - QString oldName = item->key(); - QString newName = item->text(); - - // Do nothing if the name ain't changed - if( oldName == newName ) - { - return; - } - -#ifdef KMESSDEBUG_EMOTICONS_SETTINGS - kdDebug() << "EmoticonWidget::customEmoticonRenamed() - Renaming emoticon '" << oldName << "' to '" << newName << "'" << endl; -#endif - - // First, check if an emoticon with the new name already exists - for( emoticon = emoticonTheme_->first(); emoticon != 0; emoticon = emoticonTheme_->next() ) - { - if( emoticon->getShortcut() != newName ) - { - continue; - } - - int result = KMessageBox::questionYesNo( 0, - i18n("The emoticon \"%1\" already exists, do you want to replace it?") - .arg( newName ), - i18n("Add New Emoticon") ); - - // The user doesn't want to overwrite the emoticon, cancel the operation - if( result != KMessageBox::Yes ) - { - return; - } - - // Remove the icon of the replaced emoticon from both the icon view and the theme - delete item; - emoticonTheme_->removeEmoticon( newName ); - - // Find the icon which will replace the deleted one - item = customEmoticonsView_->findItem( oldName, Qt::ExactMatch ); - if( ! item ) - { - // Something has gone wrong, abort. At this point, the user has lost an emoticon :( - kdWarning() << "EmoticonWidget::customEmoticonRenamed() - Unable to find temporary item during rename of '" << oldName << "' to '" << newName << "'" << endl; - return; - } - - // Change the icon's name to match the new one - item->setText( newName ); - item->setKey( newName ); - - // Set focus to the new item - customEmoticonsView_->setFocus(); - customEmoticonsView_->ensureItemVisible( item ); - - // Stop searching, there can be only one emoticon to replace - break; - } - - // If no other emoticons with that shortcut exist, update the name - for( emoticon = emoticonTheme_->first(); emoticon != 0; emoticon = emoticonTheme_->next() ) - { - if( emoticon->getShortcut() == oldName ) - { - // If there isn't a custom text for the tooltip, but it is the shortcut text, update it - if( emoticon->getTooltip() == emoticon->getShortcut() ) - { - emoticon->setTooltip( newName ); - } - - // Update the shortcut text - emoticon->setShortcut( newName ); - break; - } - } - - // Update the viewport and the buttons - customEmoticonSelected(); -} - - - -/** - * Update the Remove Button status when emoticons get selected - */ -void EmoticonWidget::customEmoticonSelected() -{ - renameEmoticonButton_->setEnabled( customEmoticonsView_->currentItem() != 0 ); - removeEmoticonButton_->setEnabled( customEmoticonsView_->currentItem() != 0 ); - - // Other than resetting the buttons, also update the layout to show any changes - customEmoticonsView_->arrangeItemsInGrid(); -} - - - -/** - * Load the settings of the dialog - * - * @param account Account instance which settings will be loaded - */ -void EmoticonWidget::loadSettings( Account *account ) -{ - accountHandle_ = account->getHandle(); - -#ifdef KMESSDEBUG_EMOTICONS_SETTINGS - kdDebug() << "EmoticonWidget::loadSettings() - Loading emoticon settings for account " << accountHandle_ << " - Current is " << accountHandle_ << " ." << endl; -#endif - - // Read the settings and set current emoticons - emoticonStyle_ = account->getEmoticonStyle(); - - emoticonTheme_ = new EmoticonTheme(); - emoticonTheme_->loadTheme( accountHandle_, true ); - - connect( emoticonTheme_, SIGNAL( updated() ), - this, SLOT( updateCustomEmoticonView() ) ); - - // Update the emoticon themes widget - updateThemesList(); - - // Update the custom emoticons widget - updateCustomEmoticonView(); - -#ifdef KMESSDEBUG_EMOTICONS_SETTINGS - kdDebug() << "EmoticonWidget::loadSettings() - Done!" << endl; -#endif -} - - - -/** - * Delete the selected custom emoticon from the theme and the view - */ -void EmoticonWidget::removeCustomEmoticon() -{ - if( customEmoticonsView_->currentItem() == 0 ) - { - return; - } - - if( emoticonTheme_->removeEmoticon( customEmoticonsView_->currentItem()->key() ) ) - { - delete customEmoticonsView_->currentItem(); - - // Forcibly update the buttons status to disable the rename&remove buttons - customEmoticonSelected(); - } -} - - - -/** - * Starts in-place renaming of the selected custom emoticon - */ -void EmoticonWidget::renameCustomEmoticon() -{ - QIconViewItem *item = customEmoticonsView_->currentItem(); - - if( item == 0 ) - { - return; - } - - customEmoticonsView_->setFocus(); - customEmoticonsView_->ensureItemVisible( item ); - item->rename(); -} - - - -/** - * Save the settings to the account object - * - * @param account Account instance which settings will be saved - */ -void EmoticonWidget::saveSettings( Account *account ) -{ - // Save the changes we've made - emoticonTheme_->saveTheme(); - account->setEmoticonStyle( emoticonThemesList_->currentText() ); - - disconnect( emoticonTheme_, SIGNAL( updated() ), - this, SLOT( updateCustomEmoticonView() ) ); - - // Apply the changes to the current account, too - if( accountHandle_ == CurrentAccount::instance()->getHandle() ) - { - EmoticonManager::instance()->replaceCustomTheme( emoticonTheme_ ); - } -} - - - -/** - * Show the Add New Emoticon dialog to create a new custom emoticon - */ -void EmoticonWidget::showAddEmoticonDialog() -{ - new AddEmoticonDialog( emoticonTheme_, this, "AddEmoticonDialog" ); -} - - - -/** - * Fill the widget which contains all the user's custom emoticons - */ -void EmoticonWidget::updateCustomEmoticonView() -{ - QIconViewItem *item; - Emoticon *emoticon; - - customEmoticonsView_->clear(); - - - // Add all emoticons to the list - for( emoticon = emoticonTheme_->first(); emoticon != 0; emoticon = emoticonTheme_->next() ) - { - if( ! emoticon->isValid() ) - { - continue; - } - - item = new QIconViewItem( customEmoticonsView_, emoticon->getShortcut(), QPixmap( emoticon->getPicturePath() ) ); - - item->setRenameEnabled( true ); - item->setDragEnabled( false ); - item->setDropEnabled( false ); - item->setSelectable( true ); - - customEmoticonsView_->insertItem( item ); - } -} - - - -/** - * Initialize the standard emoticon theme chooser - */ -void EmoticonWidget::updateThemesList() -{ - emoticonThemesList_->clear(); - - // Browse all emoticon dirs, to get all emoticons - QStringList themeDirs = KGlobal::dirs()->findDirs("emoticons", ""); - -#ifdef KMESSDEBUG_EMOTICONS_SETTINGS - kdDebug() << "EmoticonWidget::updateEmoticons() - Theme dirs: " << themeDirs << endl; -#endif - - for(unsigned int x = 0; x < themeDirs.count(); x++) - { - // Browse for all themes in the emoticon dir - QDir themeDir(themeDirs[x]); - QStringList themes = themeDir.entryList( QDir::Dirs, QDir::Name | QDir::IgnoreCase ); - for( QStringList::Iterator it = themes.begin(); it != themes.end(); ++it ) - { - QString dirName = *it; - - // Ignore '.' and '..' - if( dirName == "." || dirName == ".." ) - { - continue; - } - -#ifdef KMESSDEBUG_EMOTICONS_SETTINGS - kdDebug() << "EmoticonWidget::updateEmoticons() - Folder: " << themeDirs[x] << " - Theme: " << dirName << endl; -#endif - - // Add the theme to the list, using the directory name; its first valid emoticon is used as a preview - QPixmap previewPixmap( EmoticonTheme::getThemeIcon( themeDirs[x] + dirName ) ); - emoticonThemesList_->insertItem(previewPixmap, dirName); - } - } - - // Highlight the selected emoticon - QListBoxItem *item = emoticonThemesList_->findItem( emoticonStyle_, Qt::ExactMatch | Qt::CaseSensitive ); - if(item == 0) - { - kdWarning() << "Current emoticon style was not found, attempting to revert to the default setting." << endl; - item = emoticonThemesList_->findItem("KMess-new", Qt::ExactMatch); - } - - // If there is an item, select it - if(item != 0) - { - emoticonThemesList_->setCurrentItem( item ); - } - else - { - // select the first item otherwise - emoticonThemesList_->setCurrentItem( 0 ); - } -} - - - -#include "emoticonwidget.moc" diff --git a/kmess/settings/emoticonwidgetinterface.ui b/kmess/settings/emoticonwidgetinterface.ui deleted file mode 100644 index 4e11288..0000000 --- a/kmess/settings/emoticonwidgetinterface.ui +++ /dev/null @@ -1,247 +0,0 @@ - -EmoticonWidgetInterface - - - EmoticonWidgetInterface - - - - 0 - 0 - 529 - 471 - - - - EmoticonWidgetInterface - - - - unnamed - - - 0 - - - - tabWidget2 - - - 0 - - - - tab - - - &Emoticon Themes - - - - unnamed - - - - textLabel1 - - - - 5 - 0 - 0 - 0 - - - - Available emoticon styles: - - - - - emoticonThemesList_ - - - - 7 - 7 - 0 - 0 - - - - - - spacer2 - - - Vertical - - - Preferred - - - - 20 - 20 - - - - - - - - tab - - - &Custom Emoticons - - - - unnamed - - - - textLabel1_2 - - - Custom emoticons for this account: - - - - - customEmoticonsView_ - - - false - - - AlwaysOff - - - true - - - LeftToRight - - - Adjust - - - 7 - - - false - - - Select - - - - - layout11 - - - - unnamed - - - - spacer2_2 - - - Horizontal - - - Expanding - - - - 170 - 21 - - - - - - addEmoticonButton_ - - - Add ne&w... - - - Alt+W - - - Click - - - Click here to add a new customized emoticons to send to your contacts. - - - - - spacer2_3 - - - Horizontal - - - Fixed - - - - 12 - 12 - - - - - - renameEmoticonButton_ - - - false - - - Re&name - - - Alt+N - - - Click - - - Click here to rename the selected emoticon. - - - - - removeEmoticonButton_ - - - false - - - Remo&ve - - - Alt+V - - - Select an emoticon and click here to delete it. - - - - - - - - - - - - klistbox.h - kiconview.h - - diff --git a/kmess/settings/settingsdialog.cpp b/kmess/settings/settingsdialog.cpp deleted file mode 100644 index 989a5fb..0000000 --- a/kmess/settings/settingsdialog.cpp +++ /dev/null @@ -1,836 +0,0 @@ -/*************************************************************************** - settingsdialog.cpp - description - ------------------- - begin : Sat Jan 11 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 "settingsdialog.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../account.h" -#include "../emoticonmanager.h" -#include "../kmessdebug.h" -#include "../chat/chatmessage.h" -#include "../chat/chatmessagestyle.h" -#include "../chat/chatmessageview.h" -#include "accountswidget.h" -#include "alertswidget.h" -#include "chattingwidget.h" -#include "chatloggingwidget.h" -#include "emailwidget.h" -#include "emoticonwidget.h" -#include - -// Initialize the instance to zero -SettingsDialog* SettingsDialog::instance_(0); - -// The constructor -SettingsDialog::SettingsDialog(QWidget *parent, const char *name ) - : KDialogBase( IconList, i18n("Settings"), // dialogFase, caption - (Help | Ok | Apply | Cancel | User1), Ok, // buttons. defaultbutton - parent, name, // parent, qobject name - false, true, // modal, bottom separator - i18n( "&Delete" ) // User1 gui item - ), - account_(0), - chatStyle_(0) -{ - KIconLoader *loader = KGlobal::iconLoader(); - KStandardDirs *dirs = KGlobal::dirs(); - QPixmap pixmap; - - // Create the various widgets - config_ = kapp->config(); - // Load the options from the configuration file - readOptions(); - - // "Manually" set up the look of the dialog. - QFrame *accountsFrame = addPage( i18n("Account"), i18n("Account"), loader->loadIcon("identity", KIcon::NoGroup, KIcon::SizeMedium) ); - QFrame *alertsFrame = addPage( i18n("Alerts"), i18n("Alerts"), loader->loadIcon("date", KIcon::NoGroup, KIcon::SizeMedium) ); - QFrame *emoticonFrame = addPage( i18n("Emoticons"), i18n("Emoticons"), loader->loadIcon("emoticons", KIcon::NoGroup, KIcon::SizeMedium) ); - QFrame *chattingFrame = addPage( i18n("Chatting"), i18n("Chatting"), loader->loadIcon("fonts", KIcon::NoGroup, KIcon::SizeMedium) ); - QFrame *chatLoggingFrame = addPage( i18n("Chat Logging"), i18n("Chat Logging"), loader->loadIcon("filesaveas", KIcon::NoGroup, KIcon::SizeMedium) ); - QFrame *emailFrame = addPage( i18n("Email"), i18n("Email Notification"), loader->loadIcon("mail_generic", KIcon::NoGroup, KIcon::SizeMedium) ); - - // Create the layouts to maximize all child widgets - QVBoxLayout *accountsLayout = new QVBoxLayout( accountsFrame ); - QVBoxLayout *alertsLayout = new QVBoxLayout( alertsFrame ); - QVBoxLayout *emoticonLayout = new QVBoxLayout( emoticonFrame ); - QVBoxLayout *chattingLayout = new QVBoxLayout( chattingFrame ); - QVBoxLayout *chatLoggingLayout = new QVBoxLayout( chatLoggingFrame ); - QVBoxLayout *emailLayout = new QVBoxLayout( emailFrame ); - - // Create the widgets that belong in the frames - accountsWidget_ = new AccountsWidget( accountsFrame , "accounts" ); - alertsWidget_ = new AlertsWidget( alertsFrame, "alerts" ); - emoticonWidget_ = new EmoticonWidget( emoticonFrame, "emoticons" ); - chattingWidget_ = new ChattingWidget( chattingFrame , "chatting" ); - chatLoggingWidget_ = new ChatLoggingWidget( chatLoggingFrame , "chatLogging" ); - emailWidget_ = new EmailWidget( emailFrame, "email" ); - - // Add the widgets to the layouts - accountsLayout ->addWidget( accountsWidget_ ); - alertsLayout ->addWidget( alertsWidget_ ); - emoticonLayout ->addWidget( emoticonWidget_ ); - chattingLayout ->addWidget( chattingWidget_ ); - chatLoggingLayout ->addWidget( chatLoggingWidget_ ); - emailLayout ->addWidget( emailWidget_ ); - - // Connect alert widget signals - connect( alertsWidget_->showChatStartNotificationsCheckBox_, SIGNAL( toggled(bool) ), - this, SLOT ( notificationsToggled() ) ); - - // Connect chat widget signals - connect( chattingWidget_->contactFontColorButton_,SIGNAL( changed(const QColor&) ) , - this, SLOT ( updatePreview() ) ); - connect( chattingWidget_->fontColorButton_, SIGNAL( changed(const QColor&) ) , - this, SLOT ( updatePreview() ) ); - connect( chattingWidget_->useContactFontCheckBox_,SIGNAL( toggled(bool) ), - this, SLOT ( useContactFontToggled(bool) ) ); - connect( chattingWidget_->fontButton_, SIGNAL( clicked() ), - this, SLOT ( fontClicked() ) ); - connect( chattingWidget_->contactFontButton_, SIGNAL( clicked() ), - this, SLOT ( contactFontClicked() ) ); - connect( chattingWidget_->chatStyle_, SIGNAL( activated(const QString&) ) , - this, SLOT (slotChatStyleChanged(const QString&) ) ); - connect( chattingWidget_->useEmoticonsCheckBox_, SIGNAL( toggled(bool) ) , - this, SLOT ( updatePreview() ) ); - connect( chattingWidget_->useFontEffectsCheckBox_,SIGNAL( toggled(bool) ) , - this, SLOT ( updatePreview() ) ); - connect( chattingWidget_->showTimeCheckbox_, SIGNAL( toggled(bool) ) , - this, SLOT ( updatePreview() ) ); - connect( chattingWidget_->groupFollowupCheckbox_, SIGNAL( toggled(bool) ) , - this, SLOT ( updatePreview() ) ); - - // Connect chat logging widget signals - connect( chatLoggingWidget_->chatSavePathButton_, SIGNAL( clicked() ), - this, SLOT ( chooseDirectory() ) ); - - chatLoggingWidget_->chatSavePathEdit_->setReadOnly( true ); - - // Setting up the alerts widget -#ifndef HAVE_XSCREENSAVER - alertsWidget_->useIdleTimerCheckBox_->setEnabled( false ); - alertsWidget_->idleTimeSpinBox_->setEnabled( false ); -#endif - - // Set up the emoticons in the "chatting" widget - QString emoticonDir = CurrentAccount::instance()->getEmoticonStyle(); - pixmap.load( dirs->findResource( "emoticons", emoticonDir + "/teeth.png" ) ); - chattingWidget_->pixmapLabel1_->setPixmap( pixmap ); - pixmap.load( dirs->findResource( "emoticons", emoticonDir + "/rainbow.png" ) ); - chattingWidget_->pixmapLabel2_->setPixmap( pixmap ); - pixmap.load( dirs->findResource( "emoticons", emoticonDir + "/dog.png" ) ); - chattingWidget_->pixmapLabel3_->setPixmap( pixmap ); - - // Configure the preview form of the "chatting" widget - // Insert a KHTMLPart in the placeholder - chatMessageView_ = new ChatMessageView(chattingWidget_->khtmlPlaceholder_, "ChatMessageView"); - - // Create a layout to maximize the KHTMLPart - QBoxLayout *layout = new QHBoxLayout( chattingWidget_->khtmlPlaceholder_ ); - layout->addWidget( chatMessageView_->view() ); // Stretches widget - - // Get all available chat styles for the "chatting" widget. - // Avoid duplicate entries. - QStringList styleDirs = dirs->findDirs("data", "kmess/styles"); - QStringList styleNames; - - for( QStringList::Iterator dirIt = styleDirs.begin(); dirIt != styleDirs.end(); ++dirIt ) - { - QDir styleDir(*dirIt); - QStringList styles = styleDir.entryList(QDir::Dirs, QDir::Name | QDir::IgnoreCase); - for( QStringList::Iterator fileIt = styles.begin(); fileIt != styles.end(); ++fileIt ) - { - QString styleName = *fileIt; - 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); - } - } - } - - // Add all items to the chat style list. - for( QStringList::Iterator styleIt = styleNames.begin(); styleIt != styleNames.end(); ++styleIt ) - { - chattingWidget_->chatStyle_->insertItem( *styleIt ); - } - - // Prepare the XSL transformation - chatStyle_ = new ChatMessageStyle(); -} - - - -// The destructor -SettingsDialog::~SettingsDialog() -{ - saveOptions(); -#ifdef KMESSDEBUG_SETTINGSDIALOG - kdDebug() << "DESTROYED SettingsDialog " << endl; -#endif - - delete chatStyle_; - instance_ = 0; -} - - - -// Show the settings dialog for the given account -void SettingsDialog::changeAccountSettings(Account *account, bool isCurrentAccount) -{ - account_ = account; - if ( account != 0 ) - { - // Load account information into the widgets - loadAccountsSettings( account, isCurrentAccount ); - loadAlertsSettings( account ); - loadChattingSettings( account ); - loadChatLoggingSettings( account ); - loadEmailSettings( account ); - loadEmoticonSettings( account ); - } -} - - - -// Get a directory from the user. -void SettingsDialog::chooseDirectory() -{ - QString startDir, dir; - - startDir = chatLoggingWidget_->chatSavePathEdit_->text(); - - dir = KFileDialog::getExistingDirectory( startDir ); - - if ( dir != "" ) - { - chatLoggingWidget_->chatSavePathEdit_->setText( dir ); - } -} - - - -// Save options before closing. -void SettingsDialog::closeEvent(QCloseEvent *event) -{ - saveOptions(); - event->accept(); -} - - - -// The contact font button was pressed. Show a font dialog to get a new font. -void SettingsDialog::contactFontClicked() -{ - QFont font; - QString fontFamily; - bool accepted; - - // Get a default font from the font button - fontFamily = chattingWidget_->contactFontButton_->text().replace("&", QString::null); // remove accel character - font = chattingWidget_->contactFontButton_->font(); - - // Get a new font and font family from the user - accepted = getFont( font, fontFamily ); - - // If it was accepted, set the font to the button - if ( accepted ) - { - // Reset size, as it can't be used in the chat message view. - font.setPointSize(10); - - chattingWidget_->contactFontButton_->setText( fontFamily ); - chattingWidget_->contactFontButton_->setFont( font ); - - // Update the preview - chatStyle_->setContactFont( font ); - updatePreview(); - } -} - - - -// The font button was pressed. Show a font dialog to get a new font. -void SettingsDialog::fontClicked() -{ - QFont font; - QString fontFamily; - bool accepted; - - // Get a default font from the font button - fontFamily = chattingWidget_->fontButton_->text().replace("&", QString::null); // remove accel character - font = chattingWidget_->fontButton_->font(); - - // Get a new font and font family from the user - accepted = getFont( font, fontFamily ); - - // If it was accepted, set the font to the button - if ( accepted ) - { - // Reset size, as it can't be used in the chat message view. - font.setPointSize(10); - - chattingWidget_->fontButton_->setText( fontFamily ); - chattingWidget_->fontButton_->setFont( font ); - - // Update the preview - updatePreview(); - } -} - - - -// Get a font and cleaned-up font family from a dialog -bool SettingsDialog::getFont(QFont &font, QString &fontFamily) const -{ - bool accepted; - int leftBracket, result; - QFont selection; - - selection = font; - - result = KFontDialog::getFont( selection ); - accepted = ( result == KFontDialog::Accepted ); - - if ( accepted ) - { - 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.find( "[" ); - if ( leftBracket >= 0 ) - { - fontFamily = fontFamily.left( leftBracket ); - } - fontFamily = fontFamily.stripWhiteSpace(); - font = selection; - } - return accepted; -} - - - -// Return a singleton instance of the settings dialog window -SettingsDialog* SettingsDialog::instance( QWidget *parent ) -{ - // If the instance is null, create a new dialog and return that. - if ( instance_ == 0 ) - { - instance_ = new SettingsDialog( parent, "SettingsDialog" ); - } - - return instance_; -} - - - -// Load account information into the account widget -void SettingsDialog::loadAccountsSettings(Account *account, bool isCurrentAccount) -{ - accountsWidget_->loadSettings( account, isCurrentAccount ); - - // Disable the "remove account" button for guest accounts. - if( account->isGuestAccount() ) - { - enableButton( KDialogBase::User1, false ); - } -} - - - -// Load account information into the alerts widget -void SettingsDialog::loadAlertsSettings(Account *account) -{ - alertsWidget_->showOnlineNotificationsCheckBox_->setChecked( account->getNotifyContactsOnline() ); - alertsWidget_->showChatStartNotificationsCheckBox_->setChecked( account->getNotifyContactsChatStart() ); - alertsWidget_->showChatMessagesNotificationsCheckBox_->setChecked( account->getNotifyContactsChatMessages() ); - alertsWidget_->showStatusNotificationsCheckBox_->setChecked( account->getNotifyContactsStatus() ); - alertsWidget_->showOfflineNotificationsCheckBox_->setChecked( account->getNotifyContactsOffline() ); - alertsWidget_->showEmailsNotificationsCheckBox_->setChecked( account->getNotifyEmails() ); - - alertsWidget_->notificationDurationSpinBox_->setValue( account->getNotificationDuration() ); - - notificationsToggled(); - - alertsWidget_->useIdleTimerCheckBox_->setChecked( account->getUseIdleTimer() ); - alertsWidget_->idleTimeSpinBox_->setValue( account->getIdleTime() ); - alertsWidget_->shakeNudgeCheckBox_->setChecked( account->getShakeNudge() ); - alertsWidget_->nowListeningCheckBox_->setChecked( account->getShowNowListening() ); -} - - - -// Load account information into the chatting widget -void SettingsDialog::loadChattingSettings(Account *account) -{ - QColor color; - QFont font; - - // 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. - - chattingWidget_->fontButton_->setText( font.family() ); - chattingWidget_->fontButton_->setFont( font ); - chattingWidget_->fontColorButton_->setColor( color ); - - color.setNamedColor( account->getContactFontColor() ); - font = account->getContactFont(); - font.setPointSize(10); // Reset size, as it can't be used in the chat message view. - - chattingWidget_->contactFontButton_->setText( font.family() ); - chattingWidget_->contactFontButton_->setFont( font ); - chattingWidget_->contactFontColorButton_->setColor( color ); - - chattingWidget_->useContactFontCheckBox_->setChecked( account->getUseContactFont() ); - useContactFontToggled( account->getUseContactFont() ); - chattingWidget_->useEmoticonsCheckBox_->setChecked( account->getUseEmoticons() ); - chattingWidget_->showTimeCheckbox_->setChecked( account->getShowMessageTime() ); - chattingWidget_->useFontEffectsCheckBox_->setChecked( account->getUseFontEffects() ); - chattingWidget_->groupFollowupCheckbox_->setChecked( account->getGroupFollowupMessages() ); - - // Select the correct chat style, - // find the current style in the listbox. - QListBox *chatStyleListBox = chattingWidget_->chatStyle_->listBox(); - if( KMESS_NULL(chatStyleListBox) ) return; // listBox() can return null - - QListBoxItem *item = chatStyleListBox->findItem( account->getChatStyle(), Qt::ExactMatch | Qt::CaseSensitive ); - if(item == 0) - { - kdWarning() << "Current chat style was not found, attempting to revert to the default setting." << endl; - item = chatStyleListBox->findItem("Default", Qt::ExactMatch); - } - - if(item != 0) - { - // Somehow the QListBox doesn't update the parent QCombobox, - // but by selecting the item we can request the index with currentItem() - chatStyleListBox->setCurrentItem( item ); - chattingWidget_->chatStyle_->setCurrentItem( chatStyleListBox->currentItem() ); - slotChatStyleChanged( item->text() ); - } - - // Also load contact font settings into the chatStyle object, - // other settings are set in updatePreview() - chatStyle_->setContactFont(font); - chatStyle_->setContactFontColor(color.name()); -} - - - -// Load account information into the chat logging widget -void SettingsDialog::loadChatLoggingSettings(Account *account) -{ - chatLoggingWidget_->logChatsCheckBox_->setChecked( account->getSaveChats() ); - chatLoggingWidget_->chatSavePathEdit_->setText( account->getSaveChatPath() ); - - switch(account->getSavedChatDirectoryStructure()) - { - case Account::SINGLEDIRECTORY : - { - chatLoggingWidget_->singleDirectoryRadioButton_->setChecked( true ); - break; - } - case Account::BYYEAR : - { - chatLoggingWidget_->yearRadioButton_->setChecked( true ); - break; - } - case Account::BYMONTH : - { - chatLoggingWidget_->monthRadioButton_->setChecked( true ); - break; - } - case Account::BYDAY : - { - chatLoggingWidget_->dayRadioButton_->setChecked( true ); - break; - } - } -} - - - -// Load account information into the email widget -void SettingsDialog::loadEmailSettings(Account *account) -{ - emailWidget_->useHotmailRadioButton_->setChecked( account->getUseHotmail() ); - emailWidget_->useCommandRadioButton_->setChecked( !account->getUseHotmail() ); - emailWidget_->emailCommandEdit_->setText( account->getEmailCommand() ); - emailWidget_->showEmailInfoCheckBox_->setChecked( account->getShowEmail() ); - emailWidget_->showOtherFoldersCheckBox_->setChecked( account->getShowOtherFolders() ); - - // TODO: When account does not use Hotmail, disable Hotmail option box, force to use an e-mail program, or default KDE mail app. - // emailWidget_->clientButtonGroup_ ->setEnabled(account->getEmailSupported()); - emailWidget_->notificationButtonGroup_ ->setEnabled(account->getEmailSupported()); -} - - - -// Load account information into the email widget -void SettingsDialog::loadEmoticonSettings(Account *account) -{ - emoticonWidget_->loadSettings( account ); -} - - - -// Update status of dependent options for the notifications -void SettingsDialog::notificationsToggled() -{ - alertsWidget_->showChatMessagesNotificationsCheckBox_->setEnabled( alertsWidget_->showChatStartNotificationsCheckBox_->isChecked() ); -} - - - -// Read options from the configuration file. -void SettingsDialog::readOptions() -{ - // Pull in the window size and position - config_->setGroup("SettingsDialog"); - QSize size = config_->readSizeEntry("Size"); - if(!size.isEmpty()) - { - resize(size); - } - QPoint pos = config_->readPointEntry("Position"); - if(!pos.isNull()) - { - move(pos); - } -} - - - -// Save all widget settings -void SettingsDialog::saveAccountSettings() -{ - if ( account_ != 0 ) - { - QString oldAccountHandle = account_->getHandle(); - QString oldFriendlyName = account_->getFriendlyName(); - - // Save information from the widgets - saveAccountsSettings( account_ ); - saveAlertsSettings( account_ ); - saveChattingSettings( account_ ); - saveChatLoggingSettings( account_ ); - saveEmailSettings( account_ ); - saveEmoticonSettings( account_ ); - - // Commit configuration changes to disk, now - // Makes sure the settings are not lost if KMess is terminated or crashes. - KConfig *config = kapp->config(); - account_->saveProperties( config ); - - emit changedSettings( account_, oldAccountHandle, oldFriendlyName ); - } -} - - - - -// Save account information from the account widget -void SettingsDialog::saveAccountsSettings(Account *account) -{ - accountsWidget_->saveSettings( account ); -} - - - -// Save account information from the alerts widget -void SettingsDialog::saveAlertsSettings(Account *account) -{ - account->setAlertsInformation ( alertsWidget_->useIdleTimerCheckBox_->isChecked(), - alertsWidget_->idleTimeSpinBox_->value(), - alertsWidget_->shakeNudgeCheckBox_->isChecked(), - alertsWidget_->nowListeningCheckBox_->isChecked() ); - - account->setNotificationsInformation( alertsWidget_->showOnlineNotificationsCheckBox_->isChecked(), - alertsWidget_->showStatusNotificationsCheckBox_->isChecked(), - alertsWidget_->showChatStartNotificationsCheckBox_->isChecked(), - alertsWidget_->showChatMessagesNotificationsCheckBox_->isChecked(), - alertsWidget_->showOfflineNotificationsCheckBox_->isChecked(), - alertsWidget_->showEmailsNotificationsCheckBox_->isChecked(), - alertsWidget_->notificationDurationSpinBox_->value() ); -} - - - -// Save account information from the chatting widget -void SettingsDialog::saveChattingSettings(Account *account) -{ - QFont font, contactFont; - - font = chattingWidget_->fontButton_->font(); - font.setFamily( chattingWidget_->fontButton_->text() ); - - contactFont = chattingWidget_->contactFontButton_->font(); - contactFont.setFamily( chattingWidget_->contactFontButton_->text() ); - - account->setChatInformation( chattingWidget_->useContactFontCheckBox_->isChecked(), - chattingWidget_->useEmoticonsCheckBox_->isChecked(), - chattingWidget_->useFontEffectsCheckBox_->isChecked(), - chattingWidget_->showTimeCheckbox_->isChecked(), - chattingWidget_->groupFollowupCheckbox_->isChecked(), - chattingWidget_->chatStyle_->currentText() ); - - - // 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, chattingWidget_->fontColorButton_->color().name(), - contactFont, chattingWidget_->contactFontColorButton_->color().name() ); -} - - - -// Save account information from the chat logging widget -void SettingsDialog::saveChatLoggingSettings(Account *account) -{ - int directoryStructure = Account::SINGLEDIRECTORY; - - if ( chatLoggingWidget_->singleDirectoryRadioButton_->isChecked() ) - { - directoryStructure = Account::SINGLEDIRECTORY; - } - else if ( chatLoggingWidget_->yearRadioButton_->isChecked() ) - { - directoryStructure = Account::BYYEAR; - } - else if ( chatLoggingWidget_->monthRadioButton_->isChecked() ) - { - directoryStructure = Account::BYMONTH; - } - else if ( chatLoggingWidget_->dayRadioButton_->isChecked() ) - { - directoryStructure = Account::BYDAY; - } - account->setChatLoggingInformation( chatLoggingWidget_->logChatsCheckBox_->isChecked(), - chatLoggingWidget_->chatSavePathEdit_->text(), - directoryStructure ); - -} - - - -// Save account information from the email widget -void SettingsDialog::saveEmailSettings(Account *account) -{ - account->setEmailInformation( emailWidget_->useHotmailRadioButton_->isChecked(), - emailWidget_->emailCommandEdit_->text(), - emailWidget_->showEmailInfoCheckBox_->isChecked(), - emailWidget_->showOtherFoldersCheckBox_->isChecked() ); -} - - - -// Save account information from the emoticon widget -void SettingsDialog::saveEmoticonSettings(Account *account) -{ - emoticonWidget_->saveSettings( account ); -} - - -// Save the options. -void SettingsDialog::saveOptions() -{ - // Save the window geometry - config_->setGroup("SettingsDialog"); - config_->writeEntry("Size", size()); - config_->writeEntry("Position", pos()); -} - - - -// Select the Account page when showing the settings dialog -void SettingsDialog::showEvent( QShowEvent */*event*/ ) -{ - showPage( 0 ); -} - - - -// The apply button was clicked. Apply the changes. -void SettingsDialog::slotApply() -{ - saveAccountSettings(); -} - - - -// The cancel button was clicked. Close the dialog. -void SettingsDialog::slotCancel() -{ - reject(); -} - - - -// The close button was clicked. Close the dialog. -void SettingsDialog::slotClose() -{ - reject(); -} - - - -// The chat style was changed. -void SettingsDialog::slotChatStyleChanged(const QString &style) -{ - // Update the chat style object - /* bool styleLoaded = */ chatStyle_->setStyle( style ); - - // Update the preview - updatePreview(); -} - - - -// The OK button was pressed. Apply the changes and close. -void SettingsDialog::slotOk() -{ - saveAccountSettings(); - accept(); -} - - - -// The delete button was pressed. -void SettingsDialog::slotUser1() -{ - // Ask the user for confirmation - if ( ( KMessageBox::warningYesNo( this, i18n("Are you sure you want to delete this account?")) ) == KMessageBox::Yes ) - { - emit deleteAccount( account_ ); - reject(); - } -} - - - -// Update the chat style preview -void SettingsDialog::updatePreview() -{ - QString htmlBody; - - if( chatStyle_ == 0 || ! chatStyle_->hasStyle() ) - { - // Don't bother updating the preview for every event fired by the load...Settings() methods. - return; - } - - // Update the boolean settings (other settings are updated in their slots) - chatStyle_->setContactFontColor( chattingWidget_->contactFontColorButton_->color().name() ); - chatStyle_->setShowTime ( chattingWidget_->showTimeCheckbox_->isChecked() ); - chatStyle_->setUseContactFont ( chattingWidget_->useContactFontCheckBox_->isChecked() ); - chatStyle_->setUseEmoticons ( chattingWidget_->useEmoticonsCheckBox_->isChecked() ); - chatStyle_->setUseFontEffects ( chattingWidget_->useFontEffectsCheckBox_->isChecked() ); - - // Get the user data - QString userHandle = accountsWidget_->handleEdit_->text(); - QString userName = accountsWidget_->friendlyNameEdit_->text(); - QString userPicture = accountsWidget_->getPictureFileName(); - - // 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!"), userHandle, - userName, userPicture, chattingWidget_->fontButton_->font(), chattingWidget_->fontColorButton_->color().name() ); - ChatMessage fake3( ChatMessage::TYPE_OUTGOING, ChatMessage::CONTENT_MESSAGE, false, i18n("I /just/ got back from my vacation in Italy!"), userHandle, - userName, userPicture, chattingWidget_->fontButton_->font(), chattingWidget_->fontColorButton_->color().name() ); - - // Display the sample chat - htmlBody += "
" + chatStyle_->convertMessage(fake1) + "
\n"; - - if( chattingWidget_->groupFollowupCheckbox_->isChecked() ) - { - QPtrList messageGroup; - messageGroup.append(&fake2); - messageGroup.append(&fake3); - htmlBody += "
" + chatStyle_->convertMessageList(messageGroup) + "
\n"; - } - else - { - htmlBody += "
" + chatStyle_->convertMessage(fake2) + "
\n"; - htmlBody += "
" + chatStyle_->convertMessage(fake3) + "
\n"; - } - - QString messageRoot = chatStyle_->convertMessageRoot(); - if( messageRoot.isNull() ) - { - // Assign standard HTML - chatMessageView_->setStandardHtml( htmlBody, chatStyle_->getCssFile(), chatStyle_->getBaseFolder() ); - } - else - { - // Assign the custom HTML root - chatMessageView_->setHtml( messageRoot, htmlBody ); - } -} - - - -// Enable or disable the contact font and color selectors. -void SettingsDialog::useContactFontToggled(bool checked) -{ - // Enable/disable buttons - chattingWidget_->contactFontButton_->setEnabled( checked ); - chattingWidget_->contactFontColorButton_->setEnabled( checked ); - - // Update preview - chatStyle_->setUseContactFont( checked ); - updatePreview(); -} - -#include "settingsdialog.moc" diff --git a/kmess/settings/settingsdialog.h b/kmess/settings/settingsdialog.h deleted file mode 100644 index a54833b..0000000 --- a/kmess/settings/settingsdialog.h +++ /dev/null @@ -1,150 +0,0 @@ -/*************************************************************************** - settingsdialog.h - description - ------------------- - begin : Sat Jan 11 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 SETTINGSDIALOG_H -#define SETTINGSDIALOG_H - -#include -#include - -// Forward declarations -class Account; -class AccountsWidget; -class AlertsWidget; -class ChattingWidget; -class ChatLoggingWidget; -class EmailWidget; -class EmoticonWidget; -class KConfig; -class ChatMessage; -class ChatMessageStyle; -class ChatMessageView; - -/** - *@author Mike K. Bennett - */ - -class SettingsDialog : public KDialogBase -{ - Q_OBJECT - - public: - // The constructor - SettingsDialog(QWidget *parent=0, const char *name=0); - // The destructor - ~SettingsDialog(); - // Show the settings dialog for the given account - void changeAccountSettings(Account *account, bool isCurrentAccount); - // Return a singleton instance of the settings dialog window - static SettingsDialog* instance( QWidget *parent = 0 ); - - private: // Private methods - // Get a font and cleaned-up font family from a dialog - bool getFont(QFont &font, QString &fontFamily) const; - // Load account information into the account widget - void loadAccountsSettings(Account *account, bool isCurrentAccount); - // Load account information into the alerts widget - void loadAlertsSettings(Account *account); - // Load account information into the chatting widget - void loadChattingSettings(Account *account); - // Load account information into the chat logging widget - void loadChatLoggingSettings(Account *account); - // Load account information into the email widget - void loadEmailSettings(Account *account); - // Load account information into the emoticon widget - void loadEmoticonSettings(Account *account); - // Read options from the configuration file. - void readOptions(); - // Save account information from the account widget - void saveAccountsSettings(Account *account); - // Save account information from the alerts widget - void saveAlertsSettings(Account *account); - // Save account information from the chatting widget - void saveChattingSettings(Account *account); - // Save account information from the chat logging widget - void saveChatLoggingSettings(Account *account); - // Save account information from the email widget - void saveEmailSettings(Account *account); - // Save account information from the emoticon widget - void saveEmoticonSettings(Account *account); - // Save the options. - void saveOptions(); - // Save all widget settings - void saveAccountSettings(); - // Select the Account page when showing the settings dialog - void showEvent( QShowEvent *event ); - - private slots: // Private slots - // Get a directory from the user. - void chooseDirectory(); - // Save the window options before closing. - void closeEvent(QCloseEvent *event); - // The contact font button was pressed. Show a font dialog to get a new font. - void contactFontClicked(); - // The font button was pressed. Show a font dialog to get a new font. - void fontClicked(); - // Update status of dependent options for the notifications - void notificationsToggled(); - // The apply button was clicked. Apply the changes. - void slotApply(); - // The cancel button was clicked. Close the dialog. - void slotCancel(); - // The close button was clicked. Close the dialog. - void slotClose(); - // The chat style was changed. - void slotChatStyleChanged(const QString &style); - // The OK button was pressed. Apply the changes and close. - void slotOk(); - // The delete button was pressed. - void slotUser1(); - // Update the chat style preview - void updatePreview(); - // Enable or disable the contact font and color selectors. - void useContactFontToggled(bool checked); - - private: // Private attributes - // The account being edited - Account *account_; - // The configuration file from which window size is loaded from and saved to - KConfig *config_; - // The chat message preview - ChatMessageView *chatMessageView_; - // The XSL transformation handler - ChatMessageStyle *chatStyle_; - // The widget for entering profile data (handle, name, password). - AccountsWidget *accountsWidget_; - // The widget for selecting idle timer and notification timer durations. - AlertsWidget *alertsWidget_; - // The widget for selecting the user's font. - ChattingWidget *chattingWidget_; - // A widget for chat logging settings - ChatLoggingWidget *chatLoggingWidget_; - // The widget for selecting information about email notifications - EmailWidget *emailWidget_; - // The widget for selecting emoticon styles - EmoticonWidget *emoticonWidget_; - // The instance of the singleton settings dialog window - static SettingsDialog *instance_; - - signals: - // The settings have been changed - void changedSettings( Account *account, QString oldHandle, QString oldFriendlyName ); - // Request that the given account be deleted - void deleteAccount(Account *account); -}; - -#endif diff --git a/kmess/sounds/.cvsignore b/kmess/sounds/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/sounds/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/sounds/Makefile.am b/kmess/sounds/Makefile.am deleted file mode 100644 index 6df8d90..0000000 --- a/kmess/sounds/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -kde_sound_DATA = kmess_chat.ogg kmess_logoff.ogg kmess_logon.ogg kmess_msg.ogg - -EXTRA_DIST = $(kde_sound_DATA) - diff --git a/kmess/sounds/Makefile.in b/kmess/sounds/Makefile.in deleted file mode 100644 index 69b4f7d..0000000 --- a/kmess/sounds/Makefile.in +++ /dev/null @@ -1,593 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/sounds -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(kde_sounddir)" -kde_soundDATA_INSTALL = $(INSTALL_DATA) -DATA = $(kde_sound_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -kde_sound_DATA = kmess_chat.ogg kmess_logoff.ogg kmess_logon.ogg kmess_msg.ogg -EXTRA_DIST = $(kde_sound_DATA) -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/sounds/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/sounds/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/sounds/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/sounds/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/sounds/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-kde_soundDATA: $(kde_sound_DATA) - @$(NORMAL_INSTALL) - test -z "$(kde_sounddir)" || $(mkdir_p) "$(DESTDIR)$(kde_sounddir)" - @list='$(kde_sound_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(kde_soundDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(kde_sounddir)/$$f'"; \ - $(kde_soundDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(kde_sounddir)/$$f"; \ - done - -uninstall-kde_soundDATA: - @$(NORMAL_UNINSTALL) - @list='$(kde_sound_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(kde_sounddir)/$$f'"; \ - rm -f "$(DESTDIR)$(kde_sounddir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(kde_sounddir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-kde_soundDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-kde_soundDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-kde_soundDATA install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am \ - uninstall-kde_soundDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/sounds/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/sounds/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/sounds/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/.cvsignore b/kmess/styles/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Classic-compact/.cvsignore b/kmess/styles/Classic-compact/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/Classic-compact/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Classic-compact/Makefile.am b/kmess/styles/Classic-compact/Makefile.am deleted file mode 100644 index e1b5f3a..0000000 --- a/kmess/styles/Classic-compact/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -styledir = $(kde_datadir)/kmess/styles/Classic-compact/ -style_DATA = Classic-compact.xsl Classic-compact.css - diff --git a/kmess/styles/Classic-compact/Makefile.in b/kmess/styles/Classic-compact/Makefile.in deleted file mode 100644 index 9c97e87..0000000 --- a/kmess/styles/Classic-compact/Makefile.in +++ /dev/null @@ -1,592 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles/Classic-compact -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(styledir)" -styleDATA_INSTALL = $(INSTALL_DATA) -DATA = $(style_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -styledir = $(kde_datadir)/kmess/styles/Classic-compact/ -style_DATA = Classic-compact.xsl Classic-compact.css -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Classic-compact/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Classic-compact/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Classic-compact/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Classic-compact/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Classic-compact/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-styleDATA: $(style_DATA) - @$(NORMAL_INSTALL) - test -z "$(styledir)" || $(mkdir_p) "$(DESTDIR)$(styledir)" - @list='$(style_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(styleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(styledir)/$$f'"; \ - $(styleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(styledir)/$$f"; \ - done - -uninstall-styleDATA: - @$(NORMAL_UNINSTALL) - @list='$(style_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(styledir)/$$f'"; \ - rm -f "$(DESTDIR)$(styledir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(styledir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-styleDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-styleDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - install-styleDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am uninstall-styleDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Classic-compact.css Makefile.in Classic-compact.xsl Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Classic-compact/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Classic-compact/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Classic-compact/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/Classic/.cvsignore b/kmess/styles/Classic/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/Classic/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Classic/Makefile.am b/kmess/styles/Classic/Makefile.am deleted file mode 100644 index 2c4787e..0000000 --- a/kmess/styles/Classic/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -styledir = $(kde_datadir)/kmess/styles/Classic/ -style_DATA = Classic.xsl Classic.css - diff --git a/kmess/styles/Classic/Makefile.in b/kmess/styles/Classic/Makefile.in deleted file mode 100644 index 36d7d99..0000000 --- a/kmess/styles/Classic/Makefile.in +++ /dev/null @@ -1,592 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles/Classic -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(styledir)" -styleDATA_INSTALL = $(INSTALL_DATA) -DATA = $(style_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -styledir = $(kde_datadir)/kmess/styles/Classic/ -style_DATA = Classic.xsl Classic.css -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Classic/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Classic/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Classic/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Classic/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Classic/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-styleDATA: $(style_DATA) - @$(NORMAL_INSTALL) - test -z "$(styledir)" || $(mkdir_p) "$(DESTDIR)$(styledir)" - @list='$(style_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(styleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(styledir)/$$f'"; \ - $(styleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(styledir)/$$f"; \ - done - -uninstall-styleDATA: - @$(NORMAL_UNINSTALL) - @list='$(style_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(styledir)/$$f'"; \ - rm -f "$(DESTDIR)$(styledir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(styledir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-styleDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-styleDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - install-styleDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am uninstall-styleDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Classic.css Classic.xsl Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Classic/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Classic/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Classic/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/Colourful-Enclosed/.cvsignore b/kmess/styles/Colourful-Enclosed/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/Colourful-Enclosed/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Colourful-Enclosed/Makefile.am b/kmess/styles/Colourful-Enclosed/Makefile.am deleted file mode 100644 index dcca039..0000000 --- a/kmess/styles/Colourful-Enclosed/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -styledir = $(kde_datadir)/kmess/styles/Colourful-Enclosed/ -style_DATA = Colourful-Enclosed.xsl Colourful-Enclosed.css - diff --git a/kmess/styles/Colourful-Enclosed/Makefile.in b/kmess/styles/Colourful-Enclosed/Makefile.in deleted file mode 100644 index bb8cf66..0000000 --- a/kmess/styles/Colourful-Enclosed/Makefile.in +++ /dev/null @@ -1,592 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles/Colourful-Enclosed -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(styledir)" -styleDATA_INSTALL = $(INSTALL_DATA) -DATA = $(style_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -styledir = $(kde_datadir)/kmess/styles/Colourful-Enclosed/ -style_DATA = Colourful-Enclosed.xsl Colourful-Enclosed.css -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Colourful-Enclosed/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Colourful-Enclosed/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Colourful-Enclosed/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Colourful-Enclosed/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Colourful-Enclosed/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-styleDATA: $(style_DATA) - @$(NORMAL_INSTALL) - test -z "$(styledir)" || $(mkdir_p) "$(DESTDIR)$(styledir)" - @list='$(style_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(styleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(styledir)/$$f'"; \ - $(styleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(styledir)/$$f"; \ - done - -uninstall-styleDATA: - @$(NORMAL_UNINSTALL) - @list='$(style_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(styledir)/$$f'"; \ - rm -f "$(DESTDIR)$(styledir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(styledir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-styleDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-styleDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - install-styleDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am uninstall-styleDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Colourful-Enclosed.css Colourful-Enclosed.xsl Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Colourful-Enclosed/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Colourful-Enclosed/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Colourful-Enclosed/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/Dim/.cvsignore b/kmess/styles/Dim/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/Dim/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Dim/Makefile.am b/kmess/styles/Dim/Makefile.am deleted file mode 100644 index cc65276..0000000 --- a/kmess/styles/Dim/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -styledir = $(kde_datadir)/kmess/styles/Dim/ -style_DATA = Dim.xsl Dim.css - diff --git a/kmess/styles/Dim/Makefile.in b/kmess/styles/Dim/Makefile.in deleted file mode 100644 index bcd5737..0000000 --- a/kmess/styles/Dim/Makefile.in +++ /dev/null @@ -1,592 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles/Dim -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(styledir)" -styleDATA_INSTALL = $(INSTALL_DATA) -DATA = $(style_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -styledir = $(kde_datadir)/kmess/styles/Dim/ -style_DATA = Dim.xsl Dim.css -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Dim/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Dim/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Dim/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Dim/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Dim/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-styleDATA: $(style_DATA) - @$(NORMAL_INSTALL) - test -z "$(styledir)" || $(mkdir_p) "$(DESTDIR)$(styledir)" - @list='$(style_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(styleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(styledir)/$$f'"; \ - $(styleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(styledir)/$$f"; \ - done - -uninstall-styleDATA: - @$(NORMAL_UNINSTALL) - @list='$(style_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(styledir)/$$f'"; \ - rm -f "$(DESTDIR)$(styledir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(styledir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-styleDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-styleDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - install-styleDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am uninstall-styleDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Dim.css Makefile.in Dim.xsl Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Dim/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Dim/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Dim/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/Efficient/.cvsignore b/kmess/styles/Efficient/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/Efficient/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Efficient/Makefile.am b/kmess/styles/Efficient/Makefile.am deleted file mode 100644 index 52ef91f..0000000 --- a/kmess/styles/Efficient/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -styledir = $(kde_datadir)/kmess/styles/Efficient/ -style_DATA = Efficient.xsl Efficient.css - diff --git a/kmess/styles/Efficient/Makefile.in b/kmess/styles/Efficient/Makefile.in deleted file mode 100644 index 142f46b..0000000 --- a/kmess/styles/Efficient/Makefile.in +++ /dev/null @@ -1,592 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles/Efficient -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(styledir)" -styleDATA_INSTALL = $(INSTALL_DATA) -DATA = $(style_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -styledir = $(kde_datadir)/kmess/styles/Efficient/ -style_DATA = Efficient.xsl Efficient.css -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Efficient/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Efficient/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Efficient/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Efficient/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Efficient/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-styleDATA: $(style_DATA) - @$(NORMAL_INSTALL) - test -z "$(styledir)" || $(mkdir_p) "$(DESTDIR)$(styledir)" - @list='$(style_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(styleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(styledir)/$$f'"; \ - $(styleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(styledir)/$$f"; \ - done - -uninstall-styleDATA: - @$(NORMAL_UNINSTALL) - @list='$(style_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(styledir)/$$f'"; \ - rm -f "$(DESTDIR)$(styledir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(styledir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-styleDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-styleDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - install-styleDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am uninstall-styleDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Efficient.xsl Efficient.css Makefile.in Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Efficient/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Efficient/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Efficient/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/Fresh/.cvsignore b/kmess/styles/Fresh/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/Fresh/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Fresh/Makefile.am b/kmess/styles/Fresh/Makefile.am deleted file mode 100644 index 441a9ab..0000000 --- a/kmess/styles/Fresh/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -styledir = $(kde_datadir)/kmess/styles/Fresh/ -style_DATA = Fresh.xsl Fresh.css bg_gravatar.gif bg_gravatar_rtl.gif buddy_icon.png - diff --git a/kmess/styles/Fresh/Makefile.in b/kmess/styles/Fresh/Makefile.in deleted file mode 100644 index 6e61565..0000000 --- a/kmess/styles/Fresh/Makefile.in +++ /dev/null @@ -1,592 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles/Fresh -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(styledir)" -styleDATA_INSTALL = $(INSTALL_DATA) -DATA = $(style_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -styledir = $(kde_datadir)/kmess/styles/Fresh/ -style_DATA = Fresh.xsl Fresh.css bg_gravatar.gif bg_gravatar_rtl.gif buddy_icon.png -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Fresh/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Fresh/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Fresh/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Fresh/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Fresh/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-styleDATA: $(style_DATA) - @$(NORMAL_INSTALL) - test -z "$(styledir)" || $(mkdir_p) "$(DESTDIR)$(styledir)" - @list='$(style_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(styleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(styledir)/$$f'"; \ - $(styleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(styledir)/$$f"; \ - done - -uninstall-styleDATA: - @$(NORMAL_UNINSTALL) - @list='$(style_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(styledir)/$$f'"; \ - rm -f "$(DESTDIR)$(styledir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(styledir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-styleDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-styleDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - install-styleDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am uninstall-styleDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=bg_gravatar_rtl.gif bg_gravatar.gif buddy_icon.png Makefile.in Fresh.xsl Makefile.am Fresh.css - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Fresh/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Fresh/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Fresh/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/Makefile.am b/kmess/styles/Makefile.am deleted file mode 100644 index 5646ca7..0000000 --- a/kmess/styles/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -SUBDIRS = Colourful-Enclosed Classic Classic-compact Dim Efficient Fresh Pure - -stylerootdir = $(kde_datadir)/kmess/styles/ -styleroot_DATA = examplemessage.xml - diff --git a/kmess/styles/Makefile.in b/kmess/styles/Makefile.in deleted file mode 100644 index ded8526..0000000 --- a/kmess/styles/Makefile.in +++ /dev/null @@ -1,744 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -#>- html-recursive info-recursive install-data-recursive \ -#>- install-exec-recursive install-info-recursive \ -#>- install-recursive installcheck-recursive installdirs-recursive \ -#>- pdf-recursive ps-recursive uninstall-info-recursive \ -#>- uninstall-recursive -#>+ 6 -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive nmcheck-recursive bcheck-recursive -am__installdirs = "$(DESTDIR)$(stylerootdir)" -stylerootDATA_INSTALL = $(INSTALL_DATA) -DATA = $(styleroot_DATA) -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -SUBDIRS = Colourful-Enclosed Classic Classic-compact Dim Efficient Fresh Pure -stylerootdir = $(kde_datadir)/kmess/styles/ -styleroot_DATA = examplemessage.xml -#>- all: all-recursive -#>+ 1 -all: docs-am all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-stylerootDATA: $(styleroot_DATA) - @$(NORMAL_INSTALL) - test -z "$(stylerootdir)" || $(mkdir_p) "$(DESTDIR)$(stylerootdir)" - @list='$(styleroot_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(stylerootDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(stylerootdir)/$$f'"; \ - $(stylerootDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(stylerootdir)/$$f"; \ - done - -uninstall-stylerootDATA: - @$(NORMAL_UNINSTALL) - @list='$(styleroot_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(stylerootdir)/$$f'"; \ - rm -f "$(DESTDIR)$(stylerootdir)/$$f"; \ - done - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $$MAKEFLAGS; amf=$$2; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || mkdir "$(distdir)/$$subdir" \ - || exit 1; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="../$(top_distdir)" \ - distdir="../$(distdir)/$$subdir" \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(DATA) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(stylerootdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-recursive -#>+ 1 -clean: kde-rpo-clean clean-recursive - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: install-stylerootDATA - -install-exec-am: - -install-info: install-info-recursive - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-info-am uninstall-stylerootDATA - -uninstall-info: uninstall-info-recursive - -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ - clean clean-generic clean-libtool clean-recursive ctags \ - ctags-recursive distclean distclean-generic distclean-libtool \ - distclean-recursive distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip \ - install-stylerootDATA installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - maintainer-clean-recursive mostlyclean mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am uninstall-info-am \ - uninstall-stylerootDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=extract-xsl-messages Makefile.in extract-xsl-messages.xsl examplemessage.xml Makefile.am - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-recursive - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/styles/Pure/.cvsignore b/kmess/styles/Pure/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/kmess/styles/Pure/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/kmess/styles/Pure/Makefile.am b/kmess/styles/Pure/Makefile.am deleted file mode 100644 index b82b1a3..0000000 --- a/kmess/styles/Pure/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -styledir = $(kde_datadir)/kmess/styles/Pure/ -style_DATA = arrow0.png arrow1.png clock.png contact.png corner-bl.png corner-br.png corner-tl.png corner-tr.png important.png Makefile.am myself.png Pure.css Pure.xsl system.png - diff --git a/kmess/styles/Pure/Makefile.in b/kmess/styles/Pure/Makefile.in deleted file mode 100644 index 9a9d093..0000000 --- a/kmess/styles/Pure/Makefile.in +++ /dev/null @@ -1,592 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = kmess/styles/Pure -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__installdirs = "$(DESTDIR)$(styledir)" -styleDATA_INSTALL = $(INSTALL_DATA) -DATA = $(style_DATA) -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -styledir = $(kde_datadir)/kmess/styles/Pure/ -style_DATA = arrow0.png arrow1.png clock.png contact.png corner-bl.png corner-br.png corner-tl.png corner-tr.png important.png Makefile.am myself.png Pure.css Pure.xsl system.png -#>- all: all-am -#>+ 1 -all: docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Pure/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu kmess/styles/Pure/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Pure/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Pure/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Pure/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-styleDATA: $(style_DATA) - @$(NORMAL_INSTALL) - test -z "$(styledir)" || $(mkdir_p) "$(DESTDIR)$(styledir)" - @list='$(style_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(styleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(styledir)/$$f'"; \ - $(styleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(styledir)/$$f"; \ - done - -uninstall-styleDATA: - @$(NORMAL_UNINSTALL) - @list='$(style_DATA)'; for p in $$list; do \ - f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f '$(DESTDIR)$(styledir)/$$f'"; \ - rm -f "$(DESTDIR)$(styledir)/$$f"; \ - done -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(styledir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-styleDATA - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-styleDATA - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - install-styleDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-info-am uninstall-styleDATA - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=Pure.css action.png corner-bl.png clock.png system.png corner-tl.png corner-tr.png Pure.xsl corner-br.png contact.png arrow0.png myself.png Makefile.in Makefile.am important.png arrow1.png - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kmess/styles/Pure/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu kmess/styles/Pure/Makefile - cd $(top_srcdir) && perl admin/am_edit kmess/styles/Pure/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/kmess/systemtraywidget.cpp b/kmess/systemtraywidget.cpp deleted file mode 100644 index 89abad9..0000000 --- a/kmess/systemtraywidget.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/*************************************************************************** - systemtraywidget.cpp - description - ------------------- - begin : Sun Dec 29 2002 - copyright : (C) 2002 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 "systemtraywidget.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "config.h" -#include "currentaccount.h" - - -// The constructor -SystemTrayWidget::SystemTrayWidget(QWidget *parent, const char *name ) - : KSystemTray(parent,name) -{ -} - - -/** - * Display an Hide On Close dialog window with a trayicon screenshot - * - * This method, taken from the Basket Note Pads project (see the related links below), is used when - * the user closes the main KMess contact list window. Then a custom dialog window is shown to notify - * that the app will still run in background. This useful method adds to it a screenshot of the system - * tray area of the users' desktop, highlighting the application's icons. - * - * @see http://basket.kde.org/ - Official site of the Basket Note Pads project - * @see http://basket.kde.org/systemtray-on-close-info.php - Specific tray dialog page - */ -void SystemTrayWidget::displayCloseMessage( QString /*fileMenu*/ ) -{ -#if KDE_IS_VERSION( 3, 1, 90 ) - // Don't do all the computations if they are unneeded: - if ( ! KMessageBox::shouldBeShownContinue("hideOnCloseInfo") ) - return; -#endif - - // Some values we need: - QPoint g = mapToGlobal(pos()); - int desktopWidth = kapp->desktop()->width(); - int desktopHeight = kapp->desktop()->height(); - int tw = width(); - int th = height(); - - // We are trying to make a live screenshot of the systray icon to circle it - // and show it to the user. If no systray is used or if the icon is not visible, - // we should not show that screenshot but only a text! - - // 1. Determine if the user use a system tray area or not: - QCString screenstr; - screenstr.setNum(qt_xscreen()); - QCString trayatom = "_NET_SYSTEM_TRAY_S" + screenstr; - bool useSystray = (KSelectionWatcher(trayatom).owner() != 0L); - - // 2. And then if the icon is visible too (eg. this->show() has been called): - useSystray = useSystray && isVisible(); - - // 3. Kicker (or another systray manager) can be visible but masked out of - // the screen (ie. on right or on left of it). We check if the icon isn't - // out of screen. - QRect deskRect(0, 0, desktopWidth, desktopHeight); - if( useSystray && ( ! deskRect.contains( g.x(), g.y() ) ) && ( ! deskRect.contains( g.x() + tw, g.y() + th ) ) ) - { - useSystray = false; - } - - - 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." ); - - // If the system tray is not visible, just show the text message - if( ! useSystray ) - { -#ifdef KMESSDEBUG_SYSTEMTRAY - kdDebug() << "SystemTrayWidget::displayCloseMessage() - Displaying simple dialog with no screenshot." << endl; -#endif - - KMessageBox::information( kapp->activeWindow(), message, - i18n( "Docking in System Tray" ), - "hideOnCloseInfo" ); - return; - } - - // We are sure the systray icon is visible: ouf! - -#ifdef KMESSDEBUG_SYSTEMTRAY - kdDebug() << "SystemTrayWidget::displayCloseMessage() - Displaying dialog with tray icon screenshot: generating image..." << endl; -#endif - - // Compute size and position of the pixmap to be grabbed: - int w = desktopWidth / 4; - int h = desktopHeight / 9; - int x = g.x() + tw/2 - w/2; // Center the rectange in the systray icon - int y = g.y() + th/2 - h/2; - if (x < 0) x = 0; // Move the rectangle to stay in the desktop limits - if (y < 0) y = 0; - if (x + w > desktopWidth) x = desktopWidth - w; - if (y + h > desktopHeight) y = desktopHeight - h; - - // Grab the desktop and draw a circle arround the icon: - const int CIRCLE_MARGINS = 6; - const int CIRCLE_WIDTH = 3; - const int SHADOW_OFFSET = 1; - const int IMAGE_BORDER = 1; - int ax = g.x() - x - CIRCLE_MARGINS - 1; - int ay = g.y() - y - CIRCLE_MARGINS - 1; - QPixmap shot = QPixmap::grabWindow(qt_xrootwin(), x, y, w, h); - QPainter painter(&shot); - - painter.setPen( QPen(KApplication::palette().active().dark(), CIRCLE_WIDTH) ); - painter.drawArc(ax + SHADOW_OFFSET, ay + SHADOW_OFFSET, - tw + 2*CIRCLE_MARGINS, th + 2*CIRCLE_MARGINS, 0, 16*360); - painter.setPen( QPen(Qt::red, CIRCLE_WIDTH) ); - painter.drawArc(ax, ay, tw + 2*CIRCLE_MARGINS, th + 2*CIRCLE_MARGINS, 0, 16*360); - - // Draw the pixmap over the screenshot in case a window hide the icon: - painter.drawPixmap(g.x(), g.y(), *pixmap()); - painter.end(); - - // Then, we add a border arround the image to make it more visible: - QPixmap finalShot(w + 2*IMAGE_BORDER, h + 2*IMAGE_BORDER); - finalShot.fill(KApplication::palette().active().foreground()); - - painter.begin(&finalShot); - painter.drawPixmap(IMAGE_BORDER, IMAGE_BORDER, shot); - painter.end(); - -#ifdef KMESSDEBUG_SYSTEMTRAY - kdDebug() << "SystemTrayWidget::displayCloseMessage() - ...Done, showing the dialog." << endl; -#endif - - // Associate source to image and show the dialog: - QMimeSourceFactory::defaultFactory()->setPixmap("systray_shot", finalShot); - - KMessageBox::information(kapp->activeWindow(), - "

" + message + "

", - i18n("Docking in System Tray"), "hideOnCloseInfo"); - - QMimeSourceFactory::defaultFactory()->setData("systray_shot", 0L); -} - - - -// The destructor -SystemTrayWidget::~SystemTrayWidget() -{ -#ifdef KMESSDEBUG_SYSTEMTRAY - kdDebug() << "DESTROYED SystemTrayWidget" << endl; -#endif -} - - - -// 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 -KPopupMenu* SystemTrayWidget::menu() const -{ - return contextMenu(); -} - - - -// Change the icon when the user's status changes -void SystemTrayWidget::statusChanged() -{ - QString status; - QString newTooltip; - QString iconName, statusName; - KIconLoader *loader = KGlobal::iconLoader(); - CurrentAccount *currentAccount = CurrentAccount::instance(); - - status = currentAccount->getStatus(); - - // Update the onlineStatusLabel - if ( status == "AWY" ) - { - iconName = "away"; - statusName = i18n("Away"); - } - else if ( status == "BRB" ) - { - iconName = "berightback"; - statusName = i18n("Be Right Back"); - } - else if ( status == "BSY" ) - { - iconName = "busy"; - statusName = i18n("Busy"); - } - else if ( status == "FLN" ) - { - iconName = "offline"; - statusName = i18n("Offline"); - } - else if ( status == "HDN" ) - { - iconName = "invisible"; - statusName = i18n("Invisible"); - } - else if ( status == "IDL" ) - { - iconName = "away"; - statusName = i18n("Idle"); - } - else if ( status == "LUN" ) - { - iconName = "lunch"; - statusName = i18n("Out to Lunch"); - } - else if ( status == "NLN" ) - { - iconName = "online"; - statusName = i18n("Online"); - } - else if ( status == "PHN" ) - { - iconName = "onthephone"; - statusName = i18n("On the Phone"); - } - else - { - kdWarning() << "SystemTrayWidget::statusChanged() - The account had an invalid status: " << status << "." << endl; - return; - } - - // Update the icon - setPixmap( loader->loadIcon( iconName, KIcon::User ) ); - - // Change the tooltip - QToolTip::remove( this ); - - newTooltip = i18n( "%1 %2" ).arg( I18N_NOOP("KMess") ).arg ( VERSION ); - - if( status != "FLN" ) - { - newTooltip += i18n( "
%1 (%2)" ).arg( currentAccount->getFriendlyName() ).arg( statusName ); - } - - QToolTip::add( this, newTooltip ); -} - - - -#include "systemtraywidget.moc" diff --git a/po/.cvsignore b/po/.cvsignore deleted file mode 100644 index f5eaa1a..0000000 --- a/po/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in - diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100644 index 0000000..de4376f --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,25 @@ +FIND_PROGRAM( GETTEXT_MSGFMT_EXECUTABLE msgfmt ) + +IF( NOT GETTEXT_MSGFMT_EXECUTABLE ) + MESSAGE( +"------ + NOTE: msgfmt not found. Translations will *not* be installed +------") +ELSE( NOT GETTEXT_MSGFMT_EXECUTABLE ) + + SET( catalogname kmess ) + + ADD_CUSTOM_TARGET( translations ALL ) + + FILE( GLOB PO_FILES *.po ) + + FOREACH( _poFile ${PO_FILES} ) + GET_FILENAME_COMPONENT( _lang ${_poFile} NAME_WE ) + SET( _gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo ) + ADD_CUSTOM_COMMAND( TARGET translations + COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} + DEPENDS ${_poFile}) + INSTALL( FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_lang}/LC_MESSAGES/ RENAME ${catalogname}.mo ) + ENDFOREACH( _poFile ${PO_FILES} ) + +ENDIF( NOT GETTEXT_MSGFMT_EXECUTABLE ) diff --git a/po/Makefile.am b/po/Makefile.am deleted file mode 100644 index ab9f73d..0000000 --- a/po/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -####### kdevelop will overwrite this part!!! (begin)########## - -POFILES = AUTO - diff --git a/po/Makefile.in b/po/Makefile.in deleted file mode 100644 index db543ae..0000000 --- a/po/Makefile.in +++ /dev/null @@ -1,697 +0,0 @@ -# Makefile.in generated by automake 1.8.5 from Makefile.am. -# KDE tags expanded automatically by am_edit - $Revision: 483858 $ -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -####### kdevelop will overwrite this part!!! (begin)########## -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = po -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -#>+ 1 -#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -#>+ 1 -DISTFILES = $(GMOFILES) $(POFILES) $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -ARTSCCONFIG = @ARTSCCONFIG@ -AUTOCONF = @AUTOCONF@ -AUTODIRS = @AUTODIRS@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ -BINRELOC_LIBS = @BINRELOC_LIBS@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CONF_FILES = @CONF_FILES@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DCOPIDL = @DCOPIDL@ -DCOPIDL2CPP = @DCOPIDL2CPP@ -DCOPIDLNG = @DCOPIDLNG@ -DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ -GMSGFMT = @GMSGFMT@ -HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ -KCONFIG_COMPILER = @KCONFIG_COMPILER@ -KDECONFIG = @KDECONFIG@ -KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ -KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ -KDE_INCLUDES = @KDE_INCLUDES@ -KDE_LDFLAGS = @KDE_LDFLAGS@ -KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ -KDE_MT_LIBS = @KDE_MT_LIBS@ -KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ -KDE_PLUGIN = @KDE_PLUGIN@ -KDE_RPATH = @KDE_RPATH@ -KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ -KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ -KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ -KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ -KDE_USE_FPIE = @KDE_USE_FPIE@ -KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ -KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ -KDE_USE_PIE = @KDE_USE_PIE@ -KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ -KPHONEDIR = @KPHONEDIR@ -KPHONE_AUDIOBUFFER_OBJ = @KPHONE_AUDIOBUFFER_OBJ@ -KPHONE_CALLAUDIO_MOC_OBJ = @KPHONE_CALLAUDIO_MOC_OBJ@ -KPHONE_CALLAUDIO_OBJ = @KPHONE_CALLAUDIO_OBJ@ -KPHONE_DISSIPATE2_LIB = @KPHONE_DISSIPATE2_LIB@ -KPHONE_DSPAUDIOIN_OBJ = @KPHONE_DSPAUDIOIN_OBJ@ -KPHONE_DSPAUDIOOUT_OBJ = @KPHONE_DSPAUDIOOUT_OBJ@ -KPHONE_DSPAUDIO_OBJ = @KPHONE_DSPAUDIO_OBJ@ -KPHONE_DSPOUTOSS_OBJ = @KPHONE_DSPOUTOSS_OBJ@ -KPHONE_DSPOUTRTP_OBJ = @KPHONE_DSPOUTRTP_OBJ@ -KPHONE_DSPOUT_OBJ = @KPHONE_DSPOUT_OBJ@ -KPHONE_DTMFGENERATOR_OBJ = @KPHONE_DTMFGENERATOR_OBJ@ -KPHONE_G711_OBJ = @KPHONE_G711_OBJ@ -KPHONE_GSM_LIB = @KPHONE_GSM_LIB@ -KPHONE_ILBC_LIB = @KPHONE_ILBC_LIB@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ -LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ -LIBCOMPAT = @LIBCOMPAT@ -LIBCRYPT = @LIBCRYPT@ -LIBDL = @LIBDL@ -LIBJPEG = @LIBJPEG@ -LIBOBJS = @LIBOBJS@ -LIBPNG = @LIBPNG@ -LIBPTHREAD = @LIBPTHREAD@ -LIBRESOLV = @LIBRESOLV@ -LIBS = @LIBS@ -LIBSM = @LIBSM@ -LIBSOCKET = @LIBSOCKET@ -LIBTOOL = @LIBTOOL@ -LIBUCB = @LIBUCB@ -LIBUTIL = @LIBUTIL@ -LIBXML_CFLAGS = @LIBXML_CFLAGS@ -LIBXML_LIBS = @LIBXML_LIBS@ -LIBXML_RPATH = @LIBXML_RPATH@ -LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ -LIBXSLT_LIBS = @LIBXSLT_LIBS@ -LIBXSLT_RPATH = @LIBXSLT_RPATH@ -LIBZ = @LIBZ@ -LIB_KAB = @LIB_KAB@ -LIB_KABC = @LIB_KABC@ -LIB_KDECORE = @LIB_KDECORE@ -LIB_KDED = @LIB_KDED@ -LIB_KDEPIM = @LIB_KDEPIM@ -LIB_KDEPRINT = @LIB_KDEPRINT@ -LIB_KDEUI = @LIB_KDEUI@ -LIB_KDNSSD = @LIB_KDNSSD@ -LIB_KFILE = @LIB_KFILE@ -LIB_KFM = @LIB_KFM@ -LIB_KHTML = @LIB_KHTML@ -LIB_KIMPROXY = @LIB_KIMPROXY@ -LIB_KIO = @LIB_KIO@ -LIB_KJS = @LIB_KJS@ -LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ -LIB_KPARTS = @LIB_KPARTS@ -LIB_KSPELL = @LIB_KSPELL@ -LIB_KSYCOCA = @LIB_KSYCOCA@ -LIB_KUNITTEST = @LIB_KUNITTEST@ -LIB_KUTILS = @LIB_KUTILS@ -LIB_POLL = @LIB_POLL@ -LIB_QPE = @LIB_QPE@ -LIB_QT = @LIB_QT@ -LIB_SMB = @LIB_SMB@ -LIB_X11 = @LIB_X11@ -LIB_XEXT = @LIB_XEXT@ -LIB_XRENDER = @LIB_XRENDER@ -LIB_XSCREENSAVER = @LIB_XSCREENSAVER@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MAKEKDEWIDGETS = @MAKEKDEWIDGETS@ -MCOPIDL = @MCOPIDL@ -MEINPROC = @MEINPROC@ -MOC = @MOC@ -MSGFMT = @MSGFMT@ -NOOPT_CFLAGS = @NOOPT_CFLAGS@ -NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -QTE_NORTTI = @QTE_NORTTI@ -QT_INCLUDES = @QT_INCLUDES@ -QT_LDFLAGS = @QT_LDFLAGS@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPSUBDIRS = @TOPSUBDIRS@ -UIC = @UIC@ -UIC_TR = @UIC_TR@ -USER_INCLUDES = @USER_INCLUDES@ -USER_LDFLAGS = @USER_LDFLAGS@ -USE_EXCEPTIONS = @USE_EXCEPTIONS@ -USE_RTTI = @USE_RTTI@ -USE_THREADS = @USE_THREADS@ -VERSION = @VERSION@ -WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ -XGETTEXT = @XGETTEXT@ -XMLLINT = @XMLLINT@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_INCLUDES = @X_INCLUDES@ -X_LDFLAGS = @X_LDFLAGS@ -X_PRE_LIBS = @X_PRE_LIBS@ -X_RPATH = @X_RPATH@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -all_includes = @all_includes@ -all_libraries = @all_libraries@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -include_ARTS_FALSE = @include_ARTS_FALSE@ -include_ARTS_TRUE = @include_ARTS_TRUE@ -include_x11_FALSE = @include_x11_FALSE@ -include_x11_TRUE = @include_x11_TRUE@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -kde_appsdir = @kde_appsdir@ -kde_bindir = @kde_bindir@ -kde_confdir = @kde_confdir@ -kde_datadir = @kde_datadir@ -kde_htmldir = @kde_htmldir@ -kde_icondir = @kde_icondir@ -kde_includes = @kde_includes@ -kde_kcfgdir = @kde_kcfgdir@ -kde_libraries = @kde_libraries@ -kde_libs_htmldir = @kde_libs_htmldir@ -kde_libs_prefix = @kde_libs_prefix@ -kde_locale = @kde_locale@ -kde_mimedir = @kde_mimedir@ -kde_moduledir = @kde_moduledir@ -kde_qtver = @kde_qtver@ -kde_servicesdir = @kde_servicesdir@ -kde_servicetypesdir = @kde_servicetypesdir@ -kde_sounddir = @kde_sounddir@ -kde_styledir = @kde_styledir@ -kde_templatesdir = @kde_templatesdir@ -kde_wallpaperdir = @kde_wallpaperdir@ -kde_widgetdir = @kde_widgetdir@ -kdeinitdir = @kdeinitdir@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -qt_includes = @qt_includes@ -qt_libraries = @qt_libraries@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -unsermake_enable_pch_FALSE = @unsermake_enable_pch_FALSE@ -unsermake_enable_pch_TRUE = @unsermake_enable_pch_TRUE@ -x_includes = @x_includes@ -x_libraries = @x_libraries@ -xdg_appsdir = @xdg_appsdir@ -xdg_directorydir = @xdg_directorydir@ -xdg_menudir = @xdg_menudir@ -#>- POFILES = AUTO -#>+ 2 -POFILES = it.po th.po es.po ko.po tr.po pt_BR.po sl.po fr.po nl.po fi.po de.po hu.po ca.po da.po et.po ar.po zh_CN.po zh_TW.po sv.po nb.po -GMOFILES = it.gmo th.gmo es.gmo ko.gmo tr.gmo pt_BR.gmo sl.gmo fr.gmo nl.gmo fi.gmo de.gmo hu.gmo ca.gmo da.gmo et.gmo ar.gmo zh_CN.gmo zh_TW.gmo sv.gmo nb.gmo -#>- all: all-am -#>+ 1 -all: all-nls docs-am all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -#>- @for dep in $?; do \ -#>- case '$(am__configure_deps)' in \ -#>- *$$dep*) \ -#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -#>- && exit 0; \ -#>- exit 1;; \ -#>- esac; \ -#>- done; \ -#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu po/Makefile'; \ -#>- cd $(top_srcdir) && \ -#>- $(AUTOMAKE) --gnu po/Makefile -#>+ 12 - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu po/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu po/Makefile - cd $(top_srcdir) && perl admin/am_edit po/Makefile.in -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -#>- distdir: $(DISTFILES) -#>+ 1 -distdir: distdir-nls $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -#>- uninstall: uninstall-am -#>+ 1 -uninstall: uninstall-nls uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -#>- clean: clean-am -#>+ 1 -clean: kde-rpo-clean clean-am - -#>- clean-am: clean-generic clean-libtool mostlyclean-am -#>+ 1 -clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -#>- install-data-am: -#>+ 1 -install-data-am: install-nls - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -#>- maintainer-clean: maintainer-clean-am -#>+ 1 -maintainer-clean: clean-nls maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: - -#>+ 2 -KDE_DIST=zh_CN.po da.po th.po mergetrans de.po et.po nb.po fr.po tr.po pt_BR.po es.po it.po nl.po fi.po ko.po ar.po maketrans ca.po zh_TW.po kmess.pot Makefile.in sv.po hu.po Makefile.am sl.po - -#>+ 61 -it.gmo: it.po - rm -f it.gmo; $(GMSGFMT) -o it.gmo $(srcdir)/it.po - test ! -f it.gmo || touch it.gmo -th.gmo: th.po - rm -f th.gmo; $(GMSGFMT) -o th.gmo $(srcdir)/th.po - test ! -f th.gmo || touch th.gmo -es.gmo: es.po - rm -f es.gmo; $(GMSGFMT) -o es.gmo $(srcdir)/es.po - test ! -f es.gmo || touch es.gmo -ko.gmo: ko.po - rm -f ko.gmo; $(GMSGFMT) -o ko.gmo $(srcdir)/ko.po - test ! -f ko.gmo || touch ko.gmo -tr.gmo: tr.po - rm -f tr.gmo; $(GMSGFMT) -o tr.gmo $(srcdir)/tr.po - test ! -f tr.gmo || touch tr.gmo -pt_BR.gmo: pt_BR.po - rm -f pt_BR.gmo; $(GMSGFMT) -o pt_BR.gmo $(srcdir)/pt_BR.po - test ! -f pt_BR.gmo || touch pt_BR.gmo -sl.gmo: sl.po - rm -f sl.gmo; $(GMSGFMT) -o sl.gmo $(srcdir)/sl.po - test ! -f sl.gmo || touch sl.gmo -fr.gmo: fr.po - rm -f fr.gmo; $(GMSGFMT) -o fr.gmo $(srcdir)/fr.po - test ! -f fr.gmo || touch fr.gmo -nl.gmo: nl.po - rm -f nl.gmo; $(GMSGFMT) -o nl.gmo $(srcdir)/nl.po - test ! -f nl.gmo || touch nl.gmo -fi.gmo: fi.po - rm -f fi.gmo; $(GMSGFMT) -o fi.gmo $(srcdir)/fi.po - test ! -f fi.gmo || touch fi.gmo -de.gmo: de.po - rm -f de.gmo; $(GMSGFMT) -o de.gmo $(srcdir)/de.po - test ! -f de.gmo || touch de.gmo -hu.gmo: hu.po - rm -f hu.gmo; $(GMSGFMT) -o hu.gmo $(srcdir)/hu.po - test ! -f hu.gmo || touch hu.gmo -ca.gmo: ca.po - rm -f ca.gmo; $(GMSGFMT) -o ca.gmo $(srcdir)/ca.po - test ! -f ca.gmo || touch ca.gmo -da.gmo: da.po - rm -f da.gmo; $(GMSGFMT) -o da.gmo $(srcdir)/da.po - test ! -f da.gmo || touch da.gmo -et.gmo: et.po - rm -f et.gmo; $(GMSGFMT) -o et.gmo $(srcdir)/et.po - test ! -f et.gmo || touch et.gmo -ar.gmo: ar.po - rm -f ar.gmo; $(GMSGFMT) -o ar.gmo $(srcdir)/ar.po - test ! -f ar.gmo || touch ar.gmo -zh_CN.gmo: zh_CN.po - rm -f zh_CN.gmo; $(GMSGFMT) -o zh_CN.gmo $(srcdir)/zh_CN.po - test ! -f zh_CN.gmo || touch zh_CN.gmo -zh_TW.gmo: zh_TW.po - rm -f zh_TW.gmo; $(GMSGFMT) -o zh_TW.gmo $(srcdir)/zh_TW.po - test ! -f zh_TW.gmo || touch zh_TW.gmo -sv.gmo: sv.po - rm -f sv.gmo; $(GMSGFMT) -o sv.gmo $(srcdir)/sv.po - test ! -f sv.gmo || touch sv.gmo -nb.gmo: nb.po - rm -f nb.gmo; $(GMSGFMT) -o nb.gmo $(srcdir)/nb.po - test ! -f nb.gmo || touch nb.gmo - -#>+ 3 -clean-nls: - -rm -f it.gmo th.gmo es.gmo ko.gmo tr.gmo pt_BR.gmo sl.gmo fr.gmo nl.gmo fi.gmo de.gmo hu.gmo ca.gmo da.gmo et.gmo ar.gmo zh_CN.gmo zh_TW.gmo sv.gmo nb.gmo - -#>+ 10 -install-nls: - @for base in it th es ko tr pt_BR sl fr nl fi de hu ca da et ar zh_CN zh_TW sv nb ; do \ - echo $(INSTALL_DATA) $$base.gmo $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES/$(PACKAGE).mo ;\ - $(mkinstalldirs) $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES ; \ - if test -f $$base.gmo; then $(INSTALL_DATA) $$base.gmo $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES/$(PACKAGE).mo ;\ - elif test -f $(srcdir)/$$base.gmo; then $(INSTALL_DATA) $(srcdir)/$$base.gmo $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES/$(PACKAGE).mo ;\ - fi ;\ - done - - -#>+ 22 -uninstall-nls: - rm -f $(DESTDIR)$(kde_locale)/it/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/th/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/es/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/ko/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/tr/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/pt_BR/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/sl/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/fr/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/nl/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/fi/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/de/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/hu/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/ca/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/da/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/et/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/ar/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/zh_CN/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/zh_TW/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/sv/LC_MESSAGES/$(PACKAGE).mo - rm -f $(DESTDIR)$(kde_locale)/nb/LC_MESSAGES/$(PACKAGE).mo - -#>+ 2 -all-nls: $(GMOFILES) - -#>+ 8 -distdir-nls:$(GMOFILES) - for file in $(POFILES); do \ - cp $(srcdir)/$$file $(distdir); \ - done - for file in $(GMOFILES); do \ - cp $(srcdir)/$$file $(distdir); \ - done - -#>+ 4 -merge: - $(MAKE) -f $(top_srcdir)/admin/Makefile.common package-merge POFILES="${POFILES}" PACKAGE=${PACKAGE} - - -#>+ 2 -docs-am: - -#>+ 15 -force-reedit: - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu po/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu po/Makefile - cd $(top_srcdir) && perl admin/am_edit po/Makefile.in - - -#>+ 21 -clean-bcheck: - rm -f *.bchecktest.cc *.bchecktest.cc.class a.out - -bcheck: bcheck-am - -bcheck-am: - @for i in ; do \ - if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ - echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ - echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ - echo "$$i"; \ - if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ - rm -f $$i.bchecktest.cc; exit 1; \ - fi ; \ - echo "" >> $$i.bchecktest.cc.class; \ - perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ - rm -f a.out; \ - fi ; \ - done - - -#>+ 3 -final: - $(MAKE) all-am - -#>+ 3 -final-install: - $(MAKE) install-am - -#>+ 3 -no-final: - $(MAKE) all-am - -#>+ 3 -no-final-install: - $(MAKE) install-am - -#>+ 3 -kde-rpo-clean: - -rm -f *.rpo - -#>+ 3 -nmcheck: -nmcheck-am: nmcheck diff --git a/po/ar.po b/po/ar.po index b913691..7c7d775 100644 --- a/po/ar.po +++ b/po/ar.po @@ -1,3223 +1,6600 @@ # translation of ar.po to Arabic # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# Mohammed Assar (محمد عَصَر) , 2003 -# Mohammed Assar (محمد عَصَر) , 2003 # +# Mohammed Assar (محمد عَصَر) , 2003. +# Ma'moun Diraneyya , 2008, 2009. msgid "" msgstr "" -"Project-Id-Version: KMess\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2007-07-06 22:23+0300\n" -"Last-Translator: عبدالعزيز الشريف \n" -"Language-Team: Arabeyes \n" +"Project-Id-Version: kmess\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" +"PO-Revision-Date: 2009-04-04 01:11-0500\n" +"Last-Translator: Ma'moun Diraneyya \n" +"Language-Team: Arabic \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: KBabel 1.11.4\n" "X-Poedit-Language: Arabic\n" "X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Mohamed Aser (محمد عَصَر) , عبدالعزيز الشريف" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "aser@arabeyes.org,a.a-a.s@hotmail.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "أنا بعيد عن حاسوبي" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "اسمك" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "يتم تسجيل الدخول..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "أنا بعيد عن حاسوبي" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "%1 قد أرسل غمزة: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "احذ&ف" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "نعاس" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "%1 انضم للمحادثة." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "خملت المحادثة.. %1 غادرها." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 غادر المحادثة." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 و%2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "" + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr " (أرسلت هذه الرسالة تلقائياً)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "%1 أرسل لك غمزة!" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "%1 أرسل لك غمزة!" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 أصبح مُتخفياً" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1 أرسل لك رسالة بخط اليد!" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1 أرسل لك رسالة بخط اليد!" + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "لا يمكن عرض الغمزة. غير قادرٍ على قراءة البيانات." + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 أرسل لك غمزة!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 أرسل لك غمزة!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "لا يمكن عرض الغمزة. غير قادرٍ على قراءة البيانات." + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "لا يمكن عرض الغمزة. غير قادرٍ على قراءة البيانات." + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "لا يمكن عرض الغمزة. غير قادرٍ على قراءة البيانات." + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "لا يمكن عرض الغمزة. غير قادرٍ على قراءة البيانات." + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "لا يمكن عرض الغمزة. غير قادرٍ على قراءة البيانات." + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 صار خاملاً" + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 ألغى نقل الملف!" + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 أرسل لك وكزة!" + +#: chat/chat.cpp:1463 +#, 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 متراسل(ون)" + +#: chat/chat.cpp:1476 +#, kde-format +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:1481 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "%1 أرسل لك رسالةً دون اتصال:
'%2'" + +#: chat/chat.cpp:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 أرسل لك رسالةً دون اتصال:
'%2'" + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "" + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "أرسلت وكزة إلى %1!" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "أرسلت وكزة!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 يرسل غمزة: %2" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 يقول:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 -msgid "Add this emoticon: %1" +#: chat/chatmessageview.cpp:322 +#, kde-format +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/chatview.cpp:463 -msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." -msgstr "لا يمكن حفظ سجل الدردشة. تأكد أن لديك الأذون للكتابة في مجلد السجلات." +#: chat/chatmessageview.cpp:366 +#, kde-format +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/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatmessageview.cpp:406 +#, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:653 +#, kde-format +msgid "Add this emoticon: %1" +msgstr "أضف هذا الوجه: %1" + +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "ا&تصال" + +#: chat/chatview.cpp:300 +#, fuzzy, kde-format +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:439 +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:458 +#, fuzzy, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" -msgstr "كتابة فوق الملف" +msgstr "اكتُب فوق الملف" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "كت&ابة فوق الملف" +msgstr "ا&كتب فوقه" -#: chat/chatview.cpp:919 -#, fuzzy +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." -msgstr "اظهر &تعبير وجوه" +msgstr "أ&ضف هذا الوجه..." -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 #, fuzzy +msgid "Hide this &Emoticon" +msgstr "أ&ضف هذا الوجه..." + +#: chat/chatview.cpp:834 msgid "Send &Email" -msgstr "ا&رسل بريد إلكتروني" +msgstr "أ&رسل رسالةً بريديةً" -#: chat/chatview.cpp:926 +#: chat/chatview.cpp:838 #, fuzzy -msgid "Copy E&mail" -msgstr "البريد الإلكتروني" +msgid "Add &Contact" +msgstr "أ&ضف المُتراسل" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "انسخ ال&عنوان" + +#: chat/chatview.cpp:848 msgid "Visit &Link" -msgstr "" +msgstr "&زُر الوصلة" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" -msgstr "" +msgstr "انسخ ال&عنوان" -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "&انسخ نص" +#: chat/chatview.cpp:868 +#, fuzzy +msgid "&Copy Text" +msgstr "انسخ الن&ص" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" -msgstr "حدد &الكلّ" +msgstr "حدد ال&كلّ" -#: chat/chatview.cpp:948 -#, fuzzy -msgid "Save chat to &File" -msgstr "احفظ &إلى ملف" - -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "دردشة" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "لا يمكنك بدء هذه الدعوة بسبب وجود جهات اتصال متعددة في الدردشة." - -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 انضم للدردشة." - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "%1 غادر الدردشة." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 غادر الدردشة." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - دردشة" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 و %2 - دردشة" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" +#: chat/chatview.cpp:870 +msgid "Find &Text..." msgstr "" -#: chat/chatwindow.cpp:737 +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +#, fuzzy +msgid "C&lear Chat" +msgstr "امحِ اللسان" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." +msgstr "ا&حفظ المُحادثة في ملف" + +#: chat/chatwindow.cpp:115 msgid "Contacts" -msgstr "جهات الاتصال" +msgstr "المُتراسلون" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" -msgstr "تعابير الوجه" +msgstr "الوجوه التعبيرية" -#: chat/chatwindow.cpp:799 +#: chat/chatwindow.cpp:128 #, fuzzy -msgid "My emoticons" -msgstr "تعابير الوجه" +msgid "My Emoticons" +msgstr "وجوهي الخاصة" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (هذه الرسالة أرسلت تلقائياً)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "الغمزة لا يمكن عرضها. تأكد من تركيب'cabextract'" - -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "الغمزة لا يمكن عرضها. البيانات لا يمكن قرائتها" - -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "لديك غمزة من %1" - -#: chat/chatwindow.cpp:1791 -#, fuzzy -msgid "The message '%1' could not be sent." -msgstr "الرسالة \"%1\" لم يتم استلامها" - -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "لديك وكزة من %1!" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "ارسلت وكزة إلى %1!" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "ارسلت وكزة!" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 يكتب." - -#: chat/chatwindow.cpp:1985 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1 و %2 - دردشة" - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." +"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/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "ارسل &ملف" +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "" -#: chat/chatwindowinterface.cpp:174 -msgid "Start a &Meeting" -msgstr "ابدأ &اللقاء" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "" -#: chat/chatwindowinterface.cpp:175 -msgid "Send a &Nudge!" -msgstr "ارسل &وكزة" +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "أمر للسان الحاليٍّ" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "ابدأ أو أوقف &المحادثة" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "احفظ الدردشة" - -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" +#: chat/chatwindow.cpp:451 +#, fuzzy +msgid "&Invite..." msgstr "&دعوة" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&دردشة" +#: chat/chatwindow.cpp:452 +#, fuzzy +msgid "Send a &File..." +msgstr "أرسل &ملفاً" -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "" + +#: chat/chatwindow.cpp:454 +msgid "Start a &Meeting" +msgstr "ابدأ ل&قاءًً" + +#: chat/chatwindow.cpp:455 +msgid "Send a &Nudge!" +msgstr "أرسل &وكزة" + +#: chat/chatwindow.cpp:456 +#, fuzzy +msgid "Save Chat..." +msgstr "احفظ المحادثة" + +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:462 msgid "Change &Font" -msgstr "غيير &الخط" +msgstr "غيِّر الخ&ط" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" -msgstr "غيير &لون الخط" +msgstr "غيِّر لو&ن الخط" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "ادرج تعبير وجه" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" -msgstr "اظهر &تعبير وجوه" +msgstr "أ&ظهر الوجوه التعبيرية" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "اظهر/اخفي شريط &جهات الاتصال الجانبي" - -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "اظهر او اخفي شريط جهات الاتصال الجانبي" - -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "ا&رسل بريد إلكتروني" - -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:471 #, fuzzy +msgid "Show S&tatus Messages" +msgstr "أ&ظهر وقت الرسائل" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "&Panels" +msgstr "ألغِ" + +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "استخدم تدد&يققاً إملائياً" + +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "لقاء" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "وكزة" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "أرسل &ملفاً" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +msgid "Enable or disable the contacts panel" +msgstr "" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "المُتراسلون" + +#: chat/chatwindow.cpp:513 +msgid "Enable or disable the standard emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "الوجوه التعبيرية" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "اضغط هنا لإضافة وجه تعبيريٍّ مُخصص، كي تُرسله لمتراسليك." + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "وجوهي الخاصة" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "ال&خط" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "&لون الخط" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "" + +#: chat/chatwindow.cpp:603 +#, fuzzy +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "ابدأ أو أوقف محا&دثة" + +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +#, fuzzy +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "أمر:" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "محادثة" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "محادثة- %1" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1 يكتب.." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 و%2 - يكتبان.." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1 و%2 و%3 آخرون يكتبون.." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "أ&رسل رسالةً بريديةً" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" -msgstr "اظهر المعلومات الخا&صة" +msgstr "أظهر ص&فحته الشخصية" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&خصائص" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" -msgstr "ا&ضف جهة اتصال" +msgstr "أ&ضف المُتراسل" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" -msgstr "ا&سمح جهة اتصال" +msgstr "ا&قبل المُتراسل" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" -msgstr "احذ&ف جهة اتصال" +msgstr "احذ&ف المُتراسل" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" -msgstr "اح&ظر جهة اتصال" +msgstr "اح&ظر المُتراسل" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" -msgstr "ال&غي حظر جهة اتصال" +msgstr "أل&غِ حظر المُتراسل" -#: chat/contactframe.cpp:241 -#, fuzzy +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" -msgstr "اسمك المفضل:" +msgstr "الاسم" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" -msgstr "" +msgstr "الرسالة ال&شخصية" -#: chat/contactframe.cpp:243 -#, fuzzy +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" -msgstr "عنوان البريد الإلكتروني:" +msgstr "عنوان ال&بريد الإلكتروني" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" msgstr "" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "م&علومات" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "صورة العرض" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +#, fuzzy +msgid "&Notes" +msgstr "نغمة" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "الو&جوه" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" +msgstr "ان&سخ..." + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "محظور" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "بالخارج" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "المُتراسل: %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "سأعود حالاً" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "مشغول" +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "أضف مُتراسلاً" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "غير متصل" +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "أ&ضف وجهاً..." -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "بالخارج - خامد" +#: chat/emoticonswidget.cpp:453 +#, fuzzy +msgid "Edit" +msgstr "&حرِّر" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "بالخارج للغداء" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "أزل" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "وندز موبايل" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "مِرسال وِب" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "مرسال وندز لايف" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "متوافقٌ مع مِرسال مايكروسفت %1" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "مِرسال وندز لايف %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "مرسال وندز لايف" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "متوافقٌ مع مرسال وندز لايف %1" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "متوافقٌ مع مرسال وندز لايف %1" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "متصل" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "مشغول" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "بعيد" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "بعيد، مع رد تلقائي" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "خامل" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "سأعود حالاً" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "على الهاتف" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "جهة الاتصال هذه متصلة" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "خارج للغداء" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "تصميم نص الدردشة" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" -msgstr "مخفي" +msgstr "متخفٍّ" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "غير متصل" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "اضف جهة اتصال" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&حالتي" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "ادخل البريد الالكتروني للشخص الذي تود اضافته:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "اسم الدخول المعطى غير سليم!" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: contact/msnstatus.cpp:218 #, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "ا&قطع الاتصال" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "أضف مُتراسلاً" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" -msgstr "اظهر &تعبير وجوه" +msgstr "أضف وجهاً" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 +#: dialogs/addemoticondialog.cpp:130 #, fuzzy -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" -"المف '%1' موجود مسبقاً.\n" -"هل تريد الكتابة فوقه?" +msgid "Edit Emoticon" +msgstr "الوجوه التعبيرية" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "حدّد رسالة الخروج" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "الوجه \"%1\" موجود بالفعل. أتريد استبداله؟" #: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "رسالة تل&قائيَّة" + +#: dialogs/chathistorydialog.cpp:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "ت&صميم المُحادثة:" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"ادخل الرسالة التي سترسل تلقائياً\n" -"الى الأشخاص الذين يحاولون مراسلتك:" -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "استخدم اسم بديل لهذا الشخص" +#: dialogs/chathistorydialog.cpp:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "غير قادرٍ على فتح منفذ محلي." -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "اظهر فقاعة منبثقة عندما يكون هذا الشخص متصل أو غير متصل" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "ولوجٍ..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "الصورة:" +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "&خزِّن المحادثات كلها" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "الصوت:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "لقد أضافك أحدهم" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2) \n" +"قد أضافك(تك) لقائمة مُتراسليه(ها)." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2) \n" +"قد أضافك(تك) لقائمة مُتراسليه(ها)." + +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" -msgstr "خصائص جهة الاتصال لـ %1" +msgstr "خصائص المتراسل %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "عنوان البريد الإلكتروني: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "متصل" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "الاسم الحالي:" +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +#, fuzzy +msgid "Not seen yet" +msgstr "آخر مُشاهدة: " -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +#, fuzzy +msgid "No messages yet" +msgstr "أ&ظهر وقت الرسائل" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "آخر مُشاهدة: " + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "آخر مُشاهدة: " + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "عنوان البريد:" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "الزبون: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "أمتأكد من أنك تريد حذف هذا الحساب؟" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "رُفضت الدعوة؛ لعدم دعم المِرسال الآخر لها." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "المُتراسلون" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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, kde-format +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 +msgid "The export of the contact list is finished" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "نافذة الشبكة" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "احفظ لسان" +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "اح&فظ اللسان" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "امحو لسان" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "امحِ اللسان" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "إغلق لسان" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "لاتوجد اتصالات حالياً. لا يمكن فتح نافذة الشبكة." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"لا اتصالات حاضرة حالياً.\n" +"لا يمكن فتح نافذة الشبكة." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" -"لا يمكن حفظ سجل نافذة الشبكة. تأكد أن لديك الأذون للكتابة في مجلد السجل " +"تعذَّر حفظ سجل نافذة الشبكة. تأكد من امتلاكك الإضن للكتابة في مجلد السجلات." -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." -msgstr "لا يمكن إغلاق لسان الاتصال الرئيسي" +msgstr "لا يمكن إغلاق لسان الاتصال الرئيسي." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 -msgid "Cancelled" -msgstr "" - -#: dialogs/transferentry.cpp:160 -msgid "Failed!" -msgstr "" - -#: dialogs/transferentry.cpp:202 +#: dialogs/networkwindow.cpp:1273 #, fuzzy +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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 "الحاسوب" +msgstr "اكتمل" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" -msgstr "%1 ميجا بايت" +msgstr "%1 م.ب" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" -msgstr "%1 كيلو بايت" +msgstr "%1 ك.ب" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 بايت" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" +#: dialogs/transferentry.cpp:343 +#, fuzzy, kde-format +msgid "%1 of %2 received." +msgstr "استقبلت %1 من %2" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" +#: dialogs/transferentry.cpp:347 +#, fuzzy, kde-format +msgid "%1 of %2 sent." +msgstr "أرسلت %1 من %2" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "غير محدود" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" -msgstr "تم نقل الملف." +msgstr "نقل الملفات" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +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:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "أمتأكد من أنك تريد حذف هذا الحساب؟" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "صورة العرض" + +#: emoticontheme.cpp:627 +#, fuzzy, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -"لا يمكن حفظ سجل نافذة الشبكة. تأكد أن لديك الأذون للكتابة في مجلد السجل " +"لا يمكن حفظ سمة الوجوه التعبيرية. تأكد من امتلاكك الإذن للكتابة على مجلد " +"السمات." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "ابتسامة" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "غمزة" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" -msgstr "أخرس" +msgstr "لسان ممدود" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "ابتسامة كبيرة" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" -msgstr "حزين" +msgstr "حزن" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" -msgstr "يصرخ" +msgstr "بكاء" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" -msgstr "غاضب" +msgstr "غضب" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" -msgstr "حيران" +msgstr "حيرة" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" -msgstr "محرج" +msgstr "حياء" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" -msgstr "خائب الأمل" +msgstr "خيبة أمل" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" -msgstr "هائج" +msgstr "هيج" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" -msgstr "" +msgstr "كشف أنياب" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" -msgstr "" +msgstr "مبتدئ" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" -msgstr "مريض" +msgstr "مرض" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "مفاجأة" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "حفلة" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" -msgstr "نعسان" +msgstr "نعاس" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" -msgstr "مفكر" +msgstr "تفكير" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "لا تخبر أحداً" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "بلاغ سري" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" -msgstr "" +msgstr "تقليب عينين" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" -msgstr "متهكم" +msgstr "تهكُّم" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "لا أعرف" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "سأعود حالاً" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "ملاك" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" -msgstr "" +msgstr "مُعانقة يسارية" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "ولد" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "قلب أحمر" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" -msgstr "" +msgstr "وردة حمراء" -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "" +#: emoticontheme.cpp:862 +#, fuzzy +msgid "Thumbs up" +msgstr "إبهام للأعلى" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "وجه كلب" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" -msgstr "الشمس" +msgstr "شمس" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" -msgstr "الشيطان" +msgstr "شيطان" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" -msgstr "" +msgstr "مُعانقة يمينية" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "فتاة" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "قلب محطم" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" -msgstr "" +msgstr "وردة ذابلة" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" -msgstr "" +msgstr "إبهام للأسفل" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "وجه قطة" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" -msgstr "" +msgstr "نصف قمر نائم" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" -msgstr "" +msgstr "شِفاه حمراء" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "تصفيق" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" -msgstr "" +msgstr "أصابع متشابكة" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" -msgstr "تلقائي" +msgstr "سيارة" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "طائرة" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" -msgstr "" +msgstr "سلحفاة" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "حلزون" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "" +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "نعاس" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" -msgstr "عنزة" +msgstr "ماعز" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" -msgstr "" +msgstr "خفَّاش" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "بيتزا" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" -msgstr "" +msgstr "كأس فوَّار" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" -msgstr "" +msgstr "كأس عصير" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "كوب قهوة" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" -msgstr "كعكة الميلاد" +msgstr "كعكة" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "طبق" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" -msgstr "رمية" +msgstr "زبديَّة" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "نجمة" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "قوس قزح" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" -msgstr "سحابة عاصفة" +msgstr "غيمة عاصفة" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" -msgstr "البرق" +msgstr "برق" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" -msgstr "المظلّة" +msgstr "مظلّة" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" -msgstr "" +msgstr "جزيرة مع النخيل" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" -msgstr "مستلم الهاتف" +msgstr "سمَّاعة هاتف" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "هاتف نقال" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" -msgstr "البريد الإلكتروني" +msgstr "رسالة بريدية" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" -msgstr "الساعة" +msgstr "ساعة" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" -msgstr "الكاميرا" +msgstr "كمِرة" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" -msgstr "مقطع سينمائي" +msgstr "مقطع سِنمائي" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" -msgstr "ملاحظة" +msgstr "نغمة" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" -msgstr "الأصفاد" +msgstr "أصفاد" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" -msgstr "المال" +msgstr "مال" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" +msgstr "لمبة" + +#: emoticontheme.cpp:906 +#, fuzzy +msgid "Cigarette" +msgstr "سِجارة" + +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "سيجارة" - -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "كرة قدم" - -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" -msgstr "" +msgstr "هدية" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" -msgstr "X-Box" +msgstr "جهاز ألعاب" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" -msgstr "الحاسوب" +msgstr "حاسوب" -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "KMess أيقونة" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" +msgstr "أيقونة كِمس" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" msgstr "" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "اضف مجموعة" - -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "ادخل اسم جديد لهذه المجموعة:" - -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "بعيداً مع رد تلقائي" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" msgstr "" -#: kmess.cpp:715 +#: initialview.cpp:280 initialview.cpp:375 +#, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" + +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "الخادوم غير مُتاح" + +#: initialview.cpp:401 +#, kde-format +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] "" +msgstr[4] "" +msgstr[5] "" + +#: initialview.cpp:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "ا&تصال" + +#: initialview.cpp:601 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "ألغِ" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "" + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "هذا المُتراسل موجود في قائمتك بالفعل" + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "معلومات الولوج" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "مجموعة جديدة" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "أضف مجموعة" + +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" +msgstr "أدخل اسماً جديداً لهذه المجموعة:" + +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" -msgstr "هل تريد حذف %1 من قائمة الاتصال؟?" +msgstr "أمتأكد من أنك تريد إزالة %1 من قائمة مُتراسليك؟" -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "احذف جهة اتصال" +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" +msgstr "أزل مُتراسلاً" -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "محذوف ومحظور" +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" +msgstr "أزله واحظره" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" -msgstr "هل تريد حذف مجموعة %1 من قائمة الاتصال؟?" +msgstr "أمتأكد من أنك تريد إزالة مجموعة %1 من قائمة مُتراسليك؟" -#: kmess.cpp:763 -msgid "Remove group" -msgstr "احذف مجموعة" +#: kmess.cpp:636 +#, fuzzy +msgctxt "dialog button" +msgid "Remove" +msgstr "أزل" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "هذه مجموعة خاصة ولايمكن تغييرها" +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." +msgstr "هذه مجموعة خاصة، ولايمكن تغييرها." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "أعد تسمية مجموعة" +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "&غيِّر اسم المجموعة" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "متصل" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "أدخل اسماً جديداً لهذه المجموعة:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "اتصال..." + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "غير متصل" -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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:1448 +#, kde-format +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 لن يتمكن من تشغيل الأصوات والاعلامات.

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

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

" -#: kmess.cpp:1673 -msgid "Error with notifications" -msgstr "خطأ مع إعلامات" +#: kmess.cpp:1460 +#, fuzzy, kde-format +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.notifyrc' في أي واحد من المجلدات التالية: %1

توثَّق رجاءً من " +"تثبيتك، وانسخ الملف المفقود إلى إحدى المجلدات المدرجة.

" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "ح&ساب جديد" +#: kmess.cpp:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "خطأ مع تنبيهات" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "جهة ا&تصال جديدة" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "كِمس" -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "مج&موعة جديدة" +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "ا&تصال" -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "ا&بحث عن جهة اتصال" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "ابح&ث بالاهتمامات" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "تعيي&نات الحساب" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "إ&جراءات" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "ات&صل" - -#: kmessinterface.cpp:188 +#: kmessinterface.cpp:161 msgid "&Disconnect" msgstr "ا&قطع الاتصال" -#: kmessinterface.cpp:189 +#: kmessinterface.cpp:162 msgid "Show My &Profile" -msgstr "اظهر &معلوماتي" +msgstr "أ&ظهر صفحتي الشَّخصية" -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&حالتي" - -#: kmessinterface.cpp:220 -msgid "&Connect" -msgstr "ا&تصل" - -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" -msgstr "اظهر ج&هات الاتصال المسموحة" +msgstr "أظهر المُتراسلين الم&قبولين" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" -msgstr "اظهر الجهات ال&غير متصلة" +msgstr "أظهر المُتراسلين &غير المتصلين" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" -msgstr "اظهر ج&هات الاتصال المحذوفة" +msgstr "أظهر المُتراسلين المُ&زالين" -#: kmessinterface.cpp:278 +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:171 #, fuzzy -msgid "Show &Display Pictures" +msgid "&Show Search Bar" +msgstr "أظ&هر الشريط الجانبي" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "أ&ظهر الوجوه التعبيرية" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" msgstr "صورة العرض" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "اظهر نا&فذة الشبكة" - -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" -msgstr "رت&ب جهات الاتصال حسب" +msgstr "افر&ز المُتراسلين حسب" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "أظهر نا&فذة النقل" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "مُترا&سل جديد" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "مج&موعة جديدة" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "افر&ز المُتراسلين حسب" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "&حساب جديد" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "لسان ممدود" + +#: kmessinterface.cpp:186 +#, fuzzy +msgid "Configure &KMess..." +msgstr "ا&ضبط كِمس" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "ابتسامة" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "المجموعة" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" -msgstr "متصل/غير متصل" +msgstr "حالة الاتصال (متصل/غير متصل)" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "اظهر نا&فذة النقل" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "يستمع الآن إلى %1" +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "أظهر نافذة الشب&كة" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "<إدخل رسالتك الشخصية هنا>" +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] ولجت بحساب %2" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] اتصل %2" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] فصل %2" + +#: kmessview.cpp:599 msgid "Cha&t" -msgstr "دردشة" +msgstr "حا&دثه" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&خصائص" +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" +msgstr "أ&زله من المجموعة" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "اح&ذف من مجموعة" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "انقل إلى مجمو&عة" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" -msgstr "انسخ إلى مجمو&عة" +msgstr "انس&خه إلى مجموعة" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "ان&قله إلى مجموعة" + +#: kmessview.cpp:695 msgid "Move Group &Down" -msgstr "حرّك المجموعة للأ&سفل" +msgstr "حرّك المجموعة للأس&فل" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "حرّك المجموعة للأ&على" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" -msgstr "اح&ذف مجموعة" +msgstr "أز&ل المجموعة" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" -msgstr "اعد تس&مية مجموعة" +msgstr "&غيِّر اسم المجموعة" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "لديك 1 بريد إلكتروني جديد في الوارد." +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "" +"%1 (%2) \n" +"قد أضافك(تك) لقائمة مُتراسليه(ها)." -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "لديك %1 بريد إلكتروني جديد في الوارد." +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "عنوان البريد الإلكتروني" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(بالخارج)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "الزبون: " -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(سأعود حالاً)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(مشغول)" +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "نغمة" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(مختفي)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "محظور" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(بالخارج-آلي)" +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "آخر مُشاهدة: " -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(بالخارج للغداء)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "آخر مُشاهدة: " -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(على الهاتف)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "مجموعة %1" + +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "هذا المُتراسل ليس متصلاً" +msgstr[1] "هذا المُتراسل ليس متصلاً" +msgstr[2] "هذا المُتراسل ليس متصلاً" +msgstr[3] "هذا المُتراسل ليس متصلاً" +msgstr[4] "هذا المُتراسل ليس متصلاً" +msgstr[5] "هذا المُتراسل ليس متصلاً" + +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 متراسل(ون)" +msgstr[1] "%1 متراسل(ون)" +msgstr[2] "%1 متراسل(ون)" +msgstr[3] "%1 متراسل(ون)" +msgstr[4] "%1 متراسل(ون)" +msgstr[5] "%1 متراسل(ون)" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<أدخل رسالتك الشخصية هنا>" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "لقد رفضت الدعوة." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "ت&صميم المُحادثة:" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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, kde-format +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:480 settings/accountpage.cpp:541 +msgid "KMess" +msgstr "كِمس" #: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "دخول تلقائي باستخدام البريد الالكتروني المعطى" - -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 -msgid "KMess" -msgstr "KMess" - -#: main.cpp:78 #, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "زبون مِرسال إم إس إن لواجهة كدي" + +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, 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 "Developer and project founder" +msgstr "مؤسِّس المشروع، ومطوِّر فيه" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "مطوِّر" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "داعم للمشروع" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "مطوِّر حالي" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." -msgstr "ترجمة المانية , اختبار , توثيق وصفحة انترنت" +msgstr "الترجمة الألمانية، اختبار الإصدارات، التوثيق، إدارة المشروع... إلخ" -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 msgid "Web design" -msgstr "تصميم ويب" +msgstr "تصميم وِب" + +#: main.cpp:73 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:73 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" +"الترجمة الإيطالية، طقم الوجوه التعبيريَّة الرئيسي، بالإضافة إلى الصفراء/" +"الزرقاء/البنفسجية." + +#: main.cpp:74 +msgid "Cartoon emoticons" +msgstr "الوجوه التعبيرية الكرتونية" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "سمة الأصوات الافتراضية" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "أيقونات كِمس في طقم أُكسجين" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" #: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "صور المشاعر العامة الصفراء/الزرقاء/البنفسجية و الترجمة الايطالية " - -#: main.cpp:81 -msgid "Cartoon emoticons" -msgstr "صور تعابير الوجه الكرتونية" +msgid "Translations Maintainer" +msgstr "" #: main.cpp:82 -msgid "Default sound theme" -msgstr "الأصوات الافتراضية" +msgid "Arabic translation, internationalization of file saving fix." +msgstr "الترجمة العربية، إصلاح حفظ ملف دُوليٍّ." + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "محمد عصَر" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "ترجمة عربية إضافية" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "يوسف الشهيبي" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "الترجمة البرازيلية البرتغالية" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" #: main.cpp:86 -msgid "Arabic translation, internationalization of file saving fix." -msgstr "الترجمة العربي و اصلاح حفظ ملف دولياً" +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "الترجمة البرازيلية البرتغالية" #: main.cpp:87 -#, fuzzy -msgid "More Arabic translation" -msgstr "ترجمة تركية اضافية" +msgid "Sergio Rafael Lemke" +msgstr "" #: main.cpp:88 -msgid "Brazilian Portuguese translation" -msgstr "ترجمة برتغالية برازيلية" +msgid "Maurício Arozi Moraes" +msgstr "" -#: main.cpp:89 -#, fuzzy +#: main.cpp:90 msgid "Catalan translation" -msgstr "ترجمة كاتالونية" +msgstr "الترجمة الكَتلانية" + +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" #: main.cpp:91 #, fuzzy -msgid "Simplified Chinese translation, file send bug fix, proxy connect code" -msgstr "ترجمة صينية مبسطة , اصلا خطأ ارسال ملف" - -#: main.cpp:92 -#, fuzzy -msgid "More Simplified Chinese translation" -msgstr "ترجمة صينية مبسطة , اصلا خطأ ارسال ملف" +msgid "More Catalan translation" +msgstr "ترجمة إيطالية إضافية" #: main.cpp:93 -#, fuzzy -msgid "Traditional Chinese translation" -msgstr "ترجمة صينية تقليدية" +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" +"الترجمة الصينية المبسطة، إصلاح علَّة إرسال ملف، كتابة شفرة الاتصال عبر وسيط" + +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "ترجمة صينية مبسطة إضافية،" #: main.cpp:95 -#, fuzzy -msgid "Danish translation" -msgstr "ترجمة دنماركية" +msgid "Cheng Yang" +msgstr "" #: main.cpp:96 -#, fuzzy -msgid "More Danish translation" -msgstr "ترجمة دانماركية اضافية" +msgid "Traditional Chinese translation" +msgstr "الترجمة الصينية التقليدية" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" #: main.cpp:97 -msgid "Dutch translation" -msgstr "ترجمة ألمانية" +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "الترجمة الصينية التقليدية" -#: main.cpp:98 -msgid "More Dutch translation" -msgstr "ترجمة هولندية اضافية" +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "الترجمة الدِنماركية" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" #: main.cpp:100 -#, fuzzy -msgid "Estonian translation" -msgstr "ترجمة إستونية" +msgid "More Danish translation" +msgstr "ترجمة دِنماركية إضافية" -#: main.cpp:101 -#, fuzzy -msgid "Finnish translation" -msgstr "ترجمة فلندية" +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" -#: main.cpp:102 main.cpp:103 -#, fuzzy -msgid "More Finnish translation" -msgstr "ترجمة فلندية اضافية" +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "الترجمة الهولنديَّة" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 +msgid "More Dutch translation" +msgstr "ترجمة هولندية إضافية" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" #: main.cpp:105 -msgid "French translation" -msgstr "ترجمة فرنسية" +msgid "Elve" +msgstr "" #: main.cpp:106 -#, fuzzy -msgid "More French translation, MSN6 emoticon definitions" -msgstr "ترجمة فرنسية" +msgid "Sander Pientka" +msgstr "" -#: main.cpp:107 +#: main.cpp:108 #, fuzzy -msgid "More French translation" -msgstr "ترجمة فرنسية" +msgid "More German translation, Greek translation" +msgstr "ترجمة إيطالية إضافية" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" #: main.cpp:109 #, fuzzy -msgid "Hungarian translation" -msgstr "ترجمة هنغارية" +msgid "More Greek translation" +msgstr "ترجمة فرنسية إضافية" -#: main.cpp:110 main.cpp:111 -#, fuzzy -msgid "More Italian translation" -msgstr "ترجمة كورية" +#: main.cpp:111 +msgid "Estonian translation" +msgstr "الترجمة الإستونية" + +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" #: main.cpp:112 -msgid "Korean translation" -msgstr "ترجمة كورية" +msgid "Finnish translation" +msgstr "الترجمة الفنلندية" + +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "Markus Vuori" #: main.cpp:113 -#, fuzzy -msgid "Norsk Bokmål translation" -msgstr "ترجمة Norsk Bokml" +msgid "Joonas Niilola" +msgstr "Joonas Niilola" -#: main.cpp:115 -msgid "Slovenian translation" -msgstr "ترجمة سلوفينية" +#: main.cpp:113 main.cpp:114 +msgid "More Finnish translation" +msgstr "ترجمة فنلندية إضافية" + +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" #: main.cpp:116 -msgid "Spanish translation" -msgstr "ترجمة اسبانية" +msgid "Choplair" +msgstr "Choplair" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:116 +msgid "French translation" +msgstr "الترجمة الفرنسية" + +#: main.cpp:117 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "ترجمة فرنسية إضافية، تعاريفُ الوجوه التعبيرية لـMSN6" + +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:118 main.cpp:119 main.cpp:120 +msgid "More French translation" +msgstr "ترجمة فرنسية إضافية" + +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 +msgid "Hungarian translation" +msgstr "الترجمة الهنغارية" + +#: main.cpp:122 #, fuzzy -msgid "More Spanish translation" -msgstr "المزيد من الترجمة الأسبانية" - -#: main.cpp:121 -msgid "Swedish translation" -msgstr "ترجمة سويدية" +msgid "Páder Rezső" +msgstr "Páder Rezsõ" #: main.cpp:123 #, fuzzy -msgid "Thai translation" -msgstr "ترجمة تايلاندية" +msgid "More Hungarian translation" +msgstr "الترجمة الهنغارية" -#: main.cpp:124 -msgid "Turkish translation" -msgstr "ترجمة تركية" - -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "ترجمة تركية اضافية" - -#: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:123 +msgid "Pauli Henrik" msgstr "" +#: main.cpp:124 main.cpp:125 +msgid "More Italian translation" +msgstr "ترجمة إيطالية إضافية" + +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 +msgid "Korean translation" +msgstr "الترجمة الكورية" + +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:128 +msgid "Norsk Bokmål translation" +msgstr "الترجمة النرويجية البُكمالية" + +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + #: main.cpp:130 -msgid "P4-Context field support" +#, fuzzy +msgid "Serbian translation" +msgstr "الترجمة السلوفينية" + +#: main.cpp:130 +msgid "Zoran Milovanović" msgstr "" -#: main.cpp:131 -msgid "Xinerama fixes" -msgstr "اصلاح Xinerama" +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" #: main.cpp:132 -msgid "Original file receive code" -msgstr "كود \"استقبال ملف\" الأصلي" +#, fuzzy +msgid "Slovak translation" +msgstr "الترجمة السلوفينية" #: main.cpp:133 -msgid "Various internationalization fixes." -msgstr "عدة اصلاحات دولية" +#, fuzzy +msgid "Matjaž Kaše" +msgstr "Matjaž kaše" -#: main.cpp:134 +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "الترجمة السلوفينية" + +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:135 +msgid "Spanish translation" +msgstr "الترجمة الإسبانية" + +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 +msgid "More Spanish translation" +msgstr "ترجمة إسبانية إضافية" + +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:144 +msgid "Swedish translation" +msgstr "الترجمة السويدية" + +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "الترجمة السويدية" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:147 +msgid "Thai translation" +msgstr "الترجمة التايلَندية" + +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:148 +msgid "Turkish translation" +msgstr "الترجمة التركية" + +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "ترجمة تركية إضافية" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:154 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" +"شفرة الصور في قائمة المُتراسلين، معلومات الزبون عند المُتراسلين، تكبير خطِّ " +"المُحادثة" + +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "نقل الملفات" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 +msgid "P4-Context field support" +msgstr "دعم P4-Context" + +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:157 +msgid "Xinerama fixes" +msgstr "إصلاح Xinerama" + +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:158 +msgid "Original file receive code" +msgstr "الشفرة الأصلية لاستقبال الملفات" + +#: main.cpp:159 +#, fuzzy +msgid "KWallet support" +msgstr "داعم للمشروع" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "بضعة إصلاحات دوليَّة" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:166 +msgid "Various internationalization fixes." +msgstr "بضعة إصلاحات دوليَّة" + +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "مطور GnomeMeeting" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" -msgstr "شخص بكيس فوق رأسه" +msgstr "صورة الشاب ذي الكيس فوق رأسه" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:172 msgid "Inspiration and assorted code" -msgstr "شفرة متجانسة و محفزة" +msgstr "شفرة متجانسة ومُلهِمة" -#: main.cpp:139 +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:173 #, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "كود البالون المنبثق" +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" +"شفرة البالونات المُنبثقة القديمة، شفرة الندِّ للندِّ الأولية، مُدبِّر تحديات إم إس إن" -#: main.cpp:140 +#: main.cpp:174 msgid "Idle timer code" -msgstr "شفرة مؤقت الخمود" +msgstr "شفرة مؤقت الخمول" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:175 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" +msgstr "شفرة الإغلاق إلى شريط المهام" + +#: main.cpp:176 +msgid "Amarok" msgstr "" -#: main.cpp:144 -#, fuzzy -msgid "Your name here?" -msgstr "اسمك" +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" -#: main.cpp:144 +#: main.cpp:179 +#, fuzzy msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" msgstr "" +"نُرحِّب بإرسالك إصلاحات للعلل أو رُقعات إلى منتديات مساعدة كِمس!\n" +"إذا شعرت بأن اسمك مفقود هنا فراسلنا رجاءً!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:179 +msgid "Your name here?" +msgstr "اسمك هنا؟" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "مأمون ديرانية" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "عنوان البريد الإلكتروني" + +#: main.cpp:189 +msgid "Do not show the contact list window initially" +msgstr "" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "ولوجٌ تلقائي بالبريد المُعطى" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "أجرِ اختباراً تنقيحياً (نسخة المطورين فقط)" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "مقبول" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "مُزال" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." -msgstr "لقد قامت جهة الاتصال بإلغاء الجلسة." +msgstr "ألغى المُتراسل الجلسة." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." -msgstr "لقد قامت جهة الاتصال برفض الدعوة." +msgstr "رفض المُتراسل الدعوة." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "لقد ألغيت الجلسة." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "لقد رفضت الدعوة." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to
accept or cancel?" -msgstr "هل تريد قبول أو إلغي?" +msgstr "هل تريد قبوله أم إلغاءه؟" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." -msgstr "إنقر إلغي." +msgstr "اضغط هنا لإلغائه." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "هل تريد قبول الملف: %1 (%2 بايت)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "نقل %1 فشل. لا يمكن فتح الملف." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" +msgstr "" +"المف '%1' مُنشأ مسبقاً.\n" +"هل تريد الكتابة فوقه؟" -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "جاري الاتصال بـ %1, منفذ %2" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "فشل نقل %1. لا يمكن فتح الملف." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "النقل تم إلغائه" +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "فشل نقل %1. لا يمكن فتح الملف." -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "تأسيس الاتصال" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "ملف منقول بنجاح: %1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "نقل %1 فشل. الملف غير موجود مسبقاً." - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "نقل %1 فشل. الملف لا يمكن قرائته." - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "ارسال ملف %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." -msgstr "النقل تم قبوله" +msgstr "قُبل النقل." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "الاتصال جارٍ بـ%1, منفذ %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "ألغى المُتراسل النقل." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "لقد ألغيت الجلسة." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "لقد رفضت الدعوة." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "تأسس اتصال" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "نُقل بنجاح الملف: %1" + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "نُقل بنجاح الملف: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "فشل نقل %1. الملف غير موجود." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "فشل نقل %1. لا تُمكن قراءة الملف." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." +msgstr "إرسال الملف %1 (%2)" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "ألغى المُتراسل النقل." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 -#, fuzzy +#: 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 "تم إلغاء دعوة نقل الملف. بيانات سيئة تم استقبالها." +msgstr "أُلغيت دعوة نقل الملف. استُقبلت بيانات سيئة." -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "نقل %1 فشل. لا يمكن فتح الملف" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "لقد ألغيت الجلسة." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "لقد قامت جهة الاتصال بإلغاء النقل." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" +msgstr "غير قادرٍ على كتابة الملف" -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "نقل %1 فشل. الملف غير موجود مسبقاً." - -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "نقل %1 فشل. الملف لا يمكن قرائته." - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "ارسال ملف %1" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "أنت مدعو لبدء لقاء (باستخدام GnomeMeeting)." +msgstr "أنت مدعوٌّ لبدء لقاء (باستخدام GnomeMeeting)." -#: network/applications/gnomemeeting.cpp:114 -#, fuzzy +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "يتم تشغيل GnomeMeeting. الاتصال بـ %1." +msgstr "بدء GnomeMeeting. يتصل بـ%1." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "دعوة جهة الاتصال إلى لقاء" +msgstr "دعوة المُتراسلين إلى لقاء." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "الدعوة تم رفضها. ليست مدعومة من قبل الزبون الآخر." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "رُفضت الدعوة؛ لعدم دعم المِرسال الآخر لها." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "الدعوة تم إحباطها. حدوث خطأ داخلي." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "أُحبطت الدعوة. حدث خطأ داخلي." -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "الدعوة تم إحباطها. مهلة الانتظار لقبول المستخدم." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "أُحبطت الدعوة؛ لانتهاء مهلة انتظار قبول المستخدم." -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "الدعوة تم إحباطها. مهلة الانتظار لبيانات الملف." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "أُحطبت الدعوة؛ لانتهاء مهلة انتظار بيانات الملف." -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "" +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "أُحبطت الدعوة؛ لانتهاء مهلة انتظار قبول المستخدم." -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." -msgstr "الدعوة تم إحباطها." +msgstr "أُحبطت الدعوة." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "أنت مدعو لمشاركة سطح المكتب لهذا الشخص." - -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:52 #, fuzzy +msgid "You are invited to share this contact's desktop." +msgstr "أنت مدعوٌّ لتشارك سطح المكتب هذا الشخص." + +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." -msgstr "يتم تشغيل KRDC. الاتصال بـ " +msgstr "بدء KRDC. الاتصال بـ%1." -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "دعاك المُتراسل إلى '%1'؛ لكن هذه الميزة لم تُضمَّن بعد." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." -msgstr "الدعوة تم إلغائها. جهة الاتصال ارسلت بيانات سيئة, أو KMess لا يدعمها." +msgstr "أُلغيت الدعوة؛ فإما أن المُتراسل بعث بيانات سيئة، أو أن كِمس لا يدعمها." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "النقل فشل. تجهيز البيانات فشل." - -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "جهة الاتصال قامت برفض الدعوة. حدوث خطأ داخلي." - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "النقل فشل" - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 +#: network/applications/p2papplication.cpp:1085 #, fuzzy -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "النقل فشل. جهة الاتصال ارسلت بيانات سيئة, أو KMess لا يدعمها." +msgid "The transfer failed. Data preparation failed." +msgstr "فشل النقل. فشل تحضير البيانات." -#: network/applications/p2papplication.cpp:2038 -#, fuzzy +#: network/applications/p2papplication.cpp:1192 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "الدعوة تم إلغائها. الرسالة لم توجه إليهم." +msgstr "أُلغيت الدعوة. الرسالة لم توجه إلينا." -#: network/applications/p2papplication.cpp:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 #, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "النقل فشل. جهة الاتصال ارسلت بيانات سيئة, أو KMess لا يدعمها." +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "فشل النقل؛ فإما أن المُتراسل بعث بيانات سيئة، أو أن كِمس لا يدعمها." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "رفض المُتراسل الدعوة. حدث خطأ داخلي." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" -msgstr "انتظار الاتصال على %1, منفذ %2" +msgstr "الاتصال المُنتظر على %1, منفذ %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "النقل فشل. مهلة الانتظار لقبول المستخدم." - -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "النقل فشل. حدوث خطأ داخلي." - -#: network/applications/p2papplication.cpp:3670 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "النقل فشل. لا يمكن فتح مصدر البيانات." - -#: network/applications/p2papplication.cpp:4844 -#, fuzzy +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" -msgstr "انتظار قائمة الاتصال..." +msgstr "انتظار الاتصال" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." -msgstr "فشل لم أستطع انشاء مقبس" +msgstr "أُلغيت الدعوة؛ لانتهاء مهلة انتظار قبول المستخدم." -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." -msgstr "فشل لم أستطع انشاء مقبس" +msgstr "أُلغيت الدعوة؛ لانتهاء مهلة انتظار الاتصال لينجح أو يفشل." -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "" - -#: network/applications/voiceconversation.cpp:77 -msgid "You are invited to start a voice conversation." -msgstr "أنت مدعو للبدء بمحادثة صوتية." - -#: network/applications/voiceconversation.cpp:82 +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 #, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "أُلغيت الدعوة؛ لانتهاء مهلة انتظار البيانات." + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "رفض المُتراسل الدعوة. حدث خطأ داخلي." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "فشل النقل." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "فشل النقل؛ لانتهاء مهلة انتظار قبول المستخدم." + +#: network/applications/p2papplicationbase.cpp:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "فشل النقل. حدث خطأ داخلي." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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 "أنت مدعو لبدأ لقاء (باستخدام GnomeMeeting)." +msgstr "قد دُعيت لعقد محادثة صوتية؛ لكنَّ دعم هذه الميزة غير مُثبتك عندك." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "لقد ألغيت المحادثة الصوتية." +msgstr "لقد ألغيتَ المحادثة الصوتية." -#: network/applications/voiceconversation.cpp:211 +#: network/applications/voiceconversation.cpp:205 #, fuzzy -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "الدعوة تم إلغائها. أداة الصوت لا يمكن فتحه." +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "أُلغيت الدعوة؛ لا يُمكن فتح جهاز الصوت." -#: network/applications/voiceconversation.cpp:222 -#, fuzzy +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." -msgstr "يتم تشغيل المحادثة الصوتية. يتصل بـ %1." +msgstr "بدء محادثة صوتية. يتصل بـ%1." -#: network/applications/voiceconversation.cpp:228 -#, fuzzy +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." -msgstr "يتم تشغيل المحادثة الصوتية. يستمع على %1." +msgstr "بدء محادثة صوتية. يستمع إلى %1." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." -msgstr "دعوة جهة الاتصال الى محادثة صوتية" +msgstr "دعوة المُتراسل إلى محادثة صوتية." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -#, fuzzy +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format msgid "The contact is inviting you for '%1', but this is not implemented yet." -msgstr "جهة الاتصال تدعوك لبدأ" +msgstr "دعاك المُتراسل إلى '%1'؛ لكن هذه الميزة لم تُضمَّن بعد." -#: network/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "نقل %1 تم إلغائه." +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "أُلغيت دعوة نقل الملف. استُقبلت بيانات سيئة." -#: network/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "أنت مدعوٌّ لتشارك سطح المكتب هذا الشخص." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "كمِرة وِب" + +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "لقد ألغيت الجلسة." + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "ألغى المُتراسل النقل." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "فشل" -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "نقل%1 فشل. لا يمكن فتح منفذ محلي." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "إرسال الملف %1" -#: network/extra/msnftpconnection.cpp:411 +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "فشل نقل %1. غير قادرٍ على فتح منفذ محلي." + +#: network/extra/msnftpconnection.cpp:399 #, fuzzy -msgid "Couldn't open a local port." -msgstr "نقل%1 فشل. لا يمكن فتح منفذ محلي." +msgid "Could not open a local port." +msgstr "غير قادرٍ على فتح منفذ محلي." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "ابدأ نقل الملفات" +msgstr "تمهيد نقل الملف" -#: network/extra/msnftpconnection.cpp:481 -#, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "فشل الاتصال لم يتم" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "فشل نقل %1؛ غير قادرٍ على تأسيس اتصال." -#: network/extra/msnftpconnection.cpp:482 -#, fuzzy +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "عاجز عن تكوين اتصال: %1" +msgstr "غير قادرٍ على تأسيس اتصال." -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" -msgstr "استلام ملف %1" +msgstr "استلام الملف %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." -msgstr "" +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "صياغة أمر غير صالحة" -#: network/msnconnection.cpp:733 +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "مُعامل أمر غير صالح" + +#: network/msnconnection.cpp:384 #, fuzzy -msgid "1 ping lost" -msgstr "استلام القائمة" +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "البريد الإلكتروني الذي تحاول إضافته ليس حساب مِرسال MSN" -#: network/msnconnection.cpp:737 +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "اسم نطاق مفقود" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "ولجت بالفعل" + +#: network/msnconnection.cpp:396 #, fuzzy -msgid "%1 pings lost" -msgstr "استلام القائمة" +msgid "The given account name is invalid" +msgstr "اسم الحساب المُعطى غير صالح" -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "الاتصال بالخادم قد فقد" - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "الخادم عن بعد إغلق الاتصال" - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "مسموح" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "محذوف" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "أظهر حالة خدمة مراسل MSN?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "خطأ الخادم" - -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:400 #, fuzzy msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "" -"لقد أصبحت غير متصل لأنك \n" -"اتصل من برنامج msn messenger آخر \n" -"او من موقع آخر" +"This account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "اسم ذاك الحساب غير صالح، أو أنك لم تُفعِّل خدمة passport بعد." -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "حصلت المزامنة" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "التوثيق" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "استلام تأكيد المستخدم" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "انتظار قائمة الاتصال..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "تحويل لخادم الإعلام" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "التوثيق فشل, من فضلك تحقق من اسم الحساب وكلمة السر" - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "جاري الاتصال..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess استقبل أمر مجهول من الخادم: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "هناك خطأ داخلي في KMess: %1" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "البريد الإلكتروني الذي تحاول إضافته ليس حساب مراسل MSN" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "اسم الحساب المعطى غير سليم" - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" -msgstr "قائمة جهات الاتصال لديك ممتلئة" +msgstr "قائمة مُتراسليك ممتلئة" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "مُعامل SBP غير صالح" + +#: network/msnconnection.cpp:411 msgid "This contact is already on your list" -msgstr "جهة الاتصال هذه موجودة في قائمتك" +msgstr "هذا المُتراسل موجود في قائمتك بالفعل" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 msgid "This contact is not on your list" -msgstr "جهة الاتصال هذه ليست في قائمتك" +msgstr "هذا المُتراسل ليس في قائمتك" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" -msgstr "جهة الاتصال هذه متصلة" +msgstr "هذا المُتراسل ليس متصلاً" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "قائمة جهات الاتصال لديك لديها مجموعات كثيرة جداً" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "في هذا الوضع مُسبقاً" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "هذه المجموعة لا يمكن تغييرها" +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"أضفت مُسبقاً اسم المجموعة هذا في مِرسالك، أو في قائمة مُتراسلي هُتميل لديك. " +"استخدم رجاءً اسماً مختلفاً." + +#: network/msnconnection.cpp:436 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30" +msgstr "قائمة مُتراسليك فيها مجموعات كثيرة جداً" + +#: network/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "لا يُمكن تغيير هذه المجموعة" + +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "المُتراسل ليس مضافاً في هذه المجموعة" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "هذه المجموعة ليست فارغة" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" msgstr "" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "اسم المجموعة طويل جداً" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "هناك خطأ داخلي في كِمس: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "مجموعة غير صالحة" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "نطاقٌ فارغ" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2303 -#, fuzzy +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" -msgstr "تحويل لتنبيه الخادم" +msgstr "" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "خطأ اتصال مُباشر (MSNSLP)؛ فشل الاتصال" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "أحد الحقول المطلوبة مفقود" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "لم تلج" + +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" msgstr "" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "" +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "عُطِّل الأمر" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "" - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr " قمت بفتح عدة جلسات بسرعة" - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "لديك عدة جلسات مفتوحة" - -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:500 #, fuzzy +msgid "Your account is banned" +msgstr "حسابك ممنوع." + +#: network/msnconnection.cpp:504 +msgid "Challenge response failed" +msgstr "" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "بيانات أمر غير جيدة" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "أنت تفتح جلسات محادثات بسرعة فائقة" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "جلسات المحادثات المفتوحة كثيرة جداً" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "تتابع أوامر غير مُتوقع" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" -msgstr "اسم ودي سيئ:" - -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" msgstr "" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." -msgstr "لا يمكنك بدأ محادثة مع شخص وأنت في حالة مخفي." - -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN خطأ" +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "قسيمة الاستيثاق كانت خاطئة" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "هناك خطأ داخلي في الخادم" +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "لا يمكنك بدء محادثة مع أحد أثناء اختفائك." -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "الخادم مشغول جداً" +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "مُتراسل جديد غير مقبول" -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "الخادم غير متوفر" +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" +"تملك حساب passport للأطفال، أنت بحاجة لموافقة ذويك حتى تتمكن من التحدث على " +"الهواء." -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "حسابك في خدمة passport يحتاج تفعيلاً أولاً." + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "خطأ في الوصول إلى قائمة المُتراسلين، حاول مجدداً لاحقاً" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "خدمة MSN غير مُتاحة مؤقتاً؛ هناك خطأ داخلي في الخادوم." + +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "خدمة MSN غير مُتاحة مؤقتاً؛ الخادوم مشغول جداً." + +#: network/msnconnection.cpp:599 msgid "Peer notification server down" -msgstr "خادم إعلام الند مغلق" +msgstr "خادوم تنبيه الندِّ مغلق" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" -msgstr "الخادم سيتم إغلاقه" +msgstr "سيُغلق الخادوم" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" -msgstr "الخادم سيغلق قريباً" +msgstr "سيُغلق الخادوم قريباً" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "الكتابة محظورة" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "الجلسة ممتلئة" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" -msgstr "الخادم غير متوفر" +msgstr "الخادوم غير مُتاح" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" -msgstr "فشل التوثيق" +msgstr "فشل الاستيثاق" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess استقبل رسالة خطأ مجهول من الخادم: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "تحذير: الخادم سيغلق للصيانة في غضون دقيقة!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "استقبلت أمراً غير معروف من الخادوم: %1" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "هذا الشخص غير متصل او مخفي." - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1648 +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "الرسالة \"%1\" لم يتم استلامها" +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "خطأ MSN" -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "عاجز عن تكوين اتصال: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "استيثاق..." + +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "فشل الاستيثاق" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "الانتقال إلى خادوم آخر..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "اتصال..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "استقبلت أمراً غير معروف من الخادوم: %1" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "ثوانٍ معدودة" +msgstr[1] "دقيقةٌ واحدةٌ" +msgstr[2] "دقيقتان" +msgstr[3] "%1 دقائقٍ" +msgstr[4] "%1 دقيقةً" +msgstr[5] "%1 دقيقةٍ" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "الخادوم سيُغلق للصيانة في غضون: %1!" + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "خدمة MSN ستُغلق بعد %1؛ للصيانة." + +#: network/msnnotificationconnection.cpp:2309 +#, fuzzy, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "كِمس غير قادرٍ على الوصول لخدمة وِب البعيدة.
التفاصيل: %1" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "انتهت مهلة الاستيثاق" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "انتظار قائمة المُتراسلين..." + +#: network/msnnotificationconnection.cpp:2796 +#, fuzzy, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

رسالة MSN

%1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "
خطأ داخلي؛ بسبب: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, fuzzy +msgctxt "Connection error: dialog box" +msgid "" +"

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

" +msgstr "فشل الاستيثاق؛ تأكد رجاءً من اسم حسابك وكلمة السر." + +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:2932 +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:2935 +#, fuzzy, kde-format +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 "" +"

لم يستطع كِمس الاتصال بخادوم مِرسال MSN.
إما أن هناك مشكلة في اتصالك " +"بالإنترنت، أو أن خادوم مِرسال MSN غير مُتاح مؤقتاً.%1

أترغب بعرض صفحة " +"حالة خدمة مِرسال MSN؟

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

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +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 "" +"

لم يستطع كِمس الاتصال بخادوم مِرسال MSN.
إما أن هناك مشكلة في اتصالك " +"بالإنترنت، أو أن خادوم مِرسال MSN غير مُتاح مؤقتاً.%1

أترغب بعرض صفحة " +"حالة خدمة مِرسال MSN؟

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

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

" +msgstr "

رسالة MSN

%1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "

فُقد الاتصال بخادوم MSN.%1

" + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "
خطأ داخلي؛ بسبب: %1" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" msgstr "انتهت مهلة الاتصال" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" msgstr "" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" msgstr "" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 +#: network/msnsockettcp.cpp:400 #, fuzzy -msgid "%1 has sent you a nudge!" -msgstr "ارسل لك وكزة!" +msgid "The connection to the server was lost" +msgstr "فُقد الاتصال بالخادوم." -#: notification/notificationchat.cpp:196 -#, fuzzy -msgid "%1 has sent you a wink!" -msgstr "ارسل لك غمزة!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 متصل الآن" - -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "ارسل لك غمزة!" - -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "لقد ألغيت الجلسة." - -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "لقد قامت جهة الاتصال بإلغاء النقل." - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "" - -#: notification/notificationchat.cpp:218 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 قام بالخروج" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" - -#: notification/notificationchat.cpp:220 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 قام بالخروج" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "نقل %1 تم إلغائه." - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "" - -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1 قام بالخروج" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 متصل الآن" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 قام بالخروج" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 متصل الآن" - -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 قام بالخروج" - -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 متصل الآن" - -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 متصل الآن" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 متصل الآن" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "بريد جديد:
'%1'
بواسطة '%2'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "ارس&ل" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "سطر جديد" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "جهة الاتصال هذه ليست في قائمتك" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "اضف جهة اتصال" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, fuzzy, no-c-format +#: network/soap/addressbookservice.cpp:787 +#, kde-format +msgctxt "Error message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "قد أضافك لقائمته , هل تريد:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, fuzzy, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "اضفه الى قائمة \"الأصدقاء\"" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, fuzzy, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "&لا تضف جهة الاتصال, ولكن دعه يراني في حالة الاتصال" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, fuzzy, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "امنعه من الاتصال بي او معرفة حالتي." - -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "&تنظيف" - -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "إدخل معلومات الدخول الخاصة بك:" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "عنوان البريد الإلكتروني:" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "كلمة السر:" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" msgstr "" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "تذكر هذا الحساب" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "اتصل" +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "الخادوم غير مُتاح" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "إدخل رسالتك الشخصية هنا" +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, fuzzy, no-c-format -msgid "Listening to %1" -msgstr "ارسال ملف " +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "الخادوم غير مُتاح" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess إعلام" +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 يقول:
'%2'" + +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 أرسل لك رسالةً دون اتصال:
'%2'" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "" + +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 أرسل لك رسالة بخط اليد!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 أرسل لك وكزة!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 أرسل لك غمزة!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 يريد استخدام كمِرة وِب!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 يرسل لك ملفاً!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 أرسل لك دعوة!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 ألغى جلسة كمِرة الوِب!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 ألغى نقل الملف!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 قبل استخدام كمِرة وِب!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 قبل نقل الملف!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 قبل الدعوة!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 أنهى جلسة كمِرة الوِب!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "نقل الملف ذي %1 انتهى!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "نقل الملف ذي %1 فشل!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr "%1 مُتصل الآن" + +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr "%1 ذهب بعيداً" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" +msgstr "%1 سيعود قريباً" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" +msgstr "%1 مشغول الآن" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" +msgstr "%1 أصبح مُتخفياً" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" +msgstr "%1 صار خاملاً" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" +msgstr "%1 خرج" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr "%1 على الهاتف" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "%1 خارجٌ للغداء" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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 +#, 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 "" +"إغلاق النافذة الرئيسية سيُبقي كِمس عاملاً في \"صينية النظام\". استخدم أمر " +"الإنهاء في قائمة 'اتصال' لإنهاء البرنامج." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "استعرض..." + +#: settings/accountpage.cpp:81 +#, fuzzy +msgid "Browse and Crop Picture..." +msgstr "استعرض واقتطع صورة..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "صورة العرض" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "فشل تنزيل صورة العرض" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"حدث خطأ أثناء محاولة تغيير صورة العرض.\n" +"تأكد من اختيارك ملف صورة صحيحاً" + +#: 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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "العنوان البريدي الذي أدخلته غير صالح، ولا يُمكن استخدامه حسابَ: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "العنوان البريدي الذي أدخلته مُستخدم بالفعل: '%1'" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "أمتأكد من أنك تريد حذف هذا الحساب؟" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "أمتأكد من أنك تريد حذف حساب '%1'؟
ستُفقد إعدادات الحساب جميعها." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "مرحباً. كيف حالك؟ :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "زعبول" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "نحمد الله، بأفضل حال!" + +#: settings/chatstylepage.cpp:375 +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 +#, fuzzy +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, kde-format +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 "إعدادات كِمس" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "حسابات" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, fuzzy, no-c-format -msgid "Your friendly name:" -msgstr "اسمك المفضل:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "تنبيهات" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "" +#: settings/miscellaneouspage.cpp:74 +#, fuzzy +msgid "No selectable web browsers detected." +msgstr "لا مُتصفحات مُلتقطة يُمكن اختيارها." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "عنوان بريدك الالكتروني:" +#: settings/miscellaneouspage.cpp:101 +#, fuzzy +msgid "No selectable email clients detected." +msgstr "لا مُتصفحات مُلتقطة يُمكن اختيارها." -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "عليك أن تختار أمراً لتشغيله مُتصفحاً مُخصصاً!" + +#: settings/miscellaneouspage.cpp:291 +#, c-format msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"The console command you have specified to launch a custom web 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 "" -"ادخل عنوان البريد الإلكتروني لحسابك في MSN Passport. يمكنك تسجيل حساب جديد " -"في http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" +#: settings/miscellaneouspage.cpp:316 +#, fuzzy +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 emails will not work." +"
Do you want KMess to add it for you?" +msgstr "" + +#: settings/miscellaneouspage.cpp:344 +#, fuzzy +msgid "You have to select a directory for the received files!" +msgstr "عليك أن تختار أمراً لتشغيله زبون بريد مُخصصاً!" + +#: settings/miscellaneouspage.cpp:406 +#, fuzzy +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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "أظهر الو&جوه التعبيرية" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, fuzzy, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "العنوان البريدي الذي أدخلته غير صالح، ولا يُمكن استخدامه حسابَ: '%1'" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "أحداث المتراسلين" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the standard text mode." +msgstr "اضغط لإظهار صفحة هذا المُتراسل الشخصية." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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 +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 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&محادثة" + +#. 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 +#, fuzzy +msgid "Click here to display the menu for this contact" +msgstr "اضغط لإظهار صفحة هذا المُتراسل الشخصية." + +#. i18n: file: chat/contactswidget.ui:107 +#. 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 +#, 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 +msgid "" +"Enter here the email address of the person you wish to add to your contact " +"list" +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:273 +msgid "Email address:" +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 "أدخل اختصاراً لهذا الوجه:" + +#. 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 +#, fuzzy +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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "سِجلات المُحادثات" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +msgstr "سيارة" + +#. 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 "ماذا تود أن تفعل" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "امن&عه من الاتصال بي أو معرفة حالتي" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +#, fuzzy +msgid "Click this button to restore the display picture of this contact" +msgstr "اضغط لإظهار صفحة هذا المُتراسل الشخصية." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "أ&زل" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "المجموعة" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "استخدم اسمًا بديلاً لهذا الشخص" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "أظهر تنبيهاً بشأن مُتراسليك عندما:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "الصوت:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "صورة العرض" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "اضغط هنا لتغيير اسم الوجه المُحدَّد." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "صورة العرض" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "امحِ المُختزن" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "اضغط هنا لتغيير اسم الوجه المُحدَّد." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "أ&زل" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "ا&قبل المُتراسل" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "هذا المُتراسل ليس في قائمتك" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "أدخل هنا عنوان بريد الشخص الذي تودّ إضافته إلى قائمة مُتراسليك" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "المُتراسلون" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +#, fuzzy +msgid "Format" +msgstr "ماعز" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "المُتراسلون" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +#, fuzzy +msgid "Select All" +msgstr "حدد ال&كلّ" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +#, fuzzy +msgid "Deselect All" +msgstr "حدد ال&كلّ" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "حيرة" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "أمر للسان الحاليٍّ" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "أمر:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "النوع:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "قياسي" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "أرسل" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "افتح" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "ألغِ" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "ا&مسح" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +msgid "Password:" msgstr "كلمة السر:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +#, fuzzy +msgid "Status at login:" +msgstr "حالتك عند الولوج:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +#, fuzzy +msgid "If enabled, KMess will save your account" +msgstr "إن فعَّلته؛ سيصبح كمِس يلج تلقائياً بهذا الحساب." + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "سجِّل حساباً جديداً" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +#, fuzzy +msgid "R&emember password" +msgstr "تذ&كر كلمة السر" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "&حساب جديد" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +#, 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:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "ا&تصال" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +#, fuzzy +msgctxt "@title:menu" +msgid "&View" +msgstr "&عرض" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "إ&جراءات" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "حساب" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "معلومات حسابك" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +msgstr "أدخل الاسم الذي سيراه متراسلوك حينما تكون متصلاً." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "اس&مك:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +#, fuzzy +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:363 +msgid "&Email address:" +msgstr "&عنوان البريد الإلكتروني: " + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 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" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "صورة العرض:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "كلمة ال&سر:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, fuzzy, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "تذ&كر كلمة السر" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." -msgstr "&غيير..." +msgstr "ت&غيير..." -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "لا تظهر صورة ع&رض" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "لا تست&خدم" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "تذكر التعيينات لهذا الحساب" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" +"لم تؤشِّر على خيار \"تذكّر هذا الحساب\" أثناء ولوجك، لذا لن تُحفظ إعداداتك " +"تلقائياً. فعِّل هذا الخيار إن أردت إبقاء إعدادات حسابك على هذا النظام دوماً.\n" +"\n" +"يُنصح بتفعيل هذا الخيار، مالم تكن تستخدم هذا المرسال في مكان عام (مثل مقاهي " +"الإنترنت)، أو تستخدمه ضيفاً." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "تسجيل دخول بهذا الحساب تلقائياًً عند بدء التشغيل" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "تذ&كر إعدادات هذا الحساب" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." -msgstr "" +msgstr "إن فعَّلته؛ سيصبح كمِس يلج تلقائياً بهذا الحساب." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "لُ&ج بهذا الحساب تلقائياًً." -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "&حالتك عند الولوج:" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot change your friendly name because your Passport email address is " "not verified." -msgstr "" +msgstr "ليس بمقدورك تغيير اسمك؛ لأن حسابك لم يُفعَّل بعد." -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" -msgstr "طلب تحقق البريد الإلكتروني" - -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format -msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "اذهب إلى accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"أنت بحاجة لحساب MSN Passport لتستطيع الاتصال مع شبكة مرسال MSN. بإمكانك " +"تسجيل بريدك الحالي من الصفحة: register.passport.com، أو استخدام بريد هُتميل " +"للاتصال." + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" +"للاتصال بخدمة مرسال MSN، يتوجَّب عليك تسجيل بريد إلكتروني بحساب MSN Passport." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" -msgstr "تسجيل حساب جديد" +msgstr "سجِّل حساباً جديداً" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" -msgstr "http://register.passport.com/" +msgstr "http://register.passport.com" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "اذهب إلى register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "إشعارات" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "حالتك عند الولوج:" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "خطأ مع إعلامات" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" -msgstr "اظهر تنبيه عندما تصبح جهة الاتصال غير متصلة" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "متصل" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "&غيِّر حالتي إلى \"بعيد -خامل\" عندما أصير خاملاً" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "اضبط عدد الدقائق قبل أن يُغيِّر المرسال حالتك إلى \"بعيد -خامل\"" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "حدّد رسالة الخروج" +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "أخمِل حسابك بعد" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "دقائق" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "أظهر تنبيهاً بشأن مُتراسليك عندما:" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "الحسابات المحفوظة:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "غير متصل" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "أ&ضف حساباً..." -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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:491 +msgid "&Edit" +msgstr "&حرِّر" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +#, fuzzy +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:500 +msgid "&Remove" +msgstr "أ&زل" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " msgstr "" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "اظهر إعلام عندما يصل بريد في \"مجلدات أخرى\"" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "سِجلات المُحادثات" -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "اخفاء المنبثقات بعد" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "ثواني" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 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. " +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "ا&حفظ المُحادثة في ملف" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "ا&حفظ المُحادثة في ملف" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "نظِّم سجلات المحادثات المحفوظة حسب:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "السنة" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "احفظهم مُباشرة في جذر الدليل المُحدّد" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "اختر الدليل الذي تود تخزين سجلات المحادثات فيه." + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "ستُخزَّن ملفات المحادثات في هذا الدليل:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "الأ&سلوب" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +msgid "&Chat style:" +msgstr "ت&صميم المُحادثة:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "إعدادات المُحادثة" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +msgid "&Show emoticons" +msgstr "أظهر الو&جوه التعبيرية" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "أ&ظهر الوجوه التعبيرية" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, 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 "" +"هذا الخيار يُمكِّن تجميع الرسائل المُتتالية الآتية من مُتراسل واحد. عندما يبعث " +"أحد المُتراسلين بضعة سطور مستقلة يشرح فيها شيئاً، يجمع لك كمِس تلك الرسائل " +"المُتلاحقة تحت بعضها وكأنها رسالة واحدة. يعتمد المظهر الدقيق على تصميم " +"المُحادثة المُختار." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:648 +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:654 +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:657 +#, fuzzy +msgid "S&how timestamp" +msgstr "أ&ظهر وقت الرسائل" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +#, fuzzy +msgid "Show &date" +msgstr "أظ&هر الشريط الجانبي" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "أظهر الو&جوه التعبيرية" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "ال&نص" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "هذا الخط ولونه المُستخدمان في رسائل محادثاتك." + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "&خط رسائلك:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" +"بإمكانك تجاوز نوع الخط ولونه عند مُتراسليك، باستخدام الخط ولونه المُختاران في " +"الأسفل دوماً." + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "أ&جبر رسائل متراسليك على استخدام هذا الخط دوماً:" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +msgid "Chat Window Formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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 "" +"يُمكنك من استخدام تأثيرات الخطوط، مثلاً طباعة *ثخين*، أو /مائل/، أو _تحته خط_، " +"ستؤدي إلى ظهور الكلمات ثخينة، أو مائلة، أو تحتها خط، على التوالي." + +#. i18n: file: settings/chatstylepage.ui:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "استخدم تأ&ثيرات الخطوط في الرسائل, مثل *ثخين* و/مائل/ و_تحته خط_" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "" +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "&زلزل نافذة المُحادثة كلما بعثت أو استقبلت وكزة" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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/alertswidget.ui line 300 -#: rc.cpp:313 -#, fuzzy, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "تغيير الحالة الى \"بالخارج-آلي\" عندما تصبح غير نشط" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "كن بالخارج بعد" +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "اجمع المُحادثات بن&فس النافذة:" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "دوماً" -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "دقائق" +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "لمتراسلي المجموعة نفسها" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "حفظ الدردشة" +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "إطلاقاً" -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "سجل كلّ &الدردشات" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "احفظ ملفات المحادثة في هذا الدليل الأب:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "اختر الدليل الذي تود حفظ سجلات الدردشة فيه" - -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "نظم مجلدات المحادثة بواسطة:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "سنة" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "شهر" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "يوم" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "احفظ جميع ملفات المحادثة في هذا الدليل الأب" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "خط رسالتك:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "اجبر رسائل جهة الاتصال أن تستخدم هذا الخط:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "تصميم الدردشة:" - -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "اظهر الرسومات في رسائل الدردشة" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "اظهر الوقت في رسائل الدردشة" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, fuzzy, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "استخدم تأثيرات الخط في المحادثة, *عريض* و /مائل/ و _تحته خط_" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "زبون البريد" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "استخدم هوتميل" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "استخدم أمر محدد:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "إعلام البريد" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "اظهر معلومات البريد الإلكتروني" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "" - -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "اظهر إعلام عندما يصل بريد في \"مجلدات أخرى\"" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format -msgid "&Emoticon Themes" -msgstr "تعابير الوجه" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" -msgstr "تصميم تعبير الوجه:" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format -msgid "&Custom Emoticons" -msgstr "صور تعابير الوجه الكرتونية" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, fuzzy, no-c-format -msgid "Custom emoticons for this account:" -msgstr "تذكر التعيينات لهذا الحساب" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "الساعة" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format -msgid "Re&name" -msgstr "الاسم" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format -msgid "Remo&ve" -msgstr "محذوف" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "" - -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "يقول: " - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "" - -#: settings/accountswidget.cpp:421 -msgid "Display Picture" +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" msgstr "صورة العرض" -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "تنزيل صورة العرض فشل" - -#: settings/accountswidget.cpp:486 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." msgstr "" -"حدوث خطأ أثناء محاولة تغيير صورة العرض.\n" -"تأكد من اختيار ملف الصورة الصحيحة" +"إن فعلته؛ فستظهر رسالة منبثقة كلما استقبلت رسالة في صندوق الوارد، وسيكون عدد " +"الرَّسائل الحديثة غير المقروءة ظاهراً فوق قائمة المتراسلين. هذه الخدمة مُتاحة " +"فقط لحسابات بريد هُتميل." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "تعيينات" - -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "حساب" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "دردشة" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "هل أنت من متأكد من حذف هذا الحساب؟" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "" - -#: settings/settingsdialog.cpp:782 +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 #, fuzzy -msgid "Great!" -msgstr "عنزة" +msgid "Display a count of &unread mail" +msgstr "ا&عرض عدد الرَّسائل البريديَّة غير المقروءة" -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" - -#: systemtraywidget.cpp:91 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +#, fuzzy msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." msgstr "" -"إغلاق النافذة الرئيسية سيبقي KMess مشغلاً في صينية النظام. استخدم 'إنهِ' من " -"قائمة 'اتصل' لإنهاء التطبيق." +"إن فعلته؛ فسيُعلم المرسال مُتراسليك بما تستمع إليه. هذه المعلومات تُأخذ من مُشغِّل " +"الأصوات النَّشط على نظامك حالياً." -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "إرساء أيقونة صينية النظام" - -#: systemtraywidget.cpp:278 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 #, fuzzy -msgid "%1 %2" -msgstr "%1 ميجا بايت" +msgid "Show contacts w&hich song I am listening to" +msgstr "أعل&م المُتراسلين بما أستمع إليه" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." msgstr "" -#~ msgid "File transfer dialog message" -#~ msgstr "رسالة المربع الحواري لنقل الملفات" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" -#~ msgid "The file transfer invitation was cancelled. Bad data was received." -#~ msgstr "تم إلغاء دعوة نقل الملف. بيانات سيئة تم استقبالها." +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +#, fuzzy +msgid "List Formatting" +msgstr "معلومات الولوج" -#~ msgid "Alt+E" -#~ msgstr "Alt+E" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +msgid "&Emoticon Themes" +msgstr "&سمات الوجوه" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" +msgstr "الأطقم المتوفرة من الوجوه التعبيرية:" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +msgid "&Custom Emoticons" +msgstr "وجوه مُ&خصصة" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "الأطقم المتوفرة من الوجوه التعبيرية:" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +#, fuzzy +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:781 +#, fuzzy +msgid "Add Ne&w..." +msgstr "أ&ضف وجهاً..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +#, fuzzy +msgid "Click here to rename the selected emoticon" +msgstr "اضغط هنا لتغيير اسم الوجه المُحدَّد." + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +msgid "Re&name" +msgstr "&غيِّر اسمه" + +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +#, fuzzy +msgid "Click here to delete the selected emoticon" +msgstr "اضغط هنا لتغيير اسم الوجه المُحدَّد." + +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +msgid "Remo&ve" +msgstr "أ&زله" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "متصفح الوب" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +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:811 +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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 +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:827 rc.cpp:862 +#, 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 "" +"حدِّد مسار برنامج لاستخدامه في فتح الروابط. ستُستبدل '%u' هنا بمسارات الروابط" + +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "استخدم '%u' لإدخال المسار في سطر الأوامر" + +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "زبون البريد" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +#, fuzzy +msgid "" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." +msgstr "هذا الخيار مُتاح فقط للحسابات المتوافقة مع خدمة بريد مايكروسُفت Live." + +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +#, fuzzy +msgid "Use &Live Mail if the account supports it" +msgstr "استخدم بريد Live، إذا كان متاحاً لهذا الحساب." + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +#, fuzzy +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:846 +#, fuzzy +msgid "Use the &KDE default email client" +msgstr "استخدم مُتصفح كدي الا&فتراضي" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "استخدم مُتصفحاً م&ثبتاً:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, fuzzy, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "استخدم '%u' لإدخال المسار في سطر الأوامر" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +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:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +#, fuzzy +msgid "and" +msgstr "حزن" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "نقل الملفات" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "اضغط هنا لتغيير اسم الوجه المُحدَّد." + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "اضغط هنا لتغيير اسم الوجه المُحدَّد." + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "اسمك" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "حسابك ممنوع." + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "ال&صور" #, fuzzy -#~ msgid "Alt+W" -#~ msgstr "Alt+D" - -#~ msgid "..." -#~ msgstr "..." +#~ msgid "Ink message" +#~ msgstr "يبعث أحدهم رسالة إليك" #, fuzzy -#~ msgid "Alt+B" -#~ msgstr "Alt+D" - -#~ msgid "popupMessage" -#~ msgstr "رسالة منبثقة" - -#~ msgid "Alt+H" -#~ msgstr "Alt+H" - -#~ msgid "Alt+Y" -#~ msgstr "Alt+Y" - -#~ msgid "Alt+G" -#~ msgstr "Alt+G" - -#~ msgid "Alt+C" -#~ msgstr "Alt+C" - -#~ msgid "Alt+S" -#~ msgstr "Alt+S" +#~ msgid "&Do not filter" +#~ msgstr "لا تست&خدم" #, fuzzy -#~ msgid "Alt+F" -#~ msgstr "Alt+D" +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "أظهر فقاعة منبثقةً حينما يتصل هذا الشخص أو يفصل" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "الوجوه التعبيرية المُخصصة لهذا الحساب:" #, fuzzy -#~ msgid "Alt+V" -#~ msgstr "Alt+D" +#~ msgid "Ignore this &Emoticon" +#~ msgstr "أ&ضف هذا الوجه..." #, fuzzy -#~ msgid "ChattingWidget" -#~ msgstr "محادثة" +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "صورة العرض" #, fuzzy -#~ msgid "EmailWidget" -#~ msgstr "البريد الإلكتروني" +#~ msgid "Search for C&ontact" +#~ msgstr "ا&بحث عن مُتراسل" -#, fuzzy -#~ msgid "Alt+N" -#~ msgstr "Alt+E" +#~ msgid "Search by &Interest" +#~ msgstr "ابحث بالا&هتمامات" -#~ msgid "Message from %1" -#~ msgstr "رسالة من %1 " +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "mamoun.diraneyya@gmail.com" -#~ msgid "Invitation from %1" -#~ msgstr "دعوة من %1" - -#~ msgid "Notification message" -#~ msgstr "رسالة إعلام" - -#~ msgid "An error occured" -#~ msgstr "حدوث خطأ" - -#~ msgid "You can't login to hotmail with this account." -#~ msgstr "لا يمكنك تسجيل دخول لهوتميل بهذا الحساب." - -#~ msgid "The connection to the server failed." -#~ msgstr "فشل الاتصال الى الخادم" - -#~ msgid "You may not be connected to the internet." -#~ msgstr "قد لا تكون متصلاً بالإنترنت." - -#~ msgid "webcam" -#~ msgstr "كاميرا ويب" - -#~ msgid "There was a problem connecting to the proxy." -#~ msgstr "هناك مشكلة اتصال مع الوكيل" - -#~ msgid "This person is online, but he or she is blocking you." -#~ msgstr "هذا الشخص متصل, لكنك محظور لديه. " - -#~ msgid "says" -#~ msgstr "يقول" - -#~ msgid "has sent you" -#~ msgstr "قد أرسل لك" - -#~ msgid "Ctrl+Return" -#~ msgstr "Ctrl+Return" - -#~ msgid "Show this person's profile" -#~ msgstr "اظهر ملف معلومات هذا الشخص" - -#~ msgid "Send this person an email" -#~ msgstr "أرسل بريد لهذا الشخص" - -#~ msgid "Right-click to dismiss" -#~ msgstr "النقر باليمين للطرد" - -#~ msgid "Alt+L" -#~ msgstr "Alt+L" - -#, fuzzy -#~ msgid "&Start in \"Invisible\" mode" -#~ msgstr "ابدأ في حالة \"مخفي\"." - -#~ msgid "Show popup notifications for program events" -#~ msgstr "اظهر إعلامات منبثقة لأحداث البرنامج" - -#~ msgid "&Install new..." -#~ msgstr "&تركيب جديد..." - -#~ msgid "&I want to show a display picture" -#~ msgstr "&ارغب في اظهار صورة عرض" - -#~ msgid "Preview:" -#~ msgstr "معاينة:" - -#~ msgid "&Browse..." -#~ msgstr "&استعراض..." - -#~ msgid "&Use the default picture" -#~ msgstr "&استخدم الصورة الافتراضية" - -#~ msgid "I want to use a proxy" -#~ msgstr "أرغب في استخدام وكيل" +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "استهلَّ المُتراسل استخدام ميزة لـMSN6، وكِمس لا يقوى على تدبيرها بعد." #~ msgid "" -#~ "If enabled, a proxy server will be used to connect to the MSN Messenger " -#~ "service." -#~ msgstr "إذا كان ممكن, خادم الوكيل سيستخدم في الاتصال بخدمة مراسل MSN." +#~ "The transfer failed. The contact sent bad data, or KMess doesn't support " +#~ "it." +#~ msgstr "فشل النقل؛ فإما أن المُتراسل بعث بيانات سيئة، أو أن كِمس لا يدعمها." -#~ msgid "Port:" -#~ msgstr "المنفذ:" +#~ msgid "Click to send an email to this contact." +#~ msgstr "اضغط لإرسال رسالة بريدية لهذا المتراسل." -#~ msgid "Type:" -#~ msgstr "النوع:" +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "اختيارياً؛ بإمكانك اختيار مجموعة ليُوضع بها هذا المتراسل" -#~ msgid "User ID:" -#~ msgstr "هوية المستخدم:" +#~ msgid "Picture:" +#~ msgstr "الصورة:" -#~ msgid "HTTP Proxy" -#~ msgstr "HTTP وكيل" +#~ msgid "Speed:" +#~ msgstr "السرعة:" -#~ msgid "SOCKS4 Proxy" -#~ msgstr "SOCKS4 وكيل" +#~ msgid "More options..." +#~ msgstr "خيارات أكثر..." -#~ msgid "SOCKS5 Proxy" -#~ msgstr "SOCKS5 وكيل" +#~ msgid " Account options " +#~ msgstr " خيارات الحساب " -#~ msgid "Server:" -#~ msgstr "الخادم:" +#~ msgid "Remem&ber this profile" +#~ msgstr "تذ&كر هذا الحساب" -#~ msgid "Proxy" -#~ msgstr "الوكيل" +#~ msgid "Also r&emember the password" +#~ msgstr "كذلك تذكر كلمة ال&سر" -#~ msgid "Aren't you going to open your gift? :)" -#~ msgstr "هل ستقوم بفتح هديتك? :" +#~ msgid "Enter your personal message here" +#~ msgstr "أدخل رسالتك الشخصية هنا" -#~ msgid "Connection good" -#~ msgstr "الاتصال جيد" +#~ msgid "Click" +#~ msgstr "اضغط" -#~ msgid "Server too busy" -#~ msgstr "الخادم مشغول" +#~ msgid "Popup Notifications" +#~ msgstr "التنبيهات المُنبثقة" -#~ msgid "Server unavailable" -#~ msgstr "الخادم غير متوفر" - -#~ msgid "New chat notification:" -#~ msgstr "إشعار دردشة جديد:" - -#~ msgid "%1 is offline" -#~ msgstr " %1 غير متصل" - -#~ msgid "You have new mail:" -#~ msgstr "لديك بريد جديد:" - -#, fuzzy #~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in your inbox" -#~ msgstr "في صندوقك" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "إن فعلته؛ فستظهر رسالة مُنبثقة حينما يتصل أحد متراسليك." + +#~ msgid "&Go online" +#~ msgstr "يت&صل أحدهم" -#, fuzzy #~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in another folder" -#~ msgstr "في مجلد آخر" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "إن فعلته؛ فستظهر رسالة منبثقة حينما يبدأ أحد مراسليك محادثة معك." -#~ msgid "and" -#~ msgstr "و" +#~ msgid "Start a &chat with you" +#~ msgstr "يبدأ أحدهم م&حادثة معك" -#~ msgid "says: " -#~ msgstr "يقول: " +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "إن فعلته؛ فستظهر رسالة منبثقة كلما بعث أحد متراسليك رسالة إليك." -#~ msgid "(Online)" -#~ msgstr "(متصل)" +#~ msgid "" +#~ "If enabled, a popup message is also shown when your contacts change their " +#~ "MSN status." +#~ msgstr "إن فعلته؛ فستظهر رسالة منبثقة كلما غير أحد متراسليك حالته." -#~ msgid "There may be a problem with the servers" -#~ msgstr "هناك عدة مشاكل مع الخادم" +#~ msgid "Change their &status" +#~ msgstr "ي&غير أحدهم حالته" -#~ msgid "System Message" -#~ msgstr "رسالة النظام" +#~ msgid "" +#~ "If enabled, a popup message is also shown when one of your contacts goes " +#~ "offline." +#~ msgstr "إن فعلته؛ فستظهر رسالة منبثقة كلما خرج أحد متراسليك." -#~ msgid "Show incoming server messages" -#~ msgstr "اظهر رسائل الخادم الواردة" +#~ msgid "Go o&ffline" +#~ msgstr "ي&خرج أحدهم" -#~ msgid "Show outgoing server messages" -#~ msgstr "اظهر رسائل الخادم الصادرة" +#~ msgid "Email Events" +#~ msgstr "أحداث صندوق البريد" -#~ msgid "Chat - %1" -#~ msgstr "دردشة - %1" +#~ msgid "Show notifications when email is received:" +#~ msgstr "أظهر تنبيهاً عند استقبالك رسالة بريديةً:" -#, fuzzy -#~ msgid "Chat - %1 et al." -#~ msgstr " et al." +#~ msgid "In the Inbox" +#~ msgstr "في صندوق الوارد" -#, fuzzy -#~ msgid "The transfer of %1 failed. Couldn't create a socket." -#~ msgstr "فشل لم أستطع انشاء مقبس" +#~ 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 "" +#~ "إن فعلته؛ فستظهر رسالة منبثقة كلما استقبلت رسالة بريدية في مجلدات أخرى. " +#~ "هذا الخيار مُتاح فقط لحسابات بريد هُتميل." -#~ msgid "Login with a saved profile:" -#~ msgstr "ادخل بحساب محفوظ:" +#~ msgid "In other folders" +#~ msgstr "في مجلدات أخرى" -#~ msgid "Changes will take place when the program is restarted." -#~ msgstr "التغييرات ستطبق عند اعادة تشغيل البرنامج" +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "اضبط عدد الثواني قبل اختفاء النوافذ التنبيهية المُنبثقة." -#~ msgid "Get New Emoticon or Sound &Themes" -#~ msgstr "ا&حصل على تعابير و أصوات جديدة" +#~ msgid "Hide popups after" +#~ msgstr "إخفاء المنبثقات بعد" -#~ msgid "Chat message layout:" -#~ msgstr "تخطيط رسالة الدردشة:" +#~ msgid "seconds" +#~ msgstr "ثوانٍ" -#~ msgid "n&ame" -#~ msgstr "الا&سم" +#~ msgid "Other Alerts" +#~ msgstr "إخطارات أخرى" + +#~ msgid "" +#~ "If enabled, chat conversations will be saved in a specified directory." +#~ msgstr "إن فعلته؛ فستُحفظ المُحادثات في دليل مُحدد." + +#~ msgid "" +#~ "KMess automatically creates subdirectories when you choose the organize " +#~ "the chat folder by year, month or day." +#~ msgstr "" +#~ "سيُنشئ كِمس أدلة فرعيةً تلقائياً عندما تختار تنظيم مجلد المُحادثات حسب السنة " +#~ "أو الشهر أو اليوم." + +#~ msgid "Log Structure" +#~ msgstr "بِنية السجلات" + +#~ msgid "Month" +#~ msgstr "الشهر" + +#~ msgid "Day" +#~ msgstr "اليوم" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "" +#~ "يُمكِّنك من اختيار برنامج زبون البريد الذي تُفضل أن يستخدمه كِمس لعرض رسائلك." + +#~ msgid "Choose this option to enter the path to your favorite email client." +#~ msgstr "هذا الخيار لإدخال مسار برنامج زبون البريد المُفضل إليك." + +#~ msgid "Use a specified command:" +#~ msgstr "استخدم أمراً محدداً:" + +#~ msgid "Specify the path of a program to use as your account's email client." +#~ msgstr "حدِّد مسار برنامج زبون البريد الذي تود استخدامه مع حسابك." + +#~ msgid "" +#~ "You can't start this invitation because there are multiple contacts in " +#~ "this chat." +#~ msgstr "لا يمكنك بدء هذه الدعوة؛ بسبب وجود مُتراسلين كثر في المحادثة." + +#~ msgid "" +#~ "The wink could not be displayed. Make sure you have 'cabextract' " +#~ "installed." +#~ msgstr "لا يمكن عرض الغمزة. تأكد من تثبيت 'cabextract'." + +#~ msgid "You have received a wink from %1" +#~ msgstr "استقبلت غمزة من %1" + +#~ msgid "You received a nudge from %1!" +#~ msgstr "استقبلت وكزة من %1!" + +#~ msgid "The message '%1' could not be sent." +#~ msgstr "تعذَّر إرسال الرسالة \"%1\"." + +#~ msgid "Copy E&mail" +#~ msgstr "انس&خ البريد الإلكتروني" + +#~ msgid "&Help" +#~ msgstr "م&ساعدة" + +#~ msgid "&Settings" +#~ msgstr "إ&عدادات" + +#~ msgid "Hide Side&bar" +#~ msgstr "أ&خفِ الشريط الجانبي" + +#~ msgid "Hide the contact sidebar" +#~ msgstr "أخفِ شريط المُتراسلين الجانبي" + +#~ msgid "Show the contact sidebar" +#~ msgstr "أظهر شريط المُتراسلين الجانبي" + +#~ msgid "&Send email" +#~ msgstr "أر&سل له رسالةً بريديةً" + +#~ msgid "Never seen" +#~ msgstr "لم يُشاهد إطلاقاً" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "لا يوجد في هذا الحساب صندوق بريد هُتميل!" + +#~ msgid "No group" +#~ msgstr "دون مجموعة" + +#~ msgid "Specify an Away message" +#~ msgstr "حدّد رسالة الخروج" + +#~ msgid "Email: " +#~ msgstr "البريد: " + +#~ msgid "Black sheep" +#~ msgstr "خروف أسود" + +#~ msgid "Soccer ball" +#~ msgstr "كرة قدم" + +#~ msgctxt "Clickable label on login screen" +#~ msgid "Less options..." +#~ msgstr "خيارات أقل..." + +#~ msgctxt "Clickable label on login screen" +#~ msgid "More options..." +#~ msgstr "خيارات أكثر..." + +#~ msgid "Remove group" +#~ msgstr "أزل مجموعة" + +#~ msgid "Rename group" +#~ msgstr "غيِّر اسم مجموعة" + +#~ msgid "Search in Contact List" +#~ msgstr "ابحث في &قائمة المُتراسلين" + +#~ msgid "Account &Settings" +#~ msgstr "إع&دادات الحساب" + +#~ msgid "Co&nnect" +#~ msgstr "ات&صل" + +#~ msgid "Show &Tool bar" +#~ msgstr "أظهر &شريط الأدوات" + +#~ msgid "Now listening to %1" +#~ msgstr "يستمع الآن إلى %1" + +#~ msgid "&Listening Music" +#~ msgstr "ال&موسيقى المُستمعَة" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "البريد: %1" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "لديك رسالة بريدية حديثة في صندوق الوارد" + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "لديك %1 بريد إلكتروني جديد في الوارد." + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "وصلك الملف: %1 (%2 بايت)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "أُلغي النقل" + +#~ 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 failed. Couldn't open file" +#~ msgstr "فشل نقل %1. لا يمكن فتح الملف" + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "أُلغي نقل: %1." + +#~ msgid "Got synchronization" +#~ msgstr "حصلت المزامنة" + +#~ msgid "Contact is in the opposite list" +#~ msgstr "المُتراسل في القائمة المُعاكسة" + +#~ msgid "The group name is too long" +#~ msgstr "اسم المجموعة طويل جداً" + +#~ msgid "No permissions given for this account" +#~ msgstr "لا أذونات مُعطاة لهذا الحساب" + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

رسالة خادوم MSN

%1

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

Internal error in KMess

%1

" +#~ msgstr "

خطأ داخلي في كِمس

%1

" + +#~ msgid "" +#~ "Authentication failed, KMess could not process the passport login." +#~ "
Details: %1" +#~ msgstr "فشل الاستيثاق؛ لم يستطيع كِمس مُعالجة ولوج passport.
التفاصيل: %1" + +#~ msgid "SSL Error" +#~ msgstr "خطأ SSL" + +#~ msgid "This person is offline or invisible." +#~ msgstr "هذا الشخص غير متصل أو مُتخفٍّ." + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "استهلَّ المُتراسل استخدام ميزة لـMSN7، وكِمس لا يقوى على تدبيرها بعد." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "لم تُسلَّم الرسالة \"%1\"!" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "عاجز عن تكوين اتصال: %1" + +#~ msgid "Alerts" +#~ msgstr "إخطارات" + +#~ msgid "Alerts and Notifications" +#~ msgstr "تنبيهات وإخطارات" diff --git a/po/ca.po b/po/ca.po index a88f95e..65f5e44 100644 --- a/po/ca.po +++ b/po/ca.po @@ -1,3198 +1,6540 @@ -# translation of ca.po to Catalan -# This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# Jaume Cornadó , 2003 -# Jaume Cornado , 2003 +# This file is distributed under the same license as the PACKAGE package. # +# Adrià Arrufat , 2009. msgid "" msgstr "" "Project-Id-Version: ca\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2003-04-23 10:23+0200\n" -"Last-Translator: Jaume Cornado \n" -"Language-Team: Catalan \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-28 19:43+0200\n" +"PO-Revision-Date: 2009-05-10 16:32+0200\n" +"Last-Translator: Adrià Arrufat \n" +"Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 0.3\n" +"First-Translator: Adrià Arrufat \n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Jaume Cornadó" +#: account.cpp:45 +msgid "I am away from my computer" +msgstr "Estic fora de l'ordinador" -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "jaumec@lleida.net" +#: account.cpp:54 +msgid "Your name" +msgstr "El vostre nom" -#: account.cpp:41 account.cpp:716 +#: account.cpp:57 settings/accountpage.cpp:217 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "vosaltres@hotmail.com" + +#: account.cpp:744 msgid "I'm away from my computer" msgstr "Estic fora de l'ordinador" -#: account.cpp:57 -msgid "Your name" -msgstr "El teu nom" - -#: account.cpp:60 kmess.cpp:334 -msgid "you@hotmail.com" -msgstr "tu@hotmail.com" - -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Entrant al sistema" - -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "" - -#: chat/chatmessagestyle.cpp:296 -#, fuzzy -msgid "%1 says:" -msgstr "diu:" - -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 -msgid "Add this emoticon: %1" -msgstr "" - -#: chat/chatview.cpp:463 +#: accountsmanager.cpp:559 +#, kde-format msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." msgstr "" +"S'han trobat contrasenyes no segures
Voleu importar aquestes " +"contrassenyes a la KDE Wallet anomenada '%1', mantenir les contrasenyes no " +"segures o esborrar-les permanentment

Nota: no és recomanable " +"fer servir contrasenyes no segures si la cartera KDE Wallet es troba " +"disponible, perquè les vostres contrasenyes es poden llegir fàcilment des " +"dels arxius de configuració de KMess." -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Emmagatzematge segur de contrasenya" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importa" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Esborra" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Mantingues" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"No podeu enviar invitacions quan diversos contactes es troben en una " +"conversa. Si us plau, obriu una conversa amb el contacte i després re-envieu " +"la invitació." + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 s'ha unit a la conversa." + +#: chat/chat.cpp:191 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "" +"La conversa s'ha tornat inactiva, %1 ha abandonat la conversa." + +#: chat/chat.cpp:197 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 ha abandonat la conversa." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 i %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 i altres" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Aquest missatge ha estat enviat automàticament)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" +"KMess no ha pogut desar el registre d'aquesta conversa:
La " +"carpeta dels registres , "%1", no existeix." + +#: chat/chat.cpp:949 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Heu enviat una ganyota!" + +#: chat/chat.cpp:954 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Heu enviat la ganyota "%1"" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" +"La conversa ha estat desactivada perquè ja no esteu connectats al servidor " +"de Live Messenger." + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Hi ha hagut un error de connexió." + +#: chat/chat.cpp:1154 +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 "" +"Hi havia massa emoticones personalitzades en el vostre darrer " +"missatge. Només s'enviaran les 7 primeres." + +#: chat/chat.cpp:1167 +#, kde-format +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." +msgstr "" +"%1 us ha enviat un clip de veu, però KMess encara no suporta clips de " +"veu, així que no podeu sentir-lo." + +#: chat/chat.cpp:1181 +#, kde-format +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 us ha enviat un missatge d'acció, però KMess encara no suporta " +"missatges d'acció." + +#: chat/chat.cpp:1196 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "" +"%1 us ha enviat una característica de MSN que KMess encara no suporta." +"" + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"Heu rebut una ganyota de %1, però l'opció de mostrar les ganyotes ha " +"estat deshabilitada en les opcions de compte. La podeu activar des de laconfiguració de compte." + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"Heu rebut la ganyota "%2" de %1, però l'opció de mostrar les " +"ganyotes ha estat deshabilitada en les opcions de compte. La podeu activar " +"des de laconfiguració de compte." + +#: chat/chat.cpp:1262 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 us ha enviat una ganyota!" + +#: chat/chat.cpp:1269 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 us ha enviat la ganyota: "%2"!" + +#: chat/chat.cpp:1291 +#, kde-format +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." +msgstr "" +"Heu rebut una ganyota de %1, però no s'ha pogut mostrar. Assegureu-vos " +"que teniu el programa "cabextract" instal·lat. Comproveu el gestor " +"de paquets de la vostra distribució per més ajuda." + +#: chat/chat.cpp:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Heu rebut la ganyota "%2" de %1, però no s'ha pogut mostrar. " +"Assegureu-vos que teniu el programa 'cabextract' instal·lat." + +#: chat/chat.cpp:1312, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"Heu rebut una ganyota de %1, però no s'ha pogut mostrar, " +"perquè ha fallat l'extracció de la ganyota amb "cabextract"." + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"Heu rebut la ganyota "%2" de %1, però no s'ha pogut mostrar, " +"perquè ha fallat l'extracció de la ganyota amb "cabextract"." + +#: chat/chat.cpp:1333 +#, kde-format +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 "" +"Heu rebut una ganyota de %1, però no s'ha pogut mostrar. Les dades no " +"s'han pogut llegir." + +#: chat/chat.cpp:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" +"Heu rebut la ganyota "%2" de %1, però no s'ha pogut mostrar. " +"Les dades no s'han pogut llegir." + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 s'ha desconnectat. Els missatges que li envieu a partir d'ara se li " +"enviaran quan es torni a connectar." + +#: chat/chat.cpp:1389 +#, kde-format +msgid "%1 has gone offline." +msgstr "%1 s'ha desconnectat." + +#: chat/chat.cpp:1399 +#, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 ha canviat el seu estat a "%2"" + +#: chat/chat.cpp:1430 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 us ha enviat un avís!" + +#: chat/chat.cpp:1463 +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 "tot els contactes" + +#: chat/chat.cpp:1476 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "No s'ha pogut enviar l'avís a %1." + +#: chat/chat.cpp:1481 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "No s'ha pogut enviar la ganyota a %1." + +#: chat/chat.cpp:1491 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "No s'ha pogut enviar el dibuix a %1." + +#: chat/chat.cpp:1506 +#, kde-format +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 "No s'ha pogut enviar el missatge a %2:
%1" + +#: chat/chat.cpp:1589 +#, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "" +"El fitxer "%1" no s'ha pogut trobar en el vostre ordinador, " +"i la descàrrega ha fallat." + +#: chat/chat.cpp:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Heu enviat un avís a %1!" + +#: chat/chat.cpp:1632 +msgid "You have sent a nudge!" +msgstr "Heu enviat un avís!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" +"%1 es troba en desconnexió. Els missatges que li envieu a partir d'ara " +"se li enviaran quan es torni a connectar." + +#: chat/chatmaster.cpp:1387 +#, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 està enviant una ganyota: "%2"" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format +msgid "%1 says:" +msgstr "%1 diu:" + +#: chat/chatmessageview.cpp:322 +#, kde-format +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 amb %1
Començada el: %2" + +#: chat/chatmessageview.cpp:366 +#, kde-format +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 començada el: %2" + +#: chat/chatmessageview.cpp:406 +#, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Converses desades de KMess amb %1" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:653 +#, kde-format +msgid "Add this emoticon: %1" +msgstr "Afegeix aquesta emoticona: %1" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Reconnecta" + +#: chat/chatview.cpp:299 +#, kde-format +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 "" +"No s'ha pogut desar la conversa a la carpeta '%1'.\n" +"Assegureu-vos de tenir permisos d'escriptura a la carpeta on es desen el " +"registres de conversa." + +#: 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 "" +"*.html *.htm|Pàgina web (*.html)\n" +"*.txt|Document de text pla (*.txt)\n" +"*.xml|Document XML(*.xml)" + +#: chat/chatview.cpp:457 +#, kde-format msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" +"El fitxer '%1' ja existeix.\n" +"El voleu sobreescriure?" -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" -msgstr "" +msgstr "Sobreescriu el fitxer" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "" +msgstr "Sobre&escriu" -#: chat/chatview.cpp:919 -#, fuzzy +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "Mostrar &Emoticones" +msgstr "Afegeix aquesta &emoticona..." -#: chat/chatview.cpp:924 -#, fuzzy +#: chat/chatview.cpp:827 +msgid "Hide this &Emoticon" +msgstr "Amaga aquesta &emoticona..." + +#: chat/chatview.cpp:833 msgid "Send &Email" -msgstr "&Enviar un correu" +msgstr "Envia un correu &electrònic" -#: chat/chatview.cpp:926 -#, fuzzy -msgid "Copy E&mail" -msgstr "Correu" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Afegeix un &Contacte" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "Copia l'adreça de &correu electrònic" + +#: chat/chatview.cpp:847 msgid "Visit &Link" -msgstr "" +msgstr "Visita l'en&llaç" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:851 msgid "Copy &Address" -msgstr "" +msgstr "Copia l'&adreça" -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "" +#: chat/chatview.cpp:867 +msgid "&Copy Text" +msgstr "&Copia el text" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:868 msgid "Select &All" -msgstr "" +msgstr "Selecciona-ho &tot" -#: chat/chatview.cpp:948 -#, fuzzy -msgid "Save chat to &File" -msgstr "Enviar un &Fitxer" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Cerca un te&xt..." -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Xat" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:503 +msgid "C&lear Chat" +msgstr "&Neteja la conversa" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Desa la conversa a un &fitxer" -#: chat/chatwindow.cpp:260 -#, fuzzy -msgid "%1 has joined the chat." -msgstr "ha entrat en el xat" - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "ha deixat el xat" - -#: chat/chatwindow.cpp:315 -#, fuzzy -msgid "%1 has left the chat." -msgstr "ha deixat el xat" - -#: chat/chatwindow.cpp:575 -#, fuzzy -msgid "%1 - Chat" -msgstr "Xat" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "" - -#: chat/chatwindow.cpp:737 -#, fuzzy +#: chat/chatwindow.cpp:115 msgid "Contacts" -msgstr "&Afegir contacte" +msgstr "Contactes" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 -#, fuzzy +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" -msgstr "Mostrar &Emoticones" +msgstr "Emoticones" -#: chat/chatwindow.cpp:799 -#, fuzzy -msgid "My emoticons" -msgstr "Mostrar &Emoticones" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Les meves emoticones" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Aquest missatge ha estat enviat automaticament)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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 "" +"Hi ha diverses pestanyes obertes en aquesta finestra de converses. " +"Voleu tancar només la pestanya actual o totes?

" -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Tancament d'una pestanya de conversa" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "Tanca totes les pestanyes" -#: chat/chatwindow.cpp:1791 -#, fuzzy -msgid "The message '%1' could not be sent." -msgstr "no s'ha rebut." +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Tanca la pestanya actual" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "" +#: chat/chatwindow.cpp:418 +msgid "&Invite..." +msgstr "Conv&ida..." -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "" +#: chat/chatwindow.cpp:419 +msgid "Send a &File..." +msgstr "Envia un &fitxer..." -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "" +#: chat/chatwindow.cpp:420 +msgid "Webcam Chat" +msgstr "Conversa amb webcam" -#: chat/chatwindow.cpp:1976 -#, fuzzy -msgid "%1 is typing." -msgstr " esta escrivint." - -#: chat/chatwindow.cpp:1985 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr " esta escrivint." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Enviar un &Fitxer" - -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:421 msgid "Start a &Meeting" -msgstr "Començar un &Meeting" +msgstr "Comença una co&nferència" -#: chat/chatwindowinterface.cpp:175 -#, fuzzy +#: chat/chatwindow.cpp:422 msgid "Send a &Nudge!" -msgstr "Enviar un &Fitxer" +msgstr "Envia un &avís!" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "" +#: chat/chatwindow.cpp:423 +msgid "Save Chat..." +msgstr "Desa la conversa..." -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "" +#: chat/chatwindow.cpp:424 +msgid "Close &All Tabs" +msgstr "Tanca totes les pestanyes" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Convidar" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Xat" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:429 msgid "Change &Font" -msgstr "Canviar la &Font" +msgstr "Canvia el tipus de lletra" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:430 msgid "Change Font &Color" -msgstr "Canviar el &color de font" +msgstr "Canvia el color de la lletra" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Inserir una emoticona" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:437 msgid "Show &Emoticons" -msgstr "Mostrar &Emoticones" +msgstr "Mostra les &emoticones" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Mostrar/Amagar la barra de &contactes" +#: chat/chatwindow.cpp:438 +msgid "Show S&tatus Messages" +msgstr "Mostra els missatges d'es&tat" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Mostrar o amagar la barra de contactes" +#: chat/chatwindow.cpp:444 +msgid "&Panels" +msgstr "&Plafons" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "&Enviar un correu" +#: chat/chatwindow.cpp:447 +msgid "Use &Spell Checking" +msgstr "Utilitza la correcció ortogràfica" -#: chat/contactframe.cpp:232 kmessview.cpp:615 -#, fuzzy +#: chat/chatwindow.cpp:451 +msgid "Meeting" +msgstr "Conferència" + +#: chat/chatwindow.cpp:452 +msgid "Nudge" +msgstr "Avís" + +#: chat/chatwindow.cpp:453 +msgid "Send a &File" +msgstr "Envia un &fitxer" + +#: chat/chatwindow.cpp:456 chat/chatwindow.cpp:457 +msgid "P&revious Tab" +msgstr "Pestanya &anterior" + +#: chat/chatwindow.cpp:458 chat/chatwindow.cpp:459 +msgid "Ne&xt Tab" +msgstr "Pestanya &següent" + +#: chat/chatwindow.cpp:474 +msgid "Enable or disable the contacts panel" +msgstr "Habilita o deshabilita el plafó de contactes" + +#: chat/chatwindow.cpp:475 chat/chatwindow.cpp:476 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contactes" + +#: chat/chatwindow.cpp:480 +msgid "Enable or disable the standard emoticons panel" +msgstr "Habilita o deshabilita el plafó de les emoticones" + +#: chat/chatwindow.cpp:481 chat/chatwindow.cpp:482 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticones" + +#: chat/chatwindow.cpp:486 +msgid "Enable or disable the custom emoticons panel" +msgstr "Habilita o deshabilita el plafó de les emoticones personlitzades" + +#: chat/chatwindow.cpp:487 chat/chatwindow.cpp:488 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Les meves emoticones" + +#: chat/chatwindow.cpp:500 +msgid "&Font" +msgstr "Tipus de lletra" + +#: chat/chatwindow.cpp:501 +msgid "Font &Color" +msgstr "Color de la lletra" + +#: chat/chatwindow.cpp:502 +msgid "C&lear Chat Window" +msgstr "Neteja la finestra de conversa" + +#: chat/chatwindow.cpp:570 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Comença o atura una conversa" + +#: chat/chatwindow.cpp:993 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" +"Heu fet servir una sintaxi incorrecta per a la comanda /status. La " +"sintaxi correcta és: /status online|away|idle|brb|busy|lunch|phone|" +"invisible.
O bé podeu fer servir les dreceres /online, /" +"phone etc." + +#: chat/chatwindow.cpp:996 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Sintaxi /status incorrecta" + +#: chat/chatwindow.cpp:1059 +msgid "You cannot use the /block command in a group chat." +msgstr "" +"No podeu fer servir la comanda /block en una conversa de grup." + +#: chat/chatwindow.cpp:1061 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "No es pot fer servir la comanda /block!" + +#: chat/chatwindow.cpp:1072 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" +"No podeu fer servir la comanda /unblock en una conversa de grup." + +#: chat/chatwindow.cpp:1074 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "No es pot fer servir la comanda /unblock!" + +#: chat/chatwindow.cpp:1104 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" +"Comanda %1 desconeguda. Si no volíeu que aquest missatge fos " +"una comanda, escriviu un altre / al principi." + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Comanda desconeguda" + +#: chat/chatwindow.cpp:1573 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Conversa" + +#: chat/chatwindow.cpp:1577 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Conversa" + +#: chat/chatwindow.cpp:1597 kmessinterface.cpp:674 +#, kde-format +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 "" +"Esteu segurs que voleu amagar la barra de menú? La podeu tornar a " +"mostrar un altre cop fent servir la següent decera de teclat: %1" + +#: chat/chatwindow.cpp:1601 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Amagament del menú" + +#: chat/chatwindow.cpp:1854 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 està escrivint..." + +#: chat/chatwindow.cpp:1864, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 i %2 estan escrivint..." + +#: chat/chatwindow.cpp:1868 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 i %3 més estan escrivint..." + +#: chat/chatwindow.cpp:2252 +msgctxt "Label text" +msgid "" +"Handwriting is disabled: KMess cannot send drawings to some of the contacts." +msgstr "" +"Dibuixar està deshabilitat: KMess no pot enviar dibuixos a algun dels " +"contactes." + +#: chat/chatwindow.cpp:2257 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to some of the contacts." +msgstr "" +"Les ganyotes estan deshabilitades: KMess no pot enviar ganyotes a algun dels " +"contactes." + +#: chat/chatwindow.cpp:2374 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

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

Informació de la conversa

Contactes:
  • %1
Conversa començada el:
%" +"2
Connectat amb el compte:
%3
" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "&Comença una conversa privada" + +#: chat/contactframe.cpp:298 kmessview.cpp:609 +msgid "&Send Email" +msgstr "&Envia un correu electrònic" + +#: chat/contactframe.cpp:299 kmessview.cpp:610 msgid "&View Profile" -msgstr "&Mostrar perfil" +msgstr "&Visualitza el perfil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:612 +msgid "&Properties" +msgstr "&Propietats" + +#: chat/contactframe.cpp:303 kmessview.cpp:614 msgid "&Add Contact" -msgstr "&Afegir contacte" +msgstr "&Afegeix el contacte" -#: chat/contactframe.cpp:235 kmessview.cpp:619 -#, fuzzy +#: chat/contactframe.cpp:304 kmessview.cpp:615 msgid "A&llow Contact" -msgstr "&Permetre contacte" +msgstr "Permet al contacte" -#: chat/contactframe.cpp:236 kmessview.cpp:622 -#, fuzzy +#: chat/contactframe.cpp:305 kmessview.cpp:618 msgid "&Delete Contact" -msgstr "&Eliminar Contacte" +msgstr "E&sborra el contacte" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:616 msgid "&Block Contact" -msgstr "&Bloquejar contacte" +msgstr "Bloqueja el contacte" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:617 msgid "&Unblock Contact" -msgstr "&Desbloquejar contacte" +msgstr "&Desbloqueja el contacte" -#: chat/contactframe.cpp:241 -#, fuzzy +#: chat/contactframe.cpp:310 kmessview.cpp:621 msgid "&Friendly Name" -msgstr "El teu nom amigable:" +msgstr "&Nom amistós" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:622 msgid "&Personal Message" -msgstr "" +msgstr "&Missatge persona" -#: chat/contactframe.cpp:243 -#, fuzzy +#: chat/contactframe.cpp:312 kmessview.cpp:623 msgid "&Email Address" -msgstr "Adreça de correu:" +msgstr "Adreça de correu electrònic" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "" +#: chat/contactframe.cpp:313 kmessview.cpp:624 +msgid "Song &Name" +msgstr "&Nom de la cançó" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Informació" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "Imatges del contacte" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "&Notes" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "&Emoticones" + +#: chat/contactframe.cpp:347 kmessview.cpp:659 +msgid "&Copy" +msgstr "&Copia" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Bloquejat" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Fora de linea" +#: chat/contactframe.cpp:765 +#, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "El contacte està %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Torno en un moment" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" +"

No heu afegit cap emoticona personalizada encara.

Per " +"afegir-ne de noves, cliqueu aquí!

" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Afegeix a la conversa" + +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Afegeix nova emoticona" + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Edita" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Esborra" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

Encara no teniu cap ganyota.

Per afegir-ne de noves, " +"feu que us les enviïn els vostres contactes!

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Comunicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 compatible" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 compatible" + +#: contact/contactbase.cpp:353 +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger compatible" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "En línia " + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Ocupat" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Fora de linea" +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Absent" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "No es a l'ordinador" +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Absent amb auto-resposta" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Estic menjant" +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inactiu" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "En linea" +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Ara torno" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Al telèfon" -#: chat/contactframe.cpp:558 -msgid "The contact is %1" -msgstr "" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Estic menjant" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Invisible" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Desconnectats" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "Afegir un contacte" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "El &meu estat" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Afegeig l'adreça de correu de la persona que vols afegir:" +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Desconnecta" -#: dialogs/addcontactdialog.cpp:88 -#, fuzzy -msgid "The e-mail address given was invalid!" -msgstr "L'usuari no es valid" +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Afegeix un Contacte" -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 -#, fuzzy +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" -msgstr "Mostrar &Emoticones" +msgstr "Afegeix una emoticona nova" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Edita l'emoticona" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Especificar un missatge d'absencia" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "L'emoticona \"%1\" ja existeix. Voleu reemplaçar-la?" #: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Missatge automàtic d'absència" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Historial de converses" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Entra el missatge que s'enviará automaticament\n" -"a la gent que t'intenti enviar un missatge:" +"Hi ha hagut un error en obrir els vostres registres de conversa. Això pot " +"ser degut a un problema de permisos, comproveu que teniu accés de lectura i " +"escriptura a la carpeta "%1". Sinó, els vostres registres " +"poden estar defectuosos." -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Fer anar un nom alternatiu per aquesta persona" +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "No s'ha pogut obrir el registre de conversa" -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Mostra un globus cuan aquesta persona canvia de Online a Ofline" +#: dialogs/chathistorydialog.cpp:567 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Carregant..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Foto:" +#: dialogs/chathistorydialog.cpp:589 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "No hi ha converses registrades" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "So:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Algú us ha afegit" -#: dialogs/contactpropertiesdialog.cpp:229 -#, fuzzy +#: dialogs/contactaddeduserdialog.cpp:60, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"us ha afegit a la seva llista de contactes." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"us ha afegit a la seva llista de contactes." + +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" -msgstr "Propietats del contacte per " +msgstr "Propietats del contacte %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Adreça de correu: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1189 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Connectat" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Nom actual: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1193 +msgid "Not seen yet" +msgstr "Mai vist encara" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1208 +msgid "No messages yet" +msgstr "Cap missatge encara" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Vist per úlima vegada: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Últim missatge: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Adreça de correu electrònic: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Client: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Esteu segurs que voleu fer servir la imatge d'aquest contacte?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "Copia la imatge del contacte" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "El fitxer triat no està suportat per Phonon." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "Tipus de fitxes no suportat" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Convida contactes" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +msgid "Export Contact List for %1" +msgstr "Exporta la llista de contactes de %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Res per exportar" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "El fitxer ja existeix" + +#: dialogs/listexportdialog.cpp:159 +#, kde-format +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "El fitxer %1 ja existeix, el voleu sobreescriure?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Exportació finalitzada" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "L'exporació de la llista de contactes ha finalitzat" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" -msgstr "" +msgstr "Finestra de connexions" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "Desa la pestanya" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "Neteja la pestanya" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "Tanca totes les pestanyes" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." msgstr "" +"No hi ha cap connexió activa.\n" +"No es pot obrir la finestra de connexions." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" +"No s'ha pogut desar el registre de la finestra de connexions. Assegure-vos " +"que teniu permisos d'escriptura a la carpeta on s'està desant" -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." -msgstr "" +msgstr "No es pot tancar la pestanya principal de conexions" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"Enviar comandes al servidor és arriscat.
Si no sabeu exactament com " +"fer-ho, podeu tenir sort i només ser desconnectats, o pot portar " +"conseqüències més serioses.
Heu estat avisats!
Voleu " +"seguir enviant aquest missatge?" + +#: dialogs/networkwindow.cpp:1303 +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 càrrega útil que esteu intentant enviar no acaba amb la nova línia " +"requerida ('\\r\\n')!
Voleu que KMess l'afegeixi per vosaltres?" + +#: dialogs/networkwindow.cpp:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "No es poden enviar commandes a aquest tipus de connexió!" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:766 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" -msgstr "" +msgstr "Cancel·lat" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Error!" -#: dialogs/transferentry.cpp:202 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Conectat" +msgstr "Completat" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:741 +#, kde-format msgid "%1 MB" -msgstr "" +msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:746 +#, kde-format msgid "%1 kB" -msgstr "" +msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:750 +#, kde-format msgid "%1 bytes" -msgstr "" +msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 de %2 rebuts." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 de %2 enviats." -#: dialogs/transferwindow.cpp:74 -#, fuzzy +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "infinit" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:892 msgid "File Transfers" -msgstr "Transferencia de l'arxiu completada." +msgstr "Transferències de fitxers" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Utilitza" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Es&borra" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "Trieu o esborreu la vostra imatge per a mostrar" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "Esteu segurs que voleu esborrar aquesta imatge?" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Esborra la imatge a mostrar" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" +"No s'ha pogut desar el tema d'emoticones. Assegureu-vos de tenir permisos " +"d'escriptura a la carpeta de temes '%1'." -#: emoticontheme.cpp:736 -#, fuzzy +#: emoticontheme.cpp:833 msgid "Smile" -msgstr "Correu" +msgstr "Somriure" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" -msgstr "" +msgstr "Ganyota" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" -msgstr "" +msgstr "Llengua fora" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" -msgstr "" +msgstr "Gran somriure" -#: emoticontheme.cpp:740 -#, fuzzy +#: emoticontheme.cpp:837 msgid "Sad" -msgstr "i" +msgstr "Trist" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" -msgstr "" +msgstr "Plorant" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" -msgstr "" +msgstr "Enfadat" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" -msgstr "" +msgstr "Confús" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" -msgstr "" +msgstr "Avergonyit" -#: emoticontheme.cpp:745 -#, fuzzy +#: emoticontheme.cpp:842 msgid "Disappointed" -msgstr "Desconectat" +msgstr "Decebut" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" -msgstr "" +msgstr "Calent" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" -msgstr "" +msgstr "Ensenya les dents" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" -msgstr "" +msgstr "Estudiós" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" -msgstr "" +msgstr "Malalt" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" -msgstr "" +msgstr "Sorprès" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" -msgstr "" +msgstr "Festa" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" -msgstr "" +msgstr "Somnolent" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" -msgstr "" +msgstr "Pensatiu" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" -msgstr "" +msgstr "No ho diguis a ningú" -#: emoticontheme.cpp:755 -#, fuzzy +#: emoticontheme.cpp:852 msgid "Secret telling" -msgstr "Preferéncies" +msgstr "Secret" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" -msgstr "" +msgstr "Ulls giratoris" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" -msgstr "" +msgstr "Sarcàstic" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" -msgstr "" +msgstr "No ho sé" -#: emoticontheme.cpp:759 -#, fuzzy +#: emoticontheme.cpp:856 msgid "Be right back" -msgstr "Torno en un moment" +msgstr "Ara torno" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" -msgstr "" +msgstr "Àngel" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" -msgstr "" +msgstr "Abraçada esquerra" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" -msgstr "" +msgstr "Noi" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" -msgstr "" +msgstr "Cor vermell" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" -msgstr "" +msgstr "Rosa vermella" -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "" +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "Polzes amunt" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" -msgstr "" +msgstr "Cara de gos" -#: emoticontheme.cpp:767 -#, fuzzy +#: emoticontheme.cpp:864 msgid "Sun" -msgstr "So:" +msgstr "Sol" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" -msgstr "" +msgstr "Dimoni" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" -msgstr "" +msgstr "Abraçada dreta" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" -msgstr "" +msgstr "Noia" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" -msgstr "" +msgstr "Cor trencat" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" -msgstr "" +msgstr "Rosa pansida" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" -msgstr "" +msgstr "Polzes avall" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" -msgstr "" +msgstr "Cara de gat" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" -msgstr "" +msgstr "Mitja lluna" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" -msgstr "" +msgstr "Llavis vermells" -#: emoticontheme.cpp:777 -#, fuzzy +#: emoticontheme.cpp:874 msgid "Clapping" -msgstr "Parlant" +msgstr "Aplaudiment" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" -msgstr "" +msgstr "Dits creuats" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" -msgstr "" +msgstr "Cotxe" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" -msgstr "" +msgstr "Avió" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" -msgstr "" +msgstr "Tortuga" -#: emoticontheme.cpp:782 -#, fuzzy +#: emoticontheme.cpp:879 msgid "Snail" -msgstr "&Enviar un correu" +msgstr "Caragol" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Ovella" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" -msgstr "" +msgstr "Cabra" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" -msgstr "" +msgstr "Vampir" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" -msgstr "" +msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" -msgstr "" +msgstr "Cervesa" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" -msgstr "" +msgstr "Got de Martini" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" -msgstr "" +msgstr "Tassa de cafè" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" -msgstr "" +msgstr "Pastís d'aniversari" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" -msgstr "" +msgstr "Plat" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" -msgstr "" +msgstr "Bol" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" -msgstr "" +msgstr "Estrella" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" -msgstr "" +msgstr "Arc de Sant Martí" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" -msgstr "" +msgstr "Núvol de tempesta" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" -msgstr "" +msgstr "Llamp" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" -msgstr "" +msgstr "Paraigües" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" -msgstr "" +msgstr "Illa amb una palmera" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" -msgstr "" +msgstr "Telèfon fix" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" -msgstr "" +msgstr "Telèfon mòbil" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" -msgstr "Correu" +msgstr "Correu electrònic" -#: emoticontheme.cpp:802 -#, fuzzy +#: emoticontheme.cpp:899 msgid "Clock" -msgstr "Bloquejat" +msgstr "Rellotge" -#: emoticontheme.cpp:803 -#, fuzzy +#: emoticontheme.cpp:900 msgid "Camera" -msgstr "El teu nom" +msgstr "Càmera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" -msgstr "" +msgstr "Rodet de pel·lícula" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" -msgstr "" +msgstr "Nota" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" -msgstr "" +msgstr "Manilles" -#: emoticontheme.cpp:807 -#, fuzzy +#: emoticontheme.cpp:904 msgid "Money" -msgstr "Mes" +msgstr "Diners" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" -msgstr "" +msgstr "Bombeta" -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "" +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "Cigarret" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "Pilota de futbol" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" -msgstr "" +msgstr "Regal amb un llaç" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" -msgstr "" +msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" +msgstr "Ordinador" + +#: emoticontheme.cpp:911 +msgid "KMess icon" +msgstr "Icona de KMess" + +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "No s'ha pogut connectar: no s'ha trobat el compte" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" msgstr "" +"No s'ha pogut connectar: aquest compte no té cap contrasenya emmagatzemada" -#: emoticontheme.cpp:814 -#, fuzzy -msgid "KMess Icon" -msgstr "KMess" - -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" +#: initialview.cpp:280 initialview.cpp:375 +#, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" msgstr "" +"A l'espera d'una connexió a Internet per reconnectar-se...
Reconnecta't ara!" -#: kmess.cpp:288 kmess.cpp:292 -#, fuzzy -msgid "Add a group" -msgstr "&Afegir grup" +#: initialview.cpp:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Connexió a Internet no disponible" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Introdueix un nom nom per aquest grup:" +#: initialview.cpp:401 +#, kde-format +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 segon per a reconnectar-se...
Reconnecta't ara!" +msgstr[1] "" +"%1 segons per a reconnectar-se...
Reconnecta't ara!" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Fora de linea, amb resposta automàtica" +#: initialview.cpp:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Connecta't " -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Cancel·la" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" msgstr "" +"Si us plau, escriviu la vostra adreça de correu electrònic i la vostra " +"contrasenya" -#: kmess.cpp:715 -#, fuzzy +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Si us plau, escriviu una adreça de correu electròni vàlida" + +#: kmess.cpp:218 +#, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "" +"El contacte %1 ja es troba a la vostra llista de contactes." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Informació del contacte" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Nou grup" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Afegeix un grup" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Escriviu un nom per al nou grup:" + +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" -msgstr "Estás segur que vols eliminar aquest grup?" +msgstr "" +"Esteu segurs que voleu esborrar el contacte %1 de la vostra " +"llista de contactes?" -#: kmess.cpp:718 -#, fuzzy -msgid "Remove contact" -msgstr "&Eliminar Contacte" +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "Esborra el contacte" -#: kmess.cpp:720 -#, fuzzy -msgid "Remove and block" -msgstr "Eliminat" +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "Esborra i bloqueja" -#: kmess.cpp:760 -#, fuzzy +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" +"El grup %1 no està buit: treieu o esborreu tots els contactes del " +"grup i torneu-ho a provar!" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Esborrament del grup" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" msgid "" "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:763 -#, fuzzy -msgid "Remove group" -msgstr "&Eliminar Grup" - -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "Aquest es un grup especial i no es pot canviar" - -#: kmess.cpp:805 kmess.cpp:809 -#, fuzzy -msgid "Rename group" -msgstr "Re&nombrar grup" - -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Conectat" - -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "Desconectat" - -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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 "" +"Esteu segurs que voleu esborrar el grup %1 de la vostra llista de " +"contactes?" -#: kmess.cpp:1673 -#, fuzzy -msgid "Error with notifications" -msgstr "Notificació de correu" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Esborra" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nou &Perfil" +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." +msgstr "Aques es un grup especial, que no es pot canviar." -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Nou &Contacte" +#: kmess.cpp:676 +msgid "Rename Group" +msgstr "Reanomena el grup" -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Nou &Grup" +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "Escriviu un nom nou per aquest grup:" -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "&Buscar un contacte" +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" +"

No es pot connectar automàticament amb aquest compte %1:
primer heu de desar la contrasenya del compte!

" -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Buscar per &Interés" +#: kmess.cpp:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Autoconnexió fallida" -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "&Opcions del compte" +#: kmess.cpp:1039 +msgid "Connection could be down..." +msgstr "La connexió podria estar caiguda " + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Desconnectat" + +#: kmess.cpp:1448 +#, kde-format +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 ho ha cercat a les següents carpetes:
%1

" + +#: kmess.cpp:1460 +#, kde-format +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 no podrà reproduir sons ni mostrar notificacions.

El " +"fitxer 'kmess.notifyrc' no s'ha pogut trobar en cap carpeta del'aplicació.%1

Si us plau, verifiqueu la vostra instal·lació.

" + +#: kmess.cpp:1466 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Error amb les notificacions" + +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "&Incicia sessió" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Desconnecta't" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Mostra el meu &perfil" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "Mostra els c&ontactes permesos" + +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "Mostra les contactes &desconnectats" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "Mostra els contactes &esborrats" + +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Mostra l'&historial" #: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Accions" +msgid "&Show Search Bar" +msgstr "Mostra la barra de &cerca" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Mostra els grups &buits" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "&Mida de les imatges" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "&Ordena els contactes per" + +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Mostra la finestra de &transferències" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Nou &contacte..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Nou &grup..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "&Exporta la llista de contactes..." + +#: kmessinterface.cpp:183 kmessview.cpp:611 +msgid "Show Chat &History..." +msgstr "Mostra l'&historial de conversa..." + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Nou com&pte" + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Configua el compte..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Configura &KMess..." #: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Co&nectar" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Desconectar" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Veure el meu &perfil" +msgid "Show Selection &Menu" +msgstr "Mostra el &menú de selecció" #: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "El meu &Estat" +msgid "Do Not Display" +msgstr "No en mostris" -#: kmessinterface.cpp:220 -msgid "&Connect" -msgstr "&Conectar" +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Petites" -#: kmessinterface.cpp:275 -msgid "Show &Allowed Contacts" -msgstr "&Veure els contactes admesos" +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Mitjanes" -#: kmessinterface.cpp:276 -msgid "Show &Offline Contacts" -msgstr "Veure els contactes f&ora de linea" +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Grans" -#: kmessinterface.cpp:277 -msgid "Show &Removed Contacts" -msgstr "Veure els contactes &eliminats" - -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Foto:" - -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "" - -#: kmessinterface.cpp:285 -msgid "&Sort Contacts by" -msgstr "&Ordenar els contactes per" - -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:197 msgid "Group" msgstr "Grup" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" -msgstr "En Linea/Fora" +msgstr "Connectats/Desconnectats" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Mixte" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "Mostra la &fonestra de connexions..." -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:327 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Connectat amb %2" -#: kmessview.cpp:613 -#, fuzzy +#: kmessview.cpp:364 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 s'ha connectat" + +#: kmessview.cpp:369 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 s'ha desconnectat" + +#: kmessview.cpp:608 msgid "Cha&t" -msgstr "Xat" +msgstr "Con&versa" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Propietats" +#: kmessview.cpp:619 +msgid "&Remove From Group" +msgstr "&Esborra del grup" -#: kmessview.cpp:623 -#, fuzzy -msgid "&Remove from group" -msgstr "&Eliminar Grup" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Moure al grup" - -#: kmessview.cpp:641 -#, fuzzy +#: kmessview.cpp:652 msgid "&Copy to Group" -msgstr "&Moure al grup" +msgstr "&Copia al grup" -#: kmessview.cpp:674 +#: kmessview.cpp:653 +msgid "&Move to Group" +msgstr "&Mou al grup" + +#: kmessview.cpp:704 msgid "Move Group &Down" -msgstr "&Moure grup a sota" +msgstr "Mou el grup a&vall" -#: kmessview.cpp:675 +#: kmessview.cpp:705 msgid "Move Group &Up" -msgstr "&Moure grup a sobre" +msgstr "Mou el gru am&unt" -#: kmessview.cpp:676 +#: kmessview.cpp:706 msgid "Re&move Group" -msgstr "&Eliminar Grup" +msgstr "Es&borra el grup" -#: kmessview.cpp:677 +#: kmessview.cpp:707 msgid "Re&name Group" -msgstr "Re&nombrar grup" +msgstr "Rea&nomena el grup" -#: kmessview.cpp:1723 -#, fuzzy -msgid "You have 1 new e-mail in your inbox." -msgstr "nou correu al compte" +#: kmessview.cpp:1145 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Aquesta persona no us té a la seva llista de contactes." -#: kmessview.cpp:1727 -#, fuzzy -msgid "You have %1 new emails in your inbox." -msgstr "nous correus al compte" +#: kmessview.cpp:1154 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Correu electrònic" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Fora)" +#: kmessview.cpp:1161 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Client" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Torno en un moment)" +#: kmessview.cpp:1173 +msgid "Yes" +msgstr "Sí" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Ocupat)" +#: kmessview.cpp:1177 +msgid "No" +msgstr "No" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Invisible)" +#: kmessview.cpp:1180 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloquejat" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(No toca l'ordinador)" +#: kmessview.cpp:1200 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Vist per últim cop" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Fora a dinar)" +#: kmessview.cpp:1215 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Darrer missatge" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Al telèfon)" +#: kmessview.cpp:1225 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Grup %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Entrar automaticament amb el correu" +#: kmessview.cpp:1233 +#, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contacte, %2 en línia" +msgstr[1] "%1 contactes, %2 en línia" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1240 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contacte" +msgstr[1] "%1 contactes" + +#: kmessview.cpp:1660 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Escriviu aquí el vostre missatge personal>" + +#: kmessview.cpp:1661 +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 "" +"Escriviu aquí un missatge per mostrar als vostres contactes: el veuran " +"juntament amb el vostre nom amistós" + +#: kmessview.cpp:1842 +msgid "You have not chatted with this contact yet." +msgstr "No heu parlat mai amb aquest contacte." + +#: kmessview.cpp:1843 +msgid "No Chat History found." +msgstr "No s'ha trobat cap historial de converses." + +#: kmessview.cpp:2029, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 correu electrònic nou" +msgstr[1] "% correus electrònics nous" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:488 settings/accountpage.cpp:549 msgid "KMess" msgstr "KMess" -#: main.cpp:78 -#, fuzzy +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "Un client de Live Messenger per a KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Desenvolupador i fundador del projecte" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Desenvolupador" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Suport al projecte" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Desenvolupador actual" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:125 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastassi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:67 main.cpp:162 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:161 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." -msgstr "Traducció alemana, test, documentació i pàgina web" +msgstr "" +"Traducció a l'alemany, proves, documentació, pàgina web, gestió del " +"projecte, etc..." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett " + +#: main.cpp:72 msgid "Web design" -msgstr "Diseny web" +msgstr "Disseny de la pàgina web" + +#: main.cpp:73 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" +"Principals conjunts d'emoticones grogues/blaves/liles, traducció a l'italià" + +#: main.cpp:74 +msgid "Cartoon emoticons" +msgstr "Emoticones de dibuixos" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "Tema de so per omissió" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "Icona del KMess en estil Oxygen" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:109 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" #: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "" -"Les emoticones principals groga/blava/violeta, varies emoticones i la " -"traducció a l'italià." - -#: main.cpp:81 -msgid "Cartoon emoticons" -msgstr "Emoticones Cartoon" +msgid "Translations Maintainer" +msgstr "Manteniment de les traduccions" #: main.cpp:82 -msgid "Default sound theme" -msgstr "El tema de so per defecte" +msgid "Arabic translation, internationalization of file saving fix." +msgstr "Traducció a l'àrab, internacionalització en la desada dels fitxers" + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "Més traducció a l'àrab" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "Traducció al portuguès del Brazil." + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" #: main.cpp:86 -msgid "Arabic translation, internationalization of file saving fix." -msgstr "Traducció a l'Arab, arranjaments en el sistema per guardar fitxers" +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Més traducció al portuguès del Brazil" #: main.cpp:87 -#, fuzzy -msgid "More Arabic translation" -msgstr "Mes Traducció al Turc" +msgid "Sergio Rafael Lemke" +msgstr "Sergio Rafael Lemke" #: main.cpp:88 -msgid "Brazilian Portuguese translation" -msgstr "Traducció brasilera/portuguesa" +msgid "Maurício Arozi Moraes" +msgstr "Maurício Arozi Moraes" -#: main.cpp:89 -#, fuzzy +#: main.cpp:90 msgid "Catalan translation" msgstr "Traducció al català" -#: main.cpp:91 -#, 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:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" -#: main.cpp:92 -#, fuzzy -msgid "More Simplified Chinese translation" -msgstr "Traducció simplificada al Xinés, enviament d'arxius bug fix" +#: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "Adrià Arrufat" + +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "Més traducció al català" #: main.cpp:93 -#, fuzzy -msgid "Traditional Chinese translation" -msgstr "Traducció al català" +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" +"Traducció al xinès simplificat, enviament de dades errònies, codi de " +"connexió proxy" + +#: main.cpp:94 main.cpp:157 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "Més traducció al xinès simplificat" #: main.cpp:95 -#, fuzzy -msgid "Danish translation" -msgstr "Traducció danesa" +msgid "Cheng Yang" +msgstr "Cheng Yang" #: main.cpp:96 -#, fuzzy -msgid "More Danish translation" -msgstr "Traducció danesa" +msgid "Traditional Chinese translation" +msgstr "Traducció al xinès tradicional" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" #: main.cpp:97 -msgid "Dutch translation" -msgstr "Traduccó \"Dutch\"" +msgid "More Traditional Chinese translation" +msgstr "Més traducció al xinès tradicional" -#: main.cpp:98 -#, fuzzy -msgid "More Dutch translation" -msgstr "Traduccó \"Dutch\"" +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Xinès-Tryneeds" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "Traducció al danès" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" #: main.cpp:100 -#, fuzzy -msgid "Estonian translation" -msgstr "Traducció Estonia" +msgid "More Danish translation" +msgstr "Més traducció al danès" -#: main.cpp:101 -#, fuzzy -msgid "Finnish translation" -msgstr "Traducció danesa" +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" -#: main.cpp:102 main.cpp:103 -#, fuzzy -msgid "More Finnish translation" -msgstr "Traducció danesa" +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Aren van Beelen Jr." + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "Traducció a l'holandès" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 main.cpp:107 +msgid "More Dutch translation" +msgstr "Més traducció a l'holandès" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" #: main.cpp:105 -msgid "French translation" -msgstr "Traducció al francés" +msgid "Elve" +msgstr "Elve" #: main.cpp:106 -#, fuzzy -msgid "More French translation, MSN6 emoticon definitions" -msgstr "Traducció al francés" +msgid "Sander Pientka" +msgstr "Sander Pientka" #: main.cpp:107 -#, fuzzy -msgid "More French translation" -msgstr "Traducció al francés" +msgid "Heimen Stoffels" +msgstr "Heimen Stoffels" #: main.cpp:109 -#, fuzzy -msgid "Hungarian translation" -msgstr "Traducció Estonia" +msgid "More German translation, Greek translation" +msgstr "Més traducció a l'alemany, traducció al grec" -#: main.cpp:110 main.cpp:111 -#, fuzzy -msgid "More Italian translation" -msgstr "Traducció al Koreá" +#: main.cpp:110 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:110 +msgid "More Greek translation" +msgstr "Més traducció al grec" #: main.cpp:112 -msgid "Korean translation" -msgstr "Traducció al Koreá" +msgid "Estonian translation" +msgstr "Traducció a l'estonià" + +#: main.cpp:112 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo " #: main.cpp:113 -#, fuzzy -msgid "Norsk Bokmål translation" -msgstr "Traducció al \"Norsk Bokml\"" +msgid "Finnish translation" +msgstr "Traducció al finlandès" + +#: main.cpp:113 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:114 +msgid "Joonas Niilola" +msgstr "Joones Niilola" + +#: main.cpp:114 main.cpp:115 +msgid "More Finnish translation" +msgstr "Més traducció al finlandès " #: main.cpp:115 -#, fuzzy -msgid "Slovenian translation" -msgstr "Traducció al Koreá" +msgid "Jussi Timperi" +msgstr "Jussi Timperi" -#: main.cpp:116 -msgid "Spanish translation" -msgstr "Traducció española" +#: main.cpp:117 +msgid "Choplair" +msgstr "Choplair" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 -#, fuzzy -msgid "More Spanish translation" -msgstr "mes traducció a l'espanyol." +#: main.cpp:117 +msgid "French translation" +msgstr "Traducció al francès" + +#: main.cpp:118 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "Més traducció al francès, definicions d'emoticones d'MSN6" + +#: main.cpp:118 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:119 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:119 main.cpp:120 main.cpp:121 +msgid "More French translation" +msgstr "Més traducció al francès" + +#: main.cpp:120 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" #: main.cpp:121 -#, fuzzy -msgid "Swedish translation" -msgstr "Traducció española" +msgid "Scias" +msgstr "Scias" #: main.cpp:123 -#, fuzzy -msgid "Thai translation" -msgstr "Traducció al Thailandes" +msgid "Hungarian translation" +msgstr "Traducció a l'hongarès" + +#: main.cpp:123 +msgid "Páder Rezső" +msgstr "Páder Rezső" #: main.cpp:124 -msgid "Turkish translation" -msgstr "Traducció al Turc" +msgid "More Hungarian translation" +msgstr "Més traducció a l'hongarès" + +#: main.cpp:124 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" #: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "Mes Traducció al Turc" +msgid "More Italian translation" +msgstr "Més traducció a l'italià" + +#: main.cpp:126 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:127 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:127 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" +"Més traducció a l'italià, tria del grup en el diàleg 'Us ha afegit un " +"contacte'" + +#: main.cpp:128 +msgid "Korean translation" +msgstr "Traducció al coreà" + +#: main.cpp:128 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" #: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "" +msgid "Norsk Bokmål translation" +msgstr "Traducció al nòrdic" -#: main.cpp:130 -msgid "P4-Context field support" -msgstr "" +#: main.cpp:129 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" #: main.cpp:131 -msgid "Xinerama fixes" -msgstr "Arreglos en el sistema Xinerama" +msgid "Serbian translation" +msgstr "Traducció al serbi" -#: main.cpp:132 -msgid "Original file receive code" -msgstr "El codi original de la recepció d'arxius" +#: main.cpp:131 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" #: main.cpp:133 -msgid "Various internationalization fixes." -msgstr "Alguns arranjaments en la internacionalització" +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:133 +msgid "Slovak translation" +msgstr "Traducció a l'eslovac" #: main.cpp:134 -msgid "GnomeMeeting developer" -msgstr "Programador de GnomeMeeting" +msgid "Matjaž Kaše" +msgstr "Matjaž Kaše" -#: main.cpp:135 +#: main.cpp:134 +msgid "Slovenian translation" +msgstr "Traducció eslovena" + +#: main.cpp:136 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:136 +msgid "Spanish translation" +msgstr "Traducció a l'espanyol" + +#: main.cpp:137 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 main.cpp:141 +#: main.cpp:142 main.cpp:143 +msgid "More Spanish translation" +msgstr "Més traducció a l'espanyol" + +#: main.cpp:138 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:139 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:140 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:141 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:142 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:143 +msgid "Manuel Ramírez" +msgstr "Manuel Ramírez" + +#: main.cpp:145 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:145 +msgid "Swedish translation" +msgstr "Traducció al suec" + +#: main.cpp:146 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:146 +msgid "More Swedish translation" +msgstr "Més traducció al suec" + +#: main.cpp:148 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:148 +msgid "Thai translation" +msgstr "Traducció al tailandès " + +#: main.cpp:149 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:149 +msgid "Turkish translation" +msgstr "Traducció al turc" + +#: main.cpp:150 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:150 main.cpp:151 +msgid "More Turkish translation" +msgstr "Més traducció al turc" + +#: main.cpp:151 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:154 +msgid "MSNP12 support, various patches" +msgstr "Suport a l'MSNP12, diverses correccions" + +#: main.cpp:154 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:155 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:155 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" +"Imatges al codi de la llista de contactes, informació del client del " +"contacte, allunyament/apropament del tipus de lletra a les converses" + +#: main.cpp:156 +msgid "File transfer thumbnails" +msgstr "Miniatures en les transferències de fitxers" + +#: main.cpp:156 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:157 +msgid "P4-Context field support" +msgstr "Suport al context del camp P4" + +#: main.cpp:158 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:158 +msgid "Xinerama fixes" +msgstr "Correccions de Xinerama" + +#: main.cpp:159 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:159 +msgid "Original file receive code" +msgstr "Codi original de fitxers rebuts" + +#: main.cpp:160 +msgid "KWallet support" +msgstr "Suport al KWallet" + +#: main.cpp:160 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:161 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Opció de bloqueig de notificacions, opció per deshabilitar les ganyotes, " +"data de l'últim missatge rebut" + +#: main.cpp:162 +msgid "IRC-like commands in the chat window" +msgstr "Comandes tipus IRC a la finestra de la conversa" + +#: main.cpp:163 +msgid "Chat history dialog" +msgstr "Historial de converses" + +#: main.cpp:163 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:166 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:166 +msgid "Various internationalization fixes" +msgstr "Correcció de diverses internacionalitzacions" + +#: main.cpp:167 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:167 +msgid "Various internationalization fixes." +msgstr "Correcció de diverses internacionalitzacions" + +#: main.cpp:169 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:169 +msgid "GnomeMeeting developer" +msgstr "Desenvolupador de GnomeMeeting" + +#: main.cpp:170 msgid "Guy with a bag over his head" msgstr "Noi amb una bossa al cap" -#: main.cpp:138 +#: main.cpp:170 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:173 msgid "Inspiration and assorted code" -msgstr "Inspiració i una mica de codi" +msgstr "Codi d'inspiració i variat" -#: main.cpp:139 -#, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Codi dels globus" +#: main.cpp:173 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" -#: main.cpp:140 -msgid "Idle timer code" -msgstr "Codi del temporitzador" +#: main.cpp:174 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" -#: main.cpp:141 -msgid "Close-to-tray icon screenshot code" +#: main.cpp:174 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "" +"Codi de les notificacions de globus antigues, codi inicial p2p, control dels " +"reptes de msn" -#: main.cpp:144 -#, fuzzy -msgid "Your name here?" -msgstr "El teu nom" +#: main.cpp:175 +msgid "Idle timer code" +msgstr "Codi de temporització a la inactivitat" -#: main.cpp:144 +#: main.cpp:175 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:176 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:176 +msgid "Close-to-tray icon screenshot code" +msgstr "Codi de tancar a la safata del sistema amb una captura de pantalla" + +#: main.cpp:177 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:177 +msgid "Custom crash handler implementation" +msgstr "Implementació del manipulador de fallades personalitzat" + +#: main.cpp:178 msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"KNotify not giving focus bug fix and KWin focus stealing prevention " +"workaround" +msgstr "Correcció de focus per KNotify i de pèrdua de focus per KWin" + +#: main.cpp:178 +msgid "Quassel" +msgstr "Quassel" + +#: main.cpp:181 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" msgstr "" +"Podeu enviar correccions i millores als fòrums d'ajuda de KMess!\n" +"Si trobeu que el vostre nom hauria de figurar aquí, si us plau, contacteu " +"amb nosaltres!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 -#, fuzzy +#: main.cpp:181 +msgid "Your name here?" +msgstr "El vostre nom aquí?" + +#: main.cpp:184 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Els vostres noms" + +#: main.cpp:185 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "El vostre correu electrònic" + +#: main.cpp:191 +msgid "Do not show the contact list window initially" +msgstr "No mostris la llista de contactes a l'inici" + +#: main.cpp:192 +msgid "Autologin with the given email address" +msgstr "Autoconnecta't amb aquesta adreça de correu elctrònic" + +#: main.cpp:197 +msgid "Run a debug test (developer build only)" +msgstr "" +"Executa una prova amb depuració (només per a compilacions de desenvolupadors)" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "Sense grup" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Permesos" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Esborrats" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." -msgstr "Has cancel·lat la invitació." +msgstr "El contacte ha cancel·lat la sessió" -#: network/applications/application.cpp:288 -#, fuzzy +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." -msgstr "El contacte ha rebutjat el meeting." +msgstr "El contacte ha refusat la invitació" -#: network/applications/application.cpp:360 -#, fuzzy +#: network/applications/application.cpp:378 msgid "You have cancelled the session." -msgstr "Has cancel·lat la invitació." +msgstr "Heu cancel·lat la sessió" -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." -msgstr "Has rebutjat l'invitació." +msgstr "Heu refusat la invitació" -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to accept or cancel?" -msgstr "" +msgstr "Voleu acceptar o cancel·lar?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." +msgstr "Cliqueu per cancel·lar." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "El contacte us vol enviar un fitxer: "%1" (%2)." + +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" msgstr "" +"El fitxer "%1" ja existeix.\n" +"El voleu sobreescriure?" -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Vols acceptar l'arxiu: " +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"La tranferència del fitxer "%1" ha fallat. No s'ha pogut desar el " +"fitxer." -#: network/applications/filetransfer.cpp:209 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "error. No s'ha pogut obrir l'arxiu" +#: network/applications/filetransfer.cpp:295 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "" +"La transferència del fitxer "%1" ha fallat. No s'ha pogut obrit el " +"fitxer destí." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -#, fuzzy -msgid "Connecting to %1, port %2" -msgstr "Conexió fallida" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -#, fuzzy -msgid "The transfer was cancelled" -msgstr "Transferencia acceptada." - -#: network/applications/filetransfer.cpp:370 -#, fuzzy -msgid "Connection established" -msgstr "Conexió fallida" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -#, fuzzy -msgid "Successfully transferred file: %1" -msgstr "Arxiu transferit: " - -#: network/applications/filetransfer.cpp:600 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "error. No s'ha pogut obrir l'arxiu" - -#: network/applications/filetransfer.cpp:604 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "error. No es pot fer la conexió" - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -#, fuzzy -msgid "Sending file %1" -msgstr "Enviant l'arxiu " - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." -msgstr "Transferencia acceptada." +msgstr "Transferència acceptada." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Connectant-se a %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:548 +#, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "El contacte ha cancel·lat la transferència del fitxer "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:559 +#, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Heu cancel·lat la transferència del fitxer "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:570 +#, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Heu refusat la transferència del fitxer "%1"." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Connexió establerta" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:674 +#, kde-format +msgid "Successfully sent the file "%1"." +msgstr "S'ha enviat amb èxit el fitxer "%1"." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:678 +#, kde-format +msgid "Successfully received the file "%1"." +msgstr "S'ha rebut amb èxit el fitxer "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:811 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "" +"La transferència del fitxer "%1" ha fallat. El fitxer no existeix." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:816 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "" +"La transferència del fitxer "%1" ha fallat. El fitxer no s'ha " +"pogut llegir." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:850 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Enviat el fitxer "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:888 +#, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "El contacte ha acceptat la transferència del fitxer "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" -msgstr "" +msgstr "Negociant opcions per connectar-se" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 -#, fuzzy +#: 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 "Has cancel·lat la invitació." +msgstr "" +"La invitació de transferència s'ha cancel·lat. S'han rebut dades errònies." -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "error. No s'ha pogut obrir l'arxiu" +#: network/applications/filetransferp2p.cpp:404 +#, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Heu acceptat la transferència del fitxer "%1"." -#: network/applications/filetransferp2p.cpp:531 -#, fuzzy -msgid "The contact cancelled the transfer." -msgstr "Has cancel·lat la invitació." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:614 msgid "File could not be written" -msgstr "" +msgstr "No s'ha pogut escriure el fitxer" -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "error. No s'ha pogut obrir l'arxiu" - -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "error. No es pot fer la conexió" - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "Enviant l'arxiu " - -#: network/applications/gnomemeeting.cpp:55 +#: 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)" +msgstr "" +"Heu estat invitats per començar una conferència (fent servir GnomeMeeting)." -#: network/applications/gnomemeeting.cpp:114 -#, fuzzy +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "Engegant GnomeMeeting. Conectant a " +msgstr "Executant GnomeMeeting. Connectant-se a %1." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "Convidant el contacte a un meeting." +msgstr "Convidar el contacte a una conferència." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "" - -#: network/applications/mimeapplication.cpp:119 -#, fuzzy -msgid "The invitation was aborted. An internal error occured." -msgstr "El contacte ha rebutjat el meeting." - -#: network/applications/mimeapplication.cpp:125 -#, 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:130 -#, fuzzy -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "Has cancel·lat la invitació." - -#: network/applications/mimeapplication.cpp:135 +#: network/applications/inktransferp2p.cpp:108, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +"%1 has tried to send you an handwritten message, but it could not be " +"received." msgstr "" +"%1 us ha intentat enviar un dibuix, però no s'ha pogut rebre." -#: network/applications/mimeapplication.cpp:141 -#, fuzzy +#: network/applications/inktransferp2p.cpp:114, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "The handwritten message to %1 could not be delivered." +msgstr "No s'ha pogut enviar el dibuix a %1." + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "La invitació ha estat rebutjada. No està suportada per l'altre client." + +#: network/applications/mimeapplication.cpp:164 +msgid "The invitation was aborted. An internal error occured." +msgstr "La ivitació ha estat cancel·lada degut a un error intern." + +#: network/applications/mimeapplication.cpp:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "" +"La transferència ha estat cancel·lada. S'ha superat el temps d'espera perquè " +"l'usuari acceptés." + +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "" +"La transferència ha estat cancel·lada. S'ha superat el temps d'espera per " +"les dades del fitxer." + +#: network/applications/mimeapplication.cpp:180 +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "" +"La invitació s'ha cancel·lat. La central ha tancat la connexió de la " +"conversa." + +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." -msgstr "Has cancel·lat la invitació." +msgstr "La ivitació ha estat cancel·lada." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "Has estat convidat a compartir l'escriptori d'aquesta persona." +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this contact's desktop." +msgstr "Heu estat invitats per compartir l'escriptori d'aquest contacte." -#: network/applications/msnremotedesktop.cpp:155 -#, fuzzy +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." -msgstr "Engegant GnomeMeeting. Conectant a " +msgstr "Executant KRCD. Connectant-se a %1." -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "El contacte us ha convidat que encara no està suportada per KMess." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" +"La invitació s'ha cancel·lat. El contacte ha enviat dades errònies o KMess " +"no les suporta." -#: network/applications/p2papplication.cpp:1501 -#, fuzzy -msgid "The transfer failed. Data preparation failed." -msgstr "Has cancel·lat la invitació." +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "La transferència ha fallat. El preparament de les dades ha fallat." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "El contacte ha rebutjat el meeting." - -#: network/applications/p2papplication.cpp:1624 -#, fuzzy -msgid "The transfer failed." -msgstr "La transferència de " - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" - -#: network/applications/p2papplication.cpp:2038 -#, fuzzy +#: network/applications/p2papplication.cpp:1192 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "Has cancel·lat la invitació." +msgstr "" +"La invitació s'ha cancel·lat. El missatge no anava dirigit a nosaltres." -#: network/applications/p2papplication.cpp:2584 -#, fuzzy +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "error. No es pot obrir un socket" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "" +"La transferència ha fallat. El contacte ha enviat dades errònies o KMess no " +"ho suporta." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "El contacte ha refusat la invitació. Ha ocorregut un error intern." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" -msgstr "" +msgstr "Esperant connexió de %1, port %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "" +msgstr "Canviant a transferència indirecta (això pot ser lent)." -#: network/applications/p2papplication.cpp:3274 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "error. No es pot obrir un socket" - -#: network/applications/p2papplication.cpp:3293 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "El contacte ha rebutjat el meeting." - -#: network/applications/p2papplication.cpp:3670 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "error. No es pot obrir un socket" - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" -msgstr "" +msgstr "A l'espera de connexió" -#: network/applications/p2papplication.cpp:5013 -#, fuzzy +#: network/applications/p2papplication.cpp:3423 msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." -msgstr "error. No es pot obrir un socket" - -#: network/applications/p2papplication.cpp:5022 -#, 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:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +"La invitació ha estat cancel·lada. S'ha superat el temps d'espera perquè " +"l'usuari acceptés." -#: network/applications/voiceconversation.cpp:77 -#, fuzzy +#: network/applications/p2papplication.cpp:3432 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "" +"La invitació ha estat cancel·lada. S'ha superat el temps d'espera de " +"connexió exitosa o fallida." + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "" +"La invitació ha estat cancel·lada. S'ha superat el temps d'espera de dades." + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "El contacte ha refusat la invitació. Ha ocorregut un error intern." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "La transferència ha fallat." + +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"La transferència ha fallat. S'ha superat el temps d'espera perquè l'usuari " +"acceptés." + +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." +msgstr "La transferència ha fallat. Ha ocorregut un error intern." + +#: network/applications/p2papplicationbase.cpp:1208 +msgid "The transfer failed. Could not open data source." +msgstr "La transferència ha fallat. No s'han pogut obrir les dades font." + +#: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." -msgstr "Has estat convidat a compartir l'escriptori d'aquesta persona." +msgstr "Heu estat invitats a començar una conversa de veu." -#: network/applications/voiceconversation.cpp:82 -#, fuzzy +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" -msgstr "Has estat convidat a començar un meeting (utilitzant GnomeMeeting)" +msgstr "" +"Heu estat invitats a començar una conversa de veu, però no està instal·lat " +"el support per això." -#: network/applications/voiceconversation.cpp:174 -#, fuzzy +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "Has cancel·lat la invitació." +msgstr "Heu cancel·lat la conversa de veu." -#: network/applications/voiceconversation.cpp:211 -#, fuzzy -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "Has cancel·lat la invitació." +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "" +"La invitació s'ha cancel·lat. EL dispositiu d'àudio no s'ha pogut obrir." -#: network/applications/voiceconversation.cpp:222 -#, fuzzy +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." -msgstr "Engegant GnomeMeeting. Conectant a " +msgstr "Començant la conversa de veu. Connectant-se a%1." -#: network/applications/voiceconversation.cpp:228 -#, fuzzy +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." -msgstr "Engegant GnomeMeeting. Conectant a " +msgstr "Començant la conversa de veu. Escoltant %1." -#: network/applications/voiceconversation.cpp:293 -#, fuzzy +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." -msgstr "Convidant el contacte a un meeting." +msgstr "Convidar el contacte a una conversa de veu." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -#, fuzzy +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format msgid "The contact is inviting you for '%1', but this is not implemented yet." -msgstr "En contacte et convida a començar " +msgstr "" +"El contacte us està convidant a '%1', però encara no ha estat implementat." -#: network/extra/msnftpconnection.cpp:122 -#, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "La transferència de " +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "La invitació de webcam s'ha cancel·lat. S'ha rebut dades errònies." -#: network/extra/msnftpconnection.cpp:136 +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Us han demanat de mostar la webcam." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this contact's webcam." +msgstr "Heu estat invitats per veure la webcam d'aquest contacte." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webcam" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Hey cancel·lat la transferència del fitxer "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "El contacte ha cancel·lat la transferència del fitxer "%1"." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "Fallat" -#: network/extra/msnftpconnection.cpp:410 -#, 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:204 +#, kde-format +msgid "Sending file %1" +msgstr "Enviant fixer %1" -#: network/extra/msnftpconnection.cpp:411 -#, fuzzy -msgid "Couldn't open a local port." -msgstr "error. No s'ha pogut obrir l'arxiu" +#: network/extra/msnftpconnection.cpp:398 +#, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "La transferència de %1 ha fallat. No s'ha pogut obrir el port local." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." +msgstr "No s'han pogut obrir les dades font." + +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "" +msgstr "Inciant la transferència" -#: network/extra/msnftpconnection.cpp:481 -#, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "error. No es pot fer la conexió" +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "La transferència de %1 ha fallat. No s'ha pogut establir una connexió." -#: network/extra/msnftpconnection.cpp:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "" +msgstr "No s'ha pogut establir una connexió." -#: network/extra/msnftpconnection.cpp:586 -#, fuzzy +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" -msgstr "Rebent l'arxiu " +msgstr "Rebent l'arxiu %1" -#: network/msnconnection.cpp:140 +#: network/msnconnection.cpp:378 +msgid "Invalid command syntax" +msgstr "Sintaxi de comanda invàlida" + +#: network/msnconnection.cpp:382 +msgid "Invalid command parameter" +msgstr "Paràmetre de comanda invàlid" + +#: network/msnconnection.cpp:385 +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "" +"L'adreça de correu electrònic que heu intentat afegir no és un compte de " +"Live Messenger" + +#: network/msnconnection.cpp:390 +msgid "Domain name missing" +msgstr "Falta el nom del domini" + +#: network/msnconnection.cpp:394 +msgid "Already logged in" +msgstr "Ja està connectat" + +#: network/msnconnection.cpp:397 +msgid "The given account name is invalid" +msgstr "El nom del compte proporcionat és invàlid" + +#: network/msnconnection.cpp:401 msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" +"Aquest nom de compte és invàlid, o el vostre compte de Passport encara no ha " +"estat confirmat" -#: network/msnconnection.cpp:733 -#, fuzzy -msgid "1 ping lost" -msgstr "Agafant les llistes" - -#: network/msnconnection.cpp:737 -#, fuzzy -msgid "%1 pings lost" -msgstr "Agafant les llistes" - -#: network/msnconnection.cpp:752 -#, fuzzy -msgid "The connection to the server was lost." -msgstr "La conexió al servidor ha estat erronea" - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Permés" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Eliminat" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:740 -#, fuzzy -msgid "Show MSN Messenger Service status?" -msgstr "Veure l'estat de .NET?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Error en el server" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy -msgid "" -"You have been disconnected because you connected from another MSN 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:1553 -msgid "Got synchronization" -msgstr "Sincronitzat" - -#: network/msnnotificationconnection.cpp:1690 -#, fuzzy -msgid "Authenticating" -msgstr "Autentificació fallida" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Rebuda confirmació de l'usuari" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Notificant al servidor" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "" - -#: network/msnnotificationconnection.cpp:2034 -#, fuzzy -msgid "Connecting..." -msgstr "Conectar" - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -#, fuzzy -msgid "There was an internal error in KMess: %1" -msgstr "Hi ha un error intern del servidor" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" - -#: network/msnnotificationconnection.cpp:2252 -#, fuzzy -msgid "The account name given is invalid" -msgstr "L'usuari no es valid" - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:404 msgid "Your contact list is full" -msgstr "La teva llista de contactes està plena" +msgstr "La vostra llista de contactes està plena" -#: network/msnnotificationconnection.cpp:2264 -#, fuzzy +#: network/msnconnection.cpp:409 +msgid "Invalid SBP parameter" +msgstr "Paràmetre SBP invàlid" + +#: network/msnconnection.cpp:412 msgid "This contact is already on your list" -msgstr "Afegir aquest contacte a la teva llista \"Friends\"" +msgstr "Aquest contacte ja es troba a la vostra llista" -#: network/msnnotificationconnection.cpp:2267 -#, fuzzy +#: network/msnconnection.cpp:416 msgid "This contact is not on your list" -msgstr "Afegir aquest contacte a la teva llista \"Friends\"" +msgstr "Aquest contacte no es troba a la vostra llista" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:420 msgid "This contact is not online" +msgstr "Aquest contacte no està connectat" + +#: network/msnconnection.cpp:425 +msgid "Already in this mode" +msgstr "Ja esteu en aquest mode" + +#: network/msnconnection.cpp:429 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" msgstr "" +"Aquest contacte no pot ser afegit a les llistes de permesos i bloquejats." -#: network/msnnotificationconnection.cpp:2279 -#, fuzzy -msgid "Your contact list has too many groups" -msgstr "La teva llista de contactes està plena" - -#: network/msnnotificationconnection.cpp:2282 -#, fuzzy -msgid "This group can't be changed" -msgstr "Aquest es un grup especial i no es pot canviar" - -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "" - -#: network/msnnotificationconnection.cpp:2288 +#: network/msnconnection.cpp:433 msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +"The group name is already present in your contact list. Please use a " +"different name" msgstr "" +"El nom del grup ja està afegit a la vostra llista de contactes. Si us plau, " +"feu servir un nom diferent." -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" +#: network/msnconnection.cpp:437 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30" msgstr "" +"La vostra llista de contactes té massa grups; només està permès tenir 30 " +"grups com a màxim" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:441 +msgid "This group cannot be changed" +msgstr "Aquest grup no pot ser canviat" + +#: network/msnconnection.cpp:446 +msgid "Contact is not added to this group" +msgstr "El contacte no és afegit al aquest grup" + +#: network/msnconnection.cpp:450 +msgid "This group is not empty" +msgstr "Aquest grup no està buit" + +#: network/msnconnection.cpp:454 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "El nom del grup és massa llarg; no pot tenir més de 61 bytes" + +#: network/msnconnection.cpp:459 +msgid "Attempted to change group \"0\"" +msgstr "S'ha intentat canviar el grup \"0\"" + +#: network/msnconnection.cpp:459 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "S'ha produït un error intern en KMess: %1" + +#: network/msnconnection.cpp:463 +msgid "Invalid Group" +msgstr "Grup invàlid" + +#: network/msnconnection.cpp:467 +msgid "Empty domain" +msgstr "Domini buit" + +#: network/msnconnection.cpp:471 +msgid "Wrong ADL command format" +msgstr "Format de comanda ADL erroni" + +#: network/msnconnection.cpp:474 msgid "Switchboard server failed" -msgstr "" +msgstr "El servidor de la central ha fallat" -#: network/msnnotificationconnection.cpp:2303 -#, fuzzy +#: network/msnconnection.cpp:477 msgid "Transfer to switchboard server failed" -msgstr "Notificant al servidor" +msgstr "La transferència al servidor de la central ha fallat" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:481 msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "Error de connexió directa (MSNSLP) error, connexió fallada" + +#: network/msnconnection.cpp:485 +msgid "Required field missing" +msgstr "Es requereix un camp que falta" + +#: network/msnconnection.cpp:489 +msgid "Not logged in" +msgstr "No connectat" + +#: network/msnconnection.cpp:493 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "S'ha denegat l'accés al servei de Live Messenger per a aquest compte" + +#: network/msnconnection.cpp:498 +msgid "Command is disabled" +msgstr "La comanda està deshabilitada" + +#: network/msnconnection.cpp:501 +msgid "Your account is banned" +msgstr "El vostre compte està prohibit." + +#: network/msnconnection.cpp:505 +msgid "Challenge response failed" +msgstr "Resposta de repte fallida" + +#: network/msnconnection.cpp:510 +msgid "Bad command data" +msgstr "Comanda de dades errònies" + +#: network/msnconnection.cpp:514 +msgid "You are opening chat sessions too fast" +msgstr "Esteu obrint converses massa ràpid" + +#: network/msnconnection.cpp:518 +msgid "You have too many open chat sessions" +msgstr "Teniu massa converses obertes" + +#: network/msnconnection.cpp:525 +msgid "Unexpected command sequence" +msgstr "Seqüència de comandes inesperada" + +#: network/msnconnection.cpp:529 +msgid "Bad friend name" +msgstr "Nom d'amic erroni" + +#: network/msnconnection.cpp:535 +msgid "Bad CVR data" +msgstr "Dades CVR errònies" + +#: network/msnconnection.cpp:541 +msgid "The server reports KMess is flooding it with too much data" +msgstr "El servidor comunica que KMess s'està desbordant amb massa dades" + +#: network/msnconnection.cpp:548 +msgid "Authentication ticket was incorrect" +msgstr "Tiquet d'autentificació incorrecte" + +#: network/msnconnection.cpp:551 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "No podeu començar una conversa quan esteu invisibles" + +#: network/msnconnection.cpp:555 +msgid "Not accepting new contacts" +msgstr "No s'accepten nous contactes" + +#: network/msnconnection.cpp:559 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" msgstr "" +"Teniu un compte Kids Passport, necessiteu consentiment paternal per " +"conversar en línia" + +#: network/msnconnection.cpp:562 +msgid "Your Passport account needs to be verified first" +msgstr "El vostre compte a de ser verificat primer" + +#: network/msnconnection.cpp:566 +msgid "Bad USR ticket" +msgstr "Tiquet USR erroni" + +#: network/msnconnection.cpp:576 +msgid "Error accessing contact list, try again later" +msgstr "Error en accedir a la vostra llista de contactes, intenteu-ho més tard" + +#: network/msnconnection.cpp:585 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"El servei MSN es troba temporalment inaccessible. S'ha produït un error " +"intern en el servidor" + +#: network/msnconnection.cpp:596 +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" +"El servei de Live Messenger es troba temporalment inaccessible. El servidor " +"està massa ocupat" + +#: network/msnconnection.cpp:600 +msgid "Peer notification server down" +msgstr "Notificació de contacte de servidor tancat" + +#: network/msnconnection.cpp:604 +msgid "The server is going down" +msgstr "El servidor s'està tancant" + +#: network/msnconnection.cpp:608 +msgid "The server is going down soon" +msgstr "El servidor es tancarà aviat" + +#: network/msnconnection.cpp:613 +msgid "Write is blocking" +msgstr "Escriure està bloquejant" + +#: network/msnconnection.cpp:617 +msgid "Session is overloaded" +msgstr "La sessió està sobrecarregada" + +#: network/msnconnection.cpp:624 +msgid "The server is not available" +msgstr "El servidor no es troba accessible" + +#: network/msnconnection.cpp:628 +msgid "Authentication failed" +msgstr "L'autentificació ha fallat" + +#: network/msnconnection.cpp:635 +#, kde-format +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "" +"Codi d'error desconegut rebut del servidor: %1
Detalls tècnics: %2" + +#: network/msnconnection.cpp:652 network/msnnotificationconnection.cpp:2922 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Error de MSN" + +#: network/msnconnection.cpp:957 +msgid "Trying the HTTP fallback..." +msgstr "Probant el mode HTTP..." + +#: network/msnnotificationconnection.cpp:1344 +msgid "Authenticating..." +msgstr "Autentificant-se" + +#: network/msnnotificationconnection.cpp:1368 +msgid "Authenticated" +msgstr "Autentificat" + +#: network/msnnotificationconnection.cpp:1438 +msgid "Switching to another server..." +msgstr "Canviant a un altre servidor" + +#: network/msnnotificationconnection.cpp:1802 +msgid "Connecting..." +msgstr "Connectant-se" + +#: network/msnnotificationconnection.cpp:1947 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Comanda desconeguda rebuda del servidor. %1" + +#: network/msnnotificationconnection.cpp:2107 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minut" +msgstr[1] "%1 minuts" + +#: network/msnnotificationconnection.cpp:2110 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "El servidor es tancarà per manteniment en %1!" + +#: network/msnnotificationconnection.cpp:2115 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "El servidor de Live Messenger es tancarà en %1 per manteniment." #: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "" +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess no ha pogut processar els missatges Offline.
Detalls: %1" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "" +#: network/msnnotificationconnection.cpp:2317 +msgid "SOAP client is no longer valid." +msgstr "El client SOAP ja no és vàlid." -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "" +#: network/msnnotificationconnection.cpp:2587 +msgid "Authentication time limit exceeded" +msgstr "S'ha excedit el temps límit d'autentificació" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "" +#: network/msnnotificationconnection.cpp:2766 +msgid "Waiting for contact list..." +msgstr "Esperant la llista de contactes..." -#: network/msnnotificationconnection.cpp:2341 -#, fuzzy -msgid "Bad friend name" -msgstr "El teu nom amigable:" +#: network/msnnotificationconnection.cpp:2812 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Avís: %1

" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "" +#: network/msnnotificationconnection.cpp:2813 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Avís d'MSN" -#: network/msnnotificationconnection.cpp:2359 -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:2885 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Motiu d'error intern: %1" -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr "" - -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "" - -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Hi ha un error intern del servidor" - -#: network/msnnotificationconnection.cpp:2411 -#, fuzzy -msgid "The server is too busy" -msgstr "El servidor está ocupat" - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "El servidor no està en servei" - -#: network/msnnotificationconnection.cpp:2419 -msgid "Peer notification server down" -msgstr "El servidor notifica que està caigut" - -#: network/msnnotificationconnection.cpp:2423 -#, fuzzy -msgid "The server is going down" -msgstr "El servidor caurà en breu" - -#: network/msnnotificationconnection.cpp:2426 -msgid "The server is going down soon" -msgstr "El servidor caurà en breu" - -#: network/msnnotificationconnection.cpp:2430 -msgid "Write is blocking" -msgstr "" - -#: network/msnnotificationconnection.cpp:2433 -msgid "Session is overloaded" -msgstr "" - -#: network/msnnotificationconnection.cpp:2438 -#, fuzzy -msgid "The server is not available" -msgstr "El servidor no està en servei" - -#: network/msnnotificationconnection.cpp:2441 -msgid "Authentication failed" -msgstr "Autentificació fallida" - -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnnotificationconnection.cpp:2920 +msgctxt "Connection error: dialog box" msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"

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

" msgstr "" +"

L'autentificació ha fallat, si us plau verifiqueu l'adreça de correu " +"electrònic i la contrasenya.

" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" +#: network/msnnotificationconnection.cpp:2933 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

El compte %1 s'ha connectat des d'una altra ubicació.

" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnnotificationconnection.cpp:2936 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +"

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

" msgstr "" +"

Heu estat desconnectats: us heu connectat amb el compte %1 des " +"d'un altre client d'MSN, o des d'una altra ubicació.

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2948 +msgctxt "Connection error: passive notification message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" +"

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

" msgstr "" +"

No s'ha pogut connectar al servei de LIve Messenger.
Potser " +"necessiteu autentificar-vos abans de poder accedir a la xarxa?

" -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2951 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"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.
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 no s'ha pogut connectar als servidors de Live Messenger.
Deu " +"haver un problema amb la vostra connexió a Internet, o els servidors de MSN " +"estan inaccessibles temporalment.
També és possible que l'autentificació " +"a la pàgina web o el proxy hagin demanat accés a la xarxa.

Cliqueu aquí per visitar la pàgina sobre l'estat dels serveis de " +"Messenger.

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Aquesta persona está Offline o Invisible." +#: network/msnnotificationconnection.cpp:2970 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

No s'ha pogut connectar al servei de Live Messenger.

" -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1648 -#, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "no s'ha rebut." - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 -#, fuzzy -msgid "Connection timeout" -msgstr "Conexió fallida" - -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 -#, fuzzy -msgid "%1 has sent you a nudge!" -msgstr " esta en linea" - -#: notification/notificationchat.cpp:196 -#, fuzzy -msgid "%1 has sent you a wink!" -msgstr " esta en linea" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr " esta en linea" - -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr " esta en linea" - -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "Has cancel·lat la invitació." - -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "Has cancel·lat la invitació." - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "La transferència de " - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "" - -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" -msgstr " esta en linea" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" -msgstr " esta en linea" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" -msgstr " esta en linea" - -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" -msgstr " esta en linea" - -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" -msgstr " esta en linea" - -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" -msgstr " esta en linea" - -#: notification/notificationcontactstatus.cpp:74 -#, fuzzy -msgid "%1 is now online" -msgstr " esta en linea" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "Envia" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "Nova Linea" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Afegir aquest contacte a la teva llista \"Friends\"" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Afegir contacte" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, fuzzy, no-c-format +#: network/msnnotificationconnection.cpp:2972 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "t'ha afegit a la seva llista de contactes. Que vols fer:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, fuzzy, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Afegir aquest contacte a la teva llista \"Friends\"" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, fuzzy, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "No afegir el contacte, pero permetre veure el teu estat" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, fuzzy, no-c-format -msgid "Block this person from contacting &you or seeing your online state" +"

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 "" -"Bloquejar aquesta persona tant per contactar com per veure el teu estat." +"

KMess no s'ha pogut connectar als servidors de Live Messenger.
Deu " +"haver un problema amb la vostra connexió a Internet, o els servidors de MSN " +"estan inaccessibles temporalment.

Cliqueu aquí per " +"visitar la pàgina sobre l'estat dels serveis de Messenger.

" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" +#: network/msnnotificationconnection.cpp:2983 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Error: %1

" + +#: network/msnnotificationconnection.cpp:2985 +#, kde-format +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 comunicat un error:

%1

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

Messenger Service Error: %1

" +msgstr "

Error de serveis de Messenger: %1

" + +#: network/msnnotificationconnection.cpp:2998 +#, kde-format +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 comunicat un error:

%1

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

KMess Error: %1

" +msgstr "

Error de KMess: %1

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

KMess has encountered an internal error:

%1

" +msgstr "

KMess ha trobat un error intern:

%1

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

Network connection lost.

" +msgstr "

S'ha perdut la connexió.

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

Connection to the Live Messenger server has been lost.

" +msgstr "

S'ha perdut la connexió al servidor de Live Messenger.

" + +#: network/msnnotificationconnection.cpp:3077 +#, kde-format +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

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

" msgstr "" +"

Informació de desenvolupador:
Error número: %1
Cadena d'error: %2

" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, fuzzy, no-c-format -msgid "Enter your login information:" -msgstr "O entra la teva informació d'accés:" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "Adreça de correu:" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "Clau d'accés:" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." msgstr "" +"Escriviu el vostre nom i la vostra contrasenya per accedir al proxy de la " +"xarxa." -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "Recordar aquest perfil" +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Codi d'error intern: %2)" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Conectar" - -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" msgstr "" +"%1 (Codi d'error intern: %2)
Resposta: %3 %4
Ojectiu de " +"redirecció: %5" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, fuzzy, no-c-format -msgid "Listening to %1" -msgstr "Enviant l'arxiu " +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "S'ha excedit el temps límit de connexió" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, fuzzy, no-c-format -msgid "KMess Notification" -msgstr "Notificació de correu" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping perdut" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pings perduts" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "S'ha perdut la connexió al servidor" + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "L'adreça de correu electrònic \"%1\" no és vàlida!" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" +"L'adreça de correu electrònic \"%1\" no correspon a cap compte de Live " +"Messenger!" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:295 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Demanda de servei web invàlida (%1)" + +#: network/soap/httpsoapconnection.cpp:427 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "El servei web no està accessible (%1)" + +#: network/soap/httpsoapconnection.cpp:504 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Massa redireccions per part servei web" + +#: network/soap/httpsoapconnection.cpp:548 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Els missatges en desconnexió del servei web no estan disponibles" + +#: network/soap/httpsoapconnection.cpp:554 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "El serveu web de Live Messenger està experimentant problemes" + +#: network/soap/httpsoapconnection.cpp:568 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Resposta de servei web invàlida %1 (%2)" + +#: network/soap/httpsoapconnection.cpp:607 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Cap resposta del servei web" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Resposta inesperada del servidor (%1)" + +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "En la conversa de %1:
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 diu:
'%2'" + +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1 us ha enviat un missatge en desconnexió:
'%2'" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "La conversa de %1 demana la vostra atenció!" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 us ha enviat un missatge escrit a mà!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 us ha enviat un avís!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 us ha enviat una ganyota!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 vol fer servir la webcam!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 us està enviant un fitxer!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 us ha enviat una invitació!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 ha cancel·lat la sessió de webcam!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 ha cancel·lat la transferència del fitxer!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "L'activitat de %1 s'ha cancel·lat!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 ha acceptat fer servir la webcam!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 ha acceptat la transferència del fitxer!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 ha acceptat la vostra invitació!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 ha finalitzat la sessió de webcam!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "La transferència de fitxers amb %1 ha finalizat!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "L'activitat de %1 ha finalitzat!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "La sessió de webcam amb%1 ha fallat!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "La transferència de fitxers amb %1 ha fallat!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "L'activitat de %1 ha finalitzat amb un error!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
s'ha connectat" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
ha marxat" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
ara tornarà" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
està ocupat" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
s'ha tornat invisible" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
està inactiu" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
s'ha desconnectat" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
està al telèfon" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
ha anat a menjar" + +#: notification/newemailnotification.cpp:92 +#, kde-format +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Nou correu electrònic:
'%1'
de '%2'" + +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Comença una conversa" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Deixa un missatge" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Mostra el missatge" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Detalls" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Llegeix el correu electrònic" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Amaga" + +#: 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 "" +"Tancar la finestra principal de KMess farà que segueixi funcionant a la " +"safata del sistema. Feu servir 'Abandona' del menú 'Connecta' per sortir de " +"l'aplicació." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Anclant-se a la safata del sistema" + +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " - %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Examina..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Examina i retalla una imatge..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Posa una imatge anterior..." + +#. i18n: file: settings/accountpage.ui:136 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:458 rc.cpp:381 +msgid "Display Picture" +msgstr "Imatge a mostrar" + +#: settings/accountpage.cpp:488 +msgid "Downloading of display picture failed" +msgstr "La descàrrega de la imatge ha fallat" + +#: settings/accountpage.cpp:547 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Ha ocorregut un error quan s'intentava canviar la imatge per mostrar.\n" +"Assegureu-vos d'haver triat una imatge que existeixi." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Arranjament" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Compte" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "El meu compte" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Llista de contactes" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Converses" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Registre de converses " + +#: 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 "" +"Cliqueu aquí per esborrar el vostre compte de la llista de comptes " +"registrats.\n" +"No podeu esborrar el compte que es troba connectat ara mateix ni un compte " +"d'invitat, que s'esborrarà quan us desconnecteu." + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"L'adreça de correu electrònic que heu escrit no és vàlida i no pot ser " +"utilitzada com a compte: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "" +"L'adreça de correu electrònic que heu escrit ja s'està fent servir: '%1'" + +#: settings/accountsettingsdialog.cpp:220 +msgid "Please enter a friendly name for this account." +msgstr "Escriviu un nom amistós per aquest compte." + +#: settings/accountsettingsdialog.cpp:301 +msgid "Are you sure you want to delete this account?" +msgstr "Esteu segurs que voleu esborrar aquest compte?" + +#: settings/accountsmanagerpage.cpp:160 +#, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +">Esteu segurs que voleu esborrar el compte '%1' ?
Totes les " +"preferències del compte seran esborrades." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Hola, què tal? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Anna" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Fantàstic!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Jo /acabo/ d'arribar de les meves vacances a Itàlia!" + +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "Només podeu fer servir 7 caràcters per les dreceres d'emoticones" + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid Emoticon Name" +msgstr "Nom d'emoticona invàlid" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Reemplaça l'emoticona existent" + +#: settings/emoticonspage.cpp:233 +#, kde-format +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Esteu segurs que voleu esborrar l'emoticona \"%1\" ?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Esborra l'emoticona" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "Preferències de KMess" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Comptes" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, fuzzy, no-c-format -msgid "Your friendly name:" -msgstr "El teu nom amigable:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notificacions" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." +msgstr "No s'han detectat navegadors web per a escollir." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "No s'ha detectat clients de correu electrònic per a escollir." + +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom web browser!" msgstr "" +"Heu d'especificar una comanda de consola per executar un navegador " +"personalitzat!" -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "La teva adreça email:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#: settings/miscellaneouspage.cpp:291 +#, c-format msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"The console command you have specified to launch a custom web 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 "" +"La comanda de consola que heu escrit per executar un navegador " +"personalitzat no conté el paràmetre '%u'. Sense aquest paràmetre les pàgines " +"web no funcionaran.
Voleu que KMess l'afegeixi per vosaltres?" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "La teva clau:" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "" +"Heu d'especificar una comanda de consola per executar un client de correu " +"electrònic personalitzat!" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#: 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 emails will not work." +"
Do you want KMess to add it for you?" +msgstr "" +"La comanda que heu especificat per executar un client de correu " +"electrònic personalitzat no conté el paràmetre '%u'. Sense aquest paràmetre " +"no funcionarà
Voleu que KMess l'afegeixi per vosaltres?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "Heu de seleccionar una carpeta per als fitxers rebuts!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Seleccioneu la carpeta dels fitxers" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Envia amb KMess" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess no ha pogut accedir als seus fitxers de configuració!

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "&Envia un comentari als desenvolupadors" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "Mostra les icones de &Feedback" + +#: utils/likeback/likeback.cpp:323 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Benvinguts a aquesta versió de proves de %1." + +#: utils/likeback/likeback.cpp:328 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Benvinguts a %1." + +#: utils/likeback/likeback.cpp:336 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" +"Cada cop que veieu quelcom que no us agrada o que no, si us plau, feu clic a " +"la icona corresponent de sota de la barra de títol, descriviu breument què " +"no us agrada o què no i cliqueu 'Envia'." + +#: utils/likeback/likeback.cpp:343 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" +"Cada cop que veieu quelcom que us agrada, si us plau, feu clic a la cara " +"somrient a sota de la barra de títol, descriviu breument què us agrada i " +"cliqueu 'Envia'." + +#: utils/likeback/likeback.cpp:350 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" +"Cada cop que veieu quelcom que no us agrada, si us plau, feu clic a la cara " +"trista a sota de la barra de títol, descriviu breument què no us agrada i " +"cliqueu 'Envia'." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" +"Si experimenteu un comportament erroni dins l'aplicació, cliqueu la icona de " +"l'objecte trencat a la cantonada superior dreta de la finestra, descriviu-lo " +"i feu clic a 'Envia'." + +#: utils/likeback/likeback.cpp:372 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "M'agraden les noves icones. Molt innovadores." + +#: utils/likeback/likeback.cpp:380 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" +"No m'agrada la pàgina de benvinguda d'aquell assistent. Fa perdre " +"massa el temps." + +#: utils/likeback/likeback.cpp:388 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"L'aplicació té un comportament incorrecte quan clico al botó Afegeix. " +"No fa res." + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog text, usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Desitjo una nova característica que em permeti enviar-me la feina per " +"correu electrònic." + +#: utils/likeback/likeback.cpp:409 +msgctxt "Welcome dialog text, us=the developers, it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Per ajudar-nos a millorar, els vostres comentaris són importants." + +#: utils/likeback/likeback.cpp:412 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Exemple" +msgstr[1] "Exemples" + +#: utils/likeback/likeback.cpp:418 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Ajuda a millorar l'aplicació" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Envia un comentari als desenvolupadors" + +#: utils/likeback/likebackdialog.cpp:139 +#, kde-format +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 "" +"Si us plau, escriviu en %1 (potser voleu fer servir una eina " +"de traducció online per fer això).
" + +#: utils/likeback/likebackdialog.cpp:146 +#, kde-format +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 "" +"Si us plau, escriviu en %1 o %2 (potser voleu fer servir una " +"eina de traducció online per fer això).
" + +#: utils/likeback/likebackdialog.cpp:159 +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 fer que els comentaris que envieu siguin més útils, intenteu enviar el " +"mateix nombre de comentaris negatius i positius.
" + +#: utils/likeback/likebackdialog.cpp:168 +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 "" +"Si us plau, no demaneu noves característiques: aquest tipus de peticions " +"seran ignorades.
" + +#: utils/likeback/likebackdialog.cpp:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" +"

Podeu enviar als desenvolupadors una breu descripció de les vostres " +"opinions de %1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"L'adreça de correu electrònic que heu fet servir no és vàlida i no pot ser " +"utilitzada: '%1'" + +#: utils/likeback/likebackdialog.cpp:290 +msgctxt "Dialog box text" +msgid "" +"

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

Thanks for your time.

" +msgstr "" +"

El vostre comentari s'ha enviat amb èxit. Ens ajudarà a millorar " +"l'aplicació

Gràcies pel vostre temps.

" + +#: utils/likeback/likebackdialog.cpp:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Commentari enviat" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" +"

S'ha produit un error mentre s'intentava enviar el registre.

Si us " +"plau, torneu-ho a intentar més tard.

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Error en enviar el comentari" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +msgid "Standard text mode" +msgstr "Mode de text estàndard" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to the standard text mode." +msgstr "Cliqueu aquest botó per canviar al mode de text estàndard." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "Mode de dibuix" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "" +"Cliqueu aquest botó per canviar al mode de dibuix, de manera que podreu " +"escriure o dibuixar a mà." + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Emoticones estàndard" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Cliqueu aquest botó per mostrar totes les emoticones predeterminades de Live " +"Messenger i poder-les inserir fàcilment als vostres missatges." + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "Emoticones personalitzades" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Cliqueu aquest botó per mostrar les emoticones personalitzades i poder-les " +"inserir fàcilment als vostres missatges" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "Ganyotes" + +#. 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 "Cliqueu aquí per veure les ganyotes disponibles" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "No&va Línia" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "&Envia" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Conversa" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Barra d'eines principal" + +#. 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 "Cliqueu aquí per veure el menú d'aquest contacte" + +#. i18n: file: chat/contactswidget.ui:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Cliqueu aquí per obrir les preferències del vostre compte" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "Clear area" +msgstr "Neteja l'àrea" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "Pen color" +msgstr "Color del llapis" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen size" +msgstr "Gruix del llapis" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "Erase brush" +msgstr "Goma d'esborrar" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Grups inicials" + +#. 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 "" +"Escriviu aquí l'adreça de correu electrònic de la persona que voleu afegir a " +"la vostra llista de contactes" + +#. 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:273 +msgid "Email address:" +msgstr "Adreça de correu electrònic:" + +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Introduïu una drecera per l'emoticona:" + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Seleccioneu un arxiu d'imatge:" + +#. 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 "Escriviu un missatge que serà enviat automàticament a qui us parli." + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "Escriviu un missatge automàtic d'absència:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "Busca entre els contactes..." + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Filtre del registre de converses" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Filtra per conversa" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "treballant" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "Filtra per data" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "des de" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +msgstr "fins a" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Què uns agradaria fer?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +msgid "&Add this person to the following groups of your contact list:" +msgstr "" +"&Afegeix aquesta persona als següents grups de la meva llista de contactes:" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "&No afegeixis aquesta persona; només permet que vegi el meu estat" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +msgid "&Block this person from contacting you and seeing your status" +msgstr "" +"&Bloqueja aquesta persona perquè no em pugui contactar ni veure el meu estat" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "Cliqueu aquí per restablir la imatge d'aquest contacte" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Restableix" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grups:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this contact" +msgstr "Utilitza un nom &alternatiu per aquest contacte" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +msgid "Disable notifications for this contact" +msgstr "Deshabilita les notificacions per aquest contacte" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&So:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +msgid "&Display Pictures" +msgstr "&Imatges" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "Cliqueu aquí per utilitzar la imatge seleccionada com a vostra" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "Utilitza com a imatge" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Neteja" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"Podeu triar d'amagar qualsevol emoticona rebuda d'aquest contacte. " +"Només cal que feu clic dret sobre una emoticona rebuda i triar \"Ignora " +"aquesta emoticona\".\n" +"Des d'aquesta pàgina, podeu restaurar les emoticones amagades." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "Cliqueu aquí per restaurar l'emoticona seleccionada" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +msgid "Resto&re" +msgstr "&Restableix" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Contactes disponibles" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +msgid "Invite a person not on your contact list:" +msgstr "Convida un contacte que no es troba a la vostra llista:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +msgid "Enter the email address of a person to invite" +msgstr "Escriviu l'adreça de correu electrònic del contacte que voleu convidar" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +msgid "Invited Contacts" +msgstr "Contactes convidats" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Camps a exportar:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Tipus de fitxer" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Contactes:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Selecciona'ls tots" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "De-selecciona'ls tots" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Exporta..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Tanca" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "Comanda a la pestanya actual" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Comanda:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Tipus:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Estàndard" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Envia" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Comanda de càrrega útil (es pot deixar en blanc):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "KSqueezedTextLabel" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Obre" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Cancel·la" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "&Descàrrega" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "&Pujada" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "&Neteja" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "&Tanca" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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 "" +"Cliqueu aquí per mostrar les opcions del compte actual, o desplaceu-" +"vos amb la roda del ratolí per canviar entre els diferents comptes" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:276 +msgid "" +"Enter here the email address of your registered Passport or Live account" +msgstr "" +"Escriviu aquí l'adreça de correu electrònic del vostre compte Passport o Live" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Contrasenya:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "Escriviu la contrasenya del vostre compte" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "Estat en iniciar sessió:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "Tria un estat per quan us connecteu" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "Si està activat, KMess desarà el vostre compte" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +msgid "Remem&ber account" +msgstr "Recorda el compte" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" +"Si trieu de recordar un compte amb KMess, també podreu desar la seva " +"contrasenya" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +msgid "R&emember password" +msgstr "Recorda la contrasenya" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Cliqueu aquí per començar fent servir KMess, o per cancel·lar un intent de " +"connexió" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Nou compte" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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 "" +"Cliqueu aquí per registrar un nou compte Live, que podreu fer servir " +"per connectar-vos a la MSN.
També podeu fer servir la vostra adreça de " +"correu electrònic actual" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "Heu oblidat la contrasenya?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Cliqueu aquí per anar a la web del Live i canviar la vostra " +"contrasenya" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Connecta" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Visualitza" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Accions" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "Forma" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "&Informació del compte" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "Informació del vostre compte" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "Escriviu el nom per mostrar quan esteu connectats." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "Nom amistós" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Escriviu l'adreça de correu electrònic del vostre compte de MSN Passport. " +"Podeu registrar un nou compte a http://register.passport.com" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "Adreça de correu electrònic:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" +"Escriviu l'adreça de correu electrònic del vostre compte de MSN Passport. " +"Podeu registrar un nou compte a http://register.passport.com" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, fuzzy, no-c-format -msgid "Display picture:" -msgstr "Foto:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "Contrasenya:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "Click here to have your password saved by KMess" +msgstr "Cliqueu aquí per tal que KMess us desi les contrasenyes" + +#. i18n: file: settings/accountpage.ui:117 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:375 +msgid "" +"If you enable this option, KMess will save your account's password. This way " +"you will not have to enter your password on every start up, in order to log " +"in. Please keep in mind, that other persons that have access to this " +"computer may easily log in to your account, if this option is enabled." +msgstr "" +"Si activeu aquesta opció, KMess us desarà la contrasenya del compte. " +"D'aquesta " +"forma no haureu d'escriure-la cada cop que us connecteu. Tingueu en compte " +"que " +"persones amb accés a aquest ordinador poden connectar-se fàcilment al vostre " +"compte " +"si aquesta opció està habilitada." + +#. i18n: file: settings/accountpage.ui:120 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:378 +msgid "&Remember password" +msgstr "Recorda la contrasenya" + +#. i18n: file: settings/accountpage.ui:236 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:384 msgid "C&hange..." -msgstr "" +msgstr "Canvia" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, fuzzy, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Foto:" +#. i18n: file: settings/accountpage.ui:261 +#. i18n: ectx: property (toolTip), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:390 +msgid "Enable this option, if you do not want to use a display picture." +msgstr "Activeu aquesta opció si no voleu mostrar cap imatge" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "" +#. i18n: file: settings/accountpage.ui:264 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:393 +msgid "&Do not use" +msgstr "No en facis servir" -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:294 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:399 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" +"L'opció \"Recorda el compte\" estava desactivada mentre us " +"connectàveu, per tant les vostres preferències no es desaran per defecte. " +"Activeu aquesta opció si voleu desar les vostres preferències del compte en " +"aquest sistema.\n" +"\n" +"És recomanable activar aquesta opció a no ser que esteu fent servir KMess " +"com a convidat o en un sistema públic (per exemple un ciber-cafè)." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Entrar amb aquest compte automaticament al engegar" +#. i18n: file: settings/accountpage.ui:297 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:404 +msgid "Re&member the settings of this account" +msgstr "Recorda les preferències d'aquest compte" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:307 +#. i18n: ectx: property (toolTip), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:407 msgid "If enabled, KMess automatically logs in with this account." -msgstr "" +msgstr "SI està activat, KMess es connecta automàticament amb aquest compte." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "" +#. i18n: file: settings/accountpage.ui:310 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:410 +msgid "Log in &with this account automatically" +msgstr "Incia sessió amb aquest compte automàticament" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:322 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:416 +msgid "Login &as" +msgstr "Inicia sessió com" + +#. i18n: file: settings/accountpage.ui:335 +#. i18n: ectx: property (whatsThis), widget (QComboBox, initialStatus_) +#: rc.cpp:419 +msgid "Here you can select which status KMess should set, after logging in." +msgstr "Aquí podeu triar amb quin estat us trobareu just quan inicieu sessió" + +#. i18n: file: settings/accountpage.ui:378 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:422 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Necessiteu connectar-vos a la web de Passport per confirmar que la vostra " +"adreça de correu electrònic existeix." + +#. i18n: file: settings/accountpage.ui:381 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:425 +msgid "" +"You cannot change your friendly name because your Passport email address is " "not verified." msgstr "" +"No podeu canviar el nom per mostrar perquè la vostra adreça de correu " +"electrònic no ha estat verificada per Passport." -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:428 msgid "Request verification email" -msgstr "" +msgstr "Demana un correu electrònic de verificació" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:431 msgid "https://accountservices.passport.net/" -msgstr "" +msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:427 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:434 msgid "Go to accountservices.passport.net" -msgstr "" +msgstr "Ves a accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:446 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:437 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"Necessiteu un compte Passport per connectar-vos a la xarxa de Live " +"Messenger. Podeu registrar la vostra adreça de correu electrònic actual a " +"register.passport.net o fer servir un compte de Hotmail per connectar-vos." + +#. i18n: file: settings/accountpage.ui:449 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:440 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" +"Per connectar-vos al servei de Live Messenger, necessiteu registrar una " +"adreça de correu electrònic com a compte Passport." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:489 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:443 msgid "Register new account" -msgstr "" +msgstr "Registra un nou compte" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:492 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:446 msgid "http://register.passport.com/" -msgstr "" +msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:495 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:449 msgid "Go to register.passport.com" -msgstr "" +msgstr "Ves a register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Alertes" +#. i18n: file: settings/accountpage.ui:513 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:452 +msgid "&Status Options" +msgstr "Opcions d'e&stat" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "Notificació de correu" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Mostrar notificacions cuan els contactes estan fora de linea" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "En linea" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:519 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:455 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when you " +"are not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." msgstr "" +"Si està activat, el vostre estat canviarà automàticament a \"Absent-" +"Inactiu\" quan no feu servir l'ordinador durant uns minuts. Si aquesta opció " +"no està disponible, KMess va ser compilat sense suport per aquesta funció." -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "" +#. i18n: file: settings/accountpage.ui:522 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:458 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Canvia l'estat a \"&Inactiu\" quan l'ordinador es troba en desús" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountpage.ui:553 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:572 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:579 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:464 rc.cpp:470 rc.cpp:473 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "Controla el número de minuts abans de canviar a l'estat \"Inactiu\"." -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "Especificar un missatge d'absencia" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "Fora de linea" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Mostra una notificació cuan el correu rebut está a \"altres carpetes\"" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Amagar els popups despres" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "segons" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, fuzzy, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Canviar el estat a \"Fora de linea\" cuan estigui inactiu" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format +#. i18n: file: settings/accountpage.ui:556 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:467 msgid "Become idle after" -msgstr "Posar-se fora de linea despres" +msgstr "Tornar-se inactiu al cap de" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:582 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:476 msgid "minutes" msgstr "minuts" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Guardar Registre" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, fuzzy, no-c-format -msgid "Log &all chats" -msgstr "Registrar tots els xats" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Guardar els registres en aquest directori:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/accountpage.ui:615 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:479 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" +"Això ocorre perquè KMess ha estat compilat sense suport per a " +"l'extensió \"XScreenSaver\" Xorg, usada per detectar la inactivitat " +"d'usuari.\n" +"Contacteu amb el vostre equip de paquets per a més detalls." -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organitzar les carpetes de xat per:" +#. i18n: file: settings/accountpage.ui:618 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:482 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"No es pot activar l'auto-inactiu: KMess ha estat compilat sense detecció " +"d'inactivitat." -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format +#. i18n: file: settings/accountpage.ui:644 +#. i18n: ectx: property (toolTip), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:485 msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +"If enabled, you will not receive any notifications when your status is set " +"to \"Busy\"." msgstr "" +"Si està activada, no rebreu notificacions quan el vostre estat sigui " +"\"Ocupat\"." -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/accountpage.ui:647 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:488 +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "&Amaga les notificacions quan el meu estat és \"Ocupat\"" + +#. i18n: file: settings/accountsmanagerpage.ui:26 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:491 +msgid "Saved accounts:" +msgstr "Comptes desats:" + +#. i18n: file: settings/accountsmanagerpage.ui:76 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:494 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" +"Cliqueu aquí per crear un nou compte de KMess amb una adreça de correu " +"electrònic ja associada a un compte Live." + +#. i18n: file: settings/accountsmanagerpage.ui:79 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:497 +msgid "&Add Account..." +msgstr "&Afegeix un compte" + +#. i18n: file: settings/accountsmanagerpage.ui:92 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:503 +msgid "Select an account and click here to modify it" +msgstr "Escolliu un compte i cliqueu-hi per a modificar-lo" + +#. i18n: file: settings/accountsmanagerpage.ui:95 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:506 +msgid "&Edit" +msgstr "&Edita" + +#. i18n: file: settings/accountsmanagerpage.ui:108 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:512 +msgid "Select an account and click here to remove it" +msgstr "Escolliu un compte i cliqueu-hi per a esborrar-lo" + +#. i18n: file: settings/accountsmanagerpage.ui:111 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:515 +msgid "&Remove" +msgstr "Esbo&rra" + +#. i18n: file: settings/chatloggingpage.ui:17 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:521 +msgid "Enable this option to have your chats saved for later viewing" +msgstr "" +"Activeu aquesta opció per desar les vostres converses i poder- les " +"visualitzar després" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:524 +msgid "" +"

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

\n" +"

The chat logs 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 "" +"

Si activeu el registre de converses, totes les converses es desaran " +"automàticament (on especifiqueu aquí sota).

\n" +"

Els registres de conversa us permetran buscar coses en converses " +"antigues, com un enllaç, o per recordar que vau dir a algú en un dia en " +"concret.

\n" +"

Això pot suposar problemes de privacitat, perquè persones no autoritzades " +"que facin servir el vostre compte poden llegir les vostres converses

\n" +"

Assegureu-vos de desactivar aquesta opció en ordinadors públics! " + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:530 +msgid "Enable chat logging" +msgstr "Activa el registre de converses" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:533 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"Si est`a activada, KMess també pot desar les converses en fitxers HTML o de " +"text pla" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:536 +msgid "Additionally save chat logs to file" +msgstr "Adicionalment, desa les converses en fitxers" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:539 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "Amb aquesta opció, podeu escollir com es desaran les converses" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:542 +msgid "Save chat logs as:" +msgstr "Desa les converses com a:" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:545 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\n" +"

El tipus de fitxer que utilitzeu és important.

\n" +"

Els registres en HTML es poden veure en qualsevol navegador web, però no " +"es poden visualitzar en altres ordinadors

\n" +"

Els fitxers de text es poden llegir perfectament des de qualsevol lloc; " +"però no tenen el text amb format, imatges ni emoticones.

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:552 +msgid "Web Pages (HTML)" +msgstr "Pàgines web (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:555 +msgid "Plain Text" +msgstr "Text pla" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:558 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Aquestes opcions us permeten triar com han de ser organitzats els vostres " +"registres de conversa en el directori que especifiqueu aquí sota." + +#. i18n: file: settings/chatloggingpage.ui:137 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:561 +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 "" +"Depenent de l'opció que trieu, KMess crearà unes carpetes per ajudar-" +"vos a mantenir els registres de conversa organitzats. Utilitzeu l'opció " +"\"Què és això?\" sobre una opció per a més detalls." + +#. i18n: file: settings/chatloggingpage.ui:140 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:564 +msgid "Separate logged chats by:" +msgstr "Separa els registres de conversa per:" + +#. i18n: file: settings/chatloggingpage.ui:156 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:567 +msgid "Create a directory to organize chats by year" +msgstr "Crea una carpeta per organitzar les converses per any" + +#. i18n: file: settings/chatloggingpage.ui:163 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:570 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/date-and-contact-name.html

" +msgstr "" +"

Aquesta opció divideix els vostres registres de conversa per any.\n" +"Trobareu carpetes de cada any on hi hagi registres de conversa, que " +"contindran tots els registres de conversa d'aquell any, agrupats.

\n" +"\n" +"

Una conversa mantinguda el 29 de novembre de 2008 es desarà en la vostra " +"carpeta de la següent forma:

\n" +" <chat logs directory here>/2008/data-i-nom-del-contacte.html

" + +#. i18n: file: settings/chatloggingpage.ui:166 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:577 msgid "Year" msgstr "Any" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, fuzzy, no-c-format -msgid "Month" -msgstr "Mes" +#. i18n: file: settings/chatloggingpage.ui:182 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year then by month" +msgstr "Crea una carpeta per organitzar les converses per any i per mes" -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Dia" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Guardar-los tots en el directori arrel" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "La font dels teus missatges:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Fixar la font dels missatges dels contactes a:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:583 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"

This option tells KMess to divide your chat logs 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" +"

A chat had on November 29, 2008 will be saved in your chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/date-and-contact-name.html

" msgstr "" +"

Aquesta opció divideix els vostres registres de conversa per any i " +"per " +"mes.\n" +"Trobareu carpetes de cada any on hi hagi registres de conversa. Cada una " +"contindrà una carpeta per cada mes, on es desaran els registres de " +"conversa.

\n" +"\n" +"

Una conversa mantinguda el 29 de novembre de 2008 es desarà en la vostra " +"carpeta de la següent forma:

\n" +"

<chat logs directory here>/2008/11/data-i-nom-del-contacte.html

" +"" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:589 +msgid "Year then Month" +msgstr "Any i mes" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:592 +msgid "Create directories to organize chats by year, by month, then by day" msgstr "" +"Crea una carpeta per organitzar les converses per any, per mes i per dia" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:595 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/29/date-and-contact-name.html" +msgstr "" +"

Aquesta opció divideix els vostres registres de conversa per any, " +"per " +"mes i per dia.\n" +"Trobareu carpetes de cada any on hi hagi registres de conversa. Cada una " +"contindrà una carpeta per cada mes, i cada una d'aquestes carpetes contindrà " +"una carpeta per cada dia, on es desaran els registres de conversa.

\n" +"\n" +"

Una conversa mantinguda el 29 de novembre de 2008 es desarà en la vostra " +"carpeta de la següent forma:

\n" +"

<chat logs directory here>/2008/11/29/data-i-nom-del-contacte.html<" +"/p>" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:602 +msgid "Year, Month then Day" +msgstr "Any, mes i dia" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:605 +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "" +"Desa tots els registres de conversa directament en la carpeta especificada " +"aquí sota" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:608 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" +"Aquesta opció desa tots els vostres registres de conversa dins la mateixa " +"carpeta, sense organitzar-los." + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:611 +msgid "Do not organize files" +msgstr "No organitzis els fitxers" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:614 +msgid "Click here to choose a directory" +msgstr "Cliqueu aquí per escollir una carpeta" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:620 +msgid "The directory where all your chat logs will be saved" +msgstr "Carpeta on es desaran tots els vostres registres de conversa" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:623 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" +"Escolliu la carpeta del vostre ordinador on us agradaria desar els registres " +"de conversa." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:626 +msgid "Save chat logs in the following directory:" +msgstr "Desa els registres de conversa en aquesta carpeta:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:629 +msgid "St&yle" +msgstr "Estil" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:632 msgid "Allows you to change the theme KMess uses to display all chat messages." msgstr "" +"Permet canviar el tema que KMess utilitza per mostrar els missatges de les " +"converses" -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, fuzzy, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Mostrar hora en els missatges" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:635 +msgid "&Chat style:" +msgstr "Estil de conversa" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:638 +msgid "Get &New Styles..." +msgstr "Obtingues nous estils..." -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, fuzzy, no-c-format -msgid "S&how time in chat messages" -msgstr "Mostrar hora en els missatges" +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:641 +msgid "Chat Settings" +msgstr "Arranjaments de conversa" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (toolTip), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:644 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Activa l'aparició d'emoticones a la finestra de les converses" -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, fuzzy, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "Permetre efectes a les fonts, i.e. *negreta*,/italica/, i _subratllat_" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:647 +msgid "&Show emoticons" +msgstr "Mostra les emoticones" -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:653 +msgid "Enables the appearance of winks in the chat window." +msgstr "Activa l'aparició de ganyotes a la finestra de les converses." + +#. i18n: file: settings/chatstylepage.ui:246 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:656 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, winks you send or receive will be displayed in the chat window. " +"Please note that in order to use this feature, you need to have a working " +"Flash-plugin installed." msgstr "" +"Si està activada, les ganyotes que envieu o rebeu seran mostrades a la " +"finstra " +"de la conversa. Si us plau, tingueu present que per fer servir aquesta " +"característica " +"necessiteu tenir un Flash-plugin funcional instal·lat." -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:249 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:659 +msgid "Show &winks" +msgstr "Mostra les ganyotes" + +#. i18n: file: settings/chatstylepage.ui:256 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:662 +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 "" +"Aquesta opció permet agrupar els missatges d'un mateix contacte. " +"Sempre que un contacte us enviï diversos missatges seguits, KMess els " +"agruparà en un de sol. L'aparença exacta depèn de l'estil de conversa que " +"hàgiu triat." + +#. i18n: file: settings/chatstylepage.ui:259 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:665 msgid "&Group follow-up messages from the same contact" -msgstr "" +msgstr "A&grupa els missatges seguits d'un mateix contacte" -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 +#. i18n: file: settings/chatstylepage.ui:285 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:671 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Activa l'aparença de la marca de temps a cada missatge de la conversa." + +#. i18n: file: settings/chatstylepage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:674 +msgid "S&how timestamp" +msgstr "Mostra la marca de temps" + +#. i18n: file: settings/chatstylepage.ui:319 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:680 +msgid "Show &date" +msgstr "Mostra la data" + +#. i18n: file: settings/chatstylepage.ui:349 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:683 +msgid "Show s&econds" +msgstr "Mostra els segons" + +#. i18n: file: settings/chatstylepage.ui:362 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:686 +msgid "&Text" +msgstr "&Text" + +#. i18n: file: settings/chatstylepage.ui:374 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:689 +msgid "This is the font style and color used in your chat messages." +msgstr "" +"Aquest és el tipus de lletra i el color fets servir en els vostres missatges." + +#. i18n: file: settings/chatstylepage.ui:377 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:692 +msgid "Your &message font:" +msgstr "El vostre tipus de lletra:" + +#. i18n: file: settings/chatstylepage.ui:458 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:695 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" +"Permet sobreescriure el tipus de lletra i el color del missatges dels " +"vostres contactes amb el tipus de lletra i color que trieu aquí sota." + +#. i18n: file: settings/chatstylepage.ui:461 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:698 +msgid "&Force messages from your contacts to use this font:" +msgstr "" +"&Força els missatges dels meus contactes a utilitzar aquest tipus de lletra:" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:701 +msgid "Chat Window Formatting" +msgstr "Format de la finestra de converses" + +#. i18n: file: settings/chatstylepage.ui:542 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:704 +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 l'ús dels efectes en el tipus de lletra. Teclejant *negreta*, /" +"cursiva/ i _subratllat_ fa que aquestes paraules apareguin en negreta, " +"cursiva o subratllades, respectivament." + +#. i18n: file: settings/chatstylepage.ui:545 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:707 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Fes servir els efectes del tipus de lletra, com *negreta*, /cursiva/ i " +"_subratllat_" + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableChatFormattingCheckBox_) +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:713 rc.cpp:780 +msgid "" +"Enables the use of \"Messenger Plus!\" formattings in the chat window. " +"For example, [b]this text[/b] will be replaced with this text." +msgstr "" +"Habilita l'ús dels formats de \"Messenger Plus!\"a la finestra de " +"conversa. " +"Per exemple, [b]aquest text[/b] serà canviat per aquest text." + +#. i18n: file: settings/chatstylepage.ui:558 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:716 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "Activa el format de \"Messenger Plus!\"" + +#. i18n: file: settings/chatstylepage.ui:582 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:719 +msgid "&Behavior" +msgstr "Comportament" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:722 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" +"Quan els vostres contactes vulguin cridar la vostra atenció, upo poden " +"enviar un avís. Per defecte, la finestra de conversa es mou quan es rep un " +"avís. Desactiveu aquesta opció si l'efecte de moviment és massa intrusiu.\n" +"

Quan aquesta opció es troba activada, KMess limita l'efecte de moviment. " +"Si els vostres contactes us envien diversos avisos de cop, KMess només mourà " +"la finestra amb el primer.

" + +#. i18n: file: settings/chatstylepage.ui:592 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:726 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Mou la finestra de conversa quan es rep un avís" + +#. i18n: file: settings/chatstylepage.ui:602 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:732 +msgid "" +"If this option is enabled, your own display picture will be shown in the " +"contacts panel, along with the pictures of the contacts in that chat." +msgstr "" +"Quan aquesta opció està activada, es mostrarà la vostra imatge al " +"plafó dels contactes, junt amb les imatges dels contactes presents a la " +"conversa" + +#. i18n: file: settings/chatstylepage.ui:605 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:735 +msgid "Display your own &display picture in the chat window" +msgstr "Mostra la vostra imatge a la finestra de conversa" + +#. i18n: file: settings/chatstylepage.ui:630 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:738 +msgid "G&roup chats in the same window:" +msgstr "A&grupa converses a la mateixa finestra:" + +#. i18n: file: settings/chatstylepage.ui:650 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:741 +msgid "Always" +msgstr "Sempre" + +#. i18n: file: settings/chatstylepage.ui:655 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:744 +msgid "For contacts in the same group" +msgstr "Per a contactes d'un mateix grup" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:747 +msgid "Never" +msgstr "Mai" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:750 +msgid "Display Options" +msgstr "Opcions de pantalla" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:753 +msgid "" +"If enabled, a notification is shown when an email message is received in " +"your inbox. The number of unread email messages is shown above the contact " +"list. This option is only available for Live Mail accounts." +msgstr "" +"Si es troba activada, es mostrarà una notificació quan rebeu un " +"missatge a la vostra safata d'entrada. El número de missatges no llegits es " +"mostra sobre la llista de contactes. Aquesta opció només es troba disponible " +"amb comptes de Live Mail." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:756 +msgid "Display a count of &unread mail" +msgstr "Mostra el número de missatges no llegits" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:759 +msgid "" +"If enabled, your contacts can see which song you are listening to. This " +"information is retrieved from the currently active media player." +msgstr "" +"Si es troba activada, KMess informa als vostres contactes sobre què " +"esteu escoltant. Aquesta informació és extreta del reproductor d'àudio " +"actualment actiu." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:762 +msgid "Show contacts w&hich song I am listening to" +msgstr "Mostra als contactes què estic escoltant" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:768 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" +"Si està activada, el logotip de KMess es mostrarà com a fons de la llista de " +"contactes." + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:771 +msgid "Show background &image" +msgstr "Mostra la &imatge de fons" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:777 +msgid "List Formatting" +msgstr "Format de la llista" + +#. i18n: file: settings/contactlistpage.ui:71 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:783 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "Activa el format de \"Messenger Plus!\"" + +#. i18n: file: settings/contactlistpage.ui:78 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:786 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "Mostra el correu electrònic dels contactes en comptes del seu nom" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:789 +msgid "&Emoticon Themes" +msgstr "Temes d'&emoticones" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:792 +msgid "Available emoticon themes:" +msgstr "Temes d'emoticones disponibles:" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:795 +msgid "&Custom Emoticons" +msgstr "Emoticones &personalitzades" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:798 +msgid "Available custom emoticons:" +msgstr "Emoticones personalitzades disponibles:" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:801 +msgid "Click here to add a new custom emoticon" +msgstr "Cliqueu aquí per afegir una nova emoticona personalitzada" + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:804 +msgid "Add Ne&w..." +msgstr "Afegeix-ne una de nova..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:810 +msgid "Click here to rename the selected emoticon" +msgstr "Clique aquí per canviar el nom de l'emoticona seleccionada" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:813 +msgid "Re&name" +msgstr "Rea&nomena" + +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:819 +msgid "Click here to remove the selected emoticon" +msgstr "Cliquey aquí per a esborrar l'emoticona seleccionada" + +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:822 +msgid "Remo&ve" +msgstr "Esborra" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:828 +msgid "Web Browser" +msgstr "Navegador web" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:831 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "" +"Trieu aquesta opció per fer servir el navegador web usat per la resta de KDE." + +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:834 +msgid "&Use the KDE default browser" +msgstr "&Utilitza el navegador web per omissió de KDE" + +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:837 rc.cpp:872 +msgid "Select this option to choose from a list of installed browsers." +msgstr "" +"Trieu aquesta opció per escollir d'entre una llista dels navegadors web " +"instal·lats." + +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:840 +msgid "&Use an installed browser:" +msgstr "&Utilitza un navegador web instal·lat:" + +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:843 rc.cpp:878 +msgid "Choose this option to enter the path to your favorite browser." +msgstr "" +"Trieu aquesta opció per introduir la ruta del vostre navegador web preferit." + +#. 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:846 rc.cpp:881 +msgid "&Specify a custom command:" +msgstr "E&specifiqueu una comanda personalitzada:" + +#. 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:850 rc.cpp:885 #, no-c-format 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." +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." msgstr "" +"Especifiqueu la ruta del programa que obrirà els enllaços; un '%u' es " +"reemplaçarà amb la URL dels enllaços." -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:854 #, no-c-format -msgid "Mail Client" +msgid "Use '%u' to insert the URL in the command line." +msgstr "Feu servir '%u' per inserir la URL a la línia de comandes." + +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:857 +msgid "Email Client" msgstr "Client de correu" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:860 msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" +"Maqueu aquesta casella per fer servir el client Live Mail quan us connecteu " +"amb comptes compatibles amb Live Mail." -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:863 +msgid "Use &Live Mail if the account supports it" +msgstr "Utilitza &Live Mail si el compte ho suporta" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:866 +msgid "Choose this option to use the email client used by the rest of KDE." +msgstr "" +"Trieu aquesta opció per designar el client de correu que utilitza la resta " +"de KDE. " + +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:869 +msgid "Use the &KDE default email client" +msgstr "Utilitza el client de correu per omissió de &KDE" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:875 +msgid "Use an &installed email client:" +msgstr "Utilitza un client de correu electrònic instal·lat:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:889 #, no-c-format -msgid "Use Hotmail" -msgstr "Fes anar Hotmail" +msgid "Use '%u' to insert the email address in the command line." +msgstr "" +"Feu servir '%u' per inserir l'adreça de correu electrònic a la línia de " +"comandes." -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Utilitza una comanda específica:" +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:895 +msgid "&Save all received files in one directory:" +msgstr "&Desa tots els fitxers rebuts en una carpeta:" -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Notificació de correu" +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:901 +msgid "&Use ports between" +msgstr "&Utilitza els ports entre" -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, fuzzy, no-c-format -msgid "Show email information" -msgstr "Mostra l'informació de l'email a la llista de contactes" +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:904 +msgid "and" +msgstr "i" -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:907 +msgid "for file transfers" +msgstr "per les transferències de fitxers" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:910 +msgid "Click here to tell the developers about something you liked" +msgstr "" +"Cliqueu aquí per explicar als desenvolupadors quelcom que us ha agradat" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:913 rc.cpp:920 rc.cpp:927 rc.cpp:934 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." +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " msgstr "" +"Cliqueu aquestes icones per enviar el vostre \"feedback\" als " +"desenvolupadors d'aquesta aplicació. Podeu desactivar les icones amb la " +"casella \"Mostra les icones de Feedback\" del menú ajuda.\n" +" " -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Mostra una notificació cuan el correu rebut está a \"altres carpetes\"" +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:917 +msgid "Click here to tell the developers about something you did not like" +msgstr "" +"Cliqueu aquí per explicar als desenvolupadors quelcom que no us ha agradat" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:924 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" +"Cliqueu aquí per explicar als desenvolupadors un problema de l'aplicació" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:931 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"Click here to tell the developers about new features you would like to have " +"in this application" msgstr "" +"Cliqueu aquí per explicar als desenvolupadors noves característiques que us " +"agradaria tenir en aquesta aplicació" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format -msgid "&Emoticon Themes" -msgstr "Mostrar &Emoticones" +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:938 +msgid "Your comment:" +msgstr "El vostre comentari:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" -msgstr "Mostrar &Emoticones" +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:941 +msgid "Your comment is about:" +msgstr "El vostre comentari tracta sobre:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format -msgid "&Custom Emoticons" -msgstr "Emoticones Cartoon" +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:944 +msgid "Something you like" +msgstr "Quelcom que us agrada" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:947 +msgid "Something you dislike" +msgstr "Quelcom que no us agrada" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:950 +msgid "An improper behavior of the application" +msgstr "Un comportament erroni de l'aplicació" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "Bloquejat" +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:953 +msgid "A new feature you desire" +msgstr "Una nova característica que desitgeu" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:956 +msgid "Specify an email address to be contacted back:" +msgstr "Especifiqueu una adreça de correu electrònic per a contactar-vos:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format -msgid "Re&name" -msgstr "El teu nom" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format -msgid "Remo&ve" -msgstr "Eliminat" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "" - -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "diu:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "" - -#: settings/accountswidget.cpp:421 -#, fuzzy -msgid "Display Picture" -msgstr "Foto:" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "" - -#: settings/accountswidget.cpp:486 +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:959 msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +"Your email address will not be used for anything else but this report." msgstr "" +"Si especifiqueu la vostra adreça de correu electrònic, els " +"desenvolupadors podran demanar-vos més informació sobre l'incident, o dir-" +"vos quan serà implementada la nova característica.
\n" +"La vostra adreça de correu electrònic no serà utilitzada per " +"res més que això." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Preferéncies" - -#: settings/settingsdialog.cpp:93 -#, fuzzy -msgid "Account" -msgstr "Comptes" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Parlant" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Estás segur d'esborrar aquesta compta?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." -msgstr "" - -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "" - -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "" - -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "" - -#, fuzzy -#~ msgid "File transfer dialog message" -#~ msgstr "Transferencia de l'arxiu completada." - -#, fuzzy -#~ msgid "The file transfer invitation was cancelled. Bad data was received." -#~ msgstr "Has cancel·lat la invitació." - -#~ msgid "..." -#~ msgstr "..." - -#, fuzzy -#~ msgid "popupMessage" -#~ msgstr "El missatge" - -#, fuzzy -#~ msgid "ChattingWidget" -#~ msgstr "Parlant" - -#, fuzzy -#~ msgid "EmailWidget" -#~ msgstr "Correu" - -#, fuzzy -#~ msgid "Message from %1" -#~ msgstr "Missatge de " - -#, fuzzy -#~ msgid "Notification message" -#~ msgstr "Missatge de l'aplicació" - -#~ msgid "You can't login to hotmail with this account." -#~ msgstr "No pots fer login a hotmail amb aquest compte" - -#~ msgid "The connection to the server failed." -#~ msgstr "La conexió al servidor ha estat erronea" - -#~ msgid "You may not be connected to the internet." -#~ msgstr "Poder no estàs conectat a internet." - -#, fuzzy -#~ msgid "There was a problem connecting to the proxy." -#~ msgstr "Hi deu haver un problema amb els servers" - -#~ msgid "This person is online, but he or she is blocking you." -#~ msgstr "Aquesta persona está Online, pero t'está bloquejant." - -#, fuzzy -#~ msgid "says" -#~ msgstr "diu:" - -#~ msgid "Show this person's profile" -#~ msgstr "Veure el perfil d'aquesta persona" - -#~ msgid "Send this person an email" -#~ msgstr "Enviar un correu a aquesta persona" - -#, fuzzy -#~ msgid "&Start in \"Invisible\" mode" -#~ msgstr "Començar en mode \"Invisible\"." - -#~ msgid "Show popup notifications for program events" -#~ msgstr "Mostrar els globus de notificació per els events del programa" - -#, fuzzy -#~ msgid "Server:" -#~ msgstr "Error en el server" - -#, fuzzy -#~ msgid "Connection good" -#~ msgstr "Conexió fallida" - -#, fuzzy -#~ msgid "Server too busy" -#~ msgstr "El servidor está ocupat" - -#, fuzzy -#~ msgid "Server unavailable" -#~ msgstr "El servidor no està en servei" - -#, fuzzy -#~ msgid "New chat notification:" -#~ msgstr "Notificació de correu" - -#, fuzzy -#~ msgid "%1 is offline" -#~ msgstr "está fora de linea" - -#, fuzzy -#~ msgid "You have new mail:" -#~ msgstr "Tens un nou correu" - -#, fuzzy +#~ msgctxt "Warning message shown in chat, %1 is the contact's friendly name" #~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in your inbox" -#~ msgstr "en la teva bustia" +#~ "It is currently not possible to send a handwritten message to %1, " +#~ "due to an incompatibility with Windows Live Messenger 8.5." +#~ msgstr "" +#~ "No es pot enviar un dibuix a %1, degut a la incompatibilitat amb el " +#~ "Windows Live Messenger 8.5." + +#~ msgid "Select an account and click here to delete it" +#~ msgstr "Seleccioneu un compte i cliqueu aquí per a esborrar-lo" + +#~ msgid "Click here to delete the selected emoticon" +#~ msgstr "Cliqueu aquí per esborrar l'emoticona seleccionada" + +#~ msgid "I&mages" +#~ msgstr "I&matges" + +#~ msgid "Ink message" +#~ msgstr "Missatges de tinta" -#, fuzzy #~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in another folder" -#~ msgstr "en una altra carpeta" +#~ "If you have added any custom emoticons, click this button to view them, " +#~ "so you can easily insert them in your messages." +#~ msgstr "" +#~ "Si heu afegit alguna emoticona personalitzada, cliqueu aquí per veure-les " +#~ "i inserir- les als vostres missatges" -#~ msgid "and" -#~ msgstr "i" +#~ msgid "&Do not filter" +#~ msgstr "No filtris" -#~ msgid "says: " -#~ msgstr "diu:" +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Mostra una notificació quan es connecti/desconnecti" -#, fuzzy -#~ msgid "(Online)" -#~ msgstr "En linea" +#~ msgid "File format used for saving:" +#~ msgstr "Format de fitxer per a desar les converses:" -#~ msgid "There may be a problem with the servers" -#~ msgstr "Hi deu haver un problema amb els servers" +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "

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

" -#~ msgid "System Message" -#~ msgstr "Missatge del sistema" +#~ msgid "Show the feedback buttons bar on the windows" +#~ msgstr "Mostra els botos de feedback a les finestres" -#, fuzzy -#~ msgid "Show incoming server messages" -#~ msgstr "Mostrar gráfics en els missatges del xat" +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Ignora aquesta &emoticona" -#, fuzzy -#~ msgid "Show outgoing server messages" -#~ msgstr "Mostrar gráfics en els missatges del xat" +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "No es pot bloquejar ara!" -#, fuzzy -#~ msgid "Chat - %1" -#~ msgstr "Xat" +#~ msgid "Ed&it Notes" +#~ msgstr "Ed&ita les notes" -#, fuzzy -#~ msgid "Chat - %1 et al." -#~ msgstr " et al." +#~ 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 "" +#~ "No s'ha pogut trobar una data vàlida dels vostres registres de conversa! " +#~ "Això pot ser degut a que els registres van ser generats amb una versió " +#~ "antiga de KMess" -#, fuzzy -#~ msgid "The transfer of %1 failed. Couldn't create a socket." -#~ msgstr "error. No es pot obrir un socket" +#~ 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 "" +#~ "Els vostrestes registres de conversa semblen defectuosos o són d'una " +#~ "versió antiga de KMess. KMess pot intentar importar-los, voleu fer-ho ara?" -#~ msgid "Login with a saved profile:" -#~ msgstr "Entrar amb un perfil guardat" +#~ msgid "" +#~ "Migration terminated.\n" +#~ "Tried to migrate %1 items\n" +#~ "%2 items successfully migrated\n" +#~ "%3 items could not have been migrated." +#~ msgstr "" +#~ "Importació finalitzada.\n" +#~ "S'han intentat importar %1 objectes\n" +#~ "S'han importat %2 objectes correctament\n" +#~ "No s'ha pogut importar %3 objectes." -#~ msgid "Changes will take place when the program is restarted." -#~ msgstr "Els canvis s'activaràn cuan el programa sigui reiniciat." +#~ msgid "Alpha logs migration" +#~ msgstr "Importació dels registres alpha de conversa" -#~ msgid "Get New Emoticon or Sound &Themes" -#~ msgstr "Obtenir noves emoticones o &temes de so" +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Esborra la imatge" -#, fuzzy -#~ msgid "Chat message layout:" -#~ msgstr "La font dels teus missatges:" +#~ msgid "Search for C&ontact" +#~ msgstr "Cerca un c&ontacte" -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "El teu nom" +#~ msgid "Search by &Interest" +#~ msgstr "Cerca per &interessos" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Les vostres adreces de correu electrònic" + +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "" +#~ "El contacte ha inciat una característica de MSN6, que KMess encara no sap " +#~ "interpretar." + +#~ msgid "" +#~ "The transfer failed. The contact sent bad data, or KMess doesn't support " +#~ "it." +#~ msgstr "" +#~ "La transferència ha fallat. El contacte ha enviat dades errònies o KMess " +#~ "no les suporta." diff --git a/po/da.po b/po/da.po index 1da7f6e..7cb1a26 100644 --- a/po/da.po +++ b/po/da.po @@ -6,9 +6,9 @@ msgid "" msgstr "" "Project-Id-Version: da\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2008-02-21 00:20+0100\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" +"PO-Revision-Date: 2008-05-28 01:29+0200\n" "Last-Translator: Pascal d'Hermilly \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -17,509 +17,1282 @@ msgstr "" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Pascal d'Hermilly, Lars Sommer LaSG" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "pascal@tipisoft.dk, admin@LaSG.dk" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "Jeg er væk fra computeren" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Dit navn" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "digselv@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Logger ind..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Jeg er væk fra computeren" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "&Fjern" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Søvnig" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"Du kan ikke invitere fordi der allerede er flere kontakter i denne chat" + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "%1 er kommet med i samtalen" + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "%1 har forladt samtalen" + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +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:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 og %2 - Chat" + +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 et al. - Chat" + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr " (denne meddelelse blev sendt automatisk)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Du har modtaget et blink fra %1" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Du har modtaget et blink fra %1" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 er blevet usynlig" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1 har sendt dig en offline besked: '%2'" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1 har sendt dig en håndskrevet besked!" + +#: chat/chat.cpp:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "Blinket kunne ikke vises. Det kunne ikke læses korrekt" + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "Blinket kunne ikke vises. Det kunne ikke læses korrekt" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 har sendt dig et blink!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 har sendt dig et blink!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "Blinket kunne ikke vises. Undersøg om du har 'cabextract' installeret" + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "Blinket kunne ikke vises. Undersøg om du har 'cabextract' installeret" + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "Blinket kunne ikke vises. Undersøg om du har 'cabextract' installeret" + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "Blinket kunne ikke vises. Undersøg om du har 'cabextract' installeret" + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 er kommet med i samtalen" + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 er kommet med i samtalen" + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 har sendt dig et vink!" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 er kommet med i samtalen" + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "Beskeden '%1' blev ikke sendt." + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Du har sendt et vink til %1!" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Du har sendt et vink!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 sender et blink: %2" -#: chat/chatmessagestyle.cpp:296 +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 siger:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "Tilføj dette humørikon: %1" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "&Forbind" + +#: chat/chatview.cpp:300 +#, fuzzy, kde-format 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:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, fuzzy, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Overskriv fil" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Over&skriv" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." msgstr "Tilføj dette &Humørikon" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Tilføj dette &Humørikon" + +#: chat/chatview.cpp:834 msgid "Send &Email" msgstr "Send &E-post" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "&Kopier E-post" +#: chat/chatview.cpp:838 +#, fuzzy +msgid "Add &Contact" +msgstr "&Tilføj kontaktperson" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-postadresse" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "Besøg &Link" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "Kopier &Adresse" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +#, fuzzy +msgid "&Copy Text" msgstr "Kopier %tekst" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "Markér &Alt" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +#, fuzzy +msgid "C&lear Chat" +msgstr "Stryg faneblad" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Gem chat til en &Fil" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Tal" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" -"Du kan ikke invitere fordi der allerede er flere kontakter i denne chat" - -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 er kommet med i samtalen" - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "%1 har forladt samtalen" - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 har forladt samtalen" - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Chat" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 og %2 - Chat" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 et al. - Chat" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Kontakter" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Humørikoner" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +#, fuzzy +msgid "My Emoticons" msgstr "Mine humørikoner" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (denne meddelelse blev sendt automatisk)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 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" +"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:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "Blinket kunne ikke vises. Det kunne ikke læses korrekt" +#: chat/chatwindow.cpp:340 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Luk faneblad" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "Du har modtaget et blink fra %1" +#: chat/chatwindow.cpp:341 +#, fuzzy +msgid "Close All Tabs" +msgstr "Luk faneblad" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "Beskeden '%1' blev ikke sendt." +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "Luk faneblad" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "Du har modtaget et vink fra %1!" +#: chat/chatwindow.cpp:451 +#, fuzzy +msgid "&Invite..." +msgstr "&Inviter" -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Du har sendt et vink til %1!" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Du har sendt et vink!" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 skriver" - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 og %2 skriver." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 og %3 andre skriver." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +#: chat/chatwindow.cpp:452 +#, fuzzy +msgid "Send a &File..." msgstr "Send en &Fil" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +#, fuzzy +msgid "Webcam Chat" +msgstr "Gem chat" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "Start et &Møde" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 msgid "Send a &Nudge!" msgstr "Send et &Vink" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Start eller Stop en &Samtale" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:456 +#, fuzzy +msgid "Save Chat..." msgstr "Gem chat" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Inviter" +#: chat/chatwindow.cpp:457 +#, fuzzy +msgid "Close &All Tabs" +msgstr "Luk faneblad" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Chat" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "Skift &Skrifttype" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "Skift Skrift&farve" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Indsæt et humørikon" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "Brug &Stavekontrol" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "Vis humørikoner" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Vis/Sk&jul kontaktliste" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Vis tid i chat-beskeder" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Vis eller skjul kontaktlisten" +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "&Panels" +msgstr "Annuler" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "&Send e-post" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "Brug &Stavekontrol" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "Møde" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Vink" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Send en &Fil" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Venter på kontaktliste" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakter" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Venter på kontaktliste" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Humørikoner" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Venter på kontaktliste" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mine humørikoner" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "Skrifttype" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "Skriftfarve" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "Stryg faneblad" + +#: chat/chatwindow.cpp:603 +#, 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:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Tal" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Chat" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1 skriver" + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 og %2 skriver." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 og %3 andre skriver." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Start et &Møde" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "Send &E-post" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "&Vis profil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Egenskaber" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "&Tilføj kontaktperson" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" msgstr "T&illad kontaktperson" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" msgstr "&Fjern kontaktperson" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "&Bloker kontaktperson" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "&Afbloker kontaktperson" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" msgstr "Kaldenavn" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "Personlig meddelelse" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" msgstr "E-postadresse" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +#, fuzzy +msgid "&Information" +msgstr "Vis e-postinformation" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Profilbillede:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +#, fuzzy +msgid "&Notes" +msgstr "Node" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "Humørikoner" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" msgstr "&Kopier..." -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Blokeret" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Væk" - -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Er snart tilbage" - -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Optaget" - -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Offline" - -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Væk - Fraværende" - -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Til frokost" - -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "Online" - -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "Taler i telefon" - -#: chat/contactframe.cpp:558 +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" msgid "The contact is %1" msgstr "Kontakten er %1" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "Chat-tekst-stil" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "Klient: %1" +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "Tilføj en kontaktperson" -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Tilføj &ny" + +#: chat/emoticonswidget.cpp:453 +#, fuzzy +msgid "Edit" +msgstr "Rediger" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Fjern" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Robot" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 kompatibel" + +#: contact/contactbase.cpp:335 +#, fuzzy, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 Kompatibel" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 Kompatibel" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Online" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Optaget" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Væk" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Væk med autosvar" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Fraværende" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Er snart tilbage" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Taler i telefon" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Til frokost" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Usynlig" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Denne konto har ikke en Hotmail indbakke!" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Offline" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Min Status" + +#: contact/msnstatus.cpp:218 +#, 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:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Indtast e-postadressen til den person du vil tilføje:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "E-postadresen var ugyldig" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Tilføj nyt Humørikon" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "Humørikoner" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +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:28 -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/chathistorydialog.cpp:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Chat-stil:" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Skriv den besked folk automatisk vil modtage \n" -"hvis de prøver at kontakte dig:" -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Brug et alternativt navn til denne person" +#: dialogs/chathistorydialog.cpp:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Kunne ikke åbne en lokal port" -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Vis en pop-up-ballon når denne person går on- eller offline" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Logger ind..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Billede:" +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Før log over alle samtaler" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Lyd:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Du er blevet tilføjet af nogen" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"har tilføjet dig til sin kontaktliste. Vil du:" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%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:282 +#, kde-format msgid "Contact Properties for %1" msgstr "Kontaktegenskaber for %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Forbundet" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +#, fuzzy +msgid "No messages yet" +msgstr "Vis tid i chat-beskeder" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "E-postadresse:" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Nuværende navn: " +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Klient: %1" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakter" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "" +"Invitationen blev afvist. Den er ikke understøttet af kontaktens program" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "%1 kontakter" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "Netværksvindue:" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" msgstr "Gem faneblad" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" msgstr "Stryg faneblad" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" msgstr "Luk faneblad" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Ingen forbindelse. Kan ikke åbne Netværksvinduet." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Ingen forbindelse.\n" +"Kan ikke åbne Netværksvinduet." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" "Kunne ikke gemme netværksvindue-loggen. Undersøg om du har skriverettigheder " -"i den folder hvor log-filen gemmes." +"i den folder hvor logfilen gemmes." -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "Kan ikke lukke hovedfanebladet" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +#, fuzzy +msgid "Cannot send commands to this kind of connection!" +msgstr "Kan ikke lukke hovedfanebladet" + +#: 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 "Annuleret" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Fejlede!" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "Færdig" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" +#: dialogs/transferentry.cpp:343 +#, fuzzy, kde-format +msgid "%1 of %2 received." msgstr "%1 af %2 modtaget" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" +#: dialogs/transferentry.cpp:347 +#, fuzzy, kde-format +msgid "%1 of %2 sent." msgstr "%1 af %2 sendt" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" msgstr "Filoverførsler" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Forvirret" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Fjern" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Profilbillede:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Er du sikker på du vil fjerne denne konto?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Profilbillede:" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -527,343 +1300,413 @@ msgstr "" "Kunne ikke gemme humørikon temaet. Undersøg om du har skriverettigheder i " "den folder du gemmer temaer i: '%1'." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Smil" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "blink" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Tungen ude" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Stort smil" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Ked af det" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Græder" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "Sur" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Forvirret" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Forlegen" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Skuffet" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Varm" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Vise tænder" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Nørd" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Syg" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Overrasket" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Fest" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Søvnig" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Tænker" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Sig det ikke til nogen" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Hemligheds-fortælling" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Ruller med øjnene" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Sarkastisk" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Det ved jeg ikke" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Er snart tilbage" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Engel" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Venstre knus" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Dreng" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Rødt hjerte" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Rød næse" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +#, fuzzy +msgid "Thumbs up" msgstr "Tommel op" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Hundeandsigte" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Sol" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Djævel" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Højre knus" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Pige" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Knust Hjerte" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Vissen rose" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Tommel ned" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Katteandsigte" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Sovende halvmåne" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Røde læber" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Klapper" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Krydsede fingre" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Bil" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Flyvemaskine" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Skildpadde" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Snegl" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Sort får" +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "Søvnig" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Ged" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Vampyrflagermus" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Øl-krus" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "Martini glas" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "kaffekop" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Fødselsdagskage" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Tallerken" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Skål" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Stjerne" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Regnbue" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Regnvejr" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Lyn" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Paraply" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Ø med træer" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "Telefonrør" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "E-post" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Ur" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Filmstrip" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Node" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Håndjern" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Penge" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Elpære" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +#, fuzzy +msgid "Cigarette" msgstr "Cigaret" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "Fodbold" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Gave med sløjfe" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" msgstr "KMess ikon" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "Kontakt-adressen du har indtastet er ikke korrekt: '%1'" - -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "Tilfø&j en gruppe" - -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Indtast navnet for denne gruppe:" - -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Væk med autosvar" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" msgstr "" -#: kmess.cpp:715 +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Serveren er utilgængelig" + +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Serveren er utilgængelig" + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Forbind" + +#: initialview.cpp:601 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Annuler" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "E-postadresse" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "E-postadresse" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Denne kontakt er allerede på din liste" + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "Vis e-postinformation" + +#: kmess.cpp:248 +#, fuzzy +msgid "New Group" +msgstr "Ny &Gruppe" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Tilfø&j en gruppe" + +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" +msgstr "Indtast navnet for denne gruppe:" + +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -871,1402 +1714,3447 @@ msgstr "" "Er du sikker på du vil fjerne kontakten %1 fra din kontaktliste?" -#: kmess.cpp:718 -msgid "Remove contact" +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" msgstr "&Fjern kontaktperson" -#: kmess.cpp:720 -msgid "Remove and block" +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" msgstr "Fjern og blokér" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "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:763 -msgid "Remove group" -msgstr "&Fjern gruppe" +#: kmess.cpp:636 +#, fuzzy +msgctxt "dialog button" +msgid "Remove" +msgstr "Fjern" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "Dette er en særlig gruppe og kan ikke ændres" -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "&Omdøb gruppe" +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "O&mdøb gruppe" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Forbundet" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Indtast navnet for denne gruppe:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Godkendelse fejlede" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Forbinder..." + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Ikke forbundet" -#: kmess.cpp:1669 +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, fuzzy, kde-format +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 'eventsrc' 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:1673 -msgid "Error with notifications" +#: kmess.cpp:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Fejl i bekendtgørelser" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Ny &Konto" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "&Ny Kontaktperson" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Ny &Gruppe" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "&Søg efter Kontaktpersoner" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Søg på &Interesser" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Konto&opsætning" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Handlinger" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "&Forbind" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "Af&bryd Forbindelsen" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "&Vis Min Profil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Min Status" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "&Forbind" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Af&bryd Forbindelsen" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "&Vis Min Profil" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "Vis Tilla&dte Kontakter" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "Vis Offline Kontakter" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "Vis F&jernede Kontakter" -#: kmessinterface.cpp:278 -msgid "Show &Display Pictures" -msgstr "Vis &Profilbilleder" +#: kmessinterface.cpp:170 +#, fuzzy +msgid "Show &History Box" +msgstr "Chat-stil:" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Vis &Netværksvindue" +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Vis sidebar" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "Vis humørikoner" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" +msgstr "Profilbillede:" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "S&orter Kontakter Efter" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Vis &Filoverførsel vinduet" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "&Ny Kontaktperson" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "Ny &Gruppe" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Søg efter Kontaktperson" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Chat-stil:" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "Ny &Konto" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Ny &Konto" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "Smil" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Gruppe" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Online / Offline" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Vis &Filoverførsel vinduet" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Lytter nu til %1" +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Vis &Netværksvindue" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "" + +#: kmessview.cpp:599 msgid "Cha&t" msgstr "Chat" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Egenskaber" - -#: kmessview.cpp:623 -msgid "&Remove from group" +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" msgstr "Fjer&n fra gruppe" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Flyt til gruppe" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" msgstr "&Kopier til gruppe" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "&Flyt til gruppe" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "Flyt Gruppe &Ned" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "Flyt Gruppe &Op" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "Fjer&n gruppe" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "O&mdøb gruppe" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "Du har et nyt brev i din indbakke" +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Tilføj denne kontaktperson til din \"Venne\"liste" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "Du har %1 nye breve i din indbakke" +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-postadresse" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(væk)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Klient: %1" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(er snart tilbage)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(optaget)" +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "Node" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(usynlig)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokeret" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(væk - fraværende)" +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(til frokost)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Vis tid i chat-beskeder" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(taler i telefon)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Gruppe %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Log automatisk på med den givne e-post adresse" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "Kontakten er ikke online" +msgstr[1] "Kontakten er ikke online" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 kontakter" +msgstr[1] "%1 kontakter" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Du har afvist invitationen" + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "Chat-stil:" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "En MSN Messenger klient til KDE" + +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, 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 "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +#, fuzzy +msgid "Project support" +msgstr "P4-Context field support" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +#, fuzzy +msgid "Current developer" +msgstr "GnomeMeeting udvikler" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Tysk oversættelse, test, dokumentation og netside osv." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "Webdesign" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +#, 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:74 msgid "Cartoon emoticons" msgstr "Tegnefilmshumørikoner" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Oprindeligt lydtema" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabisk oversættelse, internationalisering af gem-fil ordning" -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "Mere arabisk oversættelse" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Brasilliansk / Portugisisk oversættelse" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Brasilliansk / Portugisisk oversættelse" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Katalansk oversættelse" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Mere italiensk oversættelse" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 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:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "Mere simpel kinesisk oversættelse" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "Traditionel kinesisk oversættelse" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Traditionel kinesisk oversættelse" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 msgid "Danish translation" msgstr "Dansk oversættelse" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 msgid "More Danish translation" msgstr "Mere dansk oversættelse" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "Hollandsk oversættelse" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" msgstr "Mere hollandsk oversættelse" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Mere arabisk oversættelse" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "Mere fransk oversættelse" + +#: main.cpp:111 msgid "Estonian translation" msgstr "Estisk oversættelse" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 msgid "Finnish translation" msgstr "Finsk oversættelse" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 msgid "More Finnish translation" msgstr "Mere finsk oversættelse" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "Fransk oversættelse" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" msgstr "Mere Fransk oversættelse, MSN6 humørikon-definitioner" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" msgstr "Mere fransk oversættelse" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "Ungarsk oversættelse" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Ungarsk oversættelse" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 msgid "More Italian translation" msgstr "Mere italiensk oversættelse" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "Koreansk oversættelse" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "Norsk Bokmål oversættelse" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "Slovensk oversættelse" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "Slovensk oversættelse" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 msgid "Slovenian translation" msgstr "Slovensk oversættelse" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 msgid "Spanish translation" msgstr "Spansk oversættelse" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 msgid "More Spanish translation" msgstr "Mere spansk oversættelse" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 msgid "Swedish translation" msgstr "Svensk oversættelse" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "Svensk oversættelse" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 msgid "Thai translation" msgstr "Thai oversættelse" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 msgid "Turkish translation" msgstr "Tyrkisk oversættelse" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "Mere türkisk oversættelse" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "Går Online" + +#: main.cpp:154 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:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Filoverførsler" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "P4-Context field support" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Xinerama ordninger" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Original filmodtagelseskode" -#: main.cpp:133 +#: main.cpp:159 +#, fuzzy +msgid "KWallet support" +msgstr "P4-Context field support" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "Chat-stil:" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "Forskellige internationaliseringsordninger" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "Forskellige internationaliseringsordninger" -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "GnomeMeeting udvikler" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Mand med pose over hovedet" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspiration og forskelligt kode" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +#, fuzzy +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "" "Gammel Hopop ballon-kode, oprindelig p2p kode, msn udfordrings-varetager" -#: main.cpp:140 +#: main.cpp:174 msgid "Idle timer code" msgstr "Fraværstællerkode" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 #, fuzzy msgid "Close-to-tray icon screenshot code" msgstr "Kode for screenshot af Luk-til-systembakke-ikon" -#: main.cpp:144 -msgid "Your name here?" -msgstr "Dit navn her?" +#: main.cpp:176 +msgid "Amarok" +msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +#, fuzzy msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" 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å!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:179 +msgid "Your name here?" +msgstr "Dit navn her?" + +#: main.cpp:182 +#, fuzzy +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Dit navn" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Din e-postadresse:" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Venter på kontaktliste" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Log automatisk på med den givne e-post adresse" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Tilladt" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Fjernet" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." msgstr "Kontakten har annulleret sessionen" -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "Kontakten har afvist invitationen" -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Du har annulleret invitationen" -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Du har afvist invitationen" -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, fuzzy, kde-format msgid "Do you want to
accept or cancel?" msgstr "Vil du acceptere eller annulere" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, fuzzy, kde-format msgid "Click to cancel." msgstr "Klik for at annulere." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +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, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Forbinder til %1 på port %2" +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Overførsel blev annulleret" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Forbindelsen er etableret" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Korrekt overført fil: %1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Overførslen af %1 fejlede. Filen eksisterer ikke." - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Overførslen af %1 fejlede. Filen kunne ikke læses." - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Sender fil %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Overførsel accepteret" -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Forbinder til %1 på port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Kontakten annulerede overførslen" + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Du har annulleret invitationen" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Du har annulleret invitationen" + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Forbindelsen er etableret" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Korrekt overført fil: %1" + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Korrekt overført fil: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "Overførslen af %1 fejlede. Filen eksisterer ikke." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "Overførslen af %1 fejlede. Filen kunne ikke læses." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Sender fil %1 (%2)" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Kontakten annulerede overførslen" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" msgstr "Forhandler indstillinger til forbindelsen" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "" "Filoverførsels-invitationen blev annulleret. Fejlagtige data blev modtaget." -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Du har annulleret invitationen" -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Kontakten annulerede overførslen" - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "Filen kunne ikke skrives" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Overførslen af %1 fejlede. Filen eksisterer ikke." - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Overførslen af %1 fejlede. Filen kunne ikke læses." - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "Sender fil %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: 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)" -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Starter GnomeMeeting. Forbinder til %1" -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Inviterer personen til et møde" -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." msgstr "" "Invitationen blev afvist. Den er ikke understøttet af kontaktens program" -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." msgstr "Invitationen mislykkedes. En intern fejl opstod." -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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:130 -msgid "The invitation was aborted. Timeout while waiting for file data." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +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:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." msgstr "Invitationen mislykkedes. Sammenkobleren lukkede chat-forbindelsen" -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Invitationen mislykkedes." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Du er inviteret til at dele denne persons skrivebord." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Starter KRDC. Forbinder til %1" -#: network/applications/p2papplication.cpp:276 -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:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Kontakten inviterer dig til '%1', men det er ikke understøttet endnu." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" "Invitationen blev annulleret. Kontakten sendte enten fejlagtige data eller " "også understøtter KMess den ikke endnu" -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." msgstr "Overførslen fejlede. Data-forbehandling fejlede" -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakten afviste invitationen. En intern fejl opstod" - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "Overførslen fejlede." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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/p2papplication.cpp:2038 +#: network/applications/p2papplication.cpp:1192 msgid "The invitation was cancelled. Message was not directed to us." msgstr "Invitationen blev annulleret. Beskeden var ikke tilment dig. " -#: network/applications/p2papplication.cpp:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "" "Overførslen fejlede.Kontakten sendte enten fejlagtige data eller også " "understøtter KMess det ikke endnu." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Kontakten afviste invitationen. En intern fejl opstod" + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Venter på forbindelse på %1på port %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 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:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Overførslen fejlede. Tiden løb ud inden brugeren accepterede" - -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "Overførslen fejlede. En intern fejl opstod" - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "Overførslen fejlede. Kunne ikke åbne data-kilden" - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" msgstr "Venter på forbindelse" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "Invitationen blev annulleret. Tiden løb ud inden brugeren accepterede" -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "" "Overførslen fejlede. Tiden løb ud inden programmet fandt ud af at " "forbindelsen havde lykkedes eller fejlet" -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." msgstr "Invitationen blev annulleret. Tiden løb ud inden data blev modtaget." -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakten afviste invitationen. En intern fejl opstod" + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Overførslen fejlede." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Overførslen fejlede. En intern fejl opstod" + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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" -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "" "Du er inviteret til at starte en lyd-samtale. Men dette er ikke understøttet." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "Du har annulleret lyd-samtalen" -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "Invitationen blev annulleret. Lyd-enheden kunne ikke åbnes." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Start lyd-samtale. Forbinder til %1" -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Start lyd-samtale. Lytter på %1" -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "Inviterer personen til en lyd-samtale" -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Overførslen af %1 blev annulleret" +#: 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/extra/msnftpconnection.cpp:136 +#: 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 contact'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:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Du har annulleret invitationen" + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakten annulerede overførslen" + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Fejlede" -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Sender fil %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "Overførslen af %1 fejlede. Kunne ikke åbne en lokal port." -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not open a local port." msgstr "Kunne ikke åbne en lokal port" -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Indleder filoverførsel" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +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:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Kunne ikke skabe en forbindelse" -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Modtager fil %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" msgstr "" -"KMess kunne ikke forbinde til MSN Messenger service.\n" -"Undersøg om du er forbundet til internettet.\n" -"Systemfejl: %1 (kode: %2)." -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "Ping tabt" +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 ping tabt" +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "E-postadressen du har prøvet at tilføje er ikke en MSN Messenger konto" -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "Forbindelsen til serveren gik tabt" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Domænenavnet mangler" -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "Den eksterne server har tabt forbindelsen" +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Allerede logget ind" -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Tilladt" +#: network/msnconnection.cpp:396 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Det givne brugernavn er ugyldigt" -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Fjernet" - -#: network/msnnotificationconnection.cpp:545 +#: network/msnconnection.cpp:400 +#, fuzzy msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +"This 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/msnconnection.cpp:403 +msgid "Your contact list is full" +msgstr "Din kontaktliste er fyldt op" + +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 +msgid "This contact is already on your list" +msgstr "Denne kontakt er allerede på din liste" + +#: network/msnconnection.cpp:415 +msgid "This contact is not on your list" +msgstr "Denne kontakt er ikke i din liste" + +#: network/msnconnection.cpp:419 +msgid "This contact is not online" +msgstr "Kontakten er ikke online" + +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Allerede i denne tilstand" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"Gruppenavnet bruges allerede i din Messenger eller Hotmail kontaktliste." + +#: network/msnconnection.cpp:436 +#, 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/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Denne gruppe kan ikke ændres" + +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "Din kontaktliste har for mange grupper" + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "Denne gruppe er ikke tom" + +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" + +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "Forsøgte at ændre gruppe \"0\"" + +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Der var en intern fejl i KMess: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Ugyldig gruppe" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 +msgid "Switchboard server failed" +msgstr "Sammenkobleren fejlede" + +#: network/msnconnection.cpp:476 +msgid "Transfer to switchboard server failed" +msgstr "Overførsel til sammenkobler-server fejlede" + +#: network/msnconnection.cpp:480 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "Direkte forbindelse (MSNSLP) fejl, forbindelsen fejlede" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Nødvendigt felt mangler" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "Ikke logget ind" + +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "Din konto er bandlyst" + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Overførslen fejlede." + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +#, fuzzy +msgid "You are opening chat sessions too fast" +msgstr "Du åbner sessioner for hurtigt" + +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" +msgstr "Du har for mange sessioner åbne" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 +msgid "Bad friend name" +msgstr "Dårligt kaldenavn" + +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:540 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" +msgstr "Serveren siger at KMess sender for mange data." + +#: network/msnconnection.cpp:547 +#, fuzzy +msgid "Authentication ticket was incorrect" +msgstr "Godkendelse fejlede" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Du kan ikke snakke med nogen når du er usynlig." + +#: network/msnconnection.cpp:554 +#, fuzzy +msgid "Not accepting new contacts" +msgstr "Modtager ikke flere overhoveder." + +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"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/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "Dit passport skal først bekræftes" + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "Fejl ved hentning af kontaktlisten. Prøv igen senere. " + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "Der var en intern serverfejl" + +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "Der var en intern serverfejl" + +#: network/msnconnection.cpp:599 +msgid "Peer notification server down" +msgstr "Medelelses-server nede" + +#: network/msnconnection.cpp:603 +msgid "The server is going down" +msgstr "Serveren går ned" + +#: network/msnconnection.cpp:607 +msgid "The server is going down soon" +msgstr "Serveren går snart ned" + +#: network/msnconnection.cpp:612 +msgid "Write is blocking" +msgstr "Skrivning er blokeret" + +#: network/msnconnection.cpp:616 +msgid "Session is overloaded" +msgstr "Session er overbelastet" + +#: network/msnconnection.cpp:623 +msgid "The server is not available" +msgstr "Serveren er utilgængelig" + +#: network/msnconnection.cpp:627 +msgid "Authentication failed" +msgstr "Godkendelse fejlede" + +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "KMess modtog en ukendt kommando fra serveren: %1" + +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "KMess - MSN fejl" + +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1337 +#, fuzzy +msgid "Authenticating..." +msgstr "Kontrolerer brugernavn og kode" + +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "Godkendelse fejlede" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Forbinder..." + +#: network/msnnotificationconnection.cpp:1940 +#, fuzzy, kde-format +msgid "Unknown command received from the server: %1" +msgstr "KMess modtog en ukendt kommando fra serveren: %1" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "minutter" +msgstr[1] "minutter" + +#: network/msnnotificationconnection.cpp:2103 +#, fuzzy, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Advarsel: Serveren lukker for vedligeholdese om %1 minutter!" + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger 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:2309 +#, fuzzy, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess kan ikke behandle Offline-IM beskeder.

Detaljer: %1" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "Godkendelse fejlede" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Venter på kontaktliste" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "Der var en intern fejl i KMess: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, fuzzy +msgctxt "Connection error: dialog box" +msgid "" +"

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:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:2932 +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:2935 +#, fuzzy, kde-format +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:740 -msgid "Show MSN Messenger Service status?" -msgstr "Vis MSN Messenger Service status?" +#: network/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Serverfejl" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +msgctxt "Connection error: detailed message" msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." +"

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 "" -"Din forbindelse er afbrudt fordi der blev \n" -"forbundet til MSN fra en anden klient." +"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:1553 -msgid "Got synchronization" -msgstr "Fik synkronisering" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Kontrolerer brugernavn og kode" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Modtaget brugergodkendelse" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Venter på kontaktliste" - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Overfører til notifikations-server" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" +#: network/msnnotificationconnection.cpp:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" msgstr "" -"Godkendelse fejlede. Undersøg om du har angivet rigtigt brugernavn og kodeord" -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Forbinder..." +#: network/msnnotificationconnection.cpp:2969 +#, kde-format +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess modtog en ukendt kommando fra serveren: %1" +#: network/msnnotificationconnection.cpp:2980 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" +#: network/msnnotificationconnection.cpp:2982 +#, kde-format +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3005 +#, 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:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" msgstr "Der var en intern fejl i KMess: %1" -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +#, fuzzy +msgid "Connection time limit exceeded" +msgstr "Forbindelsen er etableret" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "Ping tabt" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 ping tabt" + +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "Forbindelsen til serveren gik tabt" + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy, kde-format +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/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "Det givne brugernavn er ugyldigt" - -#: network/msnnotificationconnection.cpp:2255 +#: network/soap/addressbookservice.cpp:787 +#, fuzzy, kde-format +msgctxt "Error message" msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"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/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -"Brugernavnet er ugyldigt eller dit passport er ikke blevet bekræftet endnu." -#: network/msnnotificationconnection.cpp:2258 -msgid "Your contact list is full" -msgstr "Din kontaktliste er fyldt op" - -#: network/msnnotificationconnection.cpp:2264 -msgid "This contact is already on your list" -msgstr "Denne kontakt er allerede på din liste" - -#: network/msnnotificationconnection.cpp:2267 -msgid "This contact is not on your list" -msgstr "Denne kontakt er ikke i din liste" - -#: network/msnnotificationconnection.cpp:2270 -msgid "This contact is not online" -msgstr "Kontakten er ikke online" - -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Din kontaktliste har for mange grupper" - -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "Denne gruppe kan ikke ændres" - -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "Denne gruppe er ikke tom" - -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "" -"Gruppenavnet bruges allerede i din Messenger eller Hotmail kontaktliste." - -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "Gruppenavnet er for langt" - -#: network/msnnotificationconnection.cpp:2300 -msgid "Switchboard server failed" -msgstr "Sammenkobleren fejlede" - -#: network/msnnotificationconnection.cpp:2303 -msgid "Transfer to switchboard server failed" -msgstr "Overførsel til sammenkobler-server fejlede" - -#: network/msnnotificationconnection.cpp:2306 -msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "Direkte forbindelse (MSNSLP) fejl, forbindelsen fejlede" - -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "Fejl ved hentning af kontaktlisten. Prøv igen senere. " - -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "Din konto er bandlyst" - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Du åbner sessioner for hurtigt" - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Du har for mange sessioner åbne" - -#: network/msnnotificationconnection.cpp:2341 -msgid "Bad friend name" -msgstr "Dårligt kaldenavn" - -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "Serveren siger at KMess sender for mange data." - -#: network/msnnotificationconnection.cpp:2359 -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:2362 -msgid "You have a kids passport, 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:2366 -msgid "Your passport needs to be verified first." -msgstr "Dit passport skal først bekræftes" - -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN fejl" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Der var en intern serverfejl" - -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "Serveren er optaget" - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" msgstr "Serveren er utilgængelig" -#: network/msnnotificationconnection.cpp:2419 -msgid "Peer notification server down" -msgstr "Medelelses-server nede" - -#: network/msnnotificationconnection.cpp:2423 -msgid "The server is going down" -msgstr "Serveren går ned" - -#: network/msnnotificationconnection.cpp:2426 -msgid "The server is going down soon" -msgstr "Serveren går snart ned" - -#: network/msnnotificationconnection.cpp:2430 -msgid "Write is blocking" -msgstr "Skrivning er blokeret" - -#: network/msnnotificationconnection.cpp:2433 -msgid "Session is overloaded" -msgstr "Session er overbelastet" - -#: network/msnnotificationconnection.cpp:2438 -msgid "The server is not available" -msgstr "Serveren er utilgængelig" - -#: network/msnnotificationconnection.cpp:2441 -msgid "Authentication failed" -msgstr "Godkendelse fejlede" - -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Modtager ikke flere overhoveder." - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess modtog en ukendt fejlbesked fra serveren: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Advarsel: Serveren lukker for vedligeholdelse om 1 minut!" - -#: network/msnnotificationconnection.cpp:2596 -msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "" -"MSN serveren har annonceret at den lukker ned for vedligeholdese om ét minut." - -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Advarsel: Serveren lukker for vedligeholdese om %1 minutter!" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "KMess kan ikke behandle Offline-IM beskeder.

Detaljer: %1" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" -"Autencitet fejlede. KMess kunne ikke logge dig på \n" -"\n" -"Detaljer: %1" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "KMess kunne ikke få tilgang til den eksterne webservice." - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Personen er offline eller usynlig." - -#: network/msnswitchboardconnection.cpp:1052 -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/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "Beskeden \"%1\" blev ikke modtaget!" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Kunne ikke forbinde: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:479 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "For mange videresendelser fra login-servicen" -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Forbindelsen fejlede" +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Serveren er utilgængelig" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" msgstr "I %1s chat: %2" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" msgstr "%1 siger:
'%2'" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" msgstr "%1 har sendt dig en offline besked: '%2'" -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" +#: notification/chatnotification.cpp:187 +#, fuzzy, kde-format +msgid "%1's chat requests attention!" msgstr "%1s chat beder om din opmærksomhed!" -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" msgstr "%1:
%2" -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" +#: notification/chatnotification.cpp:199 +#, fuzzy, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 har sendt dig en håndskrevet besked!" + +#: notification/chatnotification.cpp:203 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" msgstr "%1 har sendt dig et vink!" -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" +#: notification/chatnotification.cpp:207 +#, fuzzy, kde-format +msgid "%1 has sent you a wink!" msgstr "%1 har sendt dig et blink!" -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" +#: notification/chatnotification.cpp:213 +#, fuzzy, kde-format +msgid "%1 wants to use the webcam!" msgstr "%1 vil bruge webcam!" -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" +#: notification/chatnotification.cpp:214 +#, fuzzy, kde-format +msgid "%1 is sending you a file!" msgstr "%1 sender dig en fil!" -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" +#: notification/chatnotification.cpp:215 +#, fuzzy, kde-format +msgid "%1 has sent you an invitation!" msgstr "%1 har sendt dig en invitation!" -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" +#: notification/chatnotification.cpp:222 +#, fuzzy, kde-format +msgid "%1 has canceled the webcam session!" msgstr "Du har annulleret invitationen" -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" +#: notification/chatnotification.cpp:223 +#, fuzzy, kde-format +msgid "%1 has canceled the file transfer!" msgstr "%1 annullerede fil-overførslen!" -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" +#: notification/chatnotification.cpp:224 +#, fuzzy, kde-format +msgid "%1's activity has been canceled!" msgstr "%1s aktivitet er blevet annulleret!" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" +#: notification/chatnotification.cpp:231 +#, fuzzy, kde-format +msgid "%1 has accepted to use the webcam!" msgstr "%1 har accepteret at bruge webcam!" -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" +#: notification/chatnotification.cpp:232 +#, fuzzy, kde-format +msgid "%1 has accepted the file transfer!" msgstr "%1 har accepteret filoverførslen!" -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" +#: notification/chatnotification.cpp:233 +#, fuzzy, kde-format +msgid "%1 has accepted your invitation!" msgstr "%1 har accepteret din invitation!" -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" +#: notification/chatnotification.cpp:240 +#, fuzzy, kde-format +msgid "%1 has ended the webcam session!" msgstr "%1 har afsluttet webcamsessionen." -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" msgstr "Filoverførslen fra %1 er afsluttet!" -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" +#: notification/chatnotification.cpp:242 +#, fuzzy, kde-format +msgid "%1's activity has ended!" msgstr "%1s aktivitet er afsluttet!" -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" +#: notification/chatnotification.cpp:249 +#, fuzzy, kde-format +msgid "%1's webcam session has failed!" msgstr "%1s webcamsession fejlede!" -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" +#: notification/chatnotification.cpp:250 +#, fuzzy, kde-format +msgid "The file transfer with %1 has failed!" msgstr "Overførslen af %1 blev annulleret" -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" +#: notification/chatnotification.cpp:251 +#, fuzzy, kde-format +msgid "%1's activity has ended with an error!" msgstr "%1s aktivitet endte med en fejl!" -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 er gået" +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr "%1:
%2" -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" msgstr "%1 kommer snart tilbage" -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 har travlt" +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" +msgstr "%1:
%2" -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 er logget ud" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" msgstr "%1 er blevet usynlig" -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 gør ingenting" +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" +msgstr "%1:
%2" -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 er ude og spise frokost" +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" +msgstr "%1 er logget ud" -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" msgstr "%1 snakker i telefon" -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 er nu online" +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "%1 er ude og spise frokost" -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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'" -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "Send" +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Start et &Møde" -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "N&y linje" +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Personlig meddelelse" -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Sidebar" +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Send dig en besked" -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, no-c-format -msgid "The contact is listening to music" -msgstr "Kontakten lytter til musik" +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Djævel" -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Klik her for at vise denne kontakts profil." +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Send &E-post" -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Klik for at sende en e-post til denne kontakt." - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Skriv en genvej til dette humørikon" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Vælg en billedfil:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Tilføj kontaktperson" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format -msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -"%1\n" -"har tilføjet dig til sin kontaktliste. Vil du:" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Tilføj denne kontaktperson til din \"Venne\"liste" +#: 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." -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "Tilføj ikke denne kontakt, men lad vedkommende se din status" +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Lægger sig i systembakken" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "Blokere denne person fra at se din status og kontakte dig." +#: notification/systemtraywidget.cpp:240 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" -msgstr "&Ryd op" +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 (%2/%3)" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Indtast din login information" +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Gennemse..." -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "E-postadresse" +#: settings/accountpage.cpp:81 +#, fuzzy +msgid "Browse and Crop Picture..." +msgstr "gennemse og beskær billede..." -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Kodeord" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Login-status" +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Profilbillede:" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "Husk denne profil" +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "Downloading af profilbillede fejlede" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Forbind" +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"En fejl opstod da du prøvede at ændre profilbilledet.\n" +"Undersøg om det er en korrekt billed fil." -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Indtast din personlige besked her" +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Indstillinger" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Lytter til %1" +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Konti" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess bekendtgørelse" +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Min Konto" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Kontakter" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Samtale" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Chat-log" + +#: 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, kde-format +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:214 +#, fuzzy, kde-format +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:294 +msgid "Are you sure you want to delete this account?" +msgstr "Er du sikker på du vil fjerne denne konto?" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"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:371 +msgid "Hi, how are you doing? :)" +msgstr "Hej, hvordan går det? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Stacy" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Fint!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Jeg er /lige/ kommet tilbage fra min ferie i Italien!" + +#: 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/emoticonspage.cpp:233 +#, fuzzy, kde-format +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:58 settings/globalsettingsdialog.cpp:59 +#, fuzzy msgid "Accounts" msgstr "Konti" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Dit kaldenavn:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "E-postnotifikation" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +msgid "Select Files Directory" +msgstr "Gem chat-filer i denne ovenstående folder:" + +#: 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "Vis humørikoner" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, fuzzy, kde-format +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:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kontakter" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the 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 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "Send" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chat" + +#. 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: file: chat/contactswidget.ui:107 +#. 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: 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: 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:273 +#, fuzzy +msgid "Email address:" +msgstr "E-postadresse:" + +#. 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: 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: 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: 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: 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Chat-log" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Start eller Stop en &Samtale" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +msgstr "Bil" + +#. 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 the following groups of your contact list:" +msgstr "Tilføj denne kontaktperson til din \"Venne\"liste" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "Tilføj ikke denne kontakt, men lad vedkommende se din status" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" +msgstr "Blokere denne person fra at se din status og kontakte dig." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "Fjern" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "Gruppe" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Brug et alternativt navn til denne person" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Vis bekendtgørelser når dine kontakter:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "Lyd:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Profilbillede:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, 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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Profilbillede:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +#, fuzzy +msgid "&Clear Cache" +msgstr "Stryg faneblad" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "Fjern" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "T&illad kontaktperson" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "Denne kontakt er ikke i din liste" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "Indtast e-postadressen til den person du vil tilføje her:" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "%1 kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, 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:198 +#, fuzzy +msgid "Format" +msgstr "Ged" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "Kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +#, fuzzy +msgid "Select All" +msgstr "Markér &Alt" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +#, fuzzy +msgid "Deselect All" +msgstr "Markér &Alt" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "Forvirret" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +#, fuzzy +msgid "Command to Current Tab" +msgstr "Luk faneblad" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +#, fuzzy +msgid "Standard" +msgstr "Stjerne" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +#, fuzzy +msgid "Send" +msgstr "Send" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Åben" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Annuler" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "&Ryd op" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "Forvirret" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +#, fuzzy +msgid "Password:" +msgstr "Kodeord" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +#, fuzzy +msgid "Status at login:" +msgstr "Login-status" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +#, fuzzy +msgid "If enabled, KMess will save your account" +msgstr "Hvis valgt, logger KMess automatisk på denne konto." + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "Husk denne profil" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +#, fuzzy +msgid "R&emember password" +msgstr "Husk Kodeord" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "Ny &Konto" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +#, 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:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Forbind" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +#, fuzzy +msgctxt "@title:menu" +msgid "&View" +msgstr "Se" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Handlinger" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, fuzzy +msgid "Form" +msgstr "Ged" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Konti" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +#, fuzzy +msgid "Your Account Information" +msgstr " Konto indstillinger " + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." msgstr "Indtast det navn som andre kontakter skal se når du er online." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Din e-postadresse:" +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +#, fuzzy +msgid "&Friendly name:" +msgstr "Kaldenavn" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +#, 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: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Dit kodeord:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +#, fuzzy +msgid "&Email address:" +msgstr "E-postadresse:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -2274,40 +5162,43 @@ msgstr "" "Indtast dit kodeord til din MSN-Passport konto. Du kan registrere en ny " "konto på http://register.passport.com" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Profilbillede:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +#, fuzzy +msgid "&Password:" +msgstr "Kodeord" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "Husk Kodeord" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." msgstr "S&kift" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Vis ikke et &profilbillede" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Husk denne kontos indstillinger" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" "Indstillingen \"Husk denne kontos indstillinger\" var ikke slået til da du " "loggede ind, så dine indstillinger vil ikke blive gemt permanent. Slå denne " @@ -2316,228 +5207,663 @@ 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: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Log ind med denne konto når programmet startes" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +#, fuzzy +msgid "Re&member the settings of this account" +msgstr "Husk denne kontos indstillinger" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "Hvis valgt, logger KMess automatisk på denne konto." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Sæt status ved login:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Log ind med denne konto når programmet startes" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +#, fuzzy +msgid "Login &as" +msgstr "Før log over alle samtaler" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot 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/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 +msgid "Request verification email" +msgstr "Bed om bekræftigelses-e-post" + +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 +msgid "Go to accountservices.passport.net" +msgstr "Gå til accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, fuzzy 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 a Passport account to connect to the Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail 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: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format -msgid "Request verification email" -msgstr "Bed om bekræftigelses-e-post" - -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format -msgid "https://accountservices.passport.net/" -msgstr "https://accountservices.passport.net/" - -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format -msgid "Go to accountservices.passport.net" -msgstr "Gå til accountservices.passport.net" - -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"To connect to the Live 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: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" msgstr "Registrer ny konto" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "Gå til register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Advarsler" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "Login-status" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Pop-op bekendtgørelser" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, 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:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" +"Kontrollerer antallet af minutter inden KMess ændrer din status til " +"\"Fraværende\"" + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Bliv fraværende efter" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "minutter" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" msgstr "Vis bekendtgørelser når dine kontakter:" -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "Går Online" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +#, fuzzy +msgid "Saved accounts:" +msgstr "Ny &Konto" -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -"Hvis valgt bliver en pop-op besked også vist når dine kontakter forbinder " -"til MSN." -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Start en chat med dig" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "Konti" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "Rediger" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +#, 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:500 +#, fuzzy +msgid "&Remove" +msgstr "Fjern" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" msgstr "" -"Hvis valgt bliver en pop-up besked også vist når dine kontakter går offline" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "Send dig en besked" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " msgstr "" -"Hvis valgt bliver en pop-op besked vist når dine kontakter sender dig en " -"besked." -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Skift deres status" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "Chat-log" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" msgstr "" -"Hvis valgt bliver en pop-op besked også vist når dine kontakter skifter " -"deres MSN status" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "Går offline" +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Gem chat til en &Fil" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" msgstr "" -"Hvis valgt bliver en hop-op besked også vist når dine kontakter går offline" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Vis bekendtgørelser når du modtager en e-post" +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Gem chat til en &Fil" -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Skjul hop-op'er efter" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Kontrollerer antallet af sekunder inden hop-op'er skjules" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "sekunder" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "Ryst chatvinduet når et vink modtages eller sendes" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 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. " +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Gem chat" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +#, 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:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "År" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +#, 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:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +#, 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:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Gem alle samtaler i den overliggende mappe" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "Vælg mappen på computeren hvor du vil gemme dine chat-logs" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following 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:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +#, fuzzy +msgid "&Chat style:" +msgstr "Chat-stil:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +#, fuzzy +msgid "Chat Settings" +msgstr "Indstillinger" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +#, fuzzy +msgid "&Show emoticons" +msgstr "Vis humørikoner" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "Vis humørikoner" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, 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:648 +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:654 +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:657 +#, 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:663 +#, fuzzy +msgid "Show &date" +msgstr "Kontakter" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "Vis humørikoner" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +#, fuzzy +msgid "&Text" +msgstr "Kopier %tekst" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +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: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +#, fuzzy +msgid "Your &message font:" +msgstr "Din meddelelses-skrifttype:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "Lader dig selv dikterer hvordan dine kontakters beskeder skal se ud." + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, 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:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Stryg faneblad" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +#, 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:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" @@ -2547,438 +5873,995 @@ 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: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Fortæl mine kontakter hvilken sang jeg lytter til." +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Ryst chatvinduet når et vink modtages eller sendes" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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 "" -"Hvis valgt informerer KMess dine kontakter om hvad du lytter til. Denne " -"information hentes fra det musikprogram du kører." -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Skift status til \"Væk - fraværende\" når du er inaktiv" +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Vis ikke et &profilbillede" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Din kontaktliste har for mange grupper" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +#, fuzzy +msgid "Always" +msgstr "Væk" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Din kontaktliste har for mange grupper" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +#, fuzzy +msgid "Never" +msgstr "Nørd" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Profilbillede:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -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/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Bliv fraværende efter" - -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -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/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "minutter" - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Chat-log" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "Før log over alle samtaler" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Gem chat-filer i denne ovenstående folder:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format -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/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organiser chat-mapper efter:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "År" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Måned" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Dag" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Gem alle samtaler i den overliggende mappe" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Din meddelelses-skrifttype:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Tving andre kontakters meddelelser til at bruge denne skrifttype:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Chat-stil:" - -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -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/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Vis &grafik i chat-beskeder" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Tilllad humørikoner i chat-samtaler" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Vis tid i chat-beskeder" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Lader et tidstempel stå i hver chatbesked." - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "Brug skriftype effekter som *fed*, /kursiv/ og _understregning_" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "&Gruppering af sammenhængende beskeder fra den samme kontakt" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Postklient" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" -"Lader dig vælge hvilken postklient KMess skal åbne for at vise din " -"postbeskeder." - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Brug Hotmail" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Brug en særlig kommando:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "E-postnotifikation" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Vis e-postinformation" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail 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: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Vis en notifikation når e-post er modtaget i \"andre foldere\"" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" 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." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +#, fuzzy +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." +msgstr "" +"Hvis valgt informerer KMess dine kontakter om hvad du lytter til. Denne " +"information hentes fra det musikprogram du kører." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +#, fuzzy +msgid "Show contacts w&hich song I am listening to" +msgstr "Fortæl mine kontakter hvilken sang jeg lytter til." + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" msgstr "&Humørikon-temaer" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Tilgængelige humørikon-stile" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" msgstr "Specielle humørikoner" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Specielle humørikoner for denne konto" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Tilgængelige humørikon-stile" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +#, fuzzy +msgid "Click here to add a new custom emoticon" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, fuzzy +msgid "Add Ne&w..." msgstr "Tilføj &ny" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Klik" +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +#, fuzzy +msgid "Click here to rename the selected emoticon" +msgstr "Klik her for at omdøbe det valgte humørikon" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 msgid "Re&name" msgstr "O&mdøb" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +#, fuzzy +msgid "Click here to delete the selected emoticon" msgstr "Klik her for at omdøbe det valgte humørikon" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" msgstr "&Fjern" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Vælg et humørikon og klik her for at slette det." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +#, fuzzy +msgid "Web Browser" +msgstr "Vissen rose" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "siger:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "gennemse og beskær billede..." - -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Profilbillede:" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Downloading af profilbillede fejlede" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -"En fejl opstod da du prøvede at ændre profilbilledet.\n" -"Undersøg om det er en korrekt billed fil." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Indstillinger" - -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Konti" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Samtale" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Er du sikker på du vil fjerne denne konto?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Hej, hvordan går det? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Stacy" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Fint!" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Jeg er /lige/ kommet tilbage fra min ferie i Italien!" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" 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:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Lægger sig i systembakken" +#. 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:814 rc.cpp:849 +msgid "Select this option to choose from a list of installed browsers." +msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:817 +msgid "&Use an installed browser:" +msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. 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:820 rc.cpp:855 +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:823 rc.cpp:858 +#, fuzzy +msgid "&Specify a custom command:" +msgstr "&Automatisk Væk-besked" + +#. 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:827 rc.cpp:862 +#, 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:831 +#, 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:834 +#, fuzzy +msgid "Email Client" +msgstr "Postklient" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +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:843 +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:846 +msgid "Use the &KDE default email client" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +msgid "&Save all received files in one directory:" +msgstr "Gem chat-filer i denne ovenstående folder:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +#, fuzzy +msgid "and" +msgstr "Ked af det" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "Filoverførsler" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "Dit navn" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "Din konto er bandlyst" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Vis tid i chat-beskeder" + +#, fuzzy +#~ 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" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Specielle humørikoner for denne konto" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Tilføj dette &Humørikon" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Profilbillede:" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "Søg efter Kontaktperson" + +#~ msgid "Search by &Interest" +#~ msgstr "Søg på &Interesser" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Din e-postadresse:" + +#~ 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," + +#~ 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" + +#, 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 "" +#~ "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 "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." + +#~ msgid "Picture:" +#~ msgstr "Billede:" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "" +#~ "Lader dig vælge hvilken postklient KMess skal åbne for at vise din " +#~ "postbeskeder." + +#~ msgid "Use a specified command:" +#~ msgstr "Brug en særlig kommando:" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "Denne konto har ikke en Hotmail indbakke!" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "E-post: %1" + +#~ msgid "Remove group" +#~ msgstr "&Fjern gruppe" + +#~ msgid "Show &Display Pictures" +#~ msgstr "Vis &Profilbilleder" + +#~ msgid "Show &Tool bar" +#~ msgstr "Vis Værktøjslinje" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "Du har et nyt brev i din indbakke" + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "Du har %1 nye breve i din indbakke" + +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen" + +#~ msgid "Sidebar" +#~ msgstr "Sidebar" + +#~ msgid "New contact's group" +#~ msgstr "Gruppe til ny kontaktperson" + +#~ msgid "Enter your login information:" +#~ msgstr "Indtast din login information" + +#~ msgid "Your friendly name:" +#~ msgstr "Dit kaldenavn:" + +#~ msgid "Your password:" +#~ msgstr "Dit kodeord:" + +#~ msgid "Status to set at login:" +#~ msgstr "Sæt status ved login:" + +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Vis bekendtgørelser når du modtager en e-post" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Organiser chat-mapper efter:" + +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Vis &grafik i chat-beskeder" + +#~ msgid "Use Hotmail" +#~ msgstr "Brug Hotmail" + +#~ msgid "says:" +#~ msgstr "siger:" + +#~ msgid "Current name: " +#~ msgstr "Nuværende navn: " + +#~ 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 kunne ikke forbinde til MSN Messenger service.\n" +#~ "Undersøg om du er forbundet til internettet.\n" +#~ "Grund: %1" + +#~ msgid "The remote server has closed the connection." +#~ msgstr "Den eksterne server har tabt forbindelsen" + +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Vis MSN Messenger Service status?" + +#~ msgid "Received user confirmation" +#~ msgstr "Modtaget brugergodkendelse" + +#~ msgid "Transfer to notification server" +#~ msgstr "Overfører til notifikations-server" + +#~ msgid "The server is too busy" +#~ msgstr "Serveren er optaget" + +#~ msgid "The server is unavailable" +#~ msgstr "Serveren er utilgængelig" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "KMess modtog en ukendt fejlbesked fra serveren: %1" + +#~ msgid "Warning: Server closes for maintenance in 1 minute!" +#~ msgstr "Advarsel: Serveren lukker for vedligeholdelse om 1 minut!" diff --git a/po/de.po b/po/de.po index 903912b..a443f95 100644 --- a/po/de.po +++ b/po/de.po @@ -3,3065 +3,6559 @@ # # 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: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2008-01-07 19:16+0100\n" -"Last-Translator: Jan Tönjes \n" -"Language-Team: \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-05-09 18:36+0200\n" +"PO-Revision-Date: 2009-05-09 20:12+0200\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" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Jan Tönjes" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "jan.toenjes@web.de" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 account.cpp:744 +msgid "I am away from my computer" msgstr "Ich bin nicht an meinem Computer" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Ihr Name" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:217 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "sie@hotmail.de" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Verbinde ..." - -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "%1 sendet eine Animoticon: %2" - -#: chat/chatmessagestyle.cpp:296 -msgid "%1 says:" -msgstr "%1 sagt:" - -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 -msgid "Add this emoticon: %1" -msgstr "Dieses Emoticon hinzufügen: %1" - -#: chat/chatview.cpp:463 +#: accountsmanager.cpp:559 +#, kde-format msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." msgstr "" -"Konnte Chatlog nicht speichern. Bitte stellen Sie sicher, dass sie " -"Schreibrechte für den Ordner haben in dem die Chats gespeichert werden." +"Es ist ein unsicher 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/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Sichere Passwortspeicherung" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importieren" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Löschen" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Behalten" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" msgid "" -"The file '%1' already exists.\n" -"do you want to overwrite it?" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." msgstr "" -"Die Datei '%1' existiert bereits.\n" -" Möchten Sie die Datei überschreiben?" +"Sie können keine Einladungen versenden, wenn mehrere Kontakte in einem Chat " +"sind. Bitte beginnen Sie einen eigenen Chat mit dem Kontakt, der die " +"Einladung erhalten soll." -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 -msgid "Overwrite File" -msgstr "Überschreibe Datei" - -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 -msgid "Over&write" -msgstr "Über&schreiben" - -#: chat/chatview.cpp:919 -msgid "Add this &Emoticon..." -msgstr "&Emoticon hinzufügen..." - -#: chat/chatview.cpp:924 -msgid "Send &Email" -msgstr "Email &senden" - -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "E&mail kopieren" - -#: chat/chatview.cpp:931 -msgid "Visit &Link" -msgstr "Link &Öffnen" - -#: chat/chatview.cpp:933 -msgid "Copy &Address" -msgstr "&Adresse kopieren" - -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "Text &kopieren" - -#: chat/chatview.cpp:947 -msgid "Select &All" -msgstr "&Alles markieren" - -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "Chat in &Datei speichern" - -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Chat" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" -"Sie können diese Einladung nicht starten, da mehrere Kontakte in diesem Chat " -"sind." - -#: chat/chatwindow.cpp:260 +#: chat/chat.cpp:135, kde-format msgid "%1 has joined the chat." msgstr "%1 ist dem Chat beigetreten." -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "Die Unterhaltung wurde Idle, %1 hat den Chat verlassen" +#: chat/chat.cpp:188, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "Der Chat ist inaktiv geworden, %1 hat ihn verlassen." -#: chat/chatwindow.cpp:315 +#: chat/chat.cpp:194, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 hat den Chat verlassen." -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Chat" +#: chat/chat.cpp:356 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 und %2" -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 und %2 - Chat" +#: chat/chat.cpp:364 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 und andere" -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 und andere - Chat" +#: chat/chat.cpp:660 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Diese Nachricht wurde automatisch versendet)" -#: chat/chatwindow.cpp:737 +#: chat/chat.cpp:826 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" +"KMess kann das Chat-Protokoll für diesen Chat nicht speichern:
Das Verzeichnis in dem die Chat-Protokolle gespeichert werden, "%" +"1", existiert nicht." + +#: chat/chat.cpp:946 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Sie haben ein Animoticon gesendet!" + +#: chat/chat.cpp:951, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Sie haben das "%1"-Animoticon gesendet!" + +#: chat/chat.cpp:984 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" +"Der Chat ist deaktiviert worden, da Sie nicht mehr mit dem Live-Messenger-" +"Server verbunden sind." + +#: chat/chat.cpp:1141 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Es ist ein Verbindungsproblem eingetreten." + +#: chat/chat.cpp:1151 +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 "" +"Ihre letzte Nachricht beinhaltet zu viele verschiedene Emoticons. Es " +"werden nur die ersten Sieben gesendet." + +#: chat/chat.cpp:1164, kde-format +#, 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." +msgstr "" +"%1 hat Ihnen eine Sprachaufzeichnung gesendet, jedoch unterstützt " +"KMess Sprachaufzeichnungen noch nicht." + +#: chat/chat.cpp:1178, kde-format +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 Aktionsnachricht gesendet, jedoch unterstützt KMess " +"Aktionsnachrichten noch nicht." + +#: chat/chat.cpp:1193 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support yet." +msgstr "" +"%1 hat Ihnen eine Live Messenger feature gesendet, das KMess noch " +"nicht unterstützt." + +#: chat/chat.cpp:1219, kde-format +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. You can " +"re-enable it in the account settings." +msgstr "" +"Sie haben ein Animoticon von %1 erhalten, jedoch ist die Anzeige von " +"Animoticons deaktiviert worden. Sie können es in denZugangseinstellungenerneut aktivieren." + +#: chat/chat.cpp:1229, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has been " +"disabled. You can re-enable it in the account settings." +msgstr "" +"Sie haben das "%2"-Animoticon von %1 erhalten, jedoch ist " +"die Anzeige von Animoticons deaktiviert worden. Sie können es in denZugangseinstellungenerneut aktivieren." + +#: chat/chat.cpp:1259, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 hat Ihnen ein Animoticon gesendet!" + +#: chat/chat.cpp:1266, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 hat Ihnen ein Animoticon gesendet: "%2"!" + +#: chat/chat.cpp:1288, kde-format +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." +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:1297, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be displayed. " +"Make sure you have the "cabextract" program installed." +msgstr "" +"Sie haben das "%2"-Animoticon von %1 erhalten, jedoch kann " +"es nicht angezeigt werden. Bitte stellen Sie sicher, dass "" +"cabextract" installiert ist." + +#: chat/chat.cpp:1309, kde-format +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. Extracting the " +"wink package with "cabextract" has failed." +msgstr "" +"Sie haben ein Animoticon von %1 erhalten, jedoch kann es nicht " +"angezeigt werden. Das Entpacken des Animoticonpakets mit "" +"cabextract" ist fehlgeschlagen." + +#: chat/chat.cpp:1318, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be displayed. " +"Extracting the wink package with "cabextract" has failed." +msgstr "" +"Sie haben das "%2"-Animoticon von %1 erhalten, jedoch kann " +"es nicht angezeigt werden. Das Entpacken des Animoticonpakets mit "" +"cabextract" ist fehlgeschlagen." + +#: chat/chat.cpp:1330, kde-format +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:1339, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be displayed. " +"The data could not be read." +msgstr "" +"Sie haben das "%2"-Animoticon von %1 erhalten, jedoch kann " +"es nicht angezeigt werden. Die Daten können nicht gelesen werden." + +#: chat/chat.cpp:1381, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next time " +"he or she logs in." +msgstr "" +"%1 hat sich abgemeldet. Jede Nachricht die Sie jetzt senden, wird der " +"Kontakt bei der nächsten Anmeldung erhalten." + +#: chat/chat.cpp:1386, kde-format +msgid "%1 has gone offline." +msgstr "%1 hat sich abgemeldet." + +#: chat/chat.cpp:1396, kde-format +msgid "%1 has changed his or her status to "%2"." +msgstr "%1 hat seinen/ihren Status auf "%2" gesetzt." + +#: chat/chat.cpp:1427, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 hat Ihnen ein „Rrring!“ gesendet!" + +#: chat/chat.cpp:1460 +#, 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:1473, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Das Senden des „Rrring!“ an %1 ist fehlgeschlagen." + +#: chat/chat.cpp:1478, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "Das Senden des Animoticons an %1 ist fehlgeschlagen." + +#: chat/chat.cpp:1488, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "Das Senden, der handgeschriebenen Nachricht, an %1 ist fehlgeschlagen." + +#: chat/chat.cpp:1503, kde-format +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 "Das Senden der Nachricht an %2 ist fehlgeschlagen:
%1" + +#: chat/chat.cpp:1586, kde-format +#, fuzzy +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "" +"Die Datei "%1" kann weder auf dem Computer gefunden, noch " +"heruntergeladen werden." + +#: chat/chat.cpp:1623 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Sie haben %1 ein „Rrring!“ gesendet!" + +#: chat/chat.cpp:1629 +msgid "You have sent a nudge!" +msgstr "Sie haben ein „Rrring!“ gesendet!" + +#: chat/chat.cpp:1695, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 ist zur Zeit nicht angemeldet. Jede Nachricht die Sie jetzt senden, " +"wird der Kontakt bei der nächsten Anmeldung erhalten." + +#: chat/chatmaster.cpp:1387 +#, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 sendet ein Animoticon: "%2"" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format +msgid "%1 says:" +msgstr "%1 sagt:" + +#: chat/chatmessageview.cpp:322 +#, kde-format +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 mit „%1“
Begonnen am: %2" + +#: chat/chatmessageview.cpp:366 +#, kde-format +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 begonnen am: %2" + +#: chat/chatmessageview.cpp:406 +#, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Protokollierte KMess-Chats mit %1" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:657 +#, kde-format +msgid "Add this emoticon: %1" +msgstr "Dieses Emoticon hinzufügen: %1" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Wiederverbinden" + +#: chat/chatview.cpp:306 +#, kde-format +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 "" +"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:445 +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:464 +#, kde-format +msgid "" +"The file '%1' already exists.\n" +"Do you want to overwrite it?" +msgstr "" +"Die Datei „%1“ existiert bereits.\n" +"Wollen Sie sie überschreiben?" + +#: chat/chatview.cpp:465 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "Datei überschreiben" + +#: chat/chatview.cpp:466 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "Überschreiben" + +#: chat/chatview.cpp:831 +msgid "Add this &Emoticon..." +msgstr "Dieses &Emoticon hinzufügen ..." + +#: chat/chatview.cpp:834 +msgid "Hide this &Emoticon" +msgstr "Dieses &Emoticon ausblenden" + +#: chat/chatview.cpp:840 +msgid "Send &Email" +msgstr "&E-Mail senden" + +#: chat/chatview.cpp:844 +msgid "Add &Contact" +msgstr "Kont&akt hinzufügen" + +#: chat/chatview.cpp:848 +msgid "Copy E&mail Address" +msgstr "E-&Mail-Adresse kopieren" + +#: chat/chatview.cpp:854 +msgid "Visit &Link" +msgstr "Verknüpfung öffnen" + +#: chat/chatview.cpp:858 +msgid "Copy &Address" +msgstr "Verknüpfungs&adresse kopieren" + +#: chat/chatview.cpp:874 +msgid "&Copy Text" +msgstr "&Text kopieren" + +#: chat/chatview.cpp:875 +msgid "Select &All" +msgstr "&Alles markieren" + +#: chat/chatview.cpp:876 +msgid "Find &Text..." +msgstr "&Text suchen ..." + +#: chat/chatview.cpp:877 chat/chatwindow.cpp:503 +#, fuzzy +msgid "C&lear Chat" +msgstr "Unterfenster &leeren" + +#: chat/chatview.cpp:878 +msgid "Save Chat to &File..." +msgstr "Chat als Datei speichern ..." + +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Kontakte" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticons" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" -msgstr "Meine Emoticons" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Eigene Emoticons" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Diese Nachricht wurde automatisch verschickt)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 +#, fuzzy msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"There are multiple tabs open 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 "" -"Das Animoticon konnte nicht angezeigt werden. Bitte stellen Sie sicher das " -"'cabextract' installiert ist." +"Es sind mehrere Unterfenster in diesem Chat-Fenster geöffnet. Wollen " +"Sie nur das aktuelle oder alle Unterfenster schließen?

Hinweis: Um alle Unterfenster auf einmal zu schließen, drücken Sie Alt" +"+F4." -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" -"Das Animoticon konnte nicht angezeigt werden. Fehler beim Lesen der Daten." +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Unterfenster schließen" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "Sie haben ein Animoticon von %1 empfangen" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "Alle Unterfenster schließen" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "Die Nachricht '%1' konnte nicht gesendet werden." +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Aktuelles Unterfenster schließen" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "Sie haben einen Rrrring von %1 empfangen." +#: chat/chatwindow.cpp:418 +msgid "&Invite..." +msgstr "E&inladen ..." -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Sie haben ein Rrrring zu %1 gesendet." +#: chat/chatwindow.cpp:419 +msgid "Send a &File..." +msgstr "Eine &Datei senden ..." -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Sie haben einen Rrrring gesendet!" +#: chat/chatwindow.cpp:420 +msgid "Webcam Chat" +msgstr "Webcam-Chat" -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 gibt eine Nachricht ein." - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 und %2 schreiben" - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 und %3 andere schreiben." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Datei &Senden" - -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:421 msgid "Start a &Meeting" -msgstr "&Meeting starten" +msgstr "Eine Konferenz starten" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:422 msgid "Send a &Nudge!" -msgstr "&Rrrring senden!" +msgstr "Ein „Rrri&ng!“ senden" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Starten oder Stoppen einer &Unterhaltung" +#: chat/chatwindow.cpp:423 +msgid "Save Chat..." +msgstr "Chat speichern ..." -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Chat speichern" +#: chat/chatwindow.cpp:424 +msgid "Close &All Tabs" +msgstr "&Alle Unterfenster schließen" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Einladen" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Chat" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:429 msgid "Change &Font" -msgstr "Schrift&art ändern" +msgstr "Schri&ftart ändern" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:430 msgid "Change Font &Color" -msgstr "Schrift&farbe ändern" +msgstr "S&chriftfarbe ändern" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Ein Emoticon einfügen" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:437 msgid "Show &Emoticons" msgstr "&Emoticons anzeigen" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Zeige/Verstecke die &Kontakt Sidebar" +#: chat/chatwindow.cpp:438 +msgid "Show S&tatus Messages" +msgstr "" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Zeige oder Verstecke die Kontakt Sidebar" +#: chat/chatwindow.cpp:444 +msgid "&Panels" +msgstr "&Seitenleisten








" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "Email &senden" +#: chat/chatwindow.cpp:447 +msgid "Use &Spell Checking" +msgstr "Recht&schreibprüfung" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:451 +msgid "Meeting" +msgstr "Konferenz" + +#: chat/chatwindow.cpp:452 +msgid "Nudge" +msgstr "„Rrring!“" + +#: chat/chatwindow.cpp:453 +msgid "Send a &File" +msgstr "Datei senden" + +#: chat/chatwindow.cpp:456 chat/chatwindow.cpp:457 +msgid "P&revious Tab" +msgstr "Vo&rheriges Unterfenster" + +#: chat/chatwindow.cpp:458 chat/chatwindow.cpp:459 +msgid "Ne&xt Tab" +msgstr "Nächst&es Unterfenster" + +#: chat/chatwindow.cpp:474 +msgid "Enable or disable the contacts panel" +msgstr "Die Kontaktleiste ein-/ausblenden" + +#: chat/chatwindow.cpp:475 chat/chatwindow.cpp:476 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakte" + +#: chat/chatwindow.cpp:480 +msgid "Enable or disable the standard emoticons panel" +msgstr "Die Emoticonsleiste ein-/ausblenden" + +#: chat/chatwindow.cpp:481 chat/chatwindow.cpp:482 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticons" + +#: chat/chatwindow.cpp:486 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Die Leiste der eigenen Emoticons ein-/ausblenden" + +#: chat/chatwindow.cpp:487 chat/chatwindow.cpp:488 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Meine Emoticons" + +#: chat/chatwindow.cpp:500 +msgid "&Font" +msgstr "&Schriftart" + +#: chat/chatwindow.cpp:501 +msgid "Font &Color" +msgstr "Schrift&farbe" + +#: chat/chatwindow.cpp:502 +msgid "C&lear Chat Window" +msgstr "Chatfenster &leeren " + +#: chat/chatwindow.cpp:570 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Eine Unterhaltung beginnen oder beenden" + +#: chat/chatwindow.cpp:993 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" +"Die Syntax des „/status“-Befehls, den Sie eingegeben haben, ist " +"falsch. Die korrekte Syntax lautet: /status online|away|idle|brb|busy|" +"lunch|phone|invisible.
Sie können auch Kurzbefehle wie /online oder /phone benutzen." + +#: chat/chatwindow.cpp:996 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Fehlerhafte „/status“-Syntax" + +#: chat/chatwindow.cpp:1059 +msgid "You cannot use the /block command in a group chat." +msgstr "" +"Es ist nicht möglich, während einem Gruppen-Chat, den „/block“-Befehl " +"zu verwenden." + +#: chat/chatwindow.cpp:1061 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "„/block“-Befehl nicht verwendbar" + +#: chat/chatwindow.cpp:1072 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" +"Es ist nicht möglich, während einem Gruppen-Chat, den „/unblock“-" +"Befehl zu verwenden." + +#: chat/chatwindow.cpp:1074 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "„/unblock“-Befehl nicht verwendbar" + +#: chat/chatwindow.cpp:1104 +#, kde-format +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:1107 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Unbekannter Befehl" + +#: chat/chatwindow.cpp:1574 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Chat" + +#: chat/chatwindow.cpp:1578 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Chat" + +#: chat/chatwindow.cpp:1598 kmessinterface.cpp:674 +#, kde-format +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/chatwindow.cpp:1602 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Menüleiste ausblenden" + +#: chat/chatwindow.cpp:1855 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 tippt gerade..." + +#: chat/chatwindow.cpp:1865 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 und %2 tippen gerade..." + +#: chat/chatwindow.cpp:1869 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 und %3 andere tippen gerade..." + +#: chat/chatwindow.cpp:2320 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

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

Chat-Informationen

Kontakte:
  • %" +"1
Chat-Beginn:
%2
Angemeldet als:" +"
%3
" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: chat/chatwindow.cpp:2486 rc.cpp:9 +msgid "Handwriting mode" +msgstr "Handschrift-Modus" + +#: chat/chatwindow.cpp:2495 +msgctxt "Label text" +msgid "" +"Handwriting is disabled: KMess cannot send drawings to some of the contacts." +msgstr "" + +#: chat/chatwindow.cpp:2501 +#, fuzzy +msgctxt "Label text" +msgid "Handwriting is disabled: KMess cannot send drawings to this contact." +msgstr "" +"Animoticons sind deaktiviert: KMess kann zu manchen Kontakten keine " +"Animoticons senden." + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: chat/chatwindow.cpp:2509 rc.cpp:27 +msgid "Winks" +msgstr "Animoticons" + +#: chat/chatwindow.cpp:2518 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to some of the contacts." +msgstr "" +"Animoticons sind deaktiviert: KMess kann zu manchen Kontakten keine " +"Animoticons senden." + +#: chat/chatwindow.cpp:2524 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to this contact." +msgstr "" +"Animoticons sind deaktiviert: KMess kann zu diesem Kontakt keine Animoticons " +"senden." + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "Privaten Chat beginnen" + +#: chat/contactframe.cpp:298 kmessview.cpp:609 +msgid "&Send Email" +msgstr "E-Mail &senden" + +#: chat/contactframe.cpp:299 kmessview.cpp:610 msgid "&View Profile" msgstr "&Profil anzeigen" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:612 +msgid "&Properties" +msgstr "&Eigenschaften" + +#: chat/contactframe.cpp:303 kmessview.cpp:614 msgid "&Add Contact" msgstr "&Kontakt hinzufügen" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:615 msgid "A&llow Contact" -msgstr "Kontakt &erlauben" +msgstr "Kontakt er&lauben" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:618 msgid "&Delete Contact" -msgstr "Kontakt &löschen" +msgstr "Kontakt löschen" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:616 msgid "&Block Contact" msgstr "Kontakt &blockieren" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:617 msgid "&Unblock Contact" -msgstr "Blockierung &wieder aufheben" +msgstr "Blockier&ung aufheben" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:621 msgid "&Friendly Name" -msgstr "&Nickname" +msgstr "&Spitzname" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:622 msgid "&Personal Message" -msgstr "&Eigene Nachricht" +msgstr "&Statusnachricht" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:623 msgid "&Email Address" -msgstr "&Emailadresse" +msgstr "&E-Mail-Adresse" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "&Kopieren..." +#: chat/contactframe.cpp:313 kmessview.cpp:624 +msgid "Song &Name" +msgstr "Musiktitelname" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:124 +msgid "&Information" +msgstr "&Informationen" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "Anzeigebilder" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:157 +msgid "&Notes" +msgstr "&Notizen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:160 +msgid "&Emoticons" +msgstr "&Emoticons" + +#: chat/contactframe.cpp:347 kmessview.cpp:659 +msgid "&Copy" +msgstr "&Kopieren" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Geblockt" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Abwesend" +#: chat/contactframe.cpp:765 +#, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Der Kontakt ist %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Bin gleich zurück" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not 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/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Beschäftigt" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Zum Chat hinzufügen" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Offline" +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Neues hinzufügen" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Abwesend - Idle" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Bearbeiten" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Mittagessen" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Entfernen" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

Sie haben noch keine Animoticons.

Um neue " +"hinzuzufügen, lassen Sie sich von Ihren Kontakten welche senden.

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 kompatibel" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 kompatibel" + +#: contact/contactbase.cpp:354 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 kompatibel" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Beschäftigt" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Abwesend" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Abwesend (mit Abwesenheitsnachricht)" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inaktiv" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Bin gleich zurück" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Am Telefon" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "Dieser Kontakt ist nicht Online" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Beim Mittagessen" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "chat-style-text" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Unsichtbar" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Dieser Account hat keinen Hotmail Posteingang." +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Offline" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "Kontakt hinzufügen" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Mein Status" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "" -"Geben Sie die Emailadresse der Person ein, die hinzugefügt werden soll." +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Verbindung trennen" -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "Die eingegebene Emailadresse ist ungültig!" +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Einen Kontakt hinzufügen" -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Neues Emoticon hinzufügen" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -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:130 +msgid "Edit Emoticon" +msgstr "Emoticon bearbeiten" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Geben Sie eine Abwesenheitsnachricht ein" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +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:37 +msgid "Automatic Away Message" +msgstr "Automatische Abwesenheitsnachricht" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Chat-Verlauf" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Geben Sie die Nachricht ein, die automatisch\n" -"an die Personen gesendet wird, die versuchen Ihnen zu schreiben." -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Einen alternativen zu dem vom Kontakt gegebenen Nickname benutzen" +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Kann Chat-Protokolle nicht öffnen" -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" +#: dialogs/chathistorydialog.cpp:572 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Lade ..." + +#: dialogs/chathistorydialog.cpp:594 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Keine protokollierten Chats" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Sie wurden von jemandem hinzugefügt" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." msgstr "" -"Eine Benachrichtigung anzeigen wenn der Kontakt Online und Offline geht. " +"%1\n" +"
hat Sie zu seiner/ihrer Kontaktliste hinzugefügt." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Bild:" +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +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:93 -msgid "Sound:" -msgstr "Sound:" - -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" -msgstr "Kontakteigenschaften für %1" +msgstr "Kontakteigenschaften von %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Emailadresse: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:814 kmessview.cpp:1190 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Verbunden" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Eigener Name: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1194 +msgid "Not seen yet" +msgstr "Noch nicht gesehen" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1209 +msgid "No messages yet" +msgstr "Bisher keine Nachrichten erhalten" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Zuletzt online: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Letzte Nachricht: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-Mail-Adresse: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "MSN-Programm: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" +"Sind Sie sicher, dass Sie das Anzeigebild dieses Kontaktes benutzen wollen?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "Kontakt-Anzeigebild kopieren" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "Der ausgewählte Dateityp wird nicht von Phonon unterstützt." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "Nicht unterstützter Dateityp" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Kontakte einladen" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:220 msgid "Network Window" msgstr "Netzwerkfenster" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Tab speichern" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "Unterfenster speichern" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Tab löschen" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "Unterfenster &leeren" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Tab schließen" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "A&lle Unterfenster schließen" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Es bestehen keine Verbindungen. Kann das Netzwerkfenster nicht öffnen." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Es bestehen keine Verbindungen.\n" +"
Kann das Netzwerkfenster nicht öffnen." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"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:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." -msgstr "Kann den Hauptverbindungstab nicht schließen." +msgstr "Das Unterfenster der Hauptverbindung kann nicht geschlossen werden." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"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 sind gewarnt worden!
Wollen Sie diese " +"Nachricht weiterhin senden?" + +#: dialogs/networkwindow.cpp:1303 +#, 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:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Es ist nicht möglich Befehle zu dieser Art von Verbindung zu senden!" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:766 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "Abgebrochen" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Fehlgeschlagen!" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Fertig" +msgstr "Abgeschlossen" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:741 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:746 +#, kde-format msgid "%1 kB" -msgstr "%1 kb" +msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:750 +#, kde-format msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "%1 von %2 empfangen" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 von %2 empfangen." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "%1 von %2 gesendet" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 von %2 gesendet." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "unbekannt" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:883 msgid "File Transfers" -msgstr "Dateiübertragung" +msgstr "Dateiübertragungen" -#: emoticontheme.cpp:542 +#: 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 +msgid "Choose or Remove Your Display Picture" +msgstr "Wählen oder entfernen Sie Ihr Anzeigebild" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "Sind Sie sicher, dass Sie dieses Anzeigebild löschen wollen?" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Anzeigebild löschen" + +#: emoticontheme.cpp:627 +#, kde-format 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:736 +#: emoticontheme.cpp:833 msgid "Smile" -msgstr "Lächeln" +msgstr "lächelnd" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" -msgstr "Zwinkern" +msgstr "zwinkernd" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Zunge raus" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" -msgstr "Großes Lachen" +msgstr "großes Lächeln" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" -msgstr "Traurig" +msgstr "traurig" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" -msgstr "Weinen" +msgstr "weinend" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" -msgstr "Ärgerlich" +msgstr "wütend" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" -msgstr "Verwirrt" +msgstr "verwirrt" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" -msgstr "Peinlich" +msgstr "peinlich" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" -msgstr "Enttäuscht" +msgstr "enttäuscht" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" -msgstr "Heiß" +msgstr "heiß" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" -msgstr "Zähne zeigend" +msgstr "Zähne fletschend" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" -msgstr "Freak" +msgstr "Nerd" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" -msgstr "Krank" +msgstr "krank" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" -msgstr "Überrascht" +msgstr "überrascht" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Party" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" -msgstr "Müde" +msgstr "müde" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" -msgstr "Nachdenkend" +msgstr "nachdenkend" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Sag es niemandem" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" -msgstr "Geheimnis flüsternd" +msgstr "flüsternd" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" -msgstr "Augen rollend" +msgstr "augenrollend" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" -msgstr "Sarkastisch" +msgstr "sarkastisch" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Keine Ahnung" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Bin gleich zurück" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Engel" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Umarmung von links" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Junge" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" -msgstr "Rotes Herz" +msgstr "rotes Herz" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" -msgstr "Rote Rose" +msgstr "rote Rose" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "Daumen hoch" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Hundegesicht" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Sonne" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Teufel" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Umarmung von rechts" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Mädchen" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "gebrochenes Herz" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" -msgstr "Welkende Rose" +msgstr "welkende Rose" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Daumen runter" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Katzengesicht" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "schlafender Halbmond" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" -msgstr "Rote Lippen" +msgstr "rote Lippen" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Klatschen" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "gekreuzte Finger" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Flugzeug" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Schildkröte" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" -msgstr "Schlange" +msgstr "Schnecke" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Schwarzes Schaf" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Schaf" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Ziege" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Fledermaus" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Bierkrug" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "Martiniglas" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" -msgstr "Kaffeepott" +msgstr "Kaffeetasse" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Geburtstagskuchen" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Teller" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Schüssel" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Stern" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Regenbogen" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Gewitterwolken" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Blitz" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Regenschirm" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Insel mit Palme" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" -msgstr "Telephonhörer" +msgstr "Telefonhörer" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" -msgstr "Handy" +msgstr "Mobiltelefon" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" -msgstr "Email" +msgstr "E-Mail" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Uhr" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Filmstreifen" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Note" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Handschellen" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Geld" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Glühbirne" -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "Zigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "Zigarette" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "Fußball" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Geschenk" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "KMess Icon" +#: emoticontheme.cpp:911 +msgid "KMess icon" +msgstr "KMess-Symbol" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "Die eingegebene Kontaktadresse ist nicht gültig: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Kann die Verbindung nicht wiederaufnehmen: Zugang nicht gefunden" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" +#: 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:375 +#, kde-format +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:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Keine Internetverbindung nicht verfügbar" + +#: initialview.cpp:401 +#, kde-format +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:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Verbinden" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "Abbrechen" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Bitte geben Sie Ihre E-Mail und Ihr Passwort ein" + +#: initialview.cpp:680 +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:218 +#, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Der Kontakt %1 ist bereits in Ihrer Kontaktliste." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Kontaktinformationen" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Neue Gruppe" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Gruppe hinzufügen" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Geben Sie den neuen Namen für diese Gruppe ein:" +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Geben Sie einen Namen für die neue Gruppe ein:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Abwesend (Auto-Reply)" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Idle" - -#: kmess.cpp:715 +#: kmess.cpp:576 +#, kde-format 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:718 -msgid "Remove contact" +#: kmess.cpp:578 +msgid "Remove Contact" msgstr "Kontakt löschen" -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "Löschen und Blocken" +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "Löschen und blockieren" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Entfernen einer Gruppe" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" msgid "" "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:763 -msgid "Remove group" -msgstr "Gruppe löschen" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Löschen" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "Dieses ist eine spezielle Gruppe und kann nicht verändert werden." +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." +msgstr "Das ist eine spezielle Gruppe, die nicht verändert werden kann." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" +#: kmess.cpp:676 +msgid "Rename Group" msgstr "Gruppe umbenennen" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Verbunden" +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "Geben Sie einen neuen Namen für die Gruppe ein:" -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "Nicht Verbunden" - -#: kmess.cpp:1669 +#: kmess.cpp:754 +#, kde-format +msgctxt "dialog text" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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.

" +"

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

" 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.

" +"

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

" -#: kmess.cpp:1673 -msgid "Error with notifications" -msgstr "Fehler mit Benachrichtigung" +#: kmess.cpp:757 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatische Anmeldung fehlgeschlagen" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Neues &Konto" +#: kmess.cpp:1041 +#, fuzzy +msgid "Connection could be down..." +msgstr "Verbinde ..." -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Neuer K&ontakt" +#: kmess.cpp:1111 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Verbindung getrennt" -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Neue &Gruppe" +#: kmess.cpp:1450 +#, kde-format +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

" -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "Kontakt s&uchen" +#: kmess.cpp:1462 +#, kde-format +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 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.

" -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Kontakt nach &Interesse suchen" +#: kmess.cpp:1468 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Benachrichtigungsfehler" -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Konto&einstellungen" +#: kmess.cpp:1746 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Aktionen" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "&Verbinden" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "Verbindung &trennen" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Mein &Profil anzeigen" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Mein Status" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:306 msgid "&Connect" msgstr "&Verbinden" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Verbin&dung trennen" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Mein &Profil anzeigen" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" -msgstr "&Autorisierte Kontakte anzeigen" +msgstr "Erl&aubte Kontakte anzeigen" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" -msgstr "Kontakte die &Offline sind anzeigen" +msgstr "&Offline-Kontakte anzeigen" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" -msgstr "G&elöschte Kontakte anzeigen" +msgstr "Gelöschte Kontakte anzeigen" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Mein Bild" +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Ereigniskasten anzeigen" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "&Netzwerkfenster anzeigen" +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "Kontakt&suchleiste anzeigen" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "L&eere Gruppen anzeigen" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "Kontaktanzeigebilder" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" -msgstr "&Sortiere Kontakt nach" +msgstr "Kontakte &sortieren nach" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Über&tragungsfenster anzeigen ..." + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Kontakt hinzufügen ..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Neue &Gruppe erstellen ..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "Kontaktliste &exportieren ..." + +#: kmessinterface.cpp:183 kmessview.cpp:611 +msgid "Show Chat &History..." +msgstr "C&hat-Protokolle anzeigen" + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Neuen Zug&ang erstellen ..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Zug&ang bearbeiten ..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "&KMess einrichten ..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Auswahl&menü zeigen" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Nicht anzeigen" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Klein" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Mittel" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Groß" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Gruppe" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "&Übertragungsfenster anzeigen" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Gemischt" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Höre gerade %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "&Netzwerkfenster anzeigen ..." -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:327 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] angemeldet mit %2" -#: kmessview.cpp:613 +#: kmessview.cpp:364 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 hat sich angemeldet" + +#: kmessview.cpp:369 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 hat sich abgemeldet" + +#: kmessview.cpp:608 msgid "Cha&t" msgstr "Cha&t" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Eigenschaften" +#: kmessview.cpp:619 +msgid "&Remove From Group" +msgstr "Aus G&ruppe entfernen" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "Von Gruppe &entfernen" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "In Gruppe &verschieben" - -#: kmessview.cpp:641 +#: kmessview.cpp:652 msgid "&Copy to Group" -msgstr "In Gruppe &kopieren" +msgstr "In Gruppe kopieren" -#: kmessview.cpp:674 +#: kmessview.cpp:653 +msgid "&Move to Group" +msgstr "In Gruppe verschieben" + +#: kmessview.cpp:704 msgid "Move Group &Down" -msgstr "Gruppe nach &unten verschieben" +msgstr "Gruppe nach unten verschieben" -#: kmessview.cpp:675 +#: kmessview.cpp:705 msgid "Move Group &Up" msgstr "Gruppe nach &oben verschieben" -#: kmessview.cpp:676 +#: kmessview.cpp:706 msgid "Re&move Group" -msgstr "Gruppe &löschen" +msgstr "Gruppe löschen" -#: kmessview.cpp:677 +#: kmessview.cpp:707 msgid "Re&name Group" -msgstr "Gruppe &umbenennen" +msgstr "Gruppe umbe&nennen" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "1 neue Email in Ihrem Posteingang" +#: kmessview.cpp:1146 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Dieser Kontakt hat Sie nicht in seiner/ihrer Kontaktliste." -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "%1 neue Emails in Ihrem Posteingang" +#: kmessview.cpp:1155 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-Mail-Adresse" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Abwesend)" +#: kmessview.cpp:1162 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Programm" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Bin gleich zurück)" +#: kmessview.cpp:1174 +msgid "Yes" +msgstr "Ja" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Beschäftigt)" +#: kmessview.cpp:1178 +msgid "No" +msgstr "Nein" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Unsichtbar)" +#: kmessview.cpp:1181 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blockiert" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Abwesend - Idle)" +#: kmessview.cpp:1201 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Zuletzt online" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Mittagessen)" +#: kmessview.cpp:1216 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Letzte Nachricht" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Am Telefon)" +#: kmessview.cpp:1226 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Gruppe %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Automatisch mit der gegebenen Emailadresse Anmelden" +#: kmessview.cpp:1234, kde-format +msgctxt "Contact counters in normal group tooltip, first part" +msgid "%1 contact, " +msgid_plural "%1 contacts, " +msgstr[0] "%1 Kontakt, " +msgstr[1] "%1 Kontakte, " -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1237, kde-format +msgctxt "Contact counters in normal group tooltip, second part" +msgid "%1 online" +msgid_plural "%1 online" +msgstr[0] "%1 online" +msgstr[1] "%1 online" + +#: kmessview.cpp:1243 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 Kontakt" +msgstr[1] "%1 Kontakte" + +#: kmessview.cpp:1663 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Geben Sie hier Ihre Statusnachricht ein>" + +#: kmessview.cpp:1664 +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 Ihre Kontakte sehen sollen. Sie wird " +"neben Ihrem Spitznamen zu sehen sein." + +#: kmessview.cpp:1847 +#, fuzzy +msgid "No chat logs could be found for this contact." +msgstr "Es können keine Chat-Protokolle für diesen Kontakt gefunden werden." + +#: kmessview.cpp:1848 kmessview.cpp:1854 +msgid "No chat history found" +msgstr "Keine Chat-Protokolle gefunden" + +#: kmessview.cpp:1853 +#, fuzzy +msgid "" +"No chats logs could be found for this contact. Note that new chats are not " +"logged; if you want your chats to be logged, you can enable it in your " +"account settings." +msgstr "" +"Es können keine Chat-Protokolle für diesen Kontakt gefunden werden. Beachte " +"Sie bitte, dass neue Chats nicht protokolliert werden" + +#: kmessview.cpp:2041 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 neue E-Mail-Nachricht" +msgstr[1] "%1 neue E-Mail-Nachrichten" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:488 settings/accountpage.cpp:549 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "Ein Live-Messenger-Programm für KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Entwickler und Projektgründer" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Entwickler" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Unterstützung des Projekts" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Aktueller Entwickler" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:125 +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:67 main.cpp:162 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:161 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 +#, 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:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 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:73 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:73 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "gelbe, blaue und violete Emoticon-Stile, Italienische Übersetzung" + +#: main.cpp:74 msgid "Cartoon emoticons" -msgstr "Cartoon Emoticons" +msgstr "Cartoon-Emoticons" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "KMess-Symbol im Oxygen-Stil" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:109 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "Übersetzungsbetreuer" #: main.cpp:82 -msgid "Default sound theme" -msgstr "Standart Sound Theme" - -#: main.cpp:86 +#, 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:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "Ergänzung der arabischen Übersetzung" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "brasilianisch portugiesische Übersetzung" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Ergänzung der brasilianisch portugiesischen Übersetzung" #: main.cpp:87 -msgid "More Arabic translation" -msgstr "Weitere Arabische Übersetzung" +msgid "Sergio Rafael Lemke" +msgstr "Sergio Rafael Lemke" #: main.cpp:88 -msgid "Brazilian Portuguese translation" -msgstr "Portugisische Übersetzung (Brasilien)" +msgid "Maurício Arozi Moraes" +msgstr "Maurício Arozi Moraes" -#: main.cpp:89 +#: main.cpp:90 msgid "Catalan translation" msgstr "Katalanische Übersetzung" -#: main.cpp:91 -msgid "Simplified Chinese translation, file send bug fix, proxy connect code" -msgstr "" -"Vereinfachte Chinesische Übersetzung, Dateiübertragungsbugfix. " -"Proxyverbindungscode" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" -#: main.cpp:92 -msgid "More Simplified Chinese translation" -msgstr "Weitere vereinfachte Chinesische Übersetzung" +#: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "Adrià Arrufat" + +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "Ergänzung der katalanischen Übersetzung" #: main.cpp:93 -msgid "Traditional Chinese translation" -msgstr "Traditionelle Chinesische Übersetzung" +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" +"Chinesische Übersetzung (Kurzzeichen), Behebung der Dateiübertragungen, Code " +"für Proxy-Verbindungen" + +#: main.cpp:94 main.cpp:157 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "Ergänzung der chinesischen Übersetzung (Kurzzeichen)" #: main.cpp:95 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:96 +msgid "Traditional Chinese translation" +msgstr "Chinesische Übersetzung (Langzeichen)" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "Ergänzung der chinesischen Übersetzung (Langzeichen)" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:99 msgid "Danish translation" msgstr "Dänische Übersetzung" -#: main.cpp:96 -msgid "More Danish translation" -msgstr "Weitere Dänische Übersetzung" +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" -#: main.cpp:97 +#: main.cpp:100 +msgid "More Danish translation" +msgstr "Ergänzung der dänischen Übersetzung" + +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 msgid "Dutch translation" msgstr "Niederländische Übersetzung" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 main.cpp:107 msgid "More Dutch translation" -msgstr "Weitere Niederländische Übersetzung" +msgstr "Ergänzung der niederländischen Übersetzung" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:107 +msgid "Heimen Stoffels" +msgstr "Heimen Stoffels" + +#: main.cpp:109 +msgid "More German translation, Greek translation" +msgstr "Ergänzung der deutschen Übersetzung, Griechische Übersetzung" + +#: main.cpp:110 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:110 +msgid "More Greek translation" +msgstr "Ergänzung der griechischen Übersetzung" + +#: main.cpp:112 msgid "Estonian translation" -msgstr "Estländische Übersetzung" +msgstr "Estnische Übersetzung" -#: main.cpp:101 +#: main.cpp:112 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:113 msgid "Finnish translation" msgstr "Finnische Übersetzung" -#: main.cpp:102 main.cpp:103 -msgid "More Finnish translation" -msgstr "Weitere Finnische Übersetzung" +#: main.cpp:113 +msgid "Markus Vuori" +msgstr "Markus Vuori" -#: main.cpp:105 +#: main.cpp:114 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:114 main.cpp:115 +msgid "More Finnish translation" +msgstr "Ergänzung der finnischen Übersetzung" + +#: main.cpp:115 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:117 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:117 msgid "French translation" msgstr "Französische Übersetzung" -#: main.cpp:106 +#: main.cpp:118 msgid "More French translation, MSN6 emoticon definitions" -msgstr "Französische Übersetzung, MSN6 Emoticon definitionen" +msgstr "" +"Ergänzung der französischen Übersetzung, Definierung der MSN6-Emoticons" -#: main.cpp:107 +#: main.cpp:118 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:119 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:119 main.cpp:120 main.cpp:121 msgid "More French translation" -msgstr "Weitere Französische Übersetzung" +msgstr "Ergänzung der französischen Übersetzung" -#: main.cpp:109 +#: main.cpp:120 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:121 +msgid "Scias" +msgstr "Scias" + +#: main.cpp:123 msgid "Hungarian translation" msgstr "Ungarische Übersetzung" -#: main.cpp:110 main.cpp:111 -msgid "More Italian translation" -msgstr "Weitere Italienische Übersetzung" +#: main.cpp:123 +msgid "Páder Rezső" +msgstr "Páder Rezső" -#: main.cpp:112 +#: main.cpp:124 +msgid "More Hungarian translation" +msgstr "Ergänzung der ungarischen Übersetzung" + +#: main.cpp:124 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:125 main.cpp:126 +msgid "More Italian translation" +msgstr "Ergänzung der italienischen Übersetzung" + +#: main.cpp:126 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:127 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:127 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" +"Ergänzung der italienischen Übersetzung, Gruppenauswahl im „Kontakt hat Sie " +"hinzugefügt“-Dialog" + +#: main.cpp:128 msgid "Korean translation" msgstr "Koreanische Übersetzung" -#: main.cpp:113 -msgid "Norsk Bokmål translation" -msgstr "Norwegische Übersetzung" +#: main.cpp:128 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" -#: main.cpp:115 -msgid "Slovenian translation" +#: main.cpp:129 +msgid "Norsk Bokmål translation" +msgstr "Norwegische (Bokmål) Übersetzung" + +#: main.cpp:129 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:131 +msgid "Serbian translation" +msgstr "Serbische Übersetzung" + +#: main.cpp:131 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:133 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:133 +msgid "Slovak translation" msgstr "Slowakische Übersetzung" -#: main.cpp:116 +#: main.cpp:134 +msgid "Matjaž Kaše" +msgstr "Matjaž Kaše" + +#: main.cpp:134 +msgid "Slovenian translation" +msgstr "Slowenische Übersetzung" + +#: main.cpp:136 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:136 msgid "Spanish translation" msgstr "Spanische Übersetzung" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 -msgid "More Spanish translation" -msgstr "Weitere Spanische Übersetzung" +#: main.cpp:137 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" -#: main.cpp:121 +#: main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 main.cpp:141 +#: main.cpp:142 main.cpp:143 +msgid "More Spanish translation" +msgstr "Ergänzung der spanischen Übersetzung" + +#: main.cpp:138 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:139 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:140 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:141 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:142 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:143 +msgid "Manuel Ramírez" +msgstr "Manuel Ramírez" + +#: main.cpp:145 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:145 msgid "Swedish translation" msgstr "Schwedische Übersetzung" -#: main.cpp:123 +#: main.cpp:146 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:146 +msgid "More Swedish translation" +msgstr "Ergänzung der schwedischen Übersetzung" + +#: main.cpp:148 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:148 msgid "Thai translation" msgstr "Thailändische Übersetzung" -#: main.cpp:124 +#: main.cpp:149 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:149 msgid "Turkish translation" msgstr "Türkische Übersetzung" -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "Weitere Türkische Übersetzung" +#: main.cpp:150 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" -#: main.cpp:129 +#: main.cpp:150 main.cpp:151 +msgid "More Turkish translation" +msgstr "Ergänzung der türkischen Übersetzung" + +#: main.cpp:151 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:154 +msgid "MSNP12 support, various patches" +msgstr "MSNP12-Unterstützung, verschiedene Verbesserungen" + +#: main.cpp:154 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:155 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:155 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" +"Code für Anzeigebilder in der Kontaktliste, Information über Messenger-" +"Programme der Kontakte, Schriftvergrößerung und -verkleinerung im Chatfenster" -#: main.cpp:130 +#: main.cpp:156 +msgid "File transfer thumbnails" +msgstr "Vorschaubilder bei Dateiübertragungen" + +#: main.cpp:156 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:157 msgid "P4-Context field support" -msgstr "P4-Kontextfeld Support" +msgstr "Ünterstützung für das P4-Kontextfeld" -#: main.cpp:131 +#: main.cpp:158 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:158 msgid "Xinerama fixes" -msgstr "Xinerama fixes" +msgstr "Xinerama-Korrekturen" -#: main.cpp:132 +#: main.cpp:159 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:159 msgid "Original file receive code" -msgstr "Original Dateiübertragungscode" +msgstr "Ursprünglicher Code für das Empfangen von Dateien" -#: main.cpp:133 +#: main.cpp:160 +msgid "KWallet support" +msgstr "KWallet-Unterstützung" + +#: main.cpp:160 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:161 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Option für das Deaktivieren von Benachrichtigungen, Option für das " +"Deaktivieren von Animoticons, Anzeige des Datums der zuletzt erhaltenen " +"Nachricht" + +#: main.cpp:162 +msgid "IRC-like commands in the chat window" +msgstr "IRC-ähnliche Befehle im Chat-Fenster" + +#: main.cpp:163 +msgid "Chat history dialog" +msgstr "Chat-Protokoll-Dialog" + +#: main.cpp:163 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:166 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:166 +msgid "Various internationalization fixes" +msgstr "Verschiedene Internationalisierungskorrekturen" + +#: main.cpp:167 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:167 msgid "Various internationalization fixes." -msgstr "Mehrere Internationalisierungs Fixes" +msgstr "Verschiedene Internationalisierungskorrekturen" -#: main.cpp:134 +#: main.cpp:169 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:169 msgid "GnomeMeeting developer" -msgstr "GnomeMeeting Entwickler" +msgstr "GnomeMeeting-Entwickler" -#: main.cpp:135 +#: main.cpp:170 msgid "Guy with a bag over his head" -msgstr "Typ mit der Tüte über dem Kopf" +msgstr "Typ mit einer Tüte über dem Kopf" -#: main.cpp:138 +#: main.cpp:170 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:173 msgid "Inspiration and assorted code" -msgstr "Inspiration und Code" +msgstr "Inspiration und verschiedener Code" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Alter Popup Balloon Code, erster P2P Code, MSN Challenge Handler" +#: main.cpp:173 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" -#: main.cpp:140 +#: main.cpp:174 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:174 +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:175 msgid "Idle timer code" -msgstr "Idle timer Code" +msgstr "Code zur Inaktivitätserkennung" -#: main.cpp:141 +#: main.cpp:175 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:176 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:176 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 -msgid "Your name here?" -msgstr "Ihr Name hier?" +#: main.cpp:177 +msgid "Amarok" +msgstr "Amarok" -#: main.cpp:144 +#: main.cpp:177 #, fuzzy +msgid "Custom crash handler implementation" +msgstr "Implementation einer eigenen Absturzverwaltung" + +#: main.cpp:178 msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"KNotify not giving focus bug fix and KWin focus stealing prevention " +"workaround" +msgstr "" + +#: main.cpp:178 +msgid "Quassel" +msgstr "Quassel" + +#: main.cpp:181 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\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! " +"bitte!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:181 +msgid "Your name here?" +msgstr "Ihr Name soll auch hier stehen?" + +#: main.cpp:184 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:185 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Ihre E-Mail-Adressen" + +#: main.cpp:191 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Beim Start Kontaktliste nicht anzeigen" + +#: main.cpp:192 +msgid "Autologin with the given email address" +msgstr "Automatisch mit der gegebenen E-Mail-Adresse anmelden" + +#: main.cpp:197 +msgid "Run a debug test (developer build only)" +msgstr "Einen Debug-Test ausführen (nur in der Entwickler-Version möglich)" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Erlaubt" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Entfernt" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." -msgstr "Der Kontakt hat die Session abgebrochen." +msgstr "Der Kontakt hat die Sitzung abgebrochen." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "Der Kontakt hat die Einladung abgelehnt." -#: network/applications/application.cpp:360 +#: 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:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Sie haben die Einladung abgelehnt." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to accept or cancel?" -msgstr "Möchten Sie annehmen oder ablehnen ?" +msgstr "Wollen Sie annehmen oder ablehnen?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." msgstr "Hier klicken um abzubrechen." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +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:209 -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:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Verbinde zu %1, Port %2" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Die Übertragung wurde abgebrochen" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Verbindung hergestellt" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Datei erfolgreich übertragen: %1" - -#: network/applications/filetransfer.cpp:600 -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:604 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" msgstr "" -"Die Übertragung von %1 ist fehlgeschlagen. Datei konnte nicht gelesen " -"werden." +"Die Datei "%1" existiert bereits.\n" +"Wollen Sie sie überschreiben?" -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Sende Datei %1" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"Die Übertragung der Datei "%1" ist fehlgeschlagen. Die Datei kann " +"nicht gespeichert werden." -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:295 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "" +"Die Übertragung der Datei "%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:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 -msgid "Negotiating options to connect" -msgstr "Überprüfen der Verbindungsmöglichkeiten" +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Verbinde zu %1, Port %2" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:548 +#, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "" +"Der Kontakt hat die Übertragung, der Datei "%1", abgebrochen." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:559 +#, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Sie haben die Übertragung, der Datei "%1", abgebrochen." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:570 +#, kde-format +msgid "You have rejected the transfer of the 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:581 +#: network/applications/filetransferp2p.cpp:674 +#, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Die Datei "%1" ist erfolgreich übertragen worden." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:678 +#, kde-format +msgid "Successfully received the file "%1"." +msgstr "Die Datei "%1" ist erfolgreich empfangen worden." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:811 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "" +"Die Übertragung der Datei "%1" ist fehlgeschlagen. Die Datei " +"existiert nicht." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:816 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "" +"Die Übertragung der Datei "%1" ist fehlgeschlagen. Die Datei " +"konnte nicht gelesen werden." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:850 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Sende Datei "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:888 +#, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Der Kontakt hat der Übertragung, der Datei "%1", zugestimmt." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +msgid "Negotiating options to connect" +msgstr "Überprüfe die Verbindungsmöglichkeiten" + +#: 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 "" -"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:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "Die Übertragung von %1 ist fehlgeschlagen. Konnte Datei nicht öffnen" +#: network/applications/filetransferp2p.cpp:404 +#, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Sie haben der Übertragung, der Datei "%1", zugestimmt." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Der Kontakt hat den Transfer abgebrochen." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:614 msgid "File could not be written" msgstr "Datei konnte nicht geschrieben werden" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Die Übertragung von %1 ist fehlgeschlagen. Die Datei existiert nicht." - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "" -"Die Übertragung von %1 ist fehlgeschlagen. Datei konnte nicht gelesen werden." - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "Sende Datei %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: 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:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "Starte GnomeMeeting. Verbinde zu %1" +msgstr "Starte GnomeMeeting. Verbinde zu %1." -#: network/applications/gnomemeeting.cpp:156 +#: 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:109 -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." - -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "Die Einladung wurde abgebrochen. Ein interner Fehler ist aufgetreten." - -#: network/applications/mimeapplication.cpp:125 -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." - -#: network/applications/mimeapplication.cpp:130 -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." - -#: network/applications/mimeapplication.cpp:135 +#: network/applications/inktransferp2p.cpp:108, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +"%1 has tried to send you an handwritten message, but it could not be " +"received." +msgstr "Das Senden, der handgeschriebenen Nachricht, an %1 ist fehlgeschlagen." + +#: network/applications/inktransferp2p.cpp:114 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "The handwritten message to %1 could not be delivered." msgstr "" -"Die Einladung wurde abgebrochen. Das Switchboard hat die Chatverbindung " +"Die handgeschriebene Nachricht kann nicht an %1 gesendet werden." + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "" +"Die Einladung ist abgelehnt worden. Sie wird vom anderen Programm nicht " +"unterstützt." + +#: network/applications/mimeapplication.cpp:164 +msgid "The invitation was aborted. An internal error occured." +msgstr "" +"Die Einladung ist abgebrochen worden. Ein interner Fehler ist aufgetreten." + +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "" +"Die Einladung ist abgebrochen worden. Es ist eine Zeitüberschreitung beim " +"Warten auf den anderen Kontakt zum Annehmen, eingetreten." + +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "" +"Die Einladung ist abgebrochen worden. Es ist eine Zeitüberschreitung beim " +"Warten auf die Daten der Datei eingetreten." + +#: network/applications/mimeapplication.cpp:180 +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "" +"Die Einladung ist abgebrochen worden. Das Switchboard hat die Chatverbindung " "geschlossen." -#: network/applications/mimeapplication.cpp:141 +#: 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:51 -msgid "You are invited to share this person's desktop." -msgstr "Sie wurden von dieser Person eingeladen sein Desktop zu sharen." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." +msgstr "Sie wurden eingeladen den Desktop dieser Person, mit ihr zu teilen." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." -msgstr "Starte KRDC. Verbinde zu %1" +msgstr "Starte KRDC. Verbinde zu %1." -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by KMess." msgstr "" -"Der Kontakt hat ein MSN6 feature ausgeführt, welches KMess noch nicht " -"bearbeiten kann." +"Der Kontakt lädt sie auf eine Aktivität ein, die von KMess noch nicht " +"unterstützt wird." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" -"Die Einladung wurde abgebrochen. Der Kontakt hat fehlerhafte Daten übersand, " -"oder KMess unterstützt es nicht." +"Die Einladung ist abgebrochen worden. Entweder hat der Kontakt fehlerhafte " +"Daten gesendet, oder KMess unterstützt diese Einladung nicht." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "Die Übertragung ist fehlgeschlagen. Datenaufbereitungfehlgeschlagen." +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "" +"Die Übertragung ist fehlgeschlagen. Die Datenvorbereitung ist fehlgeschlagen." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." +#: network/applications/p2papplication.cpp:1192 +#, fuzzy +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "" +"Die Einladung ist abgebrochen worden. Die Nachricht wurde nicht zu uns " +"geleitet." + +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not 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/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." msgstr "" "Der Kontakt hat die Einladung abgelehnt. Ein interner Fehler ist aufgetreten." -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "Die Übertragung ist fehlgeschlagen" - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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/p2papplication.cpp:2038 -msgid "The invitation was cancelled. Message was not directed to us." -msgstr "" -"Die Einladung wurde abgebrochen. Nachricht wurde nicht zu uns geleitet." - -#: network/applications/p2papplication.cpp:2584 -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/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Warte auf Verbindung an %1, Port %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 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:3274 -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/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "" -"Die Übertragung ist fehlgeschlagen. Ein interner Error ist aufgetreten." - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "" -"Die Übertragung ist fehlgeschlagen. Konnte die Datenquelle nicht öffnen." - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" msgstr "Warte auf Verbindung" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred 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:5022 +#: network/applications/p2papplication.cpp:3432 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred 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:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred 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/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +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:627 +msgid "The transfer failed." +msgstr "Die Übertragung ist fehlgeschlagen." + +#: network/applications/p2papplicationbase.cpp:1028 +#, 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:1047 +msgid "The transfer failed. An internal error occured." +msgstr "" +"Die Übertragung ist fehlgeschlagen. Ein interner Fehler ist aufgetreten." + +#: network/applications/p2papplicationbase.cpp:1208 +msgid "The transfer failed. Could not 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:82 +#: 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:174 +#: 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:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device could not 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:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format 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:228 +#: network/applications/voiceconversation.cpp:224 +#, fuzzy, kde-format 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:293 +#: 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:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Die Übertragung von %1 wurde abgebrochen." +#: 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:136 +#: 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 contact'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:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Sie haben die Übertragung der Datei "%1" abgebrochen." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Der Kontakt hat die Übertragung der Datei "%1" abgebrochen." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Fehlgeschlagen" -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Sende Datei %1" + +#: network/extra/msnftpconnection.cpp:398 +#, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "" -"Die Übertragung von %1 ist fehlgeschlagen. Konnte keinen lokalen Port " -"öffnen." +"Die Übertragung von %1 ist fehlgeschlagen. Es kann kein lokaler Port " +"geöffnet werden." -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." -msgstr "Konnte keinen lokalen Port öffnen." +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." +msgstr "Es kann kein lokaler Port geöffnet werden." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "Initialisiere die Dateiübertragung" +msgstr "Leite Dateiübertragung ein" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +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:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Konnte keine Verbindung herstellen." -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Empfange Datei %1" -#: network/msnconnection.cpp:140 +#: network/msnconnection.cpp:378 +msgid "Invalid command syntax" +msgstr "Ungültige Befehlssyntax" + +#: network/msnconnection.cpp:382 +msgid "Invalid command parameter" +msgstr "Ungültiger Befehlsparameter" + +#: network/msnconnection.cpp:385 +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "" +"Die E-Mail-Adresse, die Sie eingegeben haben, ist kein Live-Messenger-Zugang." + +#: network/msnconnection.cpp:390 +msgid "Domain name missing" +msgstr "Fehlender Domain-Name" + +#: network/msnconnection.cpp:394 +msgid "Already logged in" +msgstr "Bereits angemeldet" + +#: network/msnconnection.cpp:397 +msgid "The given account name is invalid" +msgstr "Der eingegebene Zugangsname ist ungültig" + +#: network/msnconnection.cpp:401 msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" 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)." +"Dieser Zugangsname ist entweder ungültig, oder Ihr Passport-Zugang ist noch " +"nicht bestätigt worden" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping verloren" - -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 pings verloren." - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "Verbindung zum Server ging verloren." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "Der Remote Server hat die Verbindung geschlossen" - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Erlaubt" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Gelöscht" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -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." - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "MSN Messenger Service Status anzeigen?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Server Fehler" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy -msgid "" -"You have been disconnected because you connected from another MSN 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:1553 -msgid "Got synchronization" -msgstr "Synchronisierung" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Authentifizierung" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Benutzerinformationen empfangen" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Warte auf die Kontaktliste..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Transfer zum Notifizierungsserver" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "" -"Anmeldung fehlgeschlagen, bitte überprüfen Sie Ihren Accountnamen und " -"Passwort." - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Verbinden..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess hat eine unbekanntes Kommando vom Server empfangen: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Es gab einen internen Fehler in KMess: %1" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "Die Email ist kein MSN Messenger Account" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "Der angegebene Accountname ist ungültig." - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" -"Der angegebene Accountname ist ungültig, oder Dein Passportkonto ist noch " -"nicht bestätigt." - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:404 msgid "Your contact list is full" -msgstr "Ihre Kontaktliste ist voll." +msgstr "Ihre Kontaktliste ist voll" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:409 +msgid "Invalid SBP parameter" +msgstr "Ungültiger SBP-Parameter" + +#: network/msnconnection.cpp:412 msgid "This contact is already on your list" msgstr "Dieser Kontakt ist bereits in Ihrer Liste." -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:416 msgid "This contact is not on your list" msgstr "Dieser Kontakt ist nicht in Ihrer Liste." -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:420 msgid "This contact is not online" -msgstr "Dieser Kontakt ist nicht Online" +msgstr "Dieser Kontakt ist nicht Online." -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Ihre Kontaktliste hat zu viele Gruppen." +#: network/msnconnection.cpp:425 +#, fuzzy +msgid "Already in this mode" +msgstr "Bereits in diesem Modus" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "Diese Gruppe kann nicht verändert werden" - -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "Diese Gruppe ist nicht leer." - -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +#: network/msnconnection.cpp:429 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" msgstr "" -"Dieser Gruppenname wird bereits von Ihrem Messenger oder Ihrer Hotmail " -"Kontaktliste benutzt." +"Dieser Kontakt kann nicht gleichzeitig zur Erlaubt- und Blockiert-Liste " +"hinzugefügt werden." -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "Der Gruppenname ist zu lang" +#: network/msnconnection.cpp:433 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"Dieser Gruppenname ist bereits in Ihrer Kontaktliste vorhanden. Bitte wählen " +"Sie einen anderen Namen." -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:437 +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/msnconnection.cpp:441 +msgid "This group cannot be changed" +msgstr "Diese Gruppe kann nicht geändert werden" + +#: network/msnconnection.cpp:446 +msgid "Contact is not added to this group" +msgstr "Kontakt wurde nicht zu dieser Gruppe hinzugefügt" + +#: network/msnconnection.cpp:450 +msgid "This group is not empty" +msgstr "Diese Gruppe ist nicht leer" + +#: network/msnconnection.cpp:454 +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/msnconnection.cpp:459 +msgid "Attempted to change group \"0\"" +msgstr "" + +#: network/msnconnection.cpp:459 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Es gab einen internen Fehler: %1" + +#: network/msnconnection.cpp:463 +msgid "Invalid Group" +msgstr "Ungültige Gruppe" + +#: network/msnconnection.cpp:467 +msgid "Empty domain" +msgstr "Leere Domain" + +#: network/msnconnection.cpp:471 +msgid "Wrong ADL command format" +msgstr "Fehlerhaftes ADL-Befehlsformat" + +#: network/msnconnection.cpp:474 msgid "Switchboard server failed" -msgstr "Switchboard Server fehlgeschlagen" +msgstr "Switchboard-Server fehlgeschlagen" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:477 msgid "Transfer to switchboard server failed" -msgstr "Übertragun zum Switchboardserver fehlgeschlagen" +msgstr "Übertragung zum Switchboardserver fehlgeschlagen" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:481 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:2316 +#: network/msnconnection.cpp:485 +msgid "Required field missing" +msgstr "Benötigtes Feld fehlt" + +#: network/msnconnection.cpp:489 +msgid "Not logged in" +msgstr "Nicht angemeldet" + +#: network/msnconnection.cpp:493 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" +"Der Zugriff auf den Live-Messenger-Dienst, wird diesem Zugang verweigert." + +#: network/msnconnection.cpp:498 +msgid "Command is disabled" +msgstr "Befehl ist deaktiviert" + +#: network/msnconnection.cpp:501 +msgid "Your account is banned" +msgstr "Ihr Zugang ist gesperrt." + +#: network/msnconnection.cpp:505 +msgid "Challenge response failed" +msgstr "" + +#: network/msnconnection.cpp:510 +msgid "Bad command data" +msgstr "Fehlerhafte Befehlsdaten" + +#: network/msnconnection.cpp:514 +#, fuzzy +msgid "You are opening chat sessions too fast" +msgstr "Sie öffnen Chat-Sitzungen zu schnell" + +#: network/msnconnection.cpp:518 +msgid "You have too many open chat sessions" +msgstr "Sie haben zu viele offene Chat-Sitzungen" + +#: network/msnconnection.cpp:525 +msgid "Unexpected command sequence" +msgstr "Unerwartete Befehlssequenz" + +#: network/msnconnection.cpp:529 +msgid "Bad friend name" +msgstr "Fehlerhafter Spitzname" + +#: network/msnconnection.cpp:535 +msgid "Bad CVR data" +msgstr "Fehlerhafte CVR-Daten" + +#: network/msnconnection.cpp:541 +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/msnconnection.cpp:548 +msgid "Authentication ticket was incorrect" +msgstr "Authentifizierungsticket war falsch" + +#: network/msnconnection.cpp:551 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Sie können keinen Chat starten während Sie unsichtbar sind." + +#: network/msnconnection.cpp:555 +msgid "Not accepting new contacts" +msgstr "Akzeptiere keine neuen Kontakte" + +#: network/msnconnection.cpp:559 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" +"Du hast einen „Kids Passport“-Zugang. Du brauchst die Einverständnis deiner " +"Eltern, um Online zu chatten." + +#: network/msnconnection.cpp:562 +msgid "Your Passport account needs to be verified first" +msgstr "Ihr Passport-Zugang muss zuerst bestätigt werden" + +#: network/msnconnection.cpp:566 +msgid "Bad USR ticket" +msgstr "Fehlerhaftes USR-Ticket" + +#: network/msnconnection.cpp:576 msgid "Error accessing contact list, try again later" msgstr "" "Fehler beim öffnen der Kontaktliste, versuchen Sie es später noch einmal" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "Ihr Account ist gebannt." - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Sie öffnen Sessions zu schnell..." - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Sie haben zu viele Sessions geöffnet." - -#: network/msnnotificationconnection.cpp:2341 -msgid "Bad friend name" -msgstr "Schlechter Freund Name" - -#: 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/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." -msgstr "Sie können keinen Chat starten wenn Sie unsichtbar sind." - -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:585 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" msgstr "" -"Du hast einen Kinderpassportkonto. Du brauchst ein Einverständnis Deiner " -"Eltern um Online zu chatten." +"Der Live-Messenger-Dienst ist vorübergehend nicht verfügbar. Es gab einen " +"internen Serverfehler." -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Ihr Passport muss zuerst verifiziert werden." +#: network/msnconnection.cpp:596 +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" +"Der Live-Messenger-Dienst ist vorübergehend nicht verfügbar. Die Server sind " +"zu beschäftigt." -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN Fehler" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Es gab einen internen Serverfehler." - -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "Der Server ist zu beschäftigt." - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Der Server ist nicht erreichbar" - -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:600 msgid "Peer notification server down" -msgstr "Notifizierungsserver ist down" +msgstr "" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:604 msgid "The server is going down" -msgstr "Der Server fährt herunter." +msgstr "Der Server fährt herunter" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:608 msgid "The server is going down soon" -msgstr "Der Server fährt bald herunter." +msgstr "Der Server fährt bald herunter" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:613 msgid "Write is blocking" -msgstr "Schreiben ist blockiert" +msgstr "" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:617 msgid "Session is overloaded" -msgstr "Die Session ist überfüllt" +msgstr "Die Sitzung ist überlastet" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:624 msgid "The server is not available" -msgstr "Der Server ist nicht erreichbar" +msgstr "Der Server ist nicht verfügbar" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:628 msgid "Authentication failed" -msgstr "Anmeldung fehlgeschlagen" +msgstr "Authentifizierung fehlgeschlagen" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Akzeptiere keine neuen Principals" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess hat einen unbekannten Fehler vom Server empfangen: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Warnung: Server schliesst für Wartungsarbeiten in 1 Minute!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:635 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -"Die MSN Server haben berichtet, dass Sie in einer Minute für " -"Wartungsarbeiten schließen werden." +"Unbekannter Fehlercode vom Server empfangen: %1
Technische Details: %2" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Warnung: Server schließt für Wartungsarbeiten in %1 Minuten!" +#: network/msnconnection.cpp:652 network/msnnotificationconnection.cpp:2922 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN-Fehler" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnconnection.cpp:957 +msgid "Trying the HTTP fallback..." +msgstr "Versuche Ausweich-Verbindung über HTTP ..." + +#: network/msnnotificationconnection.cpp:1344 +msgid "Authenticating..." +msgstr "Authentifiziere ..." + +#: network/msnnotificationconnection.cpp:1368 +msgid "Authenticated" +msgstr "Authentifiziert" + +#: network/msnnotificationconnection.cpp:1438 +msgid "Switching to another server..." +msgstr "Schalte auf anderen Server ..." + +#: network/msnnotificationconnection.cpp:1802 +msgid "Connecting..." +msgstr "Verbinde ..." + +#: network/msnnotificationconnection.cpp:1947 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Unbekannter Befehl vom Server empfangen: %1" + +#: network/msnnotificationconnection.cpp:2107 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 Minute" +msgstr[1] "%1 Minuten" + +#: network/msnnotificationconnection.cpp:2110 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Der Server schließt für Wartungsarbeiten in %1!" + +#: network/msnnotificationconnection.cpp:2115 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" +"Die Live-Messenger-Dienst werden in %1 für Wartungsarbeiten heruntergefahren." + +#: network/msnnotificationconnection.cpp:2316 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess kann die Offline-Nachrichten nicht verarbeiten.
Details: %1" + +#: network/msnnotificationconnection.cpp:2317 +msgid "SOAP client is no longer valid." +msgstr "Der SOAP-Client ist nicht mehr gültig." + +#: network/msnnotificationconnection.cpp:2587 +msgid "Authentication time limit exceeded" +msgstr "Authentifizierungszeitlimit überschritten" + +#: network/msnnotificationconnection.cpp:2766 +msgid "Waiting for contact list..." +msgstr "Warte auf die Kontaktliste ..." + +#: network/msnnotificationconnection.cpp:2812 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Warnung: %1

" + +#: network/msnnotificationconnection.cpp:2813 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "MSN-Warnung" + +#: network/msnnotificationconnection.cpp:2885 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Grund des internen Fehlers: %1" + +#: network/msnnotificationconnection.cpp:2920 +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"KMess konnte Offline-Nachrichten nicht bearbeiten.\n" -"\n" -"Details: %1" +"

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

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2933 +#, fuzzy, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

Der Zugang %1 wurde von einem anderen Ort aus verbunden.

" + +#: network/msnnotificationconnection.cpp:2936 +#, fuzzy, kde-format +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"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/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2948 +msgctxt "Connection error: passive notification message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"KMess konnte den Remote-Webservice nicht betreten.\n" -"\n" -"Details: %1" +"

Die Verbindung zum Live-Messenger-Dienst kann nicht hergestellt werden." +"
Es könnte sein, dass Sie sich zuerst authentisieren müssen, bevor Sie " +"auf das Netzwerk zugreifen können.

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Diese Person ist offline oder unsichtbar." - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" -"Der Kontakt hat ein MSN7 Feature ausgeführt, welches KMess noch nicht " -"bearbeiten kann." - -#: network/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "Die Nachricht \"%1\" wurde nicht empfangen." - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Konnte Verbindung nicht herstellen: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "Zu viele Weiterleitungen beim Login-Service" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Zeitüberschreitung der Verbindung" - -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "In %1's Chat: %2" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 sagt:
'%2'" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 hat Ihnen eine Offline Nachricht gesendet:
'%2'" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "%1's Chat fordert Aufmerksamkeit!" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1:
%2" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 hat Ihnen einen Rrrrring gesendet!" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1 hat Ihnen ein Animoticon gesendet!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 möchte die Webcam benutzen!" - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 sendet Ihnen eine Datei!" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 hat Ihnen eine Einladung gesendet!" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 hat die Webcamsession abgebrochen!" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 hat die Dateiübertragung abgebrochen!" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "%1's Aktivität wurde abgebrochen!" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1> hat der Benutzung der Webcam zugestimmt!" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 hat die Dateiübertragung angenommen." - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1> hat Ihre Einladung angenommen!" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 hat die Webcamsession beendet!" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "Die Dateiübertragung mit %1 ist fertig!" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "%1's Aktivität ist beendet!" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "%1's Webcamsession ist fehlgeschlagen!" - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "Die Dateiübertragung von %1 ist fehlgeschlagen." - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "%1's Aktivität wurde mit einem Fehler beendet!" - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1> ist Abwesend" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 ist gleich zurück" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 ist jetzt Beschäftigt" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1> hat sich abgemeldet" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 wurde Unsichtbar" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1> ist Idle gegangen" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 ist Mittagessen" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 ist am Telefon" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 ist jetzt Online" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Neue eMail:
'%1'
von '%2'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "Sen&den" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "N&eue Linie" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Sidebar" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Dieser Kontakt ist nicht in Ihrer Liste." - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Klicken Sie hier im das Profil von dem Kontakt anzuzeigen." - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Klicken Sie hier um dem Kontakt eine Email zu senden." - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Geben Sie einen Shortcut für das Emoticon ein:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Wählen Sie eine Datei aus:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Kontakt hinzufügen" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/msnnotificationconnection.cpp:2951 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"

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 "" -"%1\n" -"hat Sie zu seiner Kontaktliste hinzugefügt. Möchten Sie:" +"

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.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Den Kontakt zu Ihrer \"Freunde\" liste &hinzufügen" +#: network/msnnotificationconnection.cpp:2970 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

Kann nicht zum Live-Messenger-Service verbinden.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "Diesen Kontakt &nicht hinzufügen, aber meinen Status sehen lassen" +#: network/msnnotificationconnection.cpp:2972 +#, kde-format +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.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "Diesen Kontakt &blockieren" +#: network/msnnotificationconnection.cpp:2983 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Fehler: %1

" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "&Aufräumen" +#: network/msnnotificationconnection.cpp:2985 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Geben Sie Ihre Logininformationen ein:" +#: network/msnnotificationconnection.cpp:2996 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Messenger-Service-Fehler: %1

" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "Emailadresse" +#: network/msnnotificationconnection.cpp:2998 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Passwort" +#: network/msnnotificationconnection.cpp:3006 +#, kde-format +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

KMess-Fehler: %1

" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Status beim Einloggen" +#: network/msnnotificationconnection.cpp:3008 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "Dieses Profil &speichern" +#: network/msnnotificationconnection.cpp:3019 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Netzwerk-Verbindung verloren.

" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Verbinden" +#: network/msnnotificationconnection.cpp:3021 +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.

" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Geben Sie hier Ihre persönliche Nachricht ein " +#: network/msnnotificationconnection.cpp:3077 +#, kde-format +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

" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Höre %1" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" +"Geben Sie Ihren Zugangsnamen und Ihr Passwort ein, um das Netzwerk-Proxy zu " +"betreten." -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess Benachrichtigung" +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Code des internen Fehlers: %2)" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/msnsockethttp.cpp:696 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" +"%1 (Interner Fehlercode: %2)
Antwort: %3 %4
Weiterleitungsziel: %5" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "Verbindungszeitlimit überschritten" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 Ping verloren" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 Pings verloren" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "Die Verbindung zum Server ging verloren" + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" +"Die eingegebene E-Mail-Adresse, „%1“, ist keine gültige E-Mail-Adresse!" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +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/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:295 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Ungültige Web-Service-Anfrage (%1)" + +#: network/soap/httpsoapconnection.cpp:427 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Der Webdienst ist nicht zugreifbar (%1)" + +#: network/soap/httpsoapconnection.cpp:504 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Zu viele Weiterleitungen durch den Webdienst" + +#: network/soap/httpsoapconnection.cpp:548 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Der Offline-Nachrichten-Webdienst ist zur Zeit nicht verfügbar" + +#: network/soap/httpsoapconnection.cpp:554 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:568 +#, kde-format +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:607 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Keine Antwort vom Webdienst" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Unerwartete Antwort vom Server (%1)" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" +msgstr "In %1's Chat:
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 sagt:
„%2“" + +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1 hat Ihnen eine Offline-Nachricht gesendet:
„%2“" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "Der Chat von %1 fordert Ihre Aufmerksamkeit!" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "" +"%1 hat Ihnen eine handgeschriebene Nachricht gesendet!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 hat Ihnen ein „Rrring!“ gesendet!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 hat Ihnen ein Animoticon gesendet!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 möchte die Webcam benutzen!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 sendet Ihnen eine Datei!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 hat Ihnen eine Einladung gesendet!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 hat die Webcam-Sitzung abgebrochen!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 hat die Dateiübertragung abgebrochen!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "Die Aktivität von %1 wurde abgebrochen!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 hat der Benutzung der Webcam zugestimmt!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 hat die Dateiübertragung angenommen!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 hat Ihre Einladung angenommen!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 hat die Webcam-Sitzung beendet!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "Die Dateiübertragung mit %1 ist fertig!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "Die Aktivität von %1 ist beendet!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "Die Webcamsitzung von %1 ist fehlgeschlagen!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Die Dateiübertragung mit %1 ist fehlgeschlagen." + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" +"Die Aktivität von %1 ist mit einem Fehler beendet worden!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
ist jetzt online" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
ist jetzt abwesend" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
kommt gleich zurück" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
ist jetzt beschäftigt" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
ist jetzt unsichtbar" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
ist jetzt inaktiv" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
hat sich abgemeldet" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
ist am Telefon" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
ist beim Mittagessen" + +#: notification/newemailnotification.cpp:92 +#, kde-format +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“" + +#: 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 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Auswählen ..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Bild auswählen und zuschneiden ..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Vorheriges Bild wählen ..." + +#. i18n: file: settings/accountpage.ui:136 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:458 rc.cpp:372 +msgid "Display Picture" +msgstr "Anzeigebild" + +#: settings/accountpage.cpp:488 +msgid "Downloading of display picture failed" +msgstr "Herunterladen des Anzeigebildes fehlgeschlagen" + +#: settings/accountpage.cpp:547 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"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:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Einstellungen" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Zugang" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Mein Zugang" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Kontaktliste" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Chatten" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Chat-Protokollierung" + +#: settings/accountsettingsdialog.cpp:154 +#, fuzzy +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 "" +"Klicken Sie hier, um den ausgewählten Account von der Liste der " +"registrierten Zugänge zu löschen.\n" +"Sie können den zur Zeit verbundenen Zugang nicht löschen. Dieser wird beim " +"beenden gelöscht." + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"Die eingegebene E-Mail-Adresse ist ungültig und kann nicht als Zugang " +"verwendet werden: „%1“" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "Die eingegebene E-Mail-Adresse wird bereits verwendet: „%1“" + +#: settings/accountsettingsdialog.cpp:220 +msgid "Please enter a friendly name for this account." +msgstr "Bitte geben Sie einen Spitznamen für diesen Zugang ein." + +#: settings/accountsettingsdialog.cpp:301 +msgid "Are you sure you want to delete this account?" +msgstr "Sind Sie sicher, dass Sie diesen Zugang löschen wollen?" + +#: settings/accountsmanagerpage.cpp:160 +#, kde-format +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 den Zugang „%1“ löschen wollen?
Alle " +"Einstellungen des Zugangs werden verloren gehen." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Hi, wie geht es dir? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Stacy" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Gut!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Ich bin /gerade/ aus meinem Urlaub in Italien zurückgekehrt!" + +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "Sie können nur 7 Zeichen für die Emoticon-Kurzbefehle benutzen." + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid Emoticon Name" +msgstr "Ungültiger Emoticonname" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Existierendes Emoticon ersetzen" + +#: settings/emoticonspage.cpp:233 +#, kde-format +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 "KMess-Einstellungen" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" -msgstr "Konten" +msgstr "Zugänge" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Ihr Nickname:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Benachrichtigungen" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." +msgstr "Keine auswählbaren Web-Browser gefunden." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Keine verfügbaren E-Mail-Programme gefunden." + +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom web browser!" msgstr "" -"Geben Sie den Namen ein, den anderen Kontakte sehen wenn Sie Online sind." +"Sie müssen einen Befehl eingeben, der als benutzerdefinierter Browser " +"verwendet werden soll!" -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Ihre Emailadresse:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#: settings/miscellaneouspage.cpp:291 +#, fuzzy, c-format msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"The console command you have specified to launch a custom web 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 "" -"Geben Sie die Emailadresse von Ihrem MSN-Passport Account ein. Sie können " -"unter http://register.passport.com/ einen neuen Account registrieren." +"Dem eingegebenen Befehl, fehlt der „%u“-Parameter. Ohne diesen wird es " +"nicht möglich sein Webseiten zu öffnen.
Wollen Sie, dass KMess es " +"hinzufügt?" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 +#: 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: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 emails 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:344 +msgid "You have to select a directory for the received files!" +msgstr "Sie müssen ein Verzeichnis für die empfangenen Dateien wählen!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Directory" +msgstr "Verzeichnis wählen" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Mit KMess senden" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess kann nicht auf seine Konfigurationsdateien zugreifen!

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "Den Entwicklern einen Kommentar &senden" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "Rückmeldungssymbole anzeigen" + +#: utils/likeback/likeback.cpp:323 +#, fuzzy, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Willkommen zur Testversion von %1. " + +#: utils/likeback/likeback.cpp:328 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Willkommen bei %1." + +#: utils/likeback/likeback.cpp:336 +#, fuzzy +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" +"Jedes mal wenn Sie ein frustrierendes Erlebnis mit KMess haben, klicken Sie " +"auf das wütende Gesicht unter dem Fenstertitel, beschreiben Sie kurz was " +"Ihnen nicht gefällt und klicken Sie auf „Senden“." + +#: utils/likeback/likeback.cpp:343 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" +"Jedes mal, wenn Sie ein schönes Erlebnis mit KMess haben, klicken Sie auf " +"das lächelnde Gesicht unter dem Fenstertitel, beschreiben Sie kurz was Ihnen " +"gefällt und klicken Sie auf „Senden“." + +#: utils/likeback/likeback.cpp:350 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" +"Jedes mal wenn Sie ein frustrierendes Erlebnis mit KMess haben, klicken Sie " +"auf das wütende Gesicht unter dem Fenstertitel, beschreiben Sie kurz was " +"Ihnen nicht gefällt und klicken Sie auf „Senden“." + +#: utils/likeback/likeback.cpp:360 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" +"Falls Ihnen fehlerhaftes Verhalten der Anwendung begegnet, klicken Sie " +"einfach auf das Symbol mit dem zerbrochenem Objekt, in der oberen, rechten " +"Ecke des Fenster, und beschreiben Sie das Verhalten und klicken Sie auf " +"„Senden“." + +#: utils/likeback/likeback.cpp:372 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Ich mag die neue grafische Gestaltung. Sehr erfrischend." + +#: utils/likeback/likeback.cpp:380 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" +"Ich mag die Willkommensseite dieses Asisstenten nicht. Sie ist " +"zu zeitraubend." + +#: utils/likeback/likeback.cpp:388 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows 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:396 +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:409 +msgctxt "Welcome dialog text, us=the developers, it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" +"Um uns zu helfen die Anwendung zu verbessern, sind Ihre Kommentare wichtig." + +#: utils/likeback/likeback.cpp:412 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Beispiel" +msgstr[1] "Beispiele" + +#: utils/likeback/likeback.cpp:418 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Helfen Sie uns die Anwendung zu verbessern" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Ein Kommentar an die Entwicklern senden" + +#: utils/likeback/likebackdialog.cpp:139, kde-format +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 den Kommentare auf %1 (Sie können dafür auch ein " +"Online-Übersetzungswerkzeug verwenden).
" + +#: utils/likeback/likebackdialog.cpp:146, kde-format +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:159 +#, fuzzy +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 "" +"Um die Kommentare, die Sie senden, nützlicher zu gestalten, versuchen Sie " +"ungefähr die gleiche Anzahl von positiven und negativen Kommentaren zu " +"senden." + +#: utils/likeback/likebackdialog.cpp:168 +#, fuzzy +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 "" +"Bitte fragen Sie nicht nach neuen Features. Solche Anfragen werden ignoriert " +"werden
" + +#: utils/likeback/likebackdialog.cpp:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%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:216 +#, kde-format +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:290 +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 dafür Zeit genommen " +"haben.

" + +#: utils/likeback/likebackdialog.cpp:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kommentar gesendet" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" +"

Es ist ein Fehler beim Senden des Reports eingetreten.

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

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Fehler beim Senden des Kommentars" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +msgid "Standard text mode" +msgstr "Textmodus" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to the standard text mode." +msgstr "Klicken Sie auf diesen Knopf, um zum Textmodus umzuschalten." + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "Klicken Sie diesen Knopf, um in dem Handschriftmodus zu wechseln." + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Standard-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 Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Klicken Sie auf diesen Knopf, um alle Standard-Emoticons des Live-Messengers " +"anzuzeigen." + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "Eigene Emoticons" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Klicken Sie auf diesen Knopf, um alle Ihre eigenen Emoticons anzuzeigen." + +#. 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 "Klicken Sie hier, um die verfügbaren Animoticons anzuzeigen." + +#. 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:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Klicken Sie hier, um Ihre Zugangseinstellungen zu öffnen." + +#. 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 hier die E-Mail-Adresse der Person ein, die zur Kontaktliste " +"hinzugefügt werden soll." + +#. 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:267 +msgid "Email address:" +msgstr "E-Mail-Adresse:" + +#. 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: 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 Bilddatei aus:" + +#. 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 eine Nachricht ein, die automatisch an die Kontakte gesendet wird, " +"die versuchen Ihnen zu schreiben." + +#. 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 +msgid "Search through contacts..." +msgstr "Kontakte suchen ..." + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Chat-Protokoll-Filter" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Nach &Chat filtern" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:103 +msgid "Filter by &date" +msgstr "Nach &Datum filtern" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:106 +msgid "from" +msgstr "Vom" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:109 +msgid "to" +msgstr "Bis" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:112 +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:115 +msgid "&Add this person to the following groups of your contact list:" +msgstr "Diesen Kont&akt zu folgenden Gruppen Ihrer Kontaktliste hinzufügen:" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:118 +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "" +"Diesen Kontakt nicht hinzufügen, Ihm aber erlauben Ihren Status zu sehen" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:121 +msgid "&Block this person from contacting you and seeing your status" +msgstr "Diesen Kontakt &blockieren und Ihren Status vor Ihm verstecken" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:127 +msgid "Click this button to restore the display picture of this contact" +msgstr "Klicken Sie hier, um das Anzeigebild des Kontakts wiederherzustellen." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:130 +msgid "&Restore" +msgstr "Wiede&rherstellen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:133 +msgid "&Groups:" +msgstr "&Gruppen:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:136 +msgid "Use an &alternative name for this contact" +msgstr "Einen &alternativen Namen für diesen Kontakt nutzen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:139 +msgid "Disable notifications for this contact" +msgstr "Benachrichtigungen über diesen Kontakt deaktivieren" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:142 +msgid "&Sound:" +msgstr "&Sound:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:145 +msgid "&Display Pictures" +msgstr "Anzeigebil&der" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:148 +msgid "Click here to use the selected picture as your display picture" +msgstr "" +"Klicken Sie hier, um das ausgewählte Bild als Ihr Anzeigebild zu verwenden." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) #: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Ihr Passwort:" +msgid "Use As Display Picture" +msgstr "Als Anzeigebild verwenden" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) #: rc.cpp:154 -#, no-c-format +msgid "&Clear Cache" +msgstr "Zwis&chenspeicher leeren" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:163 +#, fuzzy +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"Sie können jedes empfangene Emoticon, das Ihnen dieser Kontakt sendet, " +"ausblenden lassen. Sie müssen nur einen Rechtsklick auf das empfangene " +"Emoticon 'machen' und „Dieses Emoticon ausblenden“ auswählen. Hier können " +"Sie bereits ausgeblendete Emoticons wiederherstellen." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:166 +msgid "Click here to restore the selected emoticon" +msgstr "Klicken Sie hier, um das ausgewählte Emoticon wiederherzustellen." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:169 +msgid "Resto&re" +msgstr "Wiede&rherstellen" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:175 +msgid "Available Contacts" +msgstr "Verfügbare Kontakte" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:178 +msgid "Invite a person not on your contact list:" +msgstr "Eine Person einladen, die nicht auf Ihrer Kontaktliste ist:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:181 +msgid "Enter the email address of a person to invite" +msgstr "Geben Sie die E-Mail-Adresse der Person ein, die Sie einladen möchten." + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:184 +msgid "Invited Contacts" +msgstr "Eingeladene Kontakte" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:193 +msgid "Items to export:" +msgstr "Zu exportierende Objekte:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:196 +msgid "Format" +msgstr "Format" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:199 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:202 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:205 +msgid "Contacts:" +msgstr "Kontakte:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:208 +msgid "Select All" +msgstr "&Alle markieren" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:211 +msgid "Deselect All" +msgstr "Auswahl aufheben" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:214 +msgid "Export..." +msgstr "Exportieren ..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:217 +msgid "Close" +msgstr "Schließen" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:223 +msgid "Command to Current Tab" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:226 +msgid "Command:" +msgstr "Befehl:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:229 +msgid "Type:" +msgstr "Typ:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:232 +msgid "Standard" +msgstr "Standard" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:235 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:238 +msgid "Send" +msgstr "Senden" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:241 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:246 +msgid "Open" +msgstr "Öffnen" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:249 +msgid "Cancel" +msgstr "Abbrechen" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:252 +msgid "&Download" +msgstr "&Download" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:255 +msgid "&Upload" +msgstr "&Upload" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:258 +msgid "C&lean Up" +msgstr "Aufräumen" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:261 +msgid "&Close" +msgstr "Schließen" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:264 +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: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:270 +msgid "" +"Enter here the email address of your registered Passport or Live account" +msgstr "" +"Geben Sie hier die E-Mail-Adresse Ihres registrierten Passport- oder Live-" +"Zugangs ein." + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:273 +msgid "Password:" +msgstr "Passwort:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:276 +msgid "Enter here your account's password" +msgstr "Geben Sie hier das Passwort Ihres Zugangs ein." + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:279 +msgid "Status at login:" +msgstr "Status beim anmelden:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:282 +msgid "Choose a status to set when successfully connected." +msgstr "" +"Wählen Sie einen Status, der nach erfolgreichem Verbinden gesetzt werden " +"soll." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:285 +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:288 +msgid "Remem&ber account" +msgstr "Zu&gang speichern" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:294 +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:297 +msgid "R&emember password" +msgstr "Passwort sp&eichern" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:303 +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:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:309 +msgid "New Account" +msgstr "Neuer Zugang" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:312 +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:315 +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 "" +"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: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:318 +msgid "Password forgotten?" +msgstr "Passwort vergessen?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:321 +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:324 +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: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:327 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Verbinden" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:330 +msgctxt "@title:menu" +msgid "&View" +msgstr "Ansicht" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Aktionen" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:336 +#, fuzzy +msgid "Form" +msgstr "Format" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:339 +msgid "Account &Info" +msgstr "Zugangs-Informationen" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:342 +msgid "Your Account Information" +msgstr "Ihre Zugangsinformationen" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:345 +msgid "Enter a name other contacts should see when you are connected." +msgstr "" +"Geben Sie einen Namen ein, den Ihre Kontakte sehen sollen wenn Sie verbunden " +"sind." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:348 +msgid "&Friendly name:" +msgstr "&Spitzname:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:351 +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:354 +msgid "&Email address:" +msgstr "&E-Mail-Adresse:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:357 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: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Mein Bild:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:360 +msgid "&Password:" +msgstr "&Passwort:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format -msgid "C&hange..." -msgstr "&Ändern..." +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:363 +msgid "Click here to have your password saved by KMess" +msgstr "Klicken Sie hier, um Ihr Passwort von KMess speichern zu lassen." -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Zeige kein Displa&y Bild" - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Accounteinstellungen merken" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:117 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:366 +#, 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" -"\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)." +"If you enable this option, KMess will save your account's password. This way " +"you will not have to enter your password on every start up, in order to log " +"in. Please keep in mind, that other persons that have access to this " +"computer may easily log in to your account, if this option is enabled." 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" +"Wenn Sie diese Option aktivieren, wird KMess ihr Zugangspasswort speichern. " +"Dadurch müssen Sie Ihr Passwort nicht mehr bei jedem Start eingeben, um sich " +"anzumelden. Bitte beachten Sie, dass andere Personen, die zu diesem Computer " +"Zugriff haben, sich einfach mit Ihrem Zugang anmelden könnten, wenn diese " +"Option aktiviert ist." + +#. i18n: file: settings/accountpage.ui:120 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:369 +msgid "&Remember password" +msgstr "Passwo&rt speichern" + +#. i18n: file: settings/accountpage.ui:236 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:375 +msgid "C&hange..." +msgstr "Ändern ..." + +#. i18n: file: settings/accountpage.ui:261 +#. i18n: ectx: property (toolTip), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:381 +msgid "Enable this option, if you do not want to use a display picture." +msgstr "" +"Aktivieren Sie diese Option, falls Sie kein Anzeigebild verwenden möchten," + +#. i18n: file: settings/accountpage.ui:264 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "Kein Anzeigebil&d" + +#. i18n: file: settings/accountpage.ui:294 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +msgid "" +"The option \"Remember account\" was left unchecked while logging in, " +"so your settings will not be saved by default. Enable this option if you " +"want to save your account settings permanently on this system.\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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." +msgstr "" +"Die Option „Zugang speichern“ wurde beim Anmelden nicht aktiviert, " +"weshalb 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 Option zu aktivieren, es sei denn Sie benutzen KMess " +"als Gast, oder auf einem öffentlichem System (z.B. im Internetcafe)." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Mit diesem Account beim Starten automatisch &Anmelden." +#. i18n: file: settings/accountpage.ui:297 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "Einstellungen dieses Zugangs speichern" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:307 +#. i18n: ectx: property (toolTip), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 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: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Status beim Anmelden:" +#. i18n: file: settings/accountpage.ui:310 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +msgid "Log in &with this account automatically" +msgstr "Mit diesem Zugang automatisch anmelden" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:322 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Anmelden &als" + +#. i18n: file: settings/accountpage.ui:335 +#. i18n: ectx: property (whatsThis), widget (QComboBox, initialStatus_) +#: rc.cpp:410 +msgid "Here you can select which status KMess should set, after logging in." +msgstr "" +"Hier können Sie auswählen welchen Status KMess, nach der Anmeldung, " +"verwenden soll." + +#. i18n: file: settings/accountpage.ui:378 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:413 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Sie müssen sich mit der Passport-Seite verbinden, um zu bestätigen, dass " +"Ihre E-Mail-Adresse existiert." + +#. i18n: file: settings/accountpage.ui:381 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:416 +msgid "" +"You cannot 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: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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." - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "Request verification email" -msgstr "Fordere Verifizierungsmail an" +msgstr "Bestätigungs-E-Mail anfordern" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:427 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:425 msgid "Go to accountservices.passport.net" -msgstr "Gehe zu accountservices.passport.net" +msgstr "Besuche accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:446 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:428 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"Sie benötigen einen Passport-Zugang, um sich mit dem Live-Messenger-" +"Netzwerk zu verbinden. Sie können Ihre aktuelle E-Mail-Adresse unter " +"register.passport.com registrieren, oder einen „Live Mail“-Zugang verwenden." +"" + +#. i18n: file: settings/accountpage.ui:449 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:431 +msgid "" +"To connect to the Live 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 Live-Messenger-Dienst verbinden zu können, ist es nötig " +"einen Passport-Zugang mit einer E-Mail-Adresse einzurichten." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:489 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "Register new account" -msgstr "Einen neuen Account registrieren" +msgstr "Einen neuen Zugang erstellen" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:492 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:495 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:440 msgid "Go to register.passport.com" -msgstr "Gehe zu register.passport.com" +msgstr "Besuche register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Alarme" +#. i18n: file: settings/accountpage.ui:513 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:443 +msgid "&Status Options" +msgstr "&Status-Optionen:" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Popupbenachrichtigungen" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Benachrichtigungen anzeigen, wenn ein Kontakt:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "&Online geht" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:519 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when you " +"are 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 ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"sich mit MSN verbindet." +"Ist diese Option aktiviert, wird Ihr Status automatisch auf „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/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Einen &Chat mit Ihnen startet" +#. i18n: file: settings/accountpage.ui:522 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:449 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Status auf „Inaktiv“ setzen wenn abwesend" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountpage.ui:553 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:572 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:579 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:455 rc.cpp:461 rc.cpp:464 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"eine Unterhaltung mit Ihnen beginnt." +"Diese Option stellt ein, nach wievielen Minuten KMess den Status auf " +"„Inaktiv“ setzen soll." -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "Ihnen eine &Nachricht sendet" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"Ihnen eine Nachricht sendet." - -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Seinen S&tatus ändert" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"seinen Status ändert." - -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "O&ffline geht" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -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: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Eine Benachrichtigung anzeigen, wenn Sie eine Email em&pfangen" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Popubs ausblenden nach" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Kontrolliert die Sekunden bis ein Popup wieder ausgeblendet wird." - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "Sekunden" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" -"Das Chat&fenster wackeln wenn ein Rrrrring gesendet oder empfangen wird" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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 "" -"

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.

" - -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Kontakte darüber informieren &welchen Musiktitel ich gerade höre." - -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" -"Wenn aktiviert, informiert KMess darüber was Sie gerade hören. Diese " -"Information wird von dem aktuell aktiven Audioplayer empfangen." - -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Status auf \"Abwesen&d-Idle\" setzen wenn inaktiv" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Wenn aktiviert, wird Ihr Status automatisch auf \"Abwesend-Idle\" gesetzte, " -"wenn Sie Ihren Computer für einige Minuten nicht benutzen." - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format +#. i18n: file: settings/accountpage.ui:556 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:458 msgid "Become idle after" -msgstr "Als Abwesend anzeigen nach" +msgstr "Als inaktiv gelten nach" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -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: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:582 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:467 msgid "minutes" msgstr "Minuten" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Chatverlauf" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "&Alle Chats speichern" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Wenn aktiviert alle Chats werden in einem bestimmten Verzeichnis gespeichert." - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Chats in diesem Verzeichnis speichern: " - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/accountpage.ui:615 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 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: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Sortiere Chatordner nach:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -"KMess erstellt automatisch Unterverzeichnisse, wenn Sie die Chats nach Jahr, " -"Monat oder Tag organisieren." -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/accountpage.ui:618 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:473 +#, fuzzy +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"Auto-Inaktivität kann nicht aktiviert werden: KMess ist ohne " +"Inaktivitätserkennung gebaut worden." + +#. i18n: file: settings/accountpage.ui:644 +#. i18n: ectx: property (toolTip), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:476 +msgid "" +"If enabled, you will not receive any notifications when your status is set " +"to \"Busy\"." +msgstr "" +"Wenn aktiviert, werden Sie keine Benachrichtigungen erhalten, wenn Ihr " +"Status auf „Beschäftigt“ gesetzt ist." + +#. i18n: file: settings/accountpage.ui:647 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:479 +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "" +"&Benachrichtigungen deaktivieren, falls Ihr Status auf „Beschäftigt“ gesetzt " +"ist" + +#. i18n: file: settings/accountsmanagerpage.ui:26 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:482 +msgid "Saved accounts:" +msgstr "Gespeicherte Zugänge:" + +#. i18n: file: settings/accountsmanagerpage.ui:76 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:485 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" +"Klicken Sie hier, um einen neuen KMess-Zugang mit einer E-Mail-Adresseeines " +"bereits registrierten Live-Zugangs zu erstellen." + +#. i18n: file: settings/accountsmanagerpage.ui:79 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:488 +msgid "&Add Account..." +msgstr "Zug&ang hinzufügen ..." + +#. i18n: file: settings/accountsmanagerpage.ui:92 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:494 +msgid "Select an account and click here to modify it" +msgstr "" +"Wählen Sie einen Zugang aus und klicken Sie hier, um ihn zu bearbeiten." + +#. i18n: file: settings/accountsmanagerpage.ui:95 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:497 +msgid "&Edit" +msgstr "B&earbeiten" + +#. i18n: file: settings/accountsmanagerpage.ui:108 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:503 +msgid "Select an account and click here to remove it" +msgstr "Wählen Sie einen Zugang aus und klicken Sie hier, um ihn zu entfernen." + +#. i18n: file: settings/accountsmanagerpage.ui:111 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:506 +msgid "&Remove" +msgstr "&Löschen" + +#. i18n: file: settings/chatloggingpage.ui:17 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:512 +msgid "Enable this option to have your chats saved for later viewing" +msgstr "" +"Aktivieren Sie diese Option, wird KMess ihre Chats protokollieren, so dass " +"Sie sie später erneut betrachten können." + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:515 +#, fuzzy +msgid "" +"

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

\n" +"

The chat logs 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 Sie die Chat-Protokollierung aktivieren, wird jeder Chat den " +"Sie haben, an einem Ort den Sie unten bestimmen können, gespeichert.

\n" +"

Die Chat-Protokolle 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: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:521 +msgid "Enable chat logging" +msgstr "Chat-Protokollierung aktivieren" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:524 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"Wenn aktiviert, kann KMess Ihre Chat-Protokolle zusätzlich auch als HTML-" +"Dokumente oder als einfachem Text speichern." + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:527 +msgid "Additionally save chat logs to file" +msgstr "Chats zusätzlich als Dateien speichern" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:530 +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:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:533 +msgid "Save chat logs as:" +msgstr "Chat-Protokolle speichern als:" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +#, fuzzy +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\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: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:543 +msgid "Web Pages (HTML)" +msgstr "Webseiten (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:546 +msgid "Plain Text" +msgstr "Einfache Textdateien" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:549 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Diese Optionen erlauben Ihnen auszuwählen, wie KMess ihre protokollierten " +"Chats, im unten angegebenen Verzeichnis, organisieren soll." + +#. i18n: file: settings/chatloggingpage.ui:137 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:552 +#, fuzzy +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 "" +"Je nachdem welche Option Sie hier auswählen, wird KMess einige Verzeichnisse " +"erstellen, um Ihre protokollierten Chats zu organisieren. Benutzen Sie die " +"„Was ist das?“-Funktion auf einer bestimmten Option, um mehr Informationen " +"darüber zu erhalten." + +#. i18n: file: settings/chatloggingpage.ui:140 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:555 +msgid "Separate logged chats by:" +msgstr "Protokollierte Chats ordnen nach:" + +#. i18n: file: settings/chatloggingpage.ui:156 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +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:163 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:561 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/date-and-contact-name.html

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:166 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:568 msgid "Year" msgstr "Jahr" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Monat" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Tag" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Chats in diesem Verzeichnis speichern: " - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Ihre Schriftart" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "Diese Schriftart und Farbe wird in Ihren Chatnachrichten verwendet." - -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" +#. i18n: file: settings/chatloggingpage.ui:182 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +#, fuzzy +msgid "Create directories to organize chats by year then by month" msgstr "" -"Nachrichten von anderen Kontakten zwingen diese Schriftart zu benutzen:" +"KMess erstellt automatisch Unterverzeichnisse, wenn Sie die Chat-Protokolle " +"nach Jahr, Monat, oder Tag organisieren lassen." -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:574 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"

This option tells KMess to divide your chat logs 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" +"

A chat had on November 29, 2008 will be saved in your chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/date-and-contact-name.html

" msgstr "" -"Erlaubt die Schriftart und Farbe der Nachrichten Ihrer Kontakte mit der " -"unten gewählten Schriftart und Farbe zu übergehen ." -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Chat Style:" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:580 +msgid "Year then Month" +msgstr "Jahr dann Monat" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +#, fuzzy +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: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:586 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:593 +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:596 +msgid "Place all saved chat logs 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:599 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:602 +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:605 +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:611 +msgid "The directory where all your chat logs will be saved" +msgstr "Das Verzeichnis in dem alle Ihre Chat-Protokolle gespeichert werden" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:614 +msgid "Choose a directory where you would like to save your 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:617 +msgid "Save chat logs in the following directory:" +msgstr "Chat-Protokolle im folgenden Verzeichnis speichern:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:620 +msgid "St&yle" +msgstr "Stil" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:623 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 " +"Erlaubt Ihnen das Design zu wechseln, mit dem KMess die Chatnachrichten " "anzeigt." -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Graphiken in Chatnachrichten &anzeigen" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:626 +msgid "&Chat style:" +msgstr "&Chat-Stil:" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Aktiviert die Anzeige von Emoticons in Chats." +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:629 +msgid "Get &New Styles..." +msgstr "Neue Designs ..." -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Zeigt die &Zeit an in Chatsnachrichten" +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:632 +msgid "Chat Settings" +msgstr "Chat-Einstellungen" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (toolTip), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:635 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Aktiviert die Anzeige von Emoticons im Chatfenster." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:638 +msgid "&Show emoticons" +msgstr "Emoticon&s anzeigen" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:644 +msgid "Enables the appearance of winks in the chat window." +msgstr "Aktiviert die Anzeige von Emoticons im Chatfenster." + +#. i18n: file: settings/chatstylepage.ui:246 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:647 +msgid "" +"If enabled, winks you send or receive will be displayed in the chat window. " +"Please note that in order to use this feature, you need to have a working " +"Flash-plugin installed." +msgstr "" +"Falls aktiviert, werden gesendete oder empfangene Animoticons im " +"Chatfenster angezeigt. Beachten Sie bitte, dass um diese Funktion nutzen zu " +"können, ein funktionierendes Flash-Plugin installiert sein muss." + +#. i18n: file: settings/chatstylepage.ui:249 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:650 +msgid "Show &winks" +msgstr "&Animoticons anzeigen" + +#. i18n: file: settings/chatstylepage.ui:256 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:653 +#, 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 "" +"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:259 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:656 +msgid "&Group follow-up messages from the same contact" +msgstr "Aufeinanderfolgende Nachrichten vom selben Kontakt &gruppieren" + +#. i18n: file: settings/chatstylepage.ui:285 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:662 msgid "Enables the appearance of a timestamp in each chat message." msgstr "Aktiviert die Anzeige von Zeitstempeln in jeder Chatnachricht." -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" +#. i18n: file: settings/chatstylepage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:665 +msgid "S&how timestamp" +msgstr "Zeitstempel anzeigen" + +#. i18n: file: settings/chatstylepage.ui:319 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:671 +msgid "Show &date" +msgstr "&Datum anzeigen" + +#. i18n: file: settings/chatstylepage.ui:349 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:674 +msgid "Show s&econds" +msgstr "S&ekunden anzeigen" + +#. i18n: file: settings/chatstylepage.ui:362 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:677 +msgid "&Text" +msgstr "&Text" + +#. i18n: file: settings/chatstylepage.ui:374 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:680 +msgid "This is the font style and color used in your chat messages." msgstr "" -"Schrifteffekte in Nachrichten &benutzen, z.B. *fett*, /kursiv/ und " +"Diese Schriftart und -farbe wird in Ihren Chatnachrichten verwendet werden." + +#. i18n: file: settings/chatstylepage.ui:377 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:683 +msgid "Your &message font:" +msgstr "Schriftart für Ihre Nachrichten:" + +#. i18n: file: settings/chatstylepage.ui:458 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:686 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" +"Diese Option erlaubt es Ihnen die Schriftart und -farbe der Nachrichten " +"Ihrer Kontakte, mit der gewählten Schriftart und -farbe zu ersetzen." + +#. i18n: file: settings/chatstylepage.ui:461 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:689 +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:536 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:692 +msgid "Chat Window Formatting" +msgstr "Chatfenster-Formatierung" + +#. i18n: file: settings/chatstylepage.ui:542 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:695 +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:545 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:698 +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/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableChatFormattingCheckBox_) +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:704 rc.cpp:771 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"Enables the use of \"Messenger Plus!\" formattings in the chat window. " +"For example, [b]this text[/b] will be replaced with this text." msgstr "" -"Aktiviert die Benutzung von Schrifteffekten. Wenn Sie *fett*, /kursiv/ und " -"_unterstrichen_ eingeben, erscheinen die Wörter entsprechend formatiert." +"Aktiviert die Verwendung von „Messenger Plus!“-Formatierungen im " +"Chatfenster. Zum Beispiel wird, „[b]Beispieltext[/b]“ mit „Beispieltext<" +"/b>“ ersetzt " +"." -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "Gruppiere anschließende Nachrichten von dem selben Kontakt." +#. i18n: file: settings/chatstylepage.ui:558 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:707 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "„Messenger Plus!“-Formatierung aktivieren" -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:582 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:710 +msgid "&Behavior" +msgstr "&Verhalten" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:713 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." +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" -"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." +"

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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "EMail Programm" +#. i18n: file: settings/chatstylepage.ui:592 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:717 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Chatfenster &wackeln, wenn ein „Rrring!“ gesendet oder empfangen wird" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:602 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:723 +#, fuzzy msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." +"If this option is enabled, your own display picture will be shown in the " +"contacts panel, along with the pictures of the contacts in that chat." msgstr "" -"Erlaubt Ihnen das Mailprogramm auszuwählen, welches KMess öffnet um Ihre " -"Emails zu lesen." +"Ist diese Option aktiviert, wird Ihr eigenes Anzeigebild in der " +"Kontaktseitenleiste, neben den Anzeigebildern der anderen Kontakte im " +"jeweiligen Chat, angezeigt." -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Hotmail benutzen" +#. i18n: file: settings/chatstylepage.ui:605 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:726 +msgid "Display your own &display picture in the chat window" +msgstr "Ihr eigenes Anzeigebil&d im Chatfenster anzeigen" -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Speziellen Befehl ausführen:" +#. i18n: file: settings/chatstylepage.ui:630 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:729 +msgid "G&roup chats in the same window:" +msgstr "Chats im selben Fenster g&ruppieren:" -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Emailbenachrichtigung" +#. i18n: file: settings/chatstylepage.ui:650 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:732 +msgid "Always" +msgstr "Immer" -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Emailinformationen in der Kontaktliste anzeigen" +#. i18n: file: settings/chatstylepage.ui:655 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:735 +msgid "For contacts in the same group" +msgstr "Bei Kontakten in der selben Gruppe" -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:738 +msgid "Never" +msgstr "Nie" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:741 +msgid "Display Options" +msgstr "Anzeige-Einstellungen" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:744 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." +"If enabled, a notification is shown when an email message is received in " +"your inbox. The number of unread email messages is shown above the contact " +"list. This option is only available for Live Mail 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." +"Ist diese Option aktiviert, wird eine Benachrichtigung 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 „Live Mail“-Zugänge verfügbar." -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "" -"Eine Benachrichtigung anzeigen, wenn eine EMail\n" -"in einem \"anderen Ordner\" angekommen ist" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:747 +msgid "Display a count of &unread mail" +msgstr "Anzahl der &ungelesenen E-Mails anzeigen" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:750 +#, fuzzy msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"If enabled, your contacts can see which song you are listening to. This " +"information is retrieved from the currently active media player." 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." +"Ist diese Option aktiviert, können Ihre Kontakte sehen, welches Lied " +"Sie gerade hören. Diese Information wird vom aktuell aktiven Medien-Player " +"abgerufen." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:753 +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:46 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:759 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" +"Wenn aktiviert, wird das KMess-Logo im Hintergrund der Kontakliste angezeigt." + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:762 +msgid "Show background &image" +msgstr "H&intergrundbild anzeigen" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:768 +msgid "List Formatting" +msgstr "Kontaktlisten-Formatierung" + +#. i18n: file: settings/contactlistpage.ui:71 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:774 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "„Messenger Plus!“-Formatierung aktivieren" + +#. i18n: file: settings/contactlistpage.ui:78 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:777 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "Die &E-Mail-Adresse der Kontakte, statt ihren Spitznamen anzeigen" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:780 msgid "&Emoticon Themes" -msgstr "&Emoticons Themes" +msgstr "&Emoticon-Designs" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "Verfügbare Emoticon Styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:783 +msgid "Available emoticon themes:" +msgstr "Verfügbare Emoticon-Designs:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:786 msgid "&Custom Emoticons" -msgstr "E&igene Emoticons" +msgstr "Eigene Emoti&cons" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Eigene Emoticons für diesen Account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:789 +msgid "Available custom emoticons:" +msgstr "Verfügbare eigene Emoticons:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "N&eues hinzufügen..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:792 +msgid "Click here to add a new custom emoticon" +msgstr "Klicken Sie hier, um ein neues Emoticon hinzuzufügen." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Klick" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:795 +msgid "Add Ne&w..." +msgstr "Hinzufügen ..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Klicken Sie hier um ein neues persönliches Emoticon hinzuzufügen, dass Sie " -"an Ihre Kontakte senden können." +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:801 +msgid "Click here to rename the selected emoticon" +msgstr "Klicken Sie hier um das ausgewählte Emoticon umzubenennen." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:804 msgid "Re&name" msgstr "Umbe&nennen" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "Klicken Sie hier um das gewählte Emoticon umzubenennen" +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:810 +msgid "Click here to remove the selected emoticon" +msgstr "Klicken Sie hier, um das ausgewählte Emoticon zu entfernen." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:813 msgid "Remo&ve" -msgstr "Ent&fernen" +msgstr "Entfernen" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -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: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:819 +msgid "Web Browser" +msgstr "Web-Browser" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "sagt:" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:822 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "Wählen Sie diese Option, um den von KDE benutzten Browser zu wählen." -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Bild öffnen und zuschneiden..." +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:825 +msgid "&Use the KDE default browser" +msgstr "Den von KDE ben&utzten Web-Browser verwenden" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Mein Bild" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Herunterladen von Mein Bild fehlgeschlagen" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:828 rc.cpp:863 +msgid "Select this option to choose from a list of installed browsers." msgstr "" -"Beim Versuch Mein Bild zu ändern ist ein Fehler aufgetreten.\n" -"Bitte überprüfen Sie , ob Sie ein korrektes Bild ausgewählt haben." +"Wählen Sie diese Option, um aus einer Liste von installierten Browsern zu " +"wählen." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Einstellungen" +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:831 +msgid "&Use an installed browser:" +msgstr "Folgenden Web-Browser verwenden:" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Konto" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Chatten" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Sind Sie sicher, dass Sie dieses Profil löschen möchten?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Hi, wie geht es Dir? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Stacy" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Gut!" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Ich komme /gerade/ zurück von meinem Urlaub aus Italien!" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:834 rc.cpp:869 +msgid "Choose this option to enter the path to your favorite browser." 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." +"Wählen Sie diese Option, um den Pfad zu Ihrem bevorzugten Browser einzugeben." -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Docke im System Tray" +#. 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:837 rc.cpp:872 +msgid "&Specify a custom command:" +msgstr "Einen benutzerdefinierten Befehl eingeben:" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. 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:841 rc.cpp:876 +#, 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 Verknüpfungen öffnen soll. " +"Das „%u“ wird mit der URL der Verknüpfung ersetzt." -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:845 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Verwenden Sie „%u“, um die URL in die Befehlszeile einzufügen." -#~ msgid "The current status of your contact." -#~ msgstr "Der aktuelle Status von Ihrem Kontakt." +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:848 +msgid "Email Client" +msgstr "E-Mail-Programm" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:851 +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: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:854 +msgid "Use &Live Mail if the account supports it" +msgstr "&Live-Mail benutzen, wenn der Zugang es unterstützt" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:857 +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: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:860 +msgid "Use the &KDE default email client" +msgstr "Das von &KDE benutzte E-Mail-Programm verwenden" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:866 +msgid "Use an &installed email client:" +msgstr "Folgendes E-Ma&il-Programm verwenden:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:880 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" +"Verwenden Sie „%u“, um die E-Mail-Adresse in die Befehlszeile einzufügen." + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:886 +msgid "&Save all received files in one directory:" +msgstr "Empfangene Dateien im folgenden Ordner &speichern:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:892 +msgid "&Use ports between" +msgstr "Ports zwischen" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:895 +msgid "and" +msgstr "und" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:898 +msgid "for file transfers" +msgstr "für Dateiübertragungen verwenden" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about something you liked" +msgstr "" +"Klicken Sie hier, um den Entwicklern über etwas was Ihnen gefällt zu " +"berichten" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:904 rc.cpp:911 rc.cpp:918 rc.cpp:925 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:908 +msgid "Click here to tell the developers about something you did not like" +msgstr "" +"Klicken Sie hier, um den Entwicklern über etwas was Ihnen nicht gefällt zu " +"berichten." + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:915 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" +"Klicken Sie hier, um den Entwicklern über ein Problem in der Anwendung zu " +"berichten" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:922 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:929 +msgid "Your comment:" +msgstr "Ihr Kommentar:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:932 +msgid "Your comment is about:" +msgstr "Ihr Kommentar handelt von:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:935 +msgid "Something you like" +msgstr "Etwas was Ihnen gefällt" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:938 +msgid "Something you dislike" +msgstr "Etwas was Ihnen nicht gefällt" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:941 +msgid "An improper behavior of the application" +msgstr "Einem fehlerhaften Verhalten der Anwendung" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:944 +#, fuzzy +msgid "A new feature you desire" +msgstr "Eine neue Fähigkeit die sie wünschen" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:947 +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 (QLabel, label) +#: rc.cpp:950 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +"Your email address will not be used for anything else but this report." +msgstr "" + +#~ msgctxt "Message shown in the chat window (when the wink name is unknown)" +#~ msgid "You have sent a wink!" +#~ msgstr "Sie haben ein Animoticon gesendet!" + +#~ msgctxt "Contacts counters in normal group tooltip" +#~ msgid "%1 contact, %2 online" +#~ msgid_plural "%1 contacts, %2 online" +#~ msgstr[0] "%1 Kontakt, %2 online" +#~ msgstr[1] "%1 Kontakte, %2 online" + +#~ msgid "I'm away from my computer" +#~ msgstr "Ich bin nicht an meinem Computer" + +#~ msgid "You have not chatted with this contact yet." +#~ msgstr "Sie haben mit diesem Kontakt noch kein Chat gehabt." + +#~ 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." + +#~ msgid "Click here to delete the selected emoticon" +#~ msgstr "Klicken Sie hier um das ausgewählte Emoticon zu löschen." + +#, fuzzy +#~ msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +#~ msgid "" +#~ "It is currently not possible to send a handwritten message to %1, " +#~ "due to an incompatibility with Windows Live Messenger 8.5." +#~ msgstr "" +#~ "Es ist zur Zeit nicht möglich eine handgeschriebene Nacricht an %1, " +#~ "wegen einer Inkompatibilität zu Windows Live Messenger 8.5 zu senden." + +#~ msgid "I&mages" +#~ msgstr "Anzeigebilder" + +#~ msgid "Ink message" +#~ msgstr "Zeichnungsmodus" + +#, fuzzy +#~ msgid "" +#~ "If you have added any custom emoticons, click this button to view them, " +#~ "so you can easily insert them in your messages." +#~ msgstr "" +#~ "Falls Sie schon eigene Emoticons hinzugefügt haben, klicken Sie hier, um " +#~ "sie anzuzeigen und in Ihren Nachrichten verwenden zu können." + +#~ msgid "&Do not filter" +#~ msgstr "Nicht &filtern" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "" +#~ "Eine Benachrichtigung anzeigen, wenn der Kontakt online/offline geht" + +#~ msgid "File format used for saving:" +#~ msgstr "Chat-Protokolle speichern als:" + +#~ 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!" + +#~ msgid "Ed&it Notes" +#~ msgstr "Notizen bearbeiten" + +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Bild löschen" + +#~ msgid "Search for C&ontact" +#~ msgstr "Nach K&ontakt suchen" + +#~ msgid "Search by &Interest" +#~ msgstr "Kontakt nach &Interesse suchen" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "pano_90@gmx.net" + +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "" +#~ "Der Kontakt hat eine MSN6-Funktion ausgeführt, die KMess noch nicht " +#~ "unterstützt." + +#~ 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." + +#, fuzzy +#~ msgid "Conversations Filter" +#~ msgstr "Unterhaltung begonnen am: %2" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "" +#~ "Wählen Sie den Zugang den Sie bearbeiten möchten, aus und klicken Sie " +#~ "anschließend hier." + +#~ 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." + +#~ 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." + +#~ 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..99206c1 --- /dev/null +++ b/po/el.po @@ -0,0 +1,6432 @@ +# 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-04-28 19:43+0200\n" +"PO-Revision-Date: 2009-04-26 21:30+0200\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" + +#: account.cpp:45 +msgid "I am away from my computer" +msgstr "" + +#: account.cpp:54 +msgid "Your name" +msgstr "" + +#: account.cpp:57 settings/accountpage.cpp:217 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "" + +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "" + +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Διαγραφή" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Πρόβατο" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "" +"Η συζήτηση ειναι ανενεργή, ο χρήστης %1 έφυγε από τη συνομιλία." + +#: chat/chat.cpp:197 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "Ο χρήστης %1 έφυγε από τη συνομιλία." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 και %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Λάβατε ενα wink από τον χρήστη %1" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Λάβατε ενα wink από τον χρήστη %1" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Παρουσιάστηκε πρόβλημα στην σύνδεση." + +#: chat/chat.cpp:1154 +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:1167 +#, kde-format +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." +msgstr "" + +#: chat/chat.cpp:1181 +#, kde-format +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:1196 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "" + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the
account " +"settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 σας έστειλε ένα wink!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 σας έστειλε ένα wink!" + +#: chat/chat.cpp:1291 +#, kde-format +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." +msgstr "" + +#: chat/chat.cpp:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" + +#: chat/chat.cpp:1312 +#, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" + +#: chat/chat.cpp:1333 +#, kde-format +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:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" + +#: chat/chat.cpp:1384 +#, fuzzy, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 αυτή τη στιγμή είναι εκτός σύνδεσης. Όλα τα μηνύματα που στέλνετε " +"θα παραδοθούν την επόμενη φορά που ο χρήστης θα είναι συνδεδεμένος." + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 σας έστειλε ένα wizz!" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "" + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Στείλατε μία ειδοποίηση στον %1 !" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Στείλατε μία ειδοποίηση!" + +#: chat/chat.cpp:1698 +#, fuzzy, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" +"%1 αυτή τη στιγμή είναι εκτός σύνδεσης. Όλα τα μηνύματα που στέλνετε " +"θα παραδοθούν την επόμενη φορά που ο χρήστης θα είναι συνδεδεμένος." + +#: chat/chatmaster.cpp:1387 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 σας στέλνει ένα wink : %2" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format +msgid "%1 says:" +msgstr "Ο χρήστης %1 λεεί:" + +#: chat/chatmessageview.cpp:322 +#, fuzzy, kde-format +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
Ξεκίνησε στις : %s" + +#: chat/chatmessageview.cpp:366 +#, fuzzy, kde-format +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 "Η συνομιλία ξεκίνησε στις : %s" + +#: chat/chatmessageview.cpp:406 +#, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Αποθηκευμένες συνομιλίες KMess με %1" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:653 +#, kde-format +msgid "Add this emoticon: %1" +msgstr "Προσθέστε αυτό το εικονίδιο διάθεσης : %1" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Επανασύνδεση" + +#: chat/chatview.cpp:299 +#, kde-format +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, kde-format +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 "Hide this &Emoticon" +msgstr "Προσθέστε αυτό το &εικονίδιο διάθεσης..." + +#: chat/chatview.cpp:833 +msgid "Send &Email" +msgstr "Αποστολή &email" + +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Προσθήκη επαφής" + +#: chat/chatview.cpp:841 +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:503 +msgid "C&lear Chat" +msgstr "Καθαρισμός συνομιλίας" + +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Αποθήκευση της συνομιλίας σε &αρχείο..." + +#: chat/chatwindow.cpp:115 +msgid "Contacts" +msgstr "Επαφές" + +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:337 +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:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Κλείσιμο μίας καρτέλας συνομιλίας" + +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "Κλείσιμο όλων των καρτελών" + +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Κλείσιμο τρέχουσας καρτέλας" + +#: chat/chatwindow.cpp:418 +msgid "&Invite..." +msgstr "&Πρόσκληση..." + +#: chat/chatwindow.cpp:419 +msgid "Send a &File..." +msgstr "Αποστολή αρχείου" + +#: chat/chatwindow.cpp:420 +msgid "Webcam Chat" +msgstr "Συνομιλία με Webcam" + +#: chat/chatwindow.cpp:421 +msgid "Start a &Meeting" +msgstr "Πρόσκληση σε συνδιάλεξη" + +#: chat/chatwindow.cpp:422 +msgid "Send a &Nudge!" +msgstr "Αποστολή μίας ειδοποίησης!" + +#: chat/chatwindow.cpp:423 +msgid "Save Chat..." +msgstr "Αποθήκευση της συνομιλίας..." + +#: chat/chatwindow.cpp:424 +msgid "Close &All Tabs" +msgstr "Κλείσιμο όλων των καρτελών" + +#: chat/chatwindow.cpp:429 +msgid "Change &Font" +msgstr "Τροποποίηση &γραμματοσειράς" + +#: chat/chatwindow.cpp:430 +msgid "Change Font &Color" +msgstr "Αλλαγή χρώματος γραμματοσειράς" + +#: chat/chatwindow.cpp:437 +msgid "Show &Emoticons" +msgstr "Εμφάνιση εικονιδίων διάθεσης" + +#: chat/chatwindow.cpp:438 +msgid "Show S&tatus Messages" +msgstr "Εμφάνιση μηνυμάτων κατάστασης" + +#: chat/chatwindow.cpp:444 +msgid "&Panels" +msgstr "&Πίνακες" + +#: chat/chatwindow.cpp:447 +msgid "Use &Spell Checking" +msgstr "Χρήση &Ορθογραφίας" + +#: chat/chatwindow.cpp:451 +msgid "Meeting" +msgstr "Συνδιάλεξη" + +#: chat/chatwindow.cpp:452 +msgid "Nudge" +msgstr "Ειδοποίηση" + +#: chat/chatwindow.cpp:453 +msgid "Send a &File" +msgstr "Αποστολή αρχείου" + +#: chat/chatwindow.cpp:456 chat/chatwindow.cpp:457 +msgid "P&revious Tab" +msgstr "Προηγούμενη καρτέλα" + +#: chat/chatwindow.cpp:458 chat/chatwindow.cpp:459 +msgid "Ne&xt Tab" +msgstr "Επόμενη καρτέλα" + +#: chat/chatwindow.cpp:474 +msgid "Enable or disable the contacts panel" +msgstr "" + +#: chat/chatwindow.cpp:475 chat/chatwindow.cpp:476 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Επαφές" + +#: chat/chatwindow.cpp:480 +msgid "Enable or disable the standard emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:481 chat/chatwindow.cpp:482 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:486 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "" +"Ενεργοποίηση ή απενεργοποίηση του πίνακα με τα προσωπικά εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:487 chat/chatwindow.cpp:488 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:500 +msgid "&Font" +msgstr "&Γραμματοσειρά" + +#: chat/chatwindow.cpp:501 +msgid "Font &Color" +msgstr "&Χρώμα γραμματοσειράς" + +#: chat/chatwindow.cpp:502 +msgid "C&lear Chat Window" +msgstr "Καθαρισμός παραθύρου συνομιλίας" + +#: chat/chatwindow.cpp:570 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:993 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:996 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1059 +#, fuzzy +msgid "You cannot use the /block command in a group chat." +msgstr "" +"Δεν μπορείτε να βάλετε φραγή σε κάποιον που είναι σε μια ομάδα " +"συνομιλίας." + +#: chat/chatwindow.cpp:1061 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1072 +#, fuzzy +msgid "You cannot use the /unblock command in a group chat." +msgstr "" +"Δεν μπορείτε να βάλετε φραγή σε κάποιον που είναι σε μια ομάδα " +"συνομιλίας." + +#: chat/chatwindow.cpp:1074 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1104 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Άγνωστη εντολή" + +#: chat/chatwindow.cpp:1573 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Συνομιλία" + +#: chat/chatwindow.cpp:1577 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Συνομιλία" + +#: chat/chatwindow.cpp:1597 kmessinterface.cpp:674 +#, kde-format +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:1601 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1854 +#, kde-format +msgid "%1 is typing..." +msgstr "Ο χρήστης %1 πληκτρολογεί..." + +#: chat/chatwindow.cpp:1864 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "Οι χρηστές %1 και %2 πληκτρολογούν..." + +#: chat/chatwindow.cpp:1868 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "Οι χρηστές %1, %2 και %3 άλλοι πληκτρολογούν..." + +#: chat/chatwindow.cpp:2252 +msgctxt "Label text" +msgid "" +"Handwriting is disabled: KMess cannot send drawings to some of the contacts." +msgstr "" + +#: chat/chatwindow.cpp:2257 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to some of the contacts." +msgstr "" + +#: chat/chatwindow.cpp:2374 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "&Ξεκινήστε Ιδιωτική Συνομιλία" + +#: chat/contactframe.cpp:298 kmessview.cpp:609 +msgid "&Send Email" +msgstr "Αποστολή Email" + +#: chat/contactframe.cpp:299 kmessview.cpp:610 +msgid "&View Profile" +msgstr "Προβολή προφίλ" + +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:612 +msgid "&Properties" +msgstr "&Ιδιότητες" + +#: chat/contactframe.cpp:303 kmessview.cpp:614 +msgid "&Add Contact" +msgstr "Προσθήκη επαφής" + +#: chat/contactframe.cpp:304 kmessview.cpp:615 +msgid "A&llow Contact" +msgstr "" + +#: chat/contactframe.cpp:305 kmessview.cpp:618 +msgid "&Delete Contact" +msgstr "&Διαγραφή επαφής" + +#: chat/contactframe.cpp:307 kmessview.cpp:616 +msgid "&Block Contact" +msgstr "&Φραγή επαφής" + +#: chat/contactframe.cpp:308 kmessview.cpp:617 +msgid "&Unblock Contact" +msgstr "&Αναίρεση φραγής επαφής" + +#: chat/contactframe.cpp:310 kmessview.cpp:621 +msgid "&Friendly Name" +msgstr "Ψευδώνυμο" + +#: chat/contactframe.cpp:311 kmessview.cpp:622 +msgid "&Personal Message" +msgstr "" + +#: chat/contactframe.cpp:312 kmessview.cpp:623 +msgid "&Email Address" +msgstr "Διεύθυνση &email" + +#: chat/contactframe.cpp:313 kmessview.cpp:624 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Πληροφορίες" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Εμφάνιση εικόνας" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "&Σημειώσεις" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "&Εικονίδια διάθεσης" + +#: chat/contactframe.cpp:347 kmessview.cpp:659 +msgid "&Copy" +msgstr "&Αντιγραφή" + +#: chat/contactframe.cpp:753 +msgid "Blocked" +msgstr "Σε φραγή" + +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Πρόσκληση επαφών" + +#: chat/emoticonswidget.cpp:289 +#, fuzzy +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" +"

Δεν έχετε κανένα wink ακόμα.

Για να προσθέσετε νέα, " +"πείτε στις επαφές σας να σας στείλουν μερικά !

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

You do not have any winks yet.

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

" +msgstr "" +"

Δεν έχετε κανένα wink ακόμα.

Για να προσθέσετε νέα, " +"πείτε στις επαφές σας να σας στείλουν μερικά !

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Συμβατό με Windows Live Messenger %1" + +#: contact/contactbase.cpp:353 +msgid "Windows Live Messenger compatible" +msgstr "Συμβατό Windows Live Messenger" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Σε σύνδεση" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Απασχολημένος" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Απουσία" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Απουσία με αυτόματη απάντηση" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Αδρανής" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Παρατεταμένη απουσία" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Στο τηλέφωνο" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Για γεύμα" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Αόρατος" + +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Χώρίς σύνδεση" + +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Κατάσταση" + +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Αποσύνδεση" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Προσθήκη μίας επαφής" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 +#, fuzzy +msgid "Add New Emoticon" +msgstr "Προσθήκη νέου εικονιδίου διάθεσης" + +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "Επεξεργασία εικονιδίου διάθεσης" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +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:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Στυλ συνομιλίας :" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "" + +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Σύνδεση..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Διαχωρισμός καταγεγραμμένων συνομιλιών ανά :" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"σας πρόσθεσε στην λίστα επαφών του." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"σας πρόσθεσε στην λίστα επαφών του." + +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format +msgid "Contact Properties for %1" +msgstr "Ιδιότητες της επαφής %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1189 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Σε Σύνδεση" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1193 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1208 +msgid "No messages yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Τελευταία παρουσία: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Διεύθυνση email: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Πελάτης: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" +"Κάντε κλικ σε αυτό το κουμπί για να επαναφέρετε την εικόνα εμφάνισης αυτής " +"της επαφής" + +#: dialogs/contactpropertiesdialog.cpp:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Επαφές" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Προσκαλεσμένοι επαφές" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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 "Η εξαγωγή της λίστας τον επαφών ολοκληρώθηκε" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 +msgid "Network Window" +msgstr "Παράθυρο δικτύου" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "Αποθήκευση καρτέλας" + +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "Καθαρισμός καρτέλας" + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "Κλείσιμο όλων των καρτελών" + +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" + +#: dialogs/networkwindow.cpp:1130 +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:1177 +msgid "Cannot close the main connection tab." +msgstr "Αδύνατο το κλείσιμο του κεντρικού παραθύρου σύνδεσης." + +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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:766 +#: 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:741 +#, kde-format +msgid "%1 MB" +msgstr "%1 MB" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:746 +#, kde-format +msgid "%1 kB" +msgstr "%1 kB" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:750 +#, kde-format +msgid "%1 bytes" +msgstr "%1 bytes" + +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 από %2 λήφθηκαν." + +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "" + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:892 +msgid "File Transfers" +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:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Είστε σίγουροι ότι επιθυμείτε την διαγραφή αυτού του λογαριασμού;" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Εμφάνιση εικόνας" + +#: emoticontheme.cpp:627 +#, kde-format +msgid "" +"Could not save the emoticon theme. Make sure you have permission to write to " +"the theme folder '%1'." +msgstr "" + +#: emoticontheme.cpp:833 +msgid "Smile" +msgstr "" + +#: emoticontheme.cpp:834 +msgid "Wink" +msgstr "" + +#: emoticontheme.cpp:835 +msgid "Tongue out" +msgstr "" + +#: emoticontheme.cpp:836 +msgid "Big smile" +msgstr "" + +#: emoticontheme.cpp:837 +msgid "Sad" +msgstr "" + +#: emoticontheme.cpp:838 +msgid "Crying" +msgstr "" + +#: emoticontheme.cpp:839 +msgid "Angry" +msgstr "" + +#: emoticontheme.cpp:840 +msgid "Confused" +msgstr "" + +#: emoticontheme.cpp:841 +msgid "Embarrassed" +msgstr "" + +#: emoticontheme.cpp:842 +msgid "Disappointed" +msgstr "" + +#: emoticontheme.cpp:843 +msgid "Hot" +msgstr "" + +#: emoticontheme.cpp:844 +msgid "Baring teeth" +msgstr "" + +#: emoticontheme.cpp:845 +msgid "Nerd" +msgstr "" + +#: emoticontheme.cpp:846 +msgid "Sick" +msgstr "" + +#: emoticontheme.cpp:847 +msgid "Surprised" +msgstr "" + +#: emoticontheme.cpp:848 +msgid "Party" +msgstr "" + +#: emoticontheme.cpp:849 +msgid "Sleepy" +msgstr "" + +#: emoticontheme.cpp:850 +msgid "Thinking" +msgstr "" + +#: emoticontheme.cpp:851 +msgid "Don't tell anyone" +msgstr "" + +#: emoticontheme.cpp:852 +msgid "Secret telling" +msgstr "" + +#: emoticontheme.cpp:853 +msgid "Eye-rolling" +msgstr "" + +#: emoticontheme.cpp:854 +msgid "Sarcastic" +msgstr "" + +#: emoticontheme.cpp:855 +msgid "I don't know" +msgstr "" + +#: emoticontheme.cpp:856 +msgid "Be right back" +msgstr "Επιστρέφω αμέσως" + +#: emoticontheme.cpp:857 +msgid "Angel" +msgstr "Άγγελος" + +#: emoticontheme.cpp:858 +msgid "Left hug" +msgstr "" + +#: emoticontheme.cpp:859 +msgid "Boy" +msgstr "" + +#: emoticontheme.cpp:860 +msgid "Red heart" +msgstr "" + +#: emoticontheme.cpp:861 +msgid "Red rose" +msgstr "Λουλούδι" + +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "" + +#: emoticontheme.cpp:863 +msgid "Dog face" +msgstr "" + +#: emoticontheme.cpp:864 +msgid "Sun" +msgstr "Ήλιος" + +#: emoticontheme.cpp:865 +msgid "Devil" +msgstr "Διάβολος" + +#: emoticontheme.cpp:866 +msgid "Right hug" +msgstr "" + +#: emoticontheme.cpp:867 +msgid "Girl" +msgstr "" + +#: emoticontheme.cpp:868 +msgid "Broken heart" +msgstr "" + +#: emoticontheme.cpp:869 +msgid "Wilted rose" +msgstr "Μαραμένο λουλούδι" + +#: emoticontheme.cpp:870 +msgid "Thumbs down" +msgstr "" + +#: emoticontheme.cpp:871 +msgid "Cat face" +msgstr "" + +#: emoticontheme.cpp:872 +msgid "Sleeping half-moon" +msgstr "" + +#: emoticontheme.cpp:873 +msgid "Red lips" +msgstr "" + +#: emoticontheme.cpp:874 +msgid "Clapping" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Crossed fingers" +msgstr "" + +#: emoticontheme.cpp:876 +msgid "Auto" +msgstr "Αυτοκίνητο" + +#: emoticontheme.cpp:877 +msgid "Airplane" +msgstr "Αεροπλάνο" + +#: emoticontheme.cpp:878 +msgid "Turtle" +msgstr "Χελώνα" + +#: emoticontheme.cpp:879 +msgid "Snail" +msgstr "Σαλιγκάρι" + +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Πρόβατο" + +#: emoticontheme.cpp:881 +msgid "Goat" +msgstr "Κατσίκα" + +#: emoticontheme.cpp:882 +msgid "Vampire bat" +msgstr "Νυχτερίδα Βαμπίρ" + +#: emoticontheme.cpp:883 +msgid "Pizza" +msgstr "Πίτσα" + +#: emoticontheme.cpp:884 +msgid "Beer mug" +msgstr "Κούπα μπύρας" + +#: emoticontheme.cpp:885 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:886 +msgid "Coffee cup" +msgstr "" + +#: emoticontheme.cpp:887 +msgid "Birthday cake" +msgstr "Τούρτα" + +#: emoticontheme.cpp:888 +msgid "Plate" +msgstr "" + +#: emoticontheme.cpp:889 +msgid "Bowl" +msgstr "" + +#: emoticontheme.cpp:890 +msgid "Star" +msgstr "Αστέρας" + +#: emoticontheme.cpp:891 +msgid "Rainbow" +msgstr "Ουράνιο τόξο" + +#: emoticontheme.cpp:892 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:893 +msgid "Lightning" +msgstr "Αστραπή" + +#: emoticontheme.cpp:894 +msgid "Umbrella" +msgstr "Ομπρέλα" + +#: emoticontheme.cpp:895 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:896 +msgid "Telephone receiver" +msgstr "Συσκευή τηλεφώνου" + +#: emoticontheme.cpp:897 +msgid "Mobile Phone" +msgstr "Κινητό τηλέφωνο" + +#: emoticontheme.cpp:898 +msgid "Email" +msgstr "Email" + +#: emoticontheme.cpp:899 +msgid "Clock" +msgstr "Ρολόι" + +#: emoticontheme.cpp:900 +msgid "Camera" +msgstr "Κάμερα" + +#: emoticontheme.cpp:901 +msgid "Filmstrip" +msgstr "" + +#: emoticontheme.cpp:902 +msgid "Note" +msgstr "" + +#: emoticontheme.cpp:903 +msgid "Handcuffs" +msgstr "Χειροπέδες" + +#: emoticontheme.cpp:904 +msgid "Money" +msgstr "Χρήματα" + +#: emoticontheme.cpp:905 +msgid "Light bulb" +msgstr "Λάμπα" + +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "Τσιγάρο" + +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "Μπάλα ποδοσφαίρου" + +#: emoticontheme.cpp:908 +msgid "Gift with a bow" +msgstr "Δώρο" + +#: emoticontheme.cpp:909 +msgid "X-Box" +msgstr "X-Box" + +#: emoticontheme.cpp:910 +msgid "Computer" +msgstr "Υπολογιστής" + +#: emoticontheme.cpp:911 +#, fuzzy +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:375 +#, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" + +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Ο εξυπηρετητής δεν είναι διαθέσιμος" + +#: initialview.cpp:401 +#, kde-format +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:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "Σύνδεση" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "Ακύρωση" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Μη έγκυρη διεύθυνση email" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Μη έγκυρη διεύθυνση email" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Η επαφή %1 υπάρχει ήδη στη λίστα επαφών σας." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Πληροφορίες επαφής" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Νέα ομάδα" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Προσθήκη μίας ομάδας" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Εισάγετε ένα όνομα για την ομάδα :" + +#: kmess.cpp:576 +#, fuzzy, kde-format +msgid "" +"Are you sure you want to remove the contact %1 from your contact " +"list?" +msgstr "" +"Επιθυμείτε σίγουρα την αφαίρεση της επαφής %1 από την λιστα " +"επαφών σας;" + +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" +msgstr "Αφαίρεση επαφής" + +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "Αφαίρεση και φραγή" + +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Αφαίρεση ομάδας" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"Are you sure you want to remove the group %1 from your contact " +"list?" +msgstr "" +"Επιθυμείτε σίγουρα τη αφαίρεση της ομάδας %1 από τη λίστα επαφών σας;" + +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Αφαίρεση" + +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." +msgstr "" + +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "Μετονoμασία ομάδας" + +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Εισάγετε το νέο όνομα για την ομάδα:" + +#: kmess.cpp:753 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" +"

Η αυτόματη σύνδεση δεν είναι δυνατή για το λογαριασμό \"%1\":
πρέπει πρώτα να αποθηκεύσετε τον κωδικό του λογαριασμού!

" + +#: kmess.cpp:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Η αυτόματη σύνδεση απέτυχε" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Σύνδεση..." + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Αποσυνδεδεμένος" + +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, kde-format +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:1466 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "" + +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "&Σύνδεση" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Αποσύνδεση" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Εμφάνιση των στοιχείων μου" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "Εμφάνιση επιτρεπόμενων επαφών" + +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "Εμφάνιση μη συνδεδεμένων επαφών" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "Εμφάνιση διαγραμμένων επαφών " + +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Προβολή πλαισίου καταγραφών" + +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "Εμφάνιση της γραμμής αναζήτησης" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Εμφάνιση κενών ομάδων" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "Μέγεθος εμφάνισης εικόνων" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "Ταξινόμηση επαφών ανά" + +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Εμφάνιση παραθύρου μεταφορών..." + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Νέα επαφή..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Νέα &ομάδα..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "Εξαγωγή της λίστας επαφών..." + +#: kmessinterface.cpp:183 kmessview.cpp:611 +msgid "Show Chat &History..." +msgstr "Εμφάνιση ιστορικού συνομιλιών..." + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Νέος &λογαριασμός..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Ρύθμιση Λογαριασμού ..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Ρύθμιση του &KMess..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Εμφάνιση του μενού Επιλογών" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Να μην εμφανίζεται" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Μικρό" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Μεσαίο" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Μεγάλο" + +#: kmessinterface.cpp:197 +msgid "Group" +msgstr "Ομάδα" + +#: kmessinterface.cpp:198 +msgid "Online/Offline" +msgstr "Συνδεδεμένοι/Αποσυνδεδεμένοι" + +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Ανάμεικτα" + +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "Εμφάνιση παραθύρου δικτύου..." + +#: kmessview.cpp:327 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Σύνδεση ως %2" + +#: kmessview.cpp:364 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1]Ο χρήστης %2 συνδέθηκε" + +#: kmessview.cpp:369 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1]Ο χρήστης %2 αποσυνδέθηκε" + +#: kmessview.cpp:608 +msgid "Cha&t" +msgstr "Συνομιλία" + +#: kmessview.cpp:619 +#, fuzzy +msgid "&Remove From Group" +msgstr "Αφαίρεση από ομάδα" + +#: kmessview.cpp:652 +msgid "&Copy to Group" +msgstr "Αντιγραφή στην Ομάδα" + +#: kmessview.cpp:653 +msgid "&Move to Group" +msgstr "" + +#: kmessview.cpp:704 +msgid "Move Group &Down" +msgstr "" + +#: kmessview.cpp:705 +msgid "Move Group &Up" +msgstr "" + +#: kmessview.cpp:706 +msgid "Re&move Group" +msgstr "Αφαίρεση ομάδας" + +#: kmessview.cpp:707 +msgid "Re&name Group" +msgstr "Μετονoμασία ομάδας" + +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Προσθήκη αυτού του ατόμου στην λίστα επαφών μου" + +#: kmessview.cpp:1154 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Διεύθυνση email" + +#: kmessview.cpp:1161 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Πελάτης: %1" + +#: kmessview.cpp:1173 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1177 +msgid "No" +msgstr "" + +#: kmessview.cpp:1180 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Σε φραγή" + +#: kmessview.cpp:1200 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Τελευταία παρουσία: %1" + +#: kmessview.cpp:1215 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "%1 νέο μήνυμα email" + +#: kmessview.cpp:1225 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Oμάδα %1" + +#: kmessview.cpp:1233 +#, kde-format +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:1240 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 επαφή" +msgstr[1] "%1 επαφές" + +#: kmessview.cpp:1660 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Γράψτε το προσωπικό σας μήνυμα>" + +#: kmessview.cpp:1661 +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:1842 +msgid "You have not chatted with this contact yet." +msgstr "" + +#: kmessview.cpp:1843 +#, fuzzy +msgid "No Chat History found." +msgstr "Στυλ συνομιλίας :" + +#: kmessview.cpp:2029 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 νέο μήνυμα email" +msgstr[1] "%1 νέα μηνύματα email" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:488 settings/accountpage.cpp:549 +msgid "KMess" +msgstr "KMess" + +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "Πελάτης MSN για το KDE" + +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, 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 "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Προγραμματιστής" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:125 +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:67 main.cpp:162 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:161 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 +msgid "" +"German translation, testing, documentation, web master, project management, " +"etc..." +msgstr "" + +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 +msgid "Web design" +msgstr "" + +#: main.cpp:73 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:74 +msgid "Cartoon emoticons" +msgstr "" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:109 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 +msgid "Catalan translation" +msgstr "Καταλανική μετάφραση" + +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Καταλανική μετάφραση" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" + +#: main.cpp:94 main.cpp:157 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "" + +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 +msgid "Traditional Chinese translation" +msgstr "Παραδοσιακή κινεζική μετάφραση" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Παραδοσιακή κινεζική μετάφραση" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "Δανέζικη μετάφραση" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:100 +msgid "More Danish translation" +msgstr "" + +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "Ολλανδική μετάφραση" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 main.cpp:107 +msgid "More Dutch translation" +msgstr "" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:107 +msgid "Heimen Stoffels" +msgstr "" + +#: main.cpp:109 +msgid "More German translation, Greek translation" +msgstr "" + +#: main.cpp:110 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:110 +#, fuzzy +msgid "More Greek translation" +msgstr "Κορεάτικη μετάφραση" + +#: main.cpp:112 +msgid "Estonian translation" +msgstr "Εσθονική μετάφραση" + +#: main.cpp:112 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:113 +msgid "Finnish translation" +msgstr "Φινλανδική μετάφραση" + +#: main.cpp:113 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:114 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:114 main.cpp:115 +msgid "More Finnish translation" +msgstr "" + +#: main.cpp:115 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:117 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:117 +msgid "French translation" +msgstr "Γαλλική μετάφραση" + +#: main.cpp:118 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:118 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:119 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:119 main.cpp:120 main.cpp:121 +msgid "More French translation" +msgstr "" + +#: main.cpp:120 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:121 +msgid "Scias" +msgstr "" + +#: main.cpp:123 +msgid "Hungarian translation" +msgstr "Ουγγρική μετάφραση" + +#: main.cpp:123 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:124 +msgid "More Hungarian translation" +msgstr "" + +#: main.cpp:124 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:125 main.cpp:126 +msgid "More Italian translation" +msgstr "" + +#: main.cpp:126 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:127 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:127 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:128 +msgid "Korean translation" +msgstr "Κορεάτικη μετάφραση" + +#: main.cpp:128 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:129 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:129 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:131 +#, fuzzy +msgid "Serbian translation" +msgstr "Σλοβενική μετάφραση" + +#: main.cpp:131 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:133 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:133 +msgid "Slovak translation" +msgstr "Σλοβάκικη μετάφραση" + +#: main.cpp:134 +#, fuzzy +msgid "Matjaž Kaše" +msgstr "Matjaž kaše" + +#: main.cpp:134 +msgid "Slovenian translation" +msgstr "Σλοβενική μετάφραση" + +#: main.cpp:136 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:136 +msgid "Spanish translation" +msgstr "Ισπανική μετάφραση" + +#: main.cpp:137 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 main.cpp:141 +#: main.cpp:142 main.cpp:143 +msgid "More Spanish translation" +msgstr "" + +#: main.cpp:138 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:139 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:140 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:141 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:142 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:143 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:145 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:145 +msgid "Swedish translation" +msgstr "Σουηδική μετάφραση" + +#: main.cpp:146 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:146 +#, fuzzy +msgid "More Swedish translation" +msgstr "Σουηδική μετάφραση" + +#: main.cpp:148 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:148 +msgid "Thai translation" +msgstr "Ταϊλανδική μετάφραση" + +#: main.cpp:149 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:149 +msgid "Turkish translation" +msgstr "Τούρκικη μετάφραση" + +#: main.cpp:150 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:150 main.cpp:151 +msgid "More Turkish translation" +msgstr "" + +#: main.cpp:151 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:154 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:154 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:155 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:155 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:156 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:156 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:157 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:158 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:158 +msgid "Xinerama fixes" +msgstr "" + +#: main.cpp:159 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:159 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:160 +msgid "KWallet support" +msgstr "Υποστήριξη KWallet" + +#: main.cpp:160 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:161 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Ειδοποιήσεις επιλογής φραγής, επιλογής απενεργοποίησης winks, πρόσθετου " +"χαρακτηριστικού τελευταίας ημερομηνίας" + +#: main.cpp:162 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:163 +#, fuzzy +msgid "Chat history dialog" +msgstr "Στυλ συνομιλίας :" + +#: main.cpp:163 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:166 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:166 +msgid "Various internationalization fixes" +msgstr "" + +#: main.cpp:167 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:167 +msgid "Various internationalization fixes." +msgstr "" + +#: main.cpp:169 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:169 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:170 +msgid "Guy with a bag over his head" +msgstr "" + +#: main.cpp:170 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:173 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:173 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:174 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:174 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" + +#: main.cpp:175 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:175 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:176 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:176 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:177 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:177 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:178 +msgid "" +"KNotify not giving focus bug fix and KWin focus stealing prevention " +"workaround" +msgstr "" + +#: main.cpp:178 +msgid "Quassel" +msgstr "" + +#: main.cpp:181 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:181 +msgid "Your name here?" +msgstr "" + +#: main.cpp:184 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Παναγιώτης Παπαδόπουλος" + +#: main.cpp:185 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Διεύθυνση email" + +#: main.cpp:191 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Η εξαγωγή της λίστας τον επαφών ολοκληρώθηκε" + +#: main.cpp:192 +msgid "Autologin with the given email address" +msgstr "Αυτόματη σύνδεση με αυτόν το λογαριασμό" + +#: main.cpp:197 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "" + +#: model/contactlist.cpp:1827 +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 +#, kde-format +msgid "Do you want to
accept or cancel?" +msgstr "" + +#: network/applications/application.cpp:581 +#, kde-format +msgid "Click to cancel." +msgstr "Κάντε κλικ για να ακυρώσετε." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" + +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +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, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"Η μεταφορά του αρχείου "%1" απέτυχε. Αδύνατη η αποθήκευση του " +"αρχείου." + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "" +"Η μεταφορά του αρχείου "%1" απέτυχε. Αδύνατη η αποθήκευση του " +"αρχείου." + +#: network/applications/filetransfer.cpp:319 +#, fuzzy +msgid "Transfer accepted." +msgstr "Μεταφορά δέχτηκε" + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:548 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Η επαφή ακύρωσε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:559 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Η επαφή ακύρωσε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:570 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Η επαφή δέχτηκε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Η σύνδεση επιτεύχθηκε" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:674 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Αποστολή αρχείου "%1" (%2)." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:678 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Η επαφή δέχτηκε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:811 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "Η μεταφορά του αρχείου "%1" απέτυχε. Το αρχείο δεν υπάρχει." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:816 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "Η μεταφορά του αρχείου "%1" απέτυχε. Το αρχείο" + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:850 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Αποστολή αρχείου "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:888 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Η επαφή δέχτηκε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +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 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Η επαφή δέχτηκε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransferp2p.cpp:614 +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 +#, kde-format +msgid "Starting GnomeMeeting. Connecting to %1." +msgstr "" + +#: network/applications/gnomemeeting.cpp:161 +msgid "Inviting the contact to a meeting." +msgstr "" + +#: network/applications/inktransferp2p.cpp:108 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has tried to send you an handwritten message, but it could not be " +"received." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: network/applications/inktransferp2p.cpp:114 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "The handwritten message to %1 could not be delivered." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is 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 contact's desktop." +msgstr "" + +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format +msgid "Starting KRDC. Connecting to %1." +msgstr "" + +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "" + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess does not " +"support it." +msgstr "" + +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "Η μεταφορά απέτυχε." + +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "" + +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "" + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "" + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "" + +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "" + +#: network/applications/p2papplication.cpp:3423 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "" + +#: network/applications/p2papplication.cpp:3432 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "" + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Η μεταφορά απέτυχε." + +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not open data source." +msgstr "" +"Η μεταφορά του αρχείου "%1" απέτυχε. Αδύνατη η αποθήκευση του " +"αρχείου." + +#: 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 could not be opened." +msgstr "" + +#: network/applications/voiceconversation.cpp:218 +#, kde-format +msgid "Start voice conversation. Connecting to %1." +msgstr "" + +#: network/applications/voiceconversation.cpp:224 +#, kde-format +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 +#, kde-format +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 contact's webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "" + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Η επαφή ακύρωσε την μεταφορά του αρχείου "%1"." + +#: network/extra/msnftpconnection.cpp:133 +#, fuzzy +msgid "Failed" +msgstr "Απέτυχε" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Αποστολή αρχείου %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "" +"Η μεταφορά του αρχείου "%1" απέτυχε. Αδύνατη η αποθήκευση του " +"αρχείου." + +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." +msgstr "" + +#: network/extra/msnftpconnection.cpp:456 +msgid "Initiating file transfer" +msgstr "" + +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +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 +#, kde-format +msgid "Receiving file %1" +msgstr "" + +#: network/msnconnection.cpp:378 +msgid "Invalid command syntax" +msgstr "" + +#: network/msnconnection.cpp:382 +msgid "Invalid command parameter" +msgstr "" + +#: network/msnconnection.cpp:385 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "" +"Η διεύθυνση email που έχετε εισάγει δεν είναι έγκυρη και δεν μπορεί να " +"χρησιμοποιηθεί ως λογαριασμός: '%1'" + +#: network/msnconnection.cpp:390 +msgid "Domain name missing" +msgstr "" + +#: network/msnconnection.cpp:394 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:397 +msgid "The given account name is invalid" +msgstr "" + +#: network/msnconnection.cpp:401 +#, fuzzy +msgid "" +"This account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "Ο λογαριασμός είναι άκυρος, ή δεν έχει γίνει ακόμα η επιβεβαίωσή του " + +#: network/msnconnection.cpp:404 +msgid "Your contact list is full" +msgstr "" + +#: network/msnconnection.cpp:409 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:412 +msgid "This contact is already on your list" +msgstr "" + +#: network/msnconnection.cpp:416 +msgid "This contact is not on your list" +msgstr "" + +#: network/msnconnection.cpp:420 +msgid "This contact is not online" +msgstr "" + +#: network/msnconnection.cpp:425 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:429 +#, fuzzy +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" +"Αυτή η επαφή δεν μπορεί να προστεθεί ταυτόχρονα στην λίστα επιτρεπομένων και " +"φραγής." + +#: network/msnconnection.cpp:433 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" + +#: network/msnconnection.cpp:437 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30" +msgstr "" + +#: network/msnconnection.cpp:441 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Αυτή η ομάδα δεν είναι κενή" + +#: network/msnconnection.cpp:446 +msgid "Contact is not added to this group" +msgstr "" + +#: network/msnconnection.cpp:450 +#, fuzzy +msgid "This group is not empty" +msgstr "Αυτή η ομάδα δεν είναι κενή" + +#: network/msnconnection.cpp:454 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" + +#: network/msnconnection.cpp:459 +msgid "Attempted to change group \"0\"" +msgstr "" + +#: network/msnconnection.cpp:459 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "" + +#: network/msnconnection.cpp:463 +msgid "Invalid Group" +msgstr "Μη έγκυρη ομάδα" + +#: network/msnconnection.cpp:467 +#, fuzzy +msgid "Empty domain" +msgstr "Κενός τομέας" + +#: network/msnconnection.cpp:471 +msgid "Wrong ADL command format" +msgstr "Κακή διατύπωση της εντολής ADL" + +#: network/msnconnection.cpp:474 +msgid "Switchboard server failed" +msgstr "" + +#: network/msnconnection.cpp:477 +msgid "Transfer to switchboard server failed" +msgstr "" + +#: network/msnconnection.cpp:481 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "" + +#: network/msnconnection.cpp:485 +msgid "Required field missing" +msgstr "" + +#: network/msnconnection.cpp:489 +msgid "Not logged in" +msgstr "" + +#: network/msnconnection.cpp:493 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:498 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:501 +#, fuzzy +msgid "Your account is banned" +msgstr "Ο λογαριασμός σας έχει απαγορευθεί." + +#: network/msnconnection.cpp:505 +msgid "Challenge response failed" +msgstr "" + +#: network/msnconnection.cpp:510 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:514 +msgid "You are opening chat sessions too fast" +msgstr "" + +#: network/msnconnection.cpp:518 +msgid "You have too many open chat sessions" +msgstr "" + +#: network/msnconnection.cpp:525 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:529 +msgid "Bad friend name" +msgstr "" + +#: network/msnconnection.cpp:535 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:541 +msgid "The server reports KMess is flooding it with too much data" +msgstr "" + +#: network/msnconnection.cpp:548 +msgid "Authentication ticket was incorrect" +msgstr "" + +#: network/msnconnection.cpp:551 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "" + +#: network/msnconnection.cpp:555 +msgid "Not accepting new contacts" +msgstr "" + +#: network/msnconnection.cpp:559 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" + +#: network/msnconnection.cpp:562 +msgid "Your Passport account needs to be verified first" +msgstr "" + +#: network/msnconnection.cpp:566 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:576 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:585 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" + +#: network/msnconnection.cpp:596 +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" + +#: network/msnconnection.cpp:600 +msgid "Peer notification server down" +msgstr "" + +#: network/msnconnection.cpp:604 +msgid "The server is going down" +msgstr "" + +#: network/msnconnection.cpp:608 +msgid "The server is going down soon" +msgstr "" + +#: network/msnconnection.cpp:613 +msgid "Write is blocking" +msgstr "Η εγγραφή είναι σε φραγή" + +#: network/msnconnection.cpp:617 +msgid "Session is overloaded" +msgstr "" + +#: network/msnconnection.cpp:624 +msgid "The server is not available" +msgstr "Ο εξυπηρετητής δεν είναι διαθέσιμος" + +#: network/msnconnection.cpp:628 +msgid "Authentication failed" +msgstr "Η ταυτοποίηση απέτυχε" + +#: network/msnconnection.cpp:635 +#, kde-format +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "" + +#: network/msnconnection.cpp:652 network/msnnotificationconnection.cpp:2922 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Σφάλμα MSN" + +#: network/msnconnection.cpp:957 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1344 +msgid "Authenticating..." +msgstr "Ταυτοποίηση..." + +#: network/msnnotificationconnection.cpp:1368 +msgid "Authenticated" +msgstr "Επιβεβαιώθηκε" + +#: network/msnnotificationconnection.cpp:1438 +msgid "Switching to another server..." +msgstr "Μετάβαση σε άλλο διακομιστή" + +#: network/msnnotificationconnection.cpp:1802 +msgid "Connecting..." +msgstr "Σύνδεση..." + +#: network/msnnotificationconnection.cpp:1947 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2107 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 λεπτό" +msgstr[1] "%1 λεπτά" + +#: network/msnnotificationconnection.cpp:2110 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "" + +#: network/msnnotificationconnection.cpp:2115 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" + +#: network/msnnotificationconnection.cpp:2316 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2317 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2587 +msgid "Authentication time limit exceeded" +msgstr "" + +#: network/msnnotificationconnection.cpp:2766 +msgid "Waiting for contact list..." +msgstr "Αναμονή της λίστας επαφών " + +#: network/msnnotificationconnection.cpp:2812 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Προσοχή: %1

" + +#: network/msnnotificationconnection.cpp:2813 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Προειδοποίηση MSN" + +#: network/msnnotificationconnection.cpp:2885 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +msgctxt "Connection error: dialog box" +msgid "" +"

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

" +msgstr "" +"

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

" + +#: network/msnnotificationconnection.cpp:2933 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

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

" + +#: network/msnnotificationconnection.cpp:2936 +#, kde-format +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 "" +"

Έχετε αποσυνδεθεί : έχετε συνδεθεί με τον λογαριασμό %1 από έναν " +"άλλο πελάτη MSN, ή από άλλη τοποθεσία.

" + +#: network/msnnotificationconnection.cpp:2948 +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:2951 +#, kde-format +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:2970 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2972 +#, kde-format +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:2983 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

" +msgstr "

Μήνυμα MSN

%1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3077 +#, kde-format +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:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "" + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "Η διεύθυνση email, \"%1\", δεν είναι έγκυρη !" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +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:295 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:427 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Ο εξυπηρετητής δεν είναι διαθέσιμος" + +#: network/soap/httpsoapconnection.cpp:504 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:548 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Ο εξυπηρετητής δεν είναι διαθέσιμος" + +#: network/soap/httpsoapconnection.cpp:554 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:568 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:607 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "Ο χρήστης %1 λεεί :
'%2'" + +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"Ο χρήστης %1 σας έστειλε ένα μήνυμα εκτός σύνδεσης :
'%2'" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 σας έστειλε ένα wizz!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 σας έστειλε ένα wink!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 σας στέλνει ένα αρχείο!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 σας έστειλε μία πρόσκληση!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "Ο χρήστης %1 ακύρωσε τη μεταφόρα του αρχείου!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "Ο χρήστης %1 δέχτηκε τη μεταφορά του αρχείου" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "Ο χρήστης%1δέχτηκε την πρόσκληση σας!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
συνδέθηκε" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
είναι απών" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
θα επιστρέψει σε λίγο" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
είναι απασχολημένος" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
είναι αόρατος" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
είναι αδρανής" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
αποσυνδέθηκε" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
είναι στο τηλέφωνο" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
είναι έξω για φαγητό" + +#: notification/newemailnotification.cpp:92 +#, kde-format +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, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +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 "" + +#. i18n: file: settings/accountpage.ui:136 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:458 rc.cpp:381 +msgid "Display Picture" +msgstr "Εμφάνιση εικόνας" + +#: settings/accountpage.cpp:488 +msgid "Downloading of display picture failed" +msgstr "" + +#: settings/accountpage.cpp:547 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image 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 +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 "" +"Πατήστε εδώ για να σβήσετε αυτόν το λογαριασμό από την λίστα.\n" +"Δεν μπορείτε να σβήσετε τον τρέχον συνδεδεμένο λογαριασμό ούτε έναν guest " +"λογαριασμό, ο οποίος θα διαγράφει μόλις αποσυνδεθείτε." + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +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 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "Η διεύθυνση email που έχετε εισάγει, χρησιμοποιείται ήδη: '%1'" + +#: settings/accountsettingsdialog.cpp:220 +#, fuzzy +msgid "Please enter a friendly name for this account." +msgstr "Χρήση &εναλλακτικού ονόματος γι αυτή την επαφή" + +#: settings/accountsettingsdialog.cpp:301 +msgid "Are you sure you want to delete this account?" +msgstr "Είστε σίγουροι ότι επιθυμείτε την διαγραφή αυτού του λογαριασμού;" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Είστε σίγουροι ότι επιθυμείτε την διαγραφή του λογαριασμού '%1' ;
Όλες οι " +"ρυθμίσεις αυτού του λογαριασμού θα χαθούν." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "" + +#: settings/chatstylepage.cpp:375 +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, kde-format +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 +#, fuzzy +msgid "No selectable web browsers detected." +msgstr "Δεν βρέθηκε κανένας περιηγητής." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Δεν βρέθηκε κανένας πελάτης email." + +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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:242 +msgid "&Send a Comment to the Developers" +msgstr "Στείλτε ένα σχόλιο στην ομάδα ανάπτυξης Kmess" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "Εμφάνιση δευτερολέπτων" + +#: utils/likeback/likeback.cpp:323 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:328 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:336 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:343 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:350 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:372 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:380 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:396 +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:409 +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:412 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:418 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, fuzzy, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"Η διεύθυνση email που έχετε εισάγει δεν είναι έγκυρη και δεν μπορεί να " +"χρησιμοποιηθεί ως λογαριασμός: '%1'" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 +#, fuzzy +msgid "Click this button to switch to the standard text mode." +msgstr "Πατήστε εδώ για να αλλάξετε σε λειτουργία κανονικού κειμένου." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 +#, fuzzy +msgid "" +"Click this button to show all default Live Messenger 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 +#, fuzzy +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Πατήστε εδώ για να εμφανίσετε όλα τα προεπιλεγμένα εικονίδια διάθεσης MSN, " +"έτσι θα μπορείτε να τα εισάγετε εύκολα στα μηνύματά σας." + +#. 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 "Κάντε κλικ σε αυτό το κουμπί για να δείτε τα διαθέσιμα winks." + +#. 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 +msgid "Click here to display the menu for this contact" +msgstr "Κάντε κλικ εδώ για να εμφανίσετε το μενού επιλογών για την επαφή" + +#. i18n: file: chat/contactswidget.ui:107 +#. 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 +#, 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 +#, fuzzy +msgid "Pen size" +msgstr "Μέγεθος μολυβιού" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +#, fuzzy +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 "" +"Παρακαλώ εισάγετε τη διεύθυνση 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:273 +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 +msgid "Search through contacts..." +msgstr "Αναζήτηση στην λίστα επαφών..." + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Φίλτρο καταγραφής συνομιλίας" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Αναζήτηση ανά συνομιλία" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "Αναζήτηση με ημερομηνία" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "από" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +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 the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "" +"&Φραγή αυτού του ατόμου, δεν θα μπορεί να επικοινωνήσει μαζί μου ή να δει " +"την κατάστασή μου" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Επαναφορά" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Ομάδες:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Χρήση &εναλλακτικού ονόματος γι αυτή την επαφή" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +msgid "Disable notifications for this contact" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Ήχος :" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Εμφάνιση εικόνας" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "Κάντε κλικ εδώ για να χρησιμοποιήσετε την επιλεγμένη εικόνα ως avatar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "Χρησιμοποίηση ως avatar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "&Καθαρισμός Cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +#, fuzzy +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"Μπορείτε να επιλέξετε την απόκρυψη των εικονιδίων διάθεσης που έχετε λάβει " +"από αυτή την επαφή. Απλά πατήστε δεξί κλικ στο εικονίδιο διάθεσης που " +"παραλάβατε και επιλέξτε « Αγνοήστε αυτό το εικονίδιο διάθεσης ».\n" +"Με αυτή τη σελίδα, μπορείτε να επαναφέρετε τα αποκρυμμένα εικονίδια." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Κάντε κλικ εδώ για να διαγράψετε το επιλεγμένο εικονίδιο διάθεσης" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "&Επαναφορά" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Διαθέσιμες επαφές" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "Προσκαλέστε μία επαφή που δεν ειναι στην λίστα :" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "" +"Εισάγετε τη διεύθυνση email της επαφής που επιθυμείτε να προσκαλέσετε :" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +msgid "Invited Contacts" +msgstr "Προσκαλεσμένοι επαφές" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Στοιχεία προς εξαγωγή :" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Μορφή" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Επαφές:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Επιλογή όλων" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "Αποεπιλογή όλων" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Εξαγωγή..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Κλείσιμο" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "Εντολή για την τρέχουσα καρτέλα" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Εντολή:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Τύπος" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Τυπικό" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Αποστολή" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Εντολή payload (προαιρετικά) :" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Άνοιγμα" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Ακύρωση" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "&Λήψη" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "&Αποστολή" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "&Καθαρισμός" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "Κλείσιμο" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter here the email address of your registered Passport or Live account" +msgstr "Εισάγετε εδώ την διεύθυνση email του λογαριασμού σας Passport ή Live" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Κωδικός πρόσβασης:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +#, fuzzy +msgid "Enter here your account's password" +msgstr "Εισάγετε εδώ τον κωδικό του λογαριασμού σας" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "Κατάσταση κατά την σύνδεση :" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "Καθορίστε την κατάσταση που θα έχετε αφού συνδεθείτε." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "Αν είναι ενεργοποιημένο, το Kmess θα αποθηκεύσει το λογαριασμό σας" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +msgid "Remem&ber account" +msgstr "Απομνημόνευση λογαριασμού" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +msgid "R&emember password" +msgstr "Απομνημόνευση κωδικού πρόσβασης" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "Πατήστε εδώ για να συνδεθείτε, ή να ακυρώσετε μία προσπάθεια σύνδεσης" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Νέος λογαριασμός" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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 "" +"Κάντε κλικ εδώ για να αποκτήσετε ένα νέο λογαριασμό Live, με τον οποίο " +"θα μπορείτε να συνδεθείτε στο MSN.
Μπορείτε επίσης να χρησιμοποιήσετε " +"την τρέχουσα διεύθυνση του email σας" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "Ξεχάσατε τον κωδικό σας ;" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Κάντε κλικ εδώ για να μεταβείτε στην ιστοσελίδα Live, για να ορίσετε " +"ένα νέο κωδικό πρόσβασης" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Σύνδεση " + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Προβολή" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Ενέργειες" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "Μορφή" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "Πληροφορίες Λογαριασμού" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "Πληροφορίες του λογαριασμού σας" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +msgstr "Εισάγετε το όνομα που θα βλέπουν οι επαφές όταν είστε σε σύνδεση." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "Ψευδώνυμο :" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Εισάγετε την διεύθυνση email ή το λογαριασμό σας MSN Passport. Μπορείτε να " +"αποκτήσετε ένα νέο λογαριασμό στο http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "Διεύθυνση &email:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 +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:369 +msgid "&Password:" +msgstr "Κωδικός πρόσβασης:" + +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "Click here to have your password saved by KMess" +msgstr "Κάντε κλικ εδώ για να ανοίξετε τις ρυθμίσεις του λογαριασμού σας" + +#. i18n: file: settings/accountpage.ui:117 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:375 +msgid "" +"If you enable this option, KMess will save your account's password. This way " +"you will not have to enter your password on every start up, in order to log " +"in. Please keep in mind, that other persons that have access to this " +"computer may easily log in to your account, if this option is enabled." +msgstr "" + +#. i18n: file: settings/accountpage.ui:120 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:378 +msgid "&Remember password" +msgstr "Απομνημόνευση κωδικού πρόσβασης" + +#. i18n: file: settings/accountpage.ui:236 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:384 +msgid "C&hange..." +msgstr "Αλλαγή..." + +#. i18n: file: settings/accountpage.ui:261 +#. i18n: ectx: property (toolTip), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:390 +msgid "Enable this option, if you do not want to use a display picture." +msgstr "" + +#. i18n: file: settings/accountpage.ui:264 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:393 +msgid "&Do not use" +msgstr "Να μην χρησιμοποιείται" + +#. i18n: file: settings/accountpage.ui:294 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:399 +msgid "" +"The option \"Remember account\" was left unchecked while logging in, " +"so your settings will not be saved by default. Enable this option if you " +"want to save your account settings permanently on this system.\n" +"\n" +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." +msgstr "" + +#. i18n: file: settings/accountpage.ui:297 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:404 +msgid "Re&member the settings of this account" +msgstr "" + +#. i18n: file: settings/accountpage.ui:307 +#. i18n: ectx: property (toolTip), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:407 +msgid "If enabled, KMess automatically logs in with this account." +msgstr "" +"Αν είναι ενεργοποιημένο, το Kmess θα συνδέεται αυτόματα με αυτόν το " +"λογαριασμό." + +#. i18n: file: settings/accountpage.ui:310 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:410 +msgid "Log in &with this account automatically" +msgstr "Αυτόματη σύνδεση με αυτόν το λογαριασμό" + +#. i18n: file: settings/accountpage.ui:322 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:416 +msgid "Login &as" +msgstr "Κατάσταση κατά τη σύνδεση" + +#. i18n: file: settings/accountpage.ui:335 +#. i18n: ectx: property (whatsThis), widget (QComboBox, initialStatus_) +#: rc.cpp:419 +msgid "Here you can select which status KMess should set, after logging in." +msgstr "" + +#. i18n: file: settings/accountpage.ui:378 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:422 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Πρέπει να συνδεθείτε στην ιστοσελίδα Passport για να επιβεβαιώσετε ότι η " +"διεύθυνση email υπάρχει." + +#. i18n: file: settings/accountpage.ui:381 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:425 +#, fuzzy +msgid "" +"You cannot change your friendly name because your Passport email address is " +"not verified." +msgstr "" +"Δεν μπορείτε να τροποποιήσετε το ψευδώνυμό σας διότι η διεύθυνση email " +"Passport δεν έχει επιβεβαιωθεί." + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:428 +msgid "Request verification email" +msgstr "Αίτηση email επιβεβαίωσης" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:431 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:427 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:434 +msgid "Go to accountservices.passport.net" +msgstr "Μετάβαση σε accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:446 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:437 +#, fuzzy +msgid "" +"You need a Passport account to connect to the Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"Χρειάζεστε ένα λογαριασμό Passport για να συνδεθείτε στο MSN Messenger " +"network. Μπορείτε να αποκτήσετε ένα λογαριασμό με την τρέχουσα διεύθυνση " +"email στο register.passport.com ή να χρησιμοποιήσετε ένα λογαριασμό Hotmail " +"για να συνδεθείτε." + +#. i18n: file: settings/accountpage.ui:449 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:440 +#, fuzzy +msgid "" +"To connect to the Live Messenger service, you will need to register an email " +"address as Passport account." +msgstr "" +"Για να συνδεθείτε στην υπηρεσία MSN Messenger, πρέπει να δηλώσετε μια " +"διεύθυνση email ως λογαριασμό Passport." + +#. i18n: file: settings/accountpage.ui:489 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:443 +msgid "Register new account" +msgstr "Καταχώρηση νέου λογαριασμού" + +#. i18n: file: settings/accountpage.ui:492 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:446 +msgid "http://register.passport.com/" +msgstr "http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:495 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:449 +msgid "Go to register.passport.com" +msgstr "Μετάβαση στο register.passport.com" + +#. i18n: file: settings/accountpage.ui:513 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:452 +msgid "&Status Options" +msgstr "Επιλογές Κατάστασης" + +#. i18n: file: settings/accountpage.ui:519 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:455 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when you " +"are 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:522 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:458 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Αλλαγή κατάστασης σε \"&Αδρανής\" όταν είστε μακριά από τον υπολογιστή" + +#. i18n: file: settings/accountpage.ui:553 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:572 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:579 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:464 rc.cpp:470 rc.cpp:473 +#, fuzzy +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" +"Ελέγχει τον αριθμό των λεπτών πριν το KMess αλλάξει την κατάσταση σε « " +"Παρατεταμένη απουσία »." + +#. i18n: file: settings/accountpage.ui:556 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:467 +msgid "Become idle after" +msgstr "Αδρανής μετά από" + +#. i18n: file: settings/accountpage.ui:582 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:476 +msgid "minutes" +msgstr "λεπτά" + +#. i18n: file: settings/accountpage.ui:615 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:479 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:618 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:482 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:644 +#. i18n: ectx: property (toolTip), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:485 +#, fuzzy +msgid "" +"If enabled, you will not receive any notifications when your status is set " +"to \"Busy\"." +msgstr "Απόκρυψη των ειδοποιήσεων όταν η κατάστασή μου είναι \"Απασχολημένος\"" + +#. i18n: file: settings/accountpage.ui:647 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:488 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "Απόκρυψη των ειδοποιήσεων όταν η κατάστασή μου είναι \"Απασχολημένος\"" + +#. i18n: file: settings/accountsmanagerpage.ui:26 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:491 +msgid "Saved accounts:" +msgstr "Αποθηκευμένοι λογαριασμοί:" + +#. i18n: file: settings/accountsmanagerpage.ui:76 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:494 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:79 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:497 +msgid "&Add Account..." +msgstr "&Προσθήκη Λογαριασμού..." + +#. i18n: file: settings/accountsmanagerpage.ui:92 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:503 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Επιλέξτε ενα λογαριασμό και κάντε κλικ εδώ για να το διαγράψετε." + +#. i18n: file: settings/accountsmanagerpage.ui:95 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:506 +msgid "&Edit" +msgstr "&Επεξεργασία" + +#. i18n: file: settings/accountsmanagerpage.ui:108 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:512 +#, fuzzy +msgid "Select an account and click here to remove it" +msgstr "Επιλέξτε ενα λογαριασμό και κάντε κλικ εδώ για να το διαγράψετε." + +#. i18n: file: settings/accountsmanagerpage.ui:111 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:515 +msgid "&Remove" +msgstr "&Αφαίρεση" + +#. i18n: file: settings/chatloggingpage.ui:17 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:521 +#, fuzzy +msgid "Enable this option to have your chats saved for later viewing" +msgstr "" +"Ενεργοποιήστε αυτο το κουτί επιλογής για να αποθηκεύσετε τις συνομιλίες σας " +"για μετέπειτα προβολή." + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:524 +msgid "" +"

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

\n" +"

The chat logs 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:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:530 +msgid "Enable chat logging" +msgstr "Ενεργοποίηση καταγραφής συνομιλιών" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:533 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:536 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Αποθήκευση της συνομιλίας σε αρχείο" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:539 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" +"Με αυτή την παράμετρο, μπορείτε να επιλέξετε τον τρόπο που το KMess θα " +"αποθηκεύει τις συνομιλίες σας " + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:542 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Αποθήκευση της συνομιλίας σε αρχείο" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:545 +#, fuzzy +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\n" +"

Ο τύπος αρχείου που χρησιμοποιείτε είναι σημαντικό.

\n" +"

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

\n" +"

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

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:552 +msgid "Web Pages (HTML)" +msgstr "Σελίδες Ιστού (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:555 +msgid "Plain Text" +msgstr "Πλήρες Κείμενο" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:558 +#, fuzzy +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Αυτές οι επιλογές σας επιτρέπουν να επιλέξετε τον τρόπο που το KMess θα " +"ταξινομεί τις καταγεγραμμένες συνομιλίες στους καθορισμένους καταλόγους " +"παρακάτω." + +#. i18n: file: settings/chatloggingpage.ui:137 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:561 +#, fuzzy +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 θα δημιουργήσει μερικούς " +"καταλόγους για να σας βοηθήσει να ταξινομήσετε τις καταγεγραμμένες " +"συνομιλίες σας. Χρησιμοποιήστε το « What's This? » σε μια συγκεκριμένη " +"επιλογή για περισσότερες λεπτομέρειες." + +#. i18n: file: settings/chatloggingpage.ui:140 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:564 +msgid "Separate logged chats by:" +msgstr "Διαχωρισμός καταγεγραμμένων συνομιλιών ανά :" + +#. i18n: file: settings/chatloggingpage.ui:156 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:567 +msgid "Create a directory to organize chats by year" +msgstr "Δημιουργεί έναν κατάλογο για ταξινόμηση των συνομιλιών ανά έτος" + +#. i18n: file: settings/chatloggingpage.ui:163 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:570 +#, fuzzy +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/date-and-contact-name.html

" +msgstr "" +"Αυτή η παράμετρος λέει στο KMess να ταξινομήσει τις καταγεγραμμένες " +"συνομιλίες ανά έτος μόνο.\n" +"Θα βρείτε καταλόγους για κάθε έτος καταγεγραμμένων συνομιλιών, αυτοί που " +"περιέχουν όλες τις συνομιλίες του έτους εμφανίζονται ομαδοποιημένα\n" +"\n" +"Μια καταγεγραμμένη συνομιλία της 29 Νοεμβρίου 2008, θα αποθηκευτεί στις " +"καταγεγραμμένες συνομιλίες σας ως : \n" +"<δέντρο καταλόγων εγγεγραμμένων συνομιλιών>/2008/11/29/ημερομηνία-και-όνομα-" +"επαφής.html" + +#. i18n: file: settings/chatloggingpage.ui:166 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:577 +msgid "Year" +msgstr "Έτος" + +#. i18n: file: settings/chatloggingpage.ui:182 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:580 +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:583 +#, fuzzy +msgid "" +"

This option tells KMess to divide your chat logs 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" +"

A chat had on November 29, 2008 will be saved in your chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/date-and-contact-name.html

" +msgstr "" +"Αυτή η παράμετρος λέει στο KMess να ταξινομήσει τις καταγεγραμμένες " +"συνομιλίες ανά έτος έπειτα ανά μήνα.\n" +"Θα βρείτε μερικούς καταλόγους για κάθε έτος των καταγεγραμμένων συνομιλιών. " +"Ο καθένας θα περιέχει έναν κατάλογο για κάθε μήνα καταγεγραμμένων " +"συνομιλιών, και μέσα σε αυτούς θα βρείτε όλες τις καταγεγραμμένες συνομιλίες " +"του μήνα ομαδοποιημένα.\n" +"\n" +"Μια καταγεγραμμένη συνομιλία της 29 Νοεμβρίου 2008, θα αποθηκευτεί στις " +"καταγεγραμμένες συνομιλίες σας ως : \n" +"<δέντρο καταλόγων εγγεγραμμένων συνομιλιών>/2008/11/29/ημερομηνία-και-όνομα-" +"επαφής.html" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:589 +msgid "Year then Month" +msgstr "Έτος και Μήνας" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:592 +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:595 +#, fuzzy +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/29/date-and-contact-name.html" +msgstr "" +"Αυτή η παράμετρος λέει στο KMess να ταξινομήσει τις καταγεγραμμένες " +"συνομιλίες ανά έτος, μήνα και ημέρα.\n" +"Θα βρείτε μερικούς καταλόγους ανά έτος με τις καταγεγραμμένες συνομιλίες. " +"Κάθε ένας περιέχει έναν κατάλογο για κάθε μήνα καταγραφής των συνομιλιών οι " +"οποίοι με τη σειρά τους περιέχουν ξεχωριστούς καταλόγους εγγεγραμμένων " +"συνομιλιών, ανά ημέρα.\n" +"\n" +"Μια καταγεγραμμένη συνομιλία της 29 Νοεμβρίου 2008, θα αποθηκευτεί στις " +"καταγεγραμμένες συνομιλίες σας ως : \n" +"<δέντρο καταλόγων εγγεγραμμένων συνομιλιών>/2008/11/29/ημερομηνία-και-όνομα-" +"επαφής.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:602 +msgid "Year, Month then Day" +msgstr "Έτος, Μήνας και Ημέρα" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:605 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "" +"Τοποθέτηση όλων των αποθηκευμένων συνομιλιών στον παρακάτω καθορισμένο " +"κατάλογο" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:608 +#, fuzzy +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" +"Αυτή η παράμετρος λέει στο KMess να αποθηκεύσει όλες τις καταγεγραμμένες " +"συνομιλίες στους ίδιους φακέλους, χωρίς καμία ταξινόμηση." + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:611 +msgid "Do not organize files" +msgstr "Μα μην γίνει ταξινόμηση των αρχείων" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:614 +msgid "Click here to choose a directory" +msgstr "Κάντε κλικ εδώ για να επιλέξετε έναν κατάλογο" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:620 +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:623 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "Ο κατάλογος που θα αποθηκεύονται οι συνομιλίες σας" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:626 +msgid "Save chat logs in the following directory:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:629 +msgid "St&yle" +msgstr "Στυλ" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:632 +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:635 +#, fuzzy +msgid "&Chat style:" +msgstr "Στυλ συνομιλίας :" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:638 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:641 +msgid "Chat Settings" +msgstr "Ρυθμίσεις συνομιλίας" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (toolTip), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:644 +#, 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:647 +msgid "&Show emoticons" +msgstr "Εμφάνιση εικονιδίων διάθεσης" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:653 +#, fuzzy +msgid "Enables the appearance of winks in the chat window." +msgstr "Καταγραφή συνομιλίας" + +#. i18n: file: settings/chatstylepage.ui:246 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:656 +msgid "" +"If enabled, winks you send or receive will be displayed in the chat window. " +"Please note that in order to use this feature, you need to have a working " +"Flash-plugin installed." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:249 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:659 +msgid "Show &winks" +msgstr "Εμφάνιση winks" + +#. i18n: file: settings/chatstylepage.ui:256 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:662 +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:259 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:665 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:285 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:671 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:674 +msgid "S&how timestamp" +msgstr "Εμφάνιση της ώρας δίπλα από τα μηνύματα" + +#. i18n: file: settings/chatstylepage.ui:319 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:680 +msgid "Show &date" +msgstr "Εμφάνιση ημερομηνίας" + +#. i18n: file: settings/chatstylepage.ui:349 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:683 +msgid "Show s&econds" +msgstr "Εμφάνιση δευτερολέπτων" + +#. i18n: file: settings/chatstylepage.ui:362 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:686 +msgid "&Text" +msgstr "Κείμενο" + +#. i18n: file: settings/chatstylepage.ui:374 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:689 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:377 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:692 +msgid "Your &message font:" +msgstr "Γραμματοσειρά των μηνυμάτων σας :" + +#. i18n: file: settings/chatstylepage.ui:458 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:695 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:461 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:698 +msgid "&Force messages from your contacts to use this font:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:701 +msgid "Chat Window Formatting" +msgstr "Μορφή Παραθύρου Συνομιλίας" + +#. i18n: file: settings/chatstylepage.ui:542 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:704 +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:545 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:707 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableChatFormattingCheckBox_) +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:713 rc.cpp:780 +msgid "" +"Enables the use of \"Messenger Plus!\" formattings in the chat window. " +"For example, [b]this text[/b] will be replaced with this text." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:558 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:716 +#, fuzzy +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "Ενεργοποίηση της μορφοποίησης MSN Plus" + +#. i18n: file: settings/chatstylepage.ui:582 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:719 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:722 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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:592 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:726 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:602 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:732 +msgid "" +"If this option is enabled, your own display picture will be shown in the " +"contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:605 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:735 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:630 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:738 +msgid "G&roup chats in the same window:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:650 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:741 +msgid "Always" +msgstr "Πάντα" + +#. i18n: file: settings/chatstylepage.ui:655 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:744 +msgid "For contacts in the same group" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:747 +msgid "Never" +msgstr "Ποτέ" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:750 +#, fuzzy +msgid "Display Options" +msgstr "Εμφάνιση εικόνας" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:753 +msgid "" +"If enabled, a notification is shown when an email message is received in " +"your inbox. The number of unread email messages is shown above the contact " +"list. This option is only available for Live Mail accounts." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:756 +msgid "Display a count of &unread mail" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:759 +#, fuzzy +msgid "" +"If enabled, your contacts can see which song you are listening to. This " +"information is retrieved from the currently active media player." +msgstr "" +"Αν ενεργοποιηθεί, το KMess πληροφορεί τις επαφές για το τραγούδι που ακούτε. " +"Η πληροφορία παρέχεται από τον τρέχον αναπαραγωγέα ήχου." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:762 +msgid "Show contacts w&hich song I am listening to" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:768 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:771 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:777 +msgid "List Formatting" +msgstr "Μορφή Λίστας" + +#. i18n: file: settings/contactlistpage.ui:71 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:783 +#, fuzzy +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "Ενεργοποίηση της μορφοποίησης MSN &Plus" + +#. i18n: file: settings/contactlistpage.ui:78 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:786 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:789 +#, fuzzy +msgid "&Emoticon Themes" +msgstr "Θέματα εικονιδίων διάθεσης" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:792 +#, fuzzy +msgid "Available emoticon themes:" +msgstr "Διαθέσημα θέματα εικονιδίων διάθεσης:" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:795 +#, fuzzy +msgid "&Custom Emoticons" +msgstr "Εικονίδια διάθεσης" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:798 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Διαθέσημα θέματα εικονιδίων διάθεσης:" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:801 +#, 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:804 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Προσθήκη νέου..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:810 +msgid "Click here to rename the selected emoticon" +msgstr "Κάντε κλικ εδώ για να μετονομάσετε το επιλεγμένο εικονίδιο διάθεσης." + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:813 +msgid "Re&name" +msgstr "Μετονομασία" + +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:819 +#, fuzzy +msgid "Click here to remove the selected emoticon" +msgstr "Κάντε κλικ εδώ για να μετονομάσετε το επιλεγμένο εικονίδιο διάθεσης." + +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:822 +msgid "Remo&ve" +msgstr "Αφαίρεση" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:828 +msgid "Web Browser" +msgstr "Περιηγητής ιστού" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:831 +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:834 +msgid "&Use the KDE default browser" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:837 rc.cpp:872 +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:840 +msgid "&Use an installed browser:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:843 rc.cpp:878 +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:846 rc.cpp:881 +#, 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:850 rc.cpp:885 +#, 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:854 +#, 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:857 +msgid "Email Client" +msgstr "Πελάτης email" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:860 +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:863 +msgid "Use &Live Mail if the account supports it" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:866 +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:869 +msgid "Use the &KDE default email client" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:875 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:889 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:895 +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:901 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:904 +msgid "and" +msgstr "και" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:907 +msgid "for file transfers" +msgstr "για μεταφορές αρχείων" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:910 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Κάντε κλικ εδώ για να ανοίξετε τις ρυθμίσεις του λογαριασμού σας" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:913 rc.cpp:920 rc.cpp:927 rc.cpp:934 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:917 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:924 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Κάντε κλικ εδώ για να διαγράψετε το επιλεγμένο εικονίδιο διάθεσης" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:931 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:938 +#, fuzzy +msgid "Your comment:" +msgstr "Παναγιώτης Παπαδόπουλος" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:941 +#, fuzzy +msgid "Your comment is about:" +msgstr "Παναγιώτης Παπαδόπουλος" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:944 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:947 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:950 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:953 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:956 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:959 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +"Your email address will not be used for anything else but this report." +msgstr "" + +#~ msgid "Ink message" +#~ msgstr "Χειρόγραφο μήνυμα" + +#~ msgid "" +#~ "If you have added any custom emoticons, click this button to view them, " +#~ "so you can easily insert them in your messages." +#~ msgstr "" +#~ "Αν έχετε προσθέσει προσωπικά εικονίδια διάθεσης, πατήστε εδώ για να τα " +#~ "εμφανίσετε, έτσι θα μπορείτε να τα εισάγετε εύκολα στα μηνύματά σας." + +#~ msgid "&Do not filter" +#~ msgstr "Αναζήτηση όλων" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "" +#~ "Εμφάνιση αναδυόμενου μηνύματος κατά τη σύνδεση/αποσύνδεση της επαφής" + +#~ msgid "I&mages" +#~ msgstr "Ε&ικόνες" + +#~ msgid "Select an account and click here to delete it" +#~ msgstr "Επιλέξτε ενα λογαριασμό και κάντε κλικ εδώ για να το διαγράψετε." + +#~ msgid "" +#~ "KMess can also save your chats as HTML files, and keep them organized " +#~ msgstr "" +#~ "Το KMess μπορεί επίσης να αποθηκεύει τις συνομιλίες σας ως αρχεία HTML, " +#~ "και να τα ταξινομήσει" + +#~ msgid "File format used for saving:" +#~ msgstr "Αποθήκευση με τον τύπο αρχείου :" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "

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

" + +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Αγνοήστε αυτό το &εικονίδιο διάθεσης" + +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "Αδύνατη η φραγή αυτή τη στιγμή !" + +#~ msgid "Ed&it Notes" +#~ msgstr "Επεξεργασία Σημειώσεων" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "&Διαγραφή επαφής" + +#~ msgid "Search for C&ontact" +#~ msgstr "Αναζήτηση επαφής" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "pano_90@gmx.net" + +#~ 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 "Απόκρυψη επαφών" diff --git a/po/es.po b/po/es.po index f1b41f5..dedea91 100644 --- a/po/es.po +++ b/po/es.po @@ -1,1109 +1,2213 @@ # 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. +# Manuel Ramírez , 2009. msgid "" msgstr "" "Project-Id-Version: es\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2007-11-04 20:33-0300\n" -"Last-Translator: Christian Kaiser \n" -"Language-Team: Spanish\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\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" +"X-Language: es_AR\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Javier Cuesta Alcocer Jaume Corbí Sabater Christian Kaiser" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "yovoya30ks@hotmail.com achane4@gmail.com ckaiser139@gmail.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "No estoy frente al equipo" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Su nombre" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "su_identificador@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Iniciando sesión..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "No estoy frente al equipo" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, fuzzy, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" +"Se han encontrado algunas contraseñas inseguras.
Desea importar " +"las contraseñas a la cartera de KDE llamada '%1', mantener las contraseñas " +"inseguras, o borrarlas de permanentemente?

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." + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Almacenamiento de contraseñas seguro" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importar" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Eliminar" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Mantener" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"No puede enviar invitaciones cuando hay varios contactos en una charla. Por " +"favor, abra una ventana de conversación con el receptor deseado y reenvíe su " +"invitación." + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 se ha unido a la charla." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "" +"La conversación se ha vuelto inactiva, %1 ha dejado la charla." + +#: chat/chat.cpp:197 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 ha dejado la charla." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 y %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 y otros." + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Este mensaje fue enviado automáticamente)" + +#: chat/chat.cpp:829 +#, fuzzy, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" +"KMess no pudo guardar el historial de esta conversación.
No " +"existe el directorio de historiales de conversación '%1'." + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Ha enviado un guiño" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Ha enviado un guiño" + +#: chat/chat.cpp:987 +#, fuzzy +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" +"La conversación ha sido cancelada debido a que usted ya no está conectado al " +"servidor MSN." + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "hubo un problema de conexión." + +#: chat/chat.cpp:1154 +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 "" +"Habían demasiados emoticonos personalizados en su último mensaje. Solo " +"los últimos 7 serán enviados." + +#: chat/chat.cpp:1167 +#, fuzzy, kde-format +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." +msgstr "" +"%1 le ha enviado un mensaje de voz, pero KMess aún no los soporta, por " +"lo que no podrá escucharlo ahora." + +#: chat/chat.cpp:1181 +#, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger 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:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"Ha recibido un guiño de %1, pero los guiños han sido deshabilitados en " +"las opciones de la cuenta. Puede volver a habilitarlos en la configuración de la cuenta." + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"Ha recibido un guiño de %1, pero los guiños han sido deshabilitados en " +"las opciones de la cuenta. Puede volver a habilitarlos en la configuración de la cuenta." + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "¡%1 le ha enviado un guiño!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 le ha enviado un guiño!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "" +"Recibió un guiño de %1, pero no se pudo mostrar. Asegúrese de que " +"tiene el programa 'cabextract' instalado. Para mas información, compruebe el " +"administrador de paquetes de su distribución" + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Recibió un guiño de %1, pero no se pudo mostrar. Asegúrese de que " +"tiene el programa 'cabextract' instalado. Para mas información, compruebe el " +"administrador de paquetes de su distribución" + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has 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:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"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:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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:1384 +#, fuzzy, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 se ha desconectado. Cualquier mensaje que le envie será entregado " +"la próxima vez que el contacto inicie sesión." + +#: chat/chat.cpp:1389 +#, kde-format +msgid "%1 has gone offline." +msgstr "%1 se ha desconectado." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 ha cambiado su estado a \"%2\"" + +#: chat/chat.cpp:1430 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 le ha enviado un zumbido!" + +#: chat/chat.cpp:1463 +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:1476 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Fallo al enviar el zumbido a %1." + +#: chat/chat.cpp:1481 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "Fallo al enviar el guiño a %1." + +#: chat/chat.cpp:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "Fallo al enviar el dibujo a %1." + +#: chat/chat.cpp:1506 +#, kde-format +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 "Fallo al enviar el mensaje a %2:
%1" + +#: chat/chat.cpp:1589 +#, fuzzy, kde-format +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 equipo, y la descarga " +"falló." + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Ha enviado un zumbido a %1!" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Ha enviado un zumbido!" + +#: chat/chat.cpp:1698 +#, fuzzy, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" +"%1 se encuentra desconectado. Cualquier mensaje que le envie será " +"entregado la próxima vez que el contacto inicie sesión." + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 está enviando un guiño: %2" -#: chat/chatmessagestyle.cpp:296 +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" -msgstr "%1 dice: " +msgstr "%1 dice:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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 "Conversación con %1
iniciadas el: %2" + +#: chat/chatmessageview.cpp:366 +#, kde-format +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 "Conversación iniciada el: %2" + +#: chat/chatmessageview.cpp:406 +#, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Historial de conversación de KMess con %1" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "Agrega este emoticono: %1" -#: chat/chatview.cpp:463 -msgid "" -"Could not save chat log. 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." +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Reconectar" -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:300 +#, kde-format +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 "" +"No se pudo guardar el historial de conversación en el directorio '%1'.\n" +"Asegúrese de tener permisos de escritura en el directorio indicado para " +"guardar los historiales." + +#: chat/chatview.cpp:439 +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:458 +#, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Sobreescribir archivo" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "Sobreescribir" +msgstr "&Sobreescribir" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." -msgstr "Agregar este &emoticono" +msgstr "Agregar este &emoticono..." -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Agregar este &emoticono..." + +#: chat/chatview.cpp:834 msgid "Send &Email" -msgstr "&Enviar correo" +msgstr "&Enviar correo electrónico" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "Copiar co&rreo" +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "Agregar &contacto" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +msgid "Copy E&mail Address" +msgstr "C&opiar dirección de correo electrónico" + +#: chat/chatview.cpp:848 msgid "Visit &Link" -msgstr "Visitar &Link" +msgstr "Visitar en&lace" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" -msgstr "Copiar &Direccion" +msgstr "Copi&ar dirección" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "&Copiar texto" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" -msgstr "Seleccionar &Todo" +msgstr "Seleccionar &todo" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "Guardar conversación a un &archivo" +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "Buscar &texto..." -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Conversación" +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +msgid "C&lear Chat" +msgstr "&Limpiar conversación" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" -"No puedes aceptar esta invitación porque hay varios contactos en la " -"conversación." +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." +msgstr "Guardar conversación en un &archivo..." -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 se ha unido a la conversación." - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "La conversacion se ha vuelto inactiva. %1 ha dejado la conversación." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 ha dejado la conversación." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "Conversación con %1" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "Conversación con %1 y %2" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 y etc - Chat" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Contactos" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticonos" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" msgstr "Mis emoticonos" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Este mensaje fue enviado automáticamente)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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 "" -"El guiño no se puede mostrar. Asegúrate de que tienes el paquete " -"'cabextract' instalado." +"Hay múltiples pestañas abiertas en esta ventana de conversación. " +"¿Desea cerrar sólo la pestaña actual, o todas las pestañas?

Nota: Puede cerrar todas las pestañas de una vez presionando Alt+F4." -#: chat/chatwindow.cpp:1502 -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/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Cerrando una pestaña de conversación" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "Has recibido un guiño de %1" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "Cerrar todas las pestañas" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "El mensaje \"%1\" no pudo ser enviado" +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Cerrar la pestaña actual" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "Has recibido un zumbido de %1!" +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "&Invitar..." -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Has enviado un zumbido a %1!" +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." +msgstr "Enviar un &archivo..." -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Has enviado un zumbido!" +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "Conversación con cámara web " -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 está escribiendo." - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 y %2 estan escribiendo." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 y %3 otros estan escribiendo." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Enviar un &archivo" - -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" -msgstr "Comenzar &videoconferencia" +msgstr "Co&menzar una videoconferencia" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 msgid "Send a &Nudge!" -msgstr "Enviar un &zumbido" +msgstr "Enviar un &zumbido!" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Iniciar o detener una &Conversación" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." +msgstr "Guardar la conversación..." -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Guardar la conversación" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "Cerrar to&das las pestañas" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Invitar" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Conversación" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" -msgstr "Cambiar &tipografía" +msgstr "Cambiar la &tipografía" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" -msgstr "Cambiar &color de tipografía" +msgstr "Cambiar &color de letra" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Insertar un emoticono" +#: chat/chatwindow.cpp:470 +msgid "Show &Emoticons" +msgstr "Mostrar &emoticonos" -#: chat/chatwindowinterface.cpp:319 +#: chat/chatwindow.cpp:471 +msgid "Show S&tatus Messages" +msgstr "Mostrar mensajes de &estado" + +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "&Paneles" + +#: chat/chatwindow.cpp:480 msgid "Use &Spell Checking" +msgstr "&Utilizar corrección ortográfica" + +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "Videoconferencia" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Zumbido" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "&Enviar un archivo" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "Pestaña &anterior" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "Pestaña &siguiente" + +#: chat/chatwindow.cpp:507 +msgid "Enable or disable the contacts panel" +msgstr "Mostrar u ocultar el panel de contactos" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contactos" + +#: chat/chatwindow.cpp:513 +msgid "Enable or disable the standard emoticons panel" +msgstr "Mostrar u ocultar el panel de emoticonos estándar" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticonos" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Mostrar u ocultar el panel de emoticonos personalizados" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mis emoticonos" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "&Tipografía" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "&Color de letra" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "&Limpiar ventana de conversación" + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Iniciar o detener una &conversación" + +#: chat/chatwindow.cpp:1026 +#, fuzzy +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" +"Utilizó una sintaxis incorrecta para el comando /status. El formato " +"correcto es: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
O puede utilizar los comandos rápidos /online, /phone, " +"etc." + +#: chat/chatwindow.cpp:1029 +#, fuzzy +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Sintaxis incorrecta para /status" + +#: chat/chatwindow.cpp:1092 +#, fuzzy +msgid "You cannot use the /block command in a group chat." +msgstr "" +"Usted no puede bloquear a nadie en una conversación grupal" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" msgstr "" -#: chat/chatwindowinterface.cpp:320 -msgid "Show &Emoticons" -msgstr "Mostrar emot&iconos" +#: chat/chatwindow.cpp:1105 +#, fuzzy +msgid "You cannot use the /unblock command in a group chat." +msgstr "" +"Usted no puede bloquear a nadie en una conversación grupal" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Mostrar/Ocultar &barra lateral" +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Muestra u oculta la barra lateral" +#: chat/chatwindow.cpp:1137 +#, kde-format +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 que este mensaje sea " +"un comando, agregue al inicio otro /." -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "&Enviar correo" +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Comando desconocido" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Conversación" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Conversación" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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 desea ocultar la barra de menú? Podrá mostrarla " +"nuevamente utilizando este atajo de teclado: %1" + +#: chat/chatwindow.cpp:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Ocultando el menú" + +#: chat/chatwindow.cpp:1887 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 está escribiendo..." + +#: chat/chatwindow.cpp:1897 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 y %2 están escribiendo..." + +#: chat/chatwindow.cpp:1901 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 y %3 otros están escribiendo..." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

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

Información de la conversación

Contactos:
  • %1
Conversación iniciada el:
%2
Conectado con la cuenta:
%3
" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "&Iniciar conversación privada" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +msgid "&Send Email" +msgstr "&Enviar correo electrónico" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "&Ver perfil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 -msgid "&Add Contact" -msgstr "&Agregar contacto" +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Propiedades" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:303 kmessview.cpp:605 +msgid "&Add Contact" +msgstr "A&gregar contacto" + +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" msgstr "&Admitir contacto" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" msgstr "&Eliminar contacto" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" -msgstr "&Bloquear contacto" +msgstr "&No admitir contacto" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "&Readmitir contacto" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" -msgstr "Nombre de usuario (nick)" +msgstr "Ap&odo" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" -msgstr "Mensaje &Personal" +msgstr "Mensaje &personal" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" -msgstr "Corr&eo Electrónico:" +msgstr "Dirección de &correo electrónico" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "&Copiar.." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "Nombre de la &canción" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Información" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Imágen para mostrar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "&Notas" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "&Emoticonos" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "&Copiar" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Sin admisión" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Ausente" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "El contacto está %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Vuelvo enseguida" +#: chat/emoticonswidget.cpp:289 +#, fuzzy +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not 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/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Ocupado" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Agregar a la Charla" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Desconectado" +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Agregar nuevo" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Ausente - Inactivo" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Editar" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Sali a Comer" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Eliminar" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

Aún no ha agregado guiños.

Para agregar nuevos, pídale " +"a sus contactos que le envíen alguno!

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Robot de messenger" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "Compatible con MSN Messenger %1" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Compatible con Windows Live Messenger %1" + +#: contact/contactbase.cpp:353 +msgid "Windows Live Messenger compatible" +msgstr "Compatible con Windows Live Messenger" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Conectado" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Ocupado" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Ausente" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Ausente con respuesta automática" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inactivo" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Vuelvo enseguida" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" -msgstr "Al Teléfono" +msgstr "Al teléfono" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "Este contacto no esta en línea" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Salí a comer" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "Estilo de la ventana de conversación:" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" +msgstr "Invisible" + +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" msgstr "Desconectado" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Esta cuenta no tiene una bandeja de entrada de Hotmail!" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Mi estado" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Desconectar" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" msgstr "Agregar un contacto" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Introduzca la dirección de correo de la persona que desea agregar:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "El nombre de usuario o dirección de correo proporcionado no es válido" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Agregar nuevo emoticono" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "El emoticono \"%1\" ya existe, desea reemplazarlo?" +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Editar emoticono" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Especifique un mensaje de ausencia" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "El emoticono \"%1\" ya existe. ¿Desea reemplazarlo?" #: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Mensaje de ausencia automático" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Historial de conversaciones" + +#: dialogs/chathistorydialog.cpp:245 +#, fuzzy, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Introduzca el mensaje que se mandará automáticamente\n" -"a la gente que intente contactar con usted:" +"Ocurrió un error al abrir sus historiales. Esto sucede usualmente por " +"problemas de permisos, compruebe que tiene acceso de lectura/escritura al " +"directorio \"%1\". De otra manera, sus historiales podrían estar " +"dañados." -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Usar un nombre alternativo para esta persona" +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "No se pudo abrir el historial de conversaciones" -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Mostrar una notificación cuando esta persona se conecte o desconecte" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Iniciando sesión..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Foto:" +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Registrar todas las conversaciones" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Sonido:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Usted ha sido agregado por alguien" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"le ha agregado a su lista de contactos." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +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:282 +#, kde-format msgid "Contact Properties for %1" -msgstr "Propiedades de contacto %1" +msgstr "Propiedades de contacto para %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Correo electronico: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Conectado" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Nombre actual: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "Aún no ha sido visto" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "Aún no hay mensajes" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Última vez visto: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Último mensaje: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Dirección de correo electrónico: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Cliente: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "¿Está seguro que desea usar la imágen para mostrar de este contacto?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "Copiar la imágen de este contacto" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "La invitación fue rechazada. No es soportada por el otro cliente." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Invitar contactos" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" -msgstr "Ventana de Red" +msgstr "Ventana de red" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Guardar pestaña" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "&Guardar pestaña" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Limpiar pestaña" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "&Limpiar pestaña" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Cerrar pestaña" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "Cerrar &todas las pestañas" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "No hay conexiónes activas. No se puede abrir la Ventana de Red" +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"No hay conexiones activas.\n" +"No se puede abrir la ventana de red." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"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 está siendo guardado." -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 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/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 -msgid "Cancelled" -msgstr "" - -#: dialogs/transferentry.cpp:160 -msgid "Failed!" -msgstr "" - -#: dialogs/transferentry.cpp:202 +#: dialogs/networkwindow.cpp:1273 #, fuzzy -msgid "Completed" -msgstr "Computadora" +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"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/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/networkwindow.cpp:1303 +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:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "¡No se puede enviar comandos a este tipo de conexión!" + +#: 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 "Cancelado" + +#: dialogs/transferentry.cpp:181 +msgid "Failed!" +msgstr "¡Falló!" + +#: dialogs/transferentry.cpp:225 +msgid "Completed" +msgstr "Completado" + +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "recibidos %1 de %2." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "enviados %1 de %2." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "infinito" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" msgstr "Transferencias de archivo" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Utilizar" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Eliminar" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "Seleccione o quite su imágen para mostrar" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "¿Está seguro de que desea eliminar la imágen?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Imágen para mostrar" + +#: emoticontheme.cpp:627 +#, kde-format 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 el directorio de temas '%1'." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Sonrisa" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "Guiño" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" -msgstr "Lengua" +msgstr "Lengua fuera" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Gran sonrisa" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Triste" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Llorando" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" -msgstr "Molesto" +msgstr "Enojado" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Confundido" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Avergonzado" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Desilusionado" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Caliente" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" -msgstr "Muestra dientes" +msgstr "Muestra los dientes" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Genio" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Enfermo" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Sorprendido" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Fiesta" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" -msgstr "Dormilón" +msgstr "Dormido" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Pensando" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Sin comentarios" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Secreto" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Cansado" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" -msgstr "Sarcastico" +msgstr "Sarcástico" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" -msgstr "No se" +msgstr "No sé" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Vuelvo enseguida" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Ángel" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" -msgstr "Abrazo" +msgstr "Abrazo a la izquierda" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Niño" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Corazón" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Rosa" -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "Ok" +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "Bien" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Perro" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Sol" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Demonio" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" -msgstr "Abrazo" +msgstr "Abrazo a la derecha" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Niña" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Corazón roto" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Rosa marchita" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Mal" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Gato" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Durmiendo" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Labios" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" -msgstr "Aplaude" +msgstr "Aplauso" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" -msgstr "Cruza dedos" +msgstr "Dedos cruzados" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" -msgstr "Auto" +msgstr "Automóvil" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Avión" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Tortuga" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Gusano" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Oveja negra" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Oveja" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Cabra" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" -msgstr "Murcielago" +msgstr "Murciélago" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Cerveza" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" -msgstr "Martini" +msgstr "Copa de martini" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" -msgstr "Café" +msgstr "Taza de café" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Pastel de cumpleaños" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Plato" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Tazón" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Estrella" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" -msgstr "Arcoiris" +msgstr "Arco iris" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Tormenta" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Rayos" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Paraguas" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" -msgstr "Isla y palmera" +msgstr "Isla con una palmera" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" -msgstr "Telefono" +msgstr "Teléfono" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Celular" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" -msgstr "Email" +msgstr "Correo electrónico" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Reloj" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" -msgstr "Camara" +msgstr "Cámara" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" -msgstr "Pelicula" +msgstr "Película" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Nota" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Esposas" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Dinero" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Foco" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "Cigarrillo" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "Pelota" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "Pelota de fútbol" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Regalo con moño" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Computadora" -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "Icono KMess" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" +msgstr "Icono de KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "La dirección de contacto que has entrado no es valida: \"%1\"" +#: initialview.cpp:239 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "No se puede reconectar: cuenta no encontrada." -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "Agregar grupo" +#: initialview.cpp:252 +#, fuzzy +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." -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Introduzca el nombre nuevo para este grupo:" - -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Ausente con respuesta automática" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Inactivo" - -#: kmess.cpp:715 +#: initialview.cpp:280 initialview.cpp:375 +#, kde-format +msgctxt "Status message on login screen" msgid "" -"Are you sure you want to remove the contact %1 from your contact " -"list?" -msgstr "¿Seguro que quiere eliminar el contacto %1?" - -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "Eliminar contacto" - -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "Eliminar y no admitir" - -#: kmess.cpp:760 -msgid "" -"Are you sure you want to remove the group %1 from your contact " -"list?" -msgstr "¿Seguro que quiere eliminar el grupo %1?" - -#: kmess.cpp:763 -msgid "Remove group" -msgstr "Eliminar grupo" - -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "Éste es un grupo especial que no puede ser cambiado." - -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "Renombrar grupo" - -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Conectado" - -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "Desconectado" - -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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.

" +"Waiting for an Internet connection to reconnect...
Reconnect now!" 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.

" +"Esperando una conexión de Internet para reconectar...
¡Reconectar ahora!" -#: kmess.cpp:1673 -msgid "Error with notifications" -msgstr "Error con las notificaciones" +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "No está disponible la conexión a Internet ." -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nueva &Cuenta" +#: initialview.cpp:401 +#, kde-format +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!" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Nuevo &Contacto" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Nuevo &Grupo" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "&Buscar contacto" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Buscar por &interés" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "O&pciones de la cuenta" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Acciones" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Co&nectar" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Desconectar" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Mostrar mi &perfil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Mi Estado" - -#: kmessinterface.cpp:220 +#: initialview.cpp:596 +msgctxt "Button label" msgid "&Connect" msgstr "&Conectar" -#: kmessinterface.cpp:275 +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Cancelar" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Por favor, complete con su correo electrónico y contraseña." + +#: initialview.cpp:680 +#, fuzzy +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:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "El contacto %1 ya está en su lista de contactos." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Información de contacto" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Nuevo grupo" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Agregar un grupo" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Introduzca el nombre para el nuevo grupo:" + +#: kmess.cpp:576 +#, kde-format +msgid "" +"Are you sure you want to remove the contact %1 from your contact " +"list?" +msgstr "" +"¿Está seguro que desea eliminar el contacto %1de su lista de " +"contactos?" + +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "Eliminar contacto" + +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "Eliminar y no admitir" + +#: kmess.cpp:626 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Eliminar grupo" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" +msgid "" +"Are you sure you want to remove the group %1 from your contact " +"list?" +msgstr "" +"¿Está seguro que desea eliminar el grupo %1de su lista de " +"contactos?" + +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Eliminar" + +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." +msgstr "Éste es un grupo especial, y no puede ser cambiado." + +#: kmess.cpp:676 +msgid "Rename Group" +msgstr "Renombrar Grupo" + +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Introduzca el nuevo nombre para este grupo:" + +#: kmess.cpp:753 +#, fuzzy, kde-format +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:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Falló el inicio de sesión automático" + +#: kmess.cpp:1039 +msgid "Connection could be down..." +msgstr "La conexión puede estar caída..." + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Desconectado" + +#: kmess.cpp:1448 +#, kde-format +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 buscó en los siguientes directorios:
%1

" + +#: kmess.cpp:1460 +#, kde-format +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 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:1466 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Error con las notificaciones" + +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "&Conectar" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Desconectar" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Mostrar mi &perfil" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "Mostrar contactos &admitidos" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "Mostrar contactos &desconectados" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "Mostrar contactos &eliminados" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Mostrar foto" +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Mostrar &historial de eventos" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Mostrar ventana de red" +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "Mostrar la barra de &búsqueda" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Mostrar grupos &vacios" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "&Tamaño de las imágenes" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "&Ordenar contactos por" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Mostrar ventana de &transferencias..." + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Nuevo &contacto..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Nuevo &grupo..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "&Exportar lista de contactos..." + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "Mostrar &historial de conversaciones..." + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Nueva &cuenta..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Configurar cuenta..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Configurar &Kmess..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Mostrar &menú de selección" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "No mostrar" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Pequeño" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Mediano" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Grande" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Grupo" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Conectados/Desconectados" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Mostrar ventana de &transferencias" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Mezclado" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Escuchando %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "Mostrar ventana de &red..." -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] sesión iniciada con %2" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 se conectó" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 se desconectó" + +#: kmessview.cpp:599 msgid "Cha&t" -msgstr "Conversación" +msgstr "&Conversación" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Propiedades" +#: kmessview.cpp:610 +msgid "&Remove From Group" +msgstr "Eliminar del g&rupo" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "Eliminar del grupo" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Mover al grupo" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" msgstr "&Copiar al grupo" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "&Mover al grupo" + +#: kmessview.cpp:695 msgid "Move Group &Down" -msgstr "&Mover al grupo" +msgstr "Mover grupo &abajo" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" -msgstr "&Mover al grupo" +msgstr "Mover grupo a&rriba" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "Eli&minar grupo" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "Re&nombrar grupo" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "Mensaje nuevo en su bandeja de entrada" +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Esta persona no lo tiene en su lista de contactos." -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "%1 mensajes nuevos en su bandeja de entrada" +#: kmessview.cpp:1145 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Correo electrónico" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Ausente)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Cliente" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Vuelvo enseguida)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "Si" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Ocupado)" +#: kmessview.cpp:1168 +msgid "No" +msgstr "No" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Desconectado)" +#: kmessview.cpp:1171 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Sin admisión" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Ausente - Inactivo)" +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Última vez visto" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Salí a comer)" +#: kmessview.cpp:1206 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Último mensaje" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Al teléfono)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Grupo %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Iniciar sesion automáticamente con la dirección dada" +#: kmessview.cpp:1224 +#, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contacto, %2 conectado" +msgstr[1] "%1 contactos, %2 conectados" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contacto" +msgstr[1] "%1 contactos" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Escriba su mensaje personal aquí>" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Ha rechazado la invitación." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "Historial de conversaciones" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 nuevo mensaje de correo electrónico" +msgstr[1] "%1 nuevos mensajes de correo electrónico" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "Un cliente de mensajería MSN para KDE" + +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, 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 "Developer and project founder" +msgstr "Desarrollador y fundador del proyecto" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Desarrollador" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Soporte para el proyecto" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Desarrollador actual" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:124 +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:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -1111,1929 +2215,5243 @@ msgstr "" "Traducción al alemán, pruebas, documentación webmaster, gestión del " "proyecto, etc..." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 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:73 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "Juego de emoticonos amarillo/azul/violeta, traducción al italiano" + +#: main.cpp:74 msgid "Cartoon emoticons" msgstr "Emoticonos de cómic" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Tema de sonido por defecto" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "Icono de KMess en estilo de Oxígeno" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "Mantenedor de traducciones" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Traducción al árabe, internacionalización de parche para guardar archivos." -#: main.cpp:87 -msgid "More Arabic translation" -msgstr "Mas traducciones al Arabe" +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" -#: main.cpp:88 +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "Mas traducciones al árabe" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Traducción al portugués brasileño" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Más traducciones al portugués brasileño" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Traducción al catalán" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Más traducciones al italiano" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 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" +"Traducción al chino simplificado, arreglo de un bug en el envio de archivos, " +"código de conexiones proxy" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "Más traducciones al chino simplificado" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "Traducción al chino tradicional" -#: main.cpp:95 -msgid "Danish translation" -msgstr "Traducción al danes" - #: main.cpp:96 -msgid "More Danish translation" -msgstr "Más traducciones al danes" +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" #: main.cpp:97 -msgid "Dutch translation" +msgid "More Traditional Chinese translation" +msgstr "Más traducciones al chino tradicional" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Traduccion al chino" + +#: main.cpp:99 +msgid "Danish translation" msgstr "Traducción al danés" -#: main.cpp:98 -msgid "More Dutch translation" +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:100 +msgid "More Danish translation" msgstr "Más traducciones al danés" #: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "Traducción a holandés" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 +msgid "More Dutch translation" +msgstr "Más traducciones a holandés" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "Más traducciones al alemán, traducción griega" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +msgid "More Greek translation" +msgstr "Más traducción al griego" + +#: main.cpp:111 msgid "Estonian translation" msgstr "Traducción al estonio" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:112 msgid "Finnish translation" msgstr "Traducción al finlandés" -#: main.cpp:102 main.cpp:103 -msgid "More Finnish translation" -msgstr "Más traducciónes al finlandés" +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "Markus Vuori" -#: main.cpp:105 +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:113 main.cpp:114 +msgid "More Finnish translation" +msgstr "Más traducciones al finlandés" + +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:116 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:116 msgid "French translation" msgstr "Traducción al francés" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" -msgstr "Mas traducciones al francés, emoticonos MSN6" +msgstr "Mas traducciones al francés,definiciones de los emoticonos MSN6" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" msgstr "Más traducción al francés" -#: main.cpp:109 -msgid "Hungarian translation" -msgstr "Traducción al hungaro" +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" -#: main.cpp:110 main.cpp:111 +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 +msgid "Hungarian translation" +msgstr "Traducción al húngaro" + +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:123 +msgid "More Hungarian translation" +msgstr "Traducción al húngaro" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:124 main.cpp:125 msgid "More Italian translation" msgstr "Más traducciones al italiano" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +#, fuzzy +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "Selección de grupo en el diálogo de \"agregar usuario\"" + +#: main.cpp:127 msgid "Korean translation" msgstr "Traducción al coreano" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "Traducción al Norsk Bokmål" -#: main.cpp:115 -msgid "Slovenian translation" -msgstr "Traducción al esloveno" +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" -#: main.cpp:116 +#: main.cpp:130 +msgid "Serbian translation" +msgstr "Traducción al serbio" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "Traducción al eslovaco" + +#: main.cpp:133 +#, fuzzy +msgid "Matjaž Kaše" +msgstr "Matjaž kaše" + +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "Traducción al eslovaco" + +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:135 msgid "Spanish translation" msgstr "Traducción al español" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 msgid "More Spanish translation" msgstr "Más traducciones al español" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:144 msgid "Swedish translation" msgstr "Traducción al sueco" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +msgid "More Swedish translation" +msgstr "Mas traducción al sueco" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:147 msgid "Thai translation" msgstr "Traducción al tailandés" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:148 msgid "Turkish translation" msgstr "Traducción al turco" -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "Traducción al turco" +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" -#: main.cpp:129 +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "Mas traducción al turco" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "Soporte MSNP12, parches varios" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" +"Código de imágenes en la lista de contactos, información del cliente del " +"contacto, acercamiento de tipografía" -#: main.cpp:130 +#: main.cpp:155 +msgid "File transfer thumbnails" +msgstr "Miniaturas de transferencias de archivo" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "Soporte para el campo \"P4-Context\"" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Correcciones de Xinerama" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Código original de recepción de archivos" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "Soporte para la cartera de KDE" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Opción de bloqueo de notificaciones, opción para deshabilitar guiños, " +"característica de última fecha del mensaje" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "Comandos tipo IRC en la ventana de conversación" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "Diálogo de historial de conversaciones" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "Varias correcciones a la internacionalización" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "Varias correcciones a la internacionalización." -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "Desarrollador de GnomeMeeting" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Tipo con una bolsa en la cabeza" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspiración y certeza del código" -#: main.cpp:139 -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:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" -#: main.cpp:140 +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:173 +#, fuzzy +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" +"Antiguo código de notificación emergente, código p2p inicial, manejo del " +"\"msn challenge\"" + +#: main.cpp:174 msgid "Idle timer code" msgstr "Código del temporizador" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:175 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" -msgstr "" +msgstr "Código de cerrar a la bandeja" -#: main.cpp:144 -msgid "Your name here?" -msgstr "Su nombre aqui" +#: main.cpp:176 +msgid "Amarok" +msgstr "Amarok" -#: main.cpp:144 +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "Implementación del manejador de fallos personalizada" + +#: main.cpp:179 #, fuzzy msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\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!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:179 +msgid "Your name here?" +msgstr "¿Su nombre aquí?" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Juan Pablo González Tognarelli, Manuel Ramírez" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Correo electronico: " + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "No mostrar lista de contactos al inicio" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "" +"Iniciar sesión automáticamente con la dirección de correo electrónico dada" + +#: main.cpp:195 +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:1823 +msgid "Individuals" +msgstr "Personas" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Admitido" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Eliminado" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." -msgstr "Su contacto ha cancelado la sesión." +msgstr "El contacto ha cancelado la sesión." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." -msgstr "Su contacto ha rechazado la invitación." +msgstr "El contacto ha rechazado la invitación." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Ha cancelado la sesión." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." -msgstr "Ha rechazado la invitación" +msgstr "Ha rechazado la invitación." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to accept or cancel?" -msgstr "Desea ACEPTAR o CANCELAR el envio?" +msgstr "Desea aceptar o cancelar?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." -msgstr "Clic para cancelar" +msgstr "Presione para cancelar." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "El contacto desea enviarle un archivo: "%1" (%2)." -#: network/applications/filetransfer.cpp:209 -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 +#, fuzzy, kde-format +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:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Conectando a %1, puerto %2" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"La transferencia del archivo "%1" falló. No se pudo guardar el " +"archivo." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "La transferencia fue cancelada" +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "La transferencia de %1 falló. No se pudo abrir el archivo destino." -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Conexión establecida" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Archivo transferido con éxito: %1" - -#: network/applications/filetransfer.cpp:600 -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:604 -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:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Enviando archivo %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Transferencia aceptada." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 -msgid "Negotiating options to connect" -msgstr "" +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Conectando a %1, puerto %2" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Su contacto ha cancelado la transferencia del archivo "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Ha cancelado la transferencia del archivo "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the 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:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "El archivo "%1" fue transferido exitosamente." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "El archivo "%1" fue recibido con éxito." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "" +"La transferencia del archivo "%1" falló. El archivo no existe." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "" +"La transferencia del archivo "%1" falló. El archivo no puedo ser " +"leído." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Enviando archivo "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "El contacto ha aceptado la transferencia del archivo "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +msgid "Negotiating options to connect" +msgstr "Negociando las opciones para conectar" + +#: 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 "" -"La transferencia de archivo fue cancelada. Fue recibida información corrupta." +"La invitación de transferencia de archivo fue cancelada. Se recibió " +"información defectuosa." -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "La transferencia de %1 falló. No se pudo abrir el archivo" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Usted ha aceptado la transferencia del archivo "%1"." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Su contacto ha cancelado la transferencia." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" +msgstr "El archivo no pudo ser escrito" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "La transferencia de %1 falló. El archivo no existe. " - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %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:814 -msgid "Sending file %1 (%2)" -msgstr "Enviando archivo %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: 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 (utilizando " +"GnomeMeeting)." -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Abriendo GnomeMeeting. Conectando a %1." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "Proponiendo al contacto el inicio de videoconferencia." +msgstr "Invitando al contacto al inicio de una videoconferencia." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." msgstr "La invitación fue rechazada. No es soportada por el otro cliente." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." msgstr "La invitación fue cancelada. Ocurrió un error interno." -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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:130 -msgid "The invitation was aborted. Timeout while waiting for file data." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +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 " -"de archivo." +"La invitación fue cancelada. Se acabó el tiempo esperando por la información " +"del archivo." -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "La invitación fue cancelada. El sistema cerro la comunicación." +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "" +"La invitación fue cancelada. El sistema cerró la conexión de la conversación." -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "La invitación fue cancelada." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Has sido invitado a compartir el escritorio de esta persona." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Abriendo KRDC. Conectando a %1." -#: network/applications/p2papplication.cpp:276 -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:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "" +"El contacto le está invitando a %1, pero esta opción no está implementada " +"aún." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "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 defectuosa o " "KMess no ofrece soporte." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "La transferencia falló. La preparación falló." +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "La transferencia falló. Preparación de datos fallida." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -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:1624 -msgid "The transfer failed." -msgstr "La transferencia falló" - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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:2038 +#: network/applications/p2papplication.cpp:1192 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:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "" -"La transferencia ha fallado. El contacto ha enviado datos defectuosos, o " +"La transferencia ha fallado. El contacto ha enviado datos defectuosos o " "KMess no lo soporta." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Su contacto rechazo la invitación. Ocurrió un error interno." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Esperando conexión en %1, puerto %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "Enviando por método indirecto (la transferencia será más lenta)." - -#: network/applications/p2papplication.cpp:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." msgstr "" -"La transferencia falló. Fuera de tiempo esperando que el usuario acepte." +"Enviando por método de transferencia de archivos indirecto (ésto puede ser " +"más lento)." -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "La transferencia falló. Ocurrió un error interno." - -#: network/applications/p2papplication.cpp:3670 -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:4844 -#, fuzzy +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" -msgstr "Esperando por lista de contactos..." +msgstr "Esperando por la conexión" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "" -"La invitación fue cancelada. Se acabo el tiempo esperando que el contacto " +"La invitación fue cancelada. Se acabó el tiempo esperando que el contacto " "aceptara." -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred 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:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred 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/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Su contacto rechazo la invitación. Ocurrió un error interno." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "La transferencia falló." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "La transferencia falló. Ocurrió un error interno." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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." -msgstr "Has sido invitado a una conversación vocal." +msgstr "Has sido invitado a una conversación de voz." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 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 " -"instalado." +"Ha sido invitado a una conversación de voz pero el soporte para ésto no fue " +"instalado" -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "Ha cancelado la conversación vocal." +msgstr "Ha cancelado la conversación de voz." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "" "La invitación fue cancelada. El dispositivo de audio no pudo ser abierto." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." -msgstr "Abriendo conversación vocal. Conectando a %1." +msgstr "Comenzar conversación de voz. Conectando a %1." -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." -msgstr "Inicia conversación vocal. Escuchando en %1." +msgstr "Comenzar conversación de voz. Escuchando en %1." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." -msgstr "Proponiendo al contacto el inicio de conversación vocal." +msgstr "Invitando al contacto a una conversación de voz." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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." +"El contacto le está invitando a %1, pero esta opción no está implementada " +"aún." -#: network/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "La transferencia de %1 fue cancelada" - -#: network/extra/msnftpconnection.cpp:136 -msgid "Failed" +#: 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. La información recibida es " +"defectuosa." -#: network/extra/msnftpconnection.cpp:410 -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/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Esta siendo invitado a mostrar su cámara web." -#: network/extra/msnftpconnection.cpp:411 +#: network/applications/webcamtransferp2p.cpp:138 #, fuzzy -msgid "Couldn't open a local port." -msgstr "" -"La transferencia de %1 falló. No se ha encontrado ningún puerto local " -"abierto." +msgid "You are invited to view this contact's webcam." +msgstr "Ha sido invitado a ver la cámara web de esta persona." -#: network/extra/msnftpconnection.cpp:468 +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "cámara web" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Ha cancelado la transferencia del archivo "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Su contacto ha cancelado la transferencia del archivo "%1"." + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "Falló" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Enviando archivo %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "La transferencia de %1 falló. No se pudo abrir un puerto local." + +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not open a local port." +msgstr "No se pudo abrir un puerto local." + +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Iniciando transferencia de archivo" -#: network/extra/msnftpconnection.cpp:481 -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 +#, kde-format +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:482 -#, 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:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Recibiendo archivo %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "La sintáxis del comando es inválida" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "El parámetro del comando es inválido" + +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" msgstr "" -"KMess no ha podido conectar con el servidor de MSN Messenger.
Asegurese " -"que esta conectado a internet
Error %1 (código %2)." +"El correo electrónico que ha tratado de agregar no es una cuenta de MSN " +"Messenger" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "Señal perdida" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Falta el nombre de dominio" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 señales perdidas" +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Ya se encuentra conectado" -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "Se ha perdido la conexión con el servidor." +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" +msgstr "El nombre de cuenta provisto es inválido" -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "El servidor ha cerrado la conexión." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Admitido" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Eliminado" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -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." - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "¿Mostrar estado del servicio .NET?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Error del servidor" - -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:400 #, fuzzy msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"Ha sido desconectado porque se conectó \n" -"desde otro cliente de MSN Messenger \n" -"o desde otra ubicación" +"El nombre de cuenta es inválido, o su cuenta Passport aún no ha sido " +"confirmada" -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "Sincronización establecida..." - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Autentificando..." - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Confirmación de usuario recibida..." - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Esperando por lista de contactos..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Transferencia al servidor de notificación" - -#: network/msnnotificationconnection.cpp:1919 -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:2034 -msgid "Connecting..." -msgstr "Conectando..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess recibió un mensaje de error desconocido del servidor: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Error interno del servidor en KMess: %1" - -#: network/msnnotificationconnection.cpp:2243 -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:2252 -msgid "The account name given is invalid" -msgstr "El nombre de cuenta proveído es inválido." - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" -"El nombre de cuenta es inválido, o su contraseña no fue confirmada aún." - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "Su lista de contactos está completa" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "Parámetro SBP inválido" + +#: network/msnconnection.cpp:411 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:2267 +#: network/msnconnection.cpp:415 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:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" -msgstr "Este contacto no esta en línea" +msgstr "Este contacto no está conectado" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Su lista de contactos tiene demasiados grupos" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Ya se está en este modo" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "Éste es un grupo que no puede ser cambiado." +#: network/msnconnection.cpp:428 +#, fuzzy +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:2285 +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"El nombre de grupo ya fue agregado a su lista de contactos de Messenger o " +"Hotmail. Por favor utilice un nombre diferente." + +#: network/msnconnection.cpp:436 +#, fuzzy +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 " +"hasta 30." + +#: network/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Este grupo no puede ser cambiado" + +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "El contacto no está agregado a este grupo" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "Este grupo no esta vacío" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +#: network/msnconnection.cpp:453 +#, fuzzy +msgid "The group name is too long; it cannot be longer than 61 bytes" msgstr "" -"Este nombre de grupo ya esta en uso por su lista de contactos Messenger o " -"Hotmail" +"El nombre del grupo es demasiado largo; Éste no puede superar los 61 bytes." -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "El nombre del grupo es demasiado largo" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "Se intentó cambiar el grupo \"0\"" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Error interno del servidor en KMess: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Grupo inválido" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "Dominio vacío" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "Formato del comando ADL erróneo" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "Fallo del servicio" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" msgstr "Transferencia al servidor de intercambio fallida" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "Error de conexión directa (MSNSLP), la conexión ha fallado." +msgstr "Error de conexión directa (MSNSLP), la conexión ha fallado" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "Error accesando a su lista de contactos, intente en otro momento" +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Falta un campo requerido" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "No autenticado" + +#: network/msnconnection.cpp:492 +#, fuzzy +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "A esta cuenta se le denegó el acceso al servicio MSN." + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "El comando está deshabilitado" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" msgstr "Su cuenta tiene el acceso prohibido." -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Esta abriendo sesiones demasiado rápido" +#: network/msnconnection.cpp:504 +msgid "Challenge response failed" +msgstr "La respuesta falló" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Tiene demasiadas sesiones abiertas" +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "Datos de comandos erróneos" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "Está abriendo sesiones de charla demasiado rápido" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "Tiene demasiadas sesiones de charla abiertas" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "Secuencia de comandos no esperada" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" -msgstr "Apodo no válido" +msgstr "Apodo inválido" -#: 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:534 +msgid "Bad CVR data" +msgstr "Datos CVR erróneos" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." -msgstr "No puedes comenzar una conversación mientras permanezcas desconectado." +#: network/msnconnection.cpp:540 +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:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr "Tiene un servicio infantil, requiere aprobación paterna" +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "La verificación de la autenticación fue incorrecta" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Su contraseña debe ser verificada primero" +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "No puede comenzar una conversación mientras permanezca desconectado." -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - Error de MSN" +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "No se están aceptando nuevos contactos" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Error interno del servidor" +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" +"Tiene una cuenta de Passport infantil, usted requiere aprobación paterna " +"para charlar." -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "El servidor está ocupado" +#: network/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "Su cuenta Passport primero necesita ser verificada." -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "El servidor no está disponible" +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "Verificación USR errónea" -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "Error accediendo a su lista de contactos, intente nuevamente mas tarde" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"El servicio MSN no está disponible temporalmente, hubo un error interno del " +"servidor." + +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" +"El servicio MSN no está disponible temporalmente, el servidor está muy " +"ocupado" + +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "Servidor de notificación de usuario caído" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" -msgstr "El servidor está a punto de cerrarse" +msgstr "El servidor está cerrandose" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" -msgstr "El servidor está a punto de caer" +msgstr "El servidor se cerrará pronto" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" -msgstr "Bloqueo de escritura" +msgstr "La escritura está bloqueada" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "La sesión esta sobrecargada" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" msgstr "El servidor no está disponible" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" -msgstr "Fallo en la autentificación de usuario" +msgstr "Fallo en la autenticación" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "No se aceptan nuevos principales" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess recibió un mensaje de error desconocido del servidor: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Advertencia: El servidor cierra por mantenimiento dentro de 1 minuto!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -"El servidor de MSN ha reportado que cerrara en 1 minuto para mantenimiento." +"Código de error desconocido recibido desde el servidor: %1
Detalles " +"técnicos: %2" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Error de MSN" + +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "Intentando el HTTP alternativo..." + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "Autenticando..." + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "Autenticado" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "Cambiando a otro servidor..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Conectando..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Se recibió un comando desconocido del servidor: %1" + +#: network/msnnotificationconnection.cpp:2100 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuto" +msgstr[1] "%1 minutos" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "El servidor cierra por mantenimiento en %1!" + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "El servidor de MSN cerrará en %1 para mantenimiento." + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -"Advertencia: El servidor cierra por mantenimiento dentro de %1 minutos!" +"KMess no ha podido procesar los mensajes recibidos cuando estaba " +"desconectado.
Detalles: %1" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "El cliente SOAP ya no es válido." + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "Se excedió el tiempo de autenticación" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Esperando por lista de contactos..." + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Advertencia: %1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Advertencia MSN" + +#: network/msnnotificationconnection.cpp:2869 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Motivo del error interno: %1" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"KMess no ha podido procesar los mensajes recibidos offline.

Detalles: " -"%1" +"

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

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +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:2920 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"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" +"

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

" -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: passive notification message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "KMess no ha podido acceder al servicio web.

Detalles: %1" +"

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.
¿Quizás usted " +"necesita autenticarse antes de acceder a la red?

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Este contacto está desconectado o invisible." - -#: network/msnswitchboardconnection.cpp:1052 -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/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "El mensaje \"%1\" no fue recibido" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "No se ha podido establecer la conexion: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "Demaciadas redirecciónes por el servidor de entrada" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Conexión fuera de tiempo." - -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "En la conversación de %1: %2" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 dice:
'%2'" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1te ha mandado un mensaje desconectado:
'%2'" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "La conversacion de %1's require atención!" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1:
%2" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 te ha enviado un zumbido!" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1 te ha enviado un guiñó!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 desea usar la camara web" - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 te esta enviando un archivo!" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 te ha enviado una invitación!" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 ha cancelado la sesión de camara web!" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 ha cancelado la transferencia de archivo!" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "La actividad con %1 ha sido cancelada!" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 ha aceptado usar la camara web!" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 ha aceptado la transferencia de archivo!" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 ha aceptado su invitacion!" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 ha terminado la sesión de camara web!" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "La transferencia de archivo con %1 ha terminado!" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "La actividad con %1 ha terminado!" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "La sesión de camara web con %1 ha fallado!" - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "La transferencia con %1 ha fallado!" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "La actividad de %1 ha finalizado con un error!" - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 se ha puesto Ausente" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 volvera enseguida" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 ahora está Ocupado" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 se ha desconectado" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 se ha puesto Invisible" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 se ha puesto Inactivo" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 salió a comer" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 está en el telefono" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 se ha conectado" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Nuevo correo electrónico
'%1'
de '%2'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "&Enviar" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "&Nueva línea" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Barra lateral" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Este contacto aún no este en su lista." - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Haz click aquí para mostrar el perfíl de este contacto." - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Haz click para mandar un correo electrónico a este contacto." - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Metodo abreviado de teclado:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Archivo de imagen:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Agregar contacto" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/msnnotificationconnection.cpp:2935 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"

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 "" -"%1\n" -"le ha agregado a su lista de contactos. ¿Qué desea hacer?" +"

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.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "&Agregar este contacto a su lista de \"Amigos\"" +#: network/msnnotificationconnection.cpp:2954 +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.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "&No agregar, pero permitir que vean mi estado de conexión." - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" +#: network/msnnotificationconnection.cpp:2956 +#, kde-format +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 "" -"Evitar que esta persona se ponga en contacto conmigo &y vea mi estado de " -"conexión" +"

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

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

" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "Lim&piar" +#: network/msnnotificationconnection.cpp:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Error: %1

" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Introduzca los datos de su cuenta:" +#: network/msnnotificationconnection.cpp:2969 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "Correo electrónico:" +#: network/msnnotificationconnection.cpp:2980 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Error del servicio de Messenger: %1

" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Contraseña" +#: network/msnnotificationconnection.cpp:2982 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Estado al iniciar sesión" +#: network/msnnotificationconnection.cpp:2990 +#, kde-format +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Error de KMess: %1

" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "Recor&dar este perfil" +#: network/msnnotificationconnection.cpp:2992 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Conectar" +#: network/msnnotificationconnection.cpp:3003 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Se ha perdido la conexión con la red.

" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Escriba su mensaje personal aquí" +#: network/msnnotificationconnection.cpp:3005 +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.

" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Escuchando %1" +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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

" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "Notificación de KMess" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" +"Ingrese su nombre de usuario y contraseña para acceder al proxy de la red." -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Código de error interno: %2)" + +#: network/msnsockethttp.cpp:696 +#, kde-format +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:364 +msgid "Connection time limit exceeded" +msgstr "Excedido el tiempo límite de conexión" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 paquete perdido" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 paquetes perdidos" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "Se ha perdido la conexión con el servidor" + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" +"¡La dirección de correo electrónico especificada, \"%1\" no es una dirección " +"de correo electrónico válida!" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" +"¡La dirección de correo electrónico especificada, \"%1\" no está asociada a " +"una cuenta de Live Messenger!" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Solicitud de servicio web inálida (%1)" + +#: network/soap/httpsoapconnection.cpp:408 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "El servicio web no está disponible (%1)" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Demasiadas redirecciones por el servicio web" + +#: network/soap/httpsoapconnection.cpp:523 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "" +"El servicio web de mensajes fuera de línea no está disponible e este momento" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "El servidor web de Live Messenger está atravesando algunos problemas" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Respuesta del servicio web inválida %1 (%2)" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "No hay respuesta del servicio web" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Respuesta inesperada del servidor (%1)" + +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "En la conversación de %1
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 dice:
'%2'" + +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1le ha mandado un mensaje fuera de línea:
'%2'" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "¡La conversación con %1's requiere atención!" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "¡%1 le ha enviado un mensaje a mano alzada!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "¡%1 le ha enviado un zumbido!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "¡%1 le ha enviado un guiño!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "¡%1 desea usar la cámara web!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "¡%1 le está enviando un archivo!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "¡%1 le ha enviado una invitación!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "¡%1 ha cancelado la sesión de cámara web!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "¡%1 ha cancelado la transferencia de archivo!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "¡La actividad con %1 ha sido cancelada!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "¡%1 ha aceptado usar la cámara web!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "¡%1 ha aceptado la transferencia de archivo!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "¡%1 ha aceptado su invitación!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "¡%1 ha terminado la sesión de cámara web!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "¡La transferencia de archivo con %1 ha terminado!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "¡La actividad con %1 ha terminado!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "¡La sesión de cámara web con %1 ha fallado!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "¡La transferencia con %1 ha fallado!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "¡La actividad de %1 ha finalizado con un error!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
se ha conectado" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
se ha puesto ausente" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
volverá enseguida" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
ahora está ocupado" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
se ha puesto invisible" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
se ha puesto inactivo" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
se ha desconectado" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
está al teléfono" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
salió a comer" + +#: notification/newemailnotification.cpp:90 +#, kde-format +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 conversar" + +#: 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 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Leer correo electrónico" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Ocultar" + +#: 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/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Minimizado en la bandeja de sistema" + +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Examinar..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Examinar y cortar imágen..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Definir una imágen anterior..." + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Imágen para mostrar" + +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "Falló la descarga de la imagen" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Ocurrió un error al intenar cambiar la imágen para mostrar.\n" +"Asegúrese de que seleccionó un archivo de imágen existente." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Preferencias" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Cuenta" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Mi cuenta" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Lista de contactos" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Conversando" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Hisotrial de conversaciones" + +#: 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 "" +"Presione aquí para eliminar esta cuenta de la lista de cuentas regitradas.\n" +"No puede eliminar la cuenta con la que está conectado actualmente ni cuentas " +"de invitado que van a ser eliminadas cuando se desconecte." + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"La dirección de correo electrónico del contacto que ha ingresado es " +"inválida, y no puede ser usada como cuenta: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "La dirección de contacto que ha ingresado ya está en uso : '%1'" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "¿Está seguro de que desea eliminar esta cuenta?" + +#: settings/accountsmanagerpage.cpp:160 +#, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"¿Está seguro de que desea eliminar la cuenta '%1'?
Todas las " +"preferencias de ésta cuenta se perderán." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Hola, como te ha ido? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Teresa" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "¡Genial!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "¡/Acabo/ de llegar de mis vacaciones en Italia!" + +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "Puede usar solamente 7 caracteres para la abreviación del emoticono." + +#: settings/emoticonspage.cpp:119 +#, fuzzy +msgctxt "Dialog box title" +msgid "Invalid Emoticon Name" +msgstr "Nombre de emoticono inválido" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Reemplazar el emoticono existente" + +#: settings/emoticonspage.cpp:233 +#, kde-format +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "¿Está seguro de que desea 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" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Su nombre (nick):" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notificaciones" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +#, fuzzy +msgid "No selectable web browsers detected." +msgstr "No se detectaron navegadores seleccionables." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "No se detectaron clientes de correo electrónico seleccionables." + +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom web browser!" msgstr "" -"Escriba el nombre que desea que vean sus contactos cuando esté en línea." +"¡Debe especificar un comando de consola para ejecutar un navegador " +"personalizado!" -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Su dirección de correo:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#: settings/miscellaneouspage.cpp:291 +#, fuzzy, c-format msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"The console command you have specified to launch a custom web 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 "" -"Escriba la dirección de su cuenta MSN Passport. Puede registrar una nueva en " -"http://register.passport.com/" +"El comando que definió para ejecutar con un navegador personalizado no " +"contiene el parámetro '%u'. Sin éste, la apertura de sitios web no " +"funcionará.
¿Desea que KMess lo agregue por usted?" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Su contraseña:" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "" +"¡Debe especificar un comando de consola para ejecutar un cliente de correo " +"electrónico personalizado!" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#: 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 emails will not work." +"
Do you want KMess to add it for you?" +msgstr "" +"El comando de consola que definió para ejecutar un cliente de correo " +"electrónico personalizado no contiene el parámetro '%u'. Sin éste, no se " +"podrán escribir correos. \n" +"
¿Desea que KMess lo agregue por usted?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "¡Debe seleccionar un directorio para los archivos recibidos!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Seleccione el directorio de archivos" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Enviar con KMess" + +#: 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!

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "&Enviar un comentario a los desarrolladores" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "Mostrar &segundos" + +#: utils/likeback/likeback.cpp:319 +#, fuzzy, kde-format +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:324 +#, fuzzy, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Bienvenido a %1." + +#: utils/likeback/likeback.cpp:332 +#, fuzzy +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on '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:339 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'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 " +"gusta y presione enviar." + +#: utils/likeback/likeback.cpp:346 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on '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:356 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on '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:367 +#, fuzzy +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:374 +#, fuzzy +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" +"No me gusta la página de bienvenida del asistente, consume mucho " +"tiempo." + +#: utils/likeback/likeback.cpp:381 +#, fuzzy +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows 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:388 +#, fuzzy +msgctxt "Welcome dialog text, usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Deseo una nueva característica que me permita enviar mi trabajo por " +"correo." + +#: utils/likeback/likeback.cpp:401 +#, fuzzy +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:404 +#, fuzzy +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Ejemplo" +msgstr[1] "Ejemplos" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, fuzzy, kde-format +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 the developers a brief description of your opinions about " +"%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:216 +#, kde-format +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:290 +#, fuzzy +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:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Comentarios enviados" + +#: utils/likeback/likebackdialog.cpp:304 +#, fuzzy +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" +"

Hubo un error mientras se intentaba enviar el reporte.

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

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Error al enviar los comentarios" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +msgid "Standard text mode" +msgstr "Modo de texto estándar" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to the standard text mode." +msgstr "Presione este botón para cambiar a modo de texto estándar." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "" +"Presione este botón para cambiar a modo mano alzada, de esta manera podrá " +"escribir o dibujar un mensaje." + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Emoticonos estándar" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +#, fuzzy +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Presione este botón para mostrar los emoticonos predeterminados de MSN, de " +"esta manera podrá insertarlos fácilmente en sus mensajes." + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "Emoticonos personalizados" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +#, fuzzy +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Presione este botón para mostrar los emoticonos predeterminados de MSN, de " +"esta manera podrá insertarlos fácilmente en sus mensajes." + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "Guiños" + +#. 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 "Presione este botón para ver los guiños disponibles." + +#. 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "&Enviar" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Conversación" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Barra de herramientas principal" + +#. 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: file: chat/contactswidget.ui:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Presione aquí para abrir las preferencias de su cuenta" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "Clear area" +msgstr "&Limpiar el área" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "Pen color" +msgstr "&Color del lápiz" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +#, fuzzy +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 +#, fuzzy +msgid "Erase brush" +msgstr "&Goma de borrar" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Grupos iniciales" + +#. 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 electrónico de la persona que desea " +"agregar a su lista de contactos" + +#. 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:273 +msgid "Email address:" +msgstr "Dirección de correo electrónico:" + +#. 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 el emoticono:" + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Seleccione un archivo de imágen:" + +#. 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 un mensaje para enviar automáticamente a las personas que " +"intenten contactarle." + +#. 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 +msgid "Search through contacts..." +msgstr "Buscar entre los contactos..." + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Filtro de historial" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Filtrar por &conversación" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "Filtrar por &fecha" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "desde" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +msgstr "hasta" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "¿Qué desea hacer?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to the following groups of your contact list:" +msgstr "&Agregar esta persona a estos grupos de mi 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, but allow him or her to see your status" +msgstr "No agregar esta persona; sólo permitirle ver mi esta&do" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" +msgstr "&No admitir a esta persona, impidiendo que me contacte o vea mi estado" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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 imágen para mostrar de este contacto" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Restaurar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grupos:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Utilizar un nombre &alternativo para esta persona" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Mostrar notificaciones cuando los contactos:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Sonido:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Imágen para mostrar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "" +"Presione aquí para utilizar la imágen seleccionada como su imágen para " +"mostrar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "Utilizar como imágen para mostrar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Limpiar &caché" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +#, fuzzy +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"Usted puede elegir ocultar cualquier emoticono recibido de este contacto. " +"Presione el botón derecho sobre un emoticono recibido y seleccione \"Ignorar " +"este emoticono\".\n" +"Con esta página, usted puede restaurar los emoticonos ocultos." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Presione aquí para eliminar el emoticono seleccionado" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "&Restaurar" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Contactos disponibles" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact 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:183 +#, fuzzy +msgid "Enter the email address of a person 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:186 +msgid "Invited Contacts" +msgstr "Contactos invitados" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Elementos para exportar:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Formato" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Contactos:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Seleccionar todo" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "Deseleccionar todo" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Exportar..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Cerrar" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "Comando a la pestaña actual" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Comando:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Tipo:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Estándar" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Enviar" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Carga del comando (puede estar vacío):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +#, fuzzy +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "KSqueezedTextLabel" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Abrir" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Cancelar" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "&Descargas" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "&Envíos" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "&Limpiar" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "&Cerrar" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:276 +#, fuzzy +msgid "" +"Enter 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: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Contraseña:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +#, fuzzy +msgid "Enter here your account's password" +msgstr "Ingrese aquí la contraseña de su cuenta" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "Estado al iniciar sesión:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "Seleccione un estado para definir cuando se conecte." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "Si está activado, KMess guardará su cuenta" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +msgid "Remem&ber account" +msgstr "&Recordar cuenta" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" +"Si selecciona recordar una cuenta con KMess, también podrá guardar la " +"contraseña" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +msgid "R&emember password" +msgstr "R&ecordar la contraseña" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Presione este botón para empezar a utilizar KMess o cancelar un intento de " +"conexión" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Nueva cuenta" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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 "" +"Presione aquí para crear una nueva cuenta Live, la cual puede utilizar " +"para conectarse a la red MSN.
También puede utilizar su cuenta actual de " +"correo electrónico" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "¿Olvidó su contraseña?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +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 para definir una nueva " +"contraseña" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Conexión" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Ver" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Acciones" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "Formulario" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "&Información de cuenta" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "Información de su cuenta" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +msgstr "" +"Escriba el nombre que desea que sus contactos vean cuando esté conectado." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "&Apodo:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +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 correo electrónico de su cuenta MSN Passport. 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:363 +msgid "&Email address:" +msgstr "Dirección de correo &electrónico:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 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/" +"Ingrese la contraseña de su cuenta MSN Passport. Puede registrar una nueva " +"cuenta en http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Foto del contacto:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "&Contraseña:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "&Recordar contraseña" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." -msgstr "Ca&mbiar" +msgstr "Ca&mbiar..." -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "No mostrar una imagen" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "&No utilizar" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Recordar las preferencias de esta cuenta." - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are 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 cuenta\" no estaba seleccionada cuando inició sesión, " +"por lo tanto, sus preferencias no serán guardadas por defecto. Habilite esta " +"opción si quiere guardar las preferencias de su cuenta permanentemente en " +"este equipo.\n" +"\n" +"Se recomienda que active esta opción a no ser que use KMess en un equipo de " +"uso público (por ejemplo: Cibercafé)." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "In&gresar con esta cuenta automáticamente al iniciar" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "&Recordar las preferencias de esta cuenta" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "" "Si está activado, KMess iniciará sesión con esta cuenta automáticamente." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Estado al iniciar sesión:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +msgid "Log in &with this account automatically" +msgstr "Iniciar &sesión con esta cuenta automáticamente" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Iniciar sesión &como" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Necesita conectarse con el sitio de Passport para confirmar que su dirección " +"de correo electrónico existe." + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot 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: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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." - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" -msgstr "Pedir correo electrónico de verificacion" +msgstr "Solicitar un correo electrónico de verificación" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "Ir a accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"Necesita una cuenta Passport para conectarse a la red de MSN Messenger. " +"Puede registrar su cuenta de correo electrónico actual en register.passport." +"com o utilizar una cuenta de Hotmail para conectarse." + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy +msgid "" +"To connect to the Live 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 dirección " +"de correo electrónico como cuenta Passport." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" -msgstr "Registrar nueva cuenta." +msgstr "Registrar nueva cuenta" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "Ir a register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Avisos" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "E&stado al iniciar sesión" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Notificación emergente" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Mostrar notificaciones cuando los contactos:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "&Se conecten" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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á activo, una notificación es mostrada cuando uno de sus contactos " -"se conecta." +"Si 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 soporte para esta característica." -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Comiencen una &conversación contigo" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Cambiar el estado a \"&Inactivo\" cuando esté inactivo" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" -"Cuando está activo, una notificación es mostrada cuando uno de sus contactos " -"comienza una conversación con usted." +"Controla el número de minutos que pasan antes de que KMess cambie su estado " +"a \"Ausente-Inactivo\"." -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "Le mand&en un mensaje" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -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 evia un mensaje." - -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Cambien su e&stado" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also 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." - -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "Se desconec&ten" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Cuando está activo, una notificación es mostrada también cuando uno de sus " -"contactos se desconecta." - -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Mostrar una notificación cuando se reciba correo" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Ocultar globos tras" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" -"Controla los segundos hasta que las notificaciones emergentes són ocultadas." - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "segundos" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -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" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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 "" -"

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." - -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Informarle a mis contactos que canción estoy escuchando" - -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -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." - -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Cambiar el estado a «Ausente-Inactivo» cuando esté inactivo" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Cuano está activado, su estado será cambiado automáticamente a \"Ausente - " -"Inactivo\" cuando no use el ordenador durante unos minutos." - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 msgid "Become idle after" msgstr "Pasar a inactivo tras" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -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: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 msgid "minutes" msgstr "minutos" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Registro de la charla" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "Registrar todas las conversaciones" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Guardar los archivos de las conversaciones en este directorio:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +#, fuzzy msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -"Seleccione la carpeta donde se guardarán los registros de la conversación." +"Esto sucede porque KMess fue compilado sin soporte para la extensión " +"\"XScreenSaver\" de Xorg, que es usada para detectar la actividad del " +"usuario.\n" +"Comuníquese con el equipo de empaquetamiento de su distribución para mas " +"detalles." -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organizar las carpetas de conversaciones por:" +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"No se puede activar inactividad automática: KMess fue compilado sin " +"detección de inactividad." -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "&Ocultar notificaciones cuando mi estado sea \"Ocupado\"" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "Cuentas guardadas:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +#, fuzzy msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -"KMess crea automáticamente subdirectorios cuando selecciones organizar la " -"carpeta de conversaciones por año, mes o día." +"Presione aquí para crear una nueva cuenta de KMess para un correo " +"electrónico asociado a una cuenta MSN" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +msgid "&Add Account..." +msgstr "&Agregar cuenta..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" +msgstr "Seleccione una cuenta y presione aquí para modificarla" + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "&Editar" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +msgid "&Remove" +msgstr "&Eliminar" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +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: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +#, fuzzy +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" +"

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

\n" +"

Las conversaciones guardadas le permitirán encontrar algo en sus " +"discusiones previas, como un enlace, o lo puede utilizar 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 historiales " +"de conversaciones.

\n" +"

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

" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "Habilitar historial de conversaciones" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +#, fuzzy +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"KMess también puede guardar sus conversaciones como archivos HTML, y " +"mantenerlas organizados" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Guardar conversaciones en archivos" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "Con esta opción, puede elegir como KMess guardará sus conversaciones" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Guardar las charlas como:" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +#, fuzzy +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\n" +"

El formato del archivo que utilice es importante.

\n" +"

Los historiales 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 no contendrán ningún formato de texto, imágenes para " +"mostrar o emoticonos.

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "Páginas web (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "Texto plano" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +#, fuzzy +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Estas opciones le permiten seleccionar la forma en que KMess organizará los " +"historiales de conversación en el directorio especificado más abajo." + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +#, fuzzy +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.\n" +" " +msgstr "" +"Dependiendo de qué opción seleccione aquí, KMess creará algunos directorios " +"para ayudarle a mantener los historiales de conversación organizados. " +"Utilice la opción \"¿Qué es esto?\" para más detalles." + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +msgid "Separate logged chats by:" +msgstr "Organizar los historiales de conversación por:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "Crea un directorio para organizar las conversaciones por año" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" +"Esta opción le indica a KMess que divida su historial de conversaciones " +"solamente por año.\n" +"Encontrará directorios para cada año con conversaciones registradas, dentro " +"de éstos estarán agrupados los historiales de conversación del año.\n" +"\n" +"Una conversación realizada el 29 de Noviembre de 2008 será guardada en el " +"directorio de historiales como:\n" +"/2008/fecha-y-nombre-del-" +"contacto.html" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 msgid "Year" msgstr "Año" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Mes" +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "Crea directorios para organizar las conversaciones por año y mes" -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Día" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Guardar todas las conversaciones en el directorio padre" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "La tipografía de su mensaje:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Obligar a que los mensajes del contacto usen esta tipografía:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +#, fuzzy msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" msgstr "" -"Permite que las preferencias de fuente y color de sus contactos sean " -"cambiados." +"Esta opción le indica a KMess que divida su historial de conversaciones por " +"año y mes.\n" +"Encontrará directorios para cada año con conversaciones registradas, cada " +"uno de éstos contendrá directorios por cada mes en que se registraron " +"conversaciones, y dentro de éstos estarán agrupados los historiales de " +"conversación del mes.\n" +"\n" +"Una conversación realizada el 29 de Noviembre de 2008 será guardada en el " +"directorio de historiales como:\n" +"/2008/11/fecha-y-nombre-del-" +"contacto.html" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Estilo de la ventana de conversación:" +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +#, fuzzy +msgid "Year then Month" +msgstr "Año y mes" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "Crea directorios para organizar las conversaciones por año, mes y día" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" +"Esta opción le indica a KMess que divida su historial de conversaciones por " +"año, mes y día.\n" +"Encontrará directorios para cada año con conversaciones registradas, cada " +"uno de éstos contendrá directorios por cada mes en que se registraron " +"conversaciones, y luego, las conversaciones estarán divididas en un " +"directorio por día.\n" +"\n" +"Una conversación realizada el 29 de Noviembre de 2008 será guardada en el " +"directorio de historiales como:\n" +"/2008/11//29/fecha-y-nombre-" +"del-contacto.html" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "Año, mes y día" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "" +"Guardar todas las conversaciones en el directorio especificado más abajo" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +#, fuzzy +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" +"Esta opción le indica a KMess guardar todos sus historiales de conversación " +"en los mismos directorios, sin organizarlos." + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "No organizar los archivos" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "Presione aquí para seleccionar un directorio" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" +"El directorio donde todos los historiales de conversación serán guardados" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" +"Seleccione el directorio donde desea guardar los historiales de conversación." + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "Guardar historiales de conversación en este directorio:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "Est&ilo" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 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 " +"Le permite cambiar el tema que KMess usa para mostrar los mensajes en una " "conversación." -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Mostrar &gráficos en los mensajes" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:624 +msgid "&Chat style:" +msgstr "Estilo de &conversación:" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Habilita los emoticonos en las conversaciones." +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "Conseguir &nuevos estilos..." -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Mostrar la &hora en los mensajes" +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "Preferencias de conversación" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -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: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Permite mostrar emoticonos en la ventana de conversación." -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" -"Usar &efectos de fuente en mensajes. (*negrita*, /cursiva/, _subrayado_)" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:636 +msgid "&Show emoticons" +msgstr "Mostrar emoticono&s" -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +msgid "Show &winks" +msgstr "Mostrar &guiños" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, fuzzy msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"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 "" -"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." +"Esta opción permite que se agrupen los mensajes que provienen del mismo " +"contacto. Cuando éste escriba varios mensajes consecutivos, KMess los " +"agrupará. La apariencia dependerá del estilo de conversación seleccionado." -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:648 msgid "&Group follow-up messages from the same contact" -msgstr "Agrupar los mensajes que provienen del mismo contacto" +msgstr "A&grupar mensajes consecutivos del mismo contacto" -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:654 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Permite mostrar la hora en cada mensaje de la conversación." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:657 +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:663 +msgid "Show &date" +msgstr "Mostrar &fecha" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +msgid "Show s&econds" +msgstr "Mostrar &segundos" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "&Texto" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "Éste es el color y tipo de letra usado en sus mensajes." + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "Tipo de letra de su &mensaje:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy 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." +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." 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." +"Permite sobreescribir la tipografía y color de los mensajes de sus contactos " +"con la tipografía y color indicada más abajo." -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Cliente de correo" +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +msgid "&Force messages from your contacts to use this font:" +msgstr "" +"&Forzar los mensajes de sus contactos para que utilicen esta tipografía:" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +msgid "Chat Window Formatting" +msgstr "Formato de la ventana de conversación" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, fuzzy msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." +"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 "" -"Le permite elegir que programa de correo electrónico abrirá KMess cuando " -"intente ver un e-mail." +"Permite el uso de efectos de tipografía. Escribir *negrita*, /cursiva/ y " +"_subrayado_ hará que esas palabras se vean con el tipo de letra negrita, " +"cursiva o subrayada respectivamente." -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Usar Hotmail" +#. i18n: file: settings/chatstylepage.ui:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Utilizar &efectos de tipografía en mensajes, como *negrita*, /cursiva/ y " +"_subrayado_" -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Usar un comando especifico:" +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +#, fuzzy +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "Permite mostrar el formato de MSN Plus" -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Notificación de correo" +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "&Comportamiento" -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Mostrar información referente al correo." - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, 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 contacts would like to have your attention they can send you 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" +"

Even if 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 "" -"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." +"

Cuando sus contactos desean obtener su atención pueden mandar un " +"zumbido. Por defecto, la ventana de conversación 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 KMess sacudirá la " +"ventana de conversación sólo con el primer zumbido recibido.

" -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Mostrar una notificación cuando se reciba correo en «otras carpetas»" +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +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" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +#, fuzzy msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. 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 "" -"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." +"

Cuando esta opción está seleccionada, verá su propia imágen para " +"mostrar en el panel de contactos, junto con las imágenes de los otros " +"contactos en la conversación.

" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "Mostrar su &imágen para mostrar en la ventana de conversación" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "Ag&rupar las conversaciones en la misma ventana:" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "Siempre" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "Para contactos del mismo grupo" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "Nunca" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +msgid "Display Options" +msgstr "Opciones de visualización" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." +msgstr "" +"Si está activado, se mostrará una notificación emergente 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:736 +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_) +#: rc.cpp:739 +#, fuzzy +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." +msgstr "" +"Si está activada, KMess informa a sus contactos lo que está escuchando. Esta " +"información es recolectada desde el reproductor de audio que está " +"actualmente activo." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" +msgstr "Mostrarle a mis contactos la &canción que estoy escuchando" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "Mostrar &imágen de fondo" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "Formato de la lista" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +#, fuzzy +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "Permitir formato MSN &Plus" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +#, fuzzy +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" +"Mostrar la &dirección de correo electrónico del contacto en vez de su apodo" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" -msgstr "Temas de &Emoticonos" +msgstr "Temas de &emoticonos" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Temas de emoticonos disponibles:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" -msgstr "Emoticonos Personalizados" +msgstr "Emoticonos &personalizados" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Emoticones personalizados para esta cuenta:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Temas de emoticonos disponibles:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "Agregar nue&vo.." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" +msgstr "Presione aquí para agregar un emoticono personalizado" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Click" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +msgid "Add Ne&w..." +msgstr "Agregar nue&vo..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Haga click aquí para agregar nuevos emoticonos personalizados para enviarle " -"a sus contactos." +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" +msgstr "Presione aquí para renombrar el emoticono seleccionado" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 msgid "Re&name" msgstr "Re&nombrar" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "Haga click aquí para cambiarle el nombre al emoticono seleccionado." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "Presione aquí para eliminar el emoticono seleccionado" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" msgstr "Eli&minar" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Seleccione un emoticono y haga click aqui para borrarlo." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "Navegador web" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "dice:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Examinar y cortar imagen..." - -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Mostrar foto" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Descarga de la imágen falló" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -"Ocurrión un error al tratar de cambiar la imágen mostrada.\n" -"Asegurese de que eligipo el archivo de imágen correcto" +"Seleccione esta opción para utilizar el navegador web utilizado por KDE." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Preferencias" +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "&Utilizar el navegador predeterminado de KDE" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Cuenta" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Conversación" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "¿Está seguro de que quiere eliminar esta cuenta?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Hola, como estas? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Ana" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Genial!" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "/Acabo/ de llegar de mis vacaciones en Italia!" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#. 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:814 rc.cpp:849 +msgid "Select this option to choose from a list of installed browsers." msgstr "" -"Cuando cierres la ventana KMess seguirá funcionando. Usa 'salir' desde el " -"menú conectar para cerrar la aplicación." +"Seleccione esta opción para escoger desde una lista de navegadores " +"instalados." -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Mostrando el icono en la barra del sistema." +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:817 +msgid "&Use an installed browser:" +msgstr "&Utilizar un navegador instalado:" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. 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:820 rc.cpp:855 +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." -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. 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:823 rc.cpp:858 +msgid "&Specify a custom command:" +msgstr "Especificar un &comando personalizado:" + +#. 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:827 rc.cpp:862 +#, 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 los enlaces web, un '%u' será " +"reemplazado con la dirección del enlace." + +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Utilice '%u' para ingresar la dirección en la linea de comandos." + +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "Cliente de correo electrónico" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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 utilizar el correo web Live Mail cuando se " +"conecte con cuentas compatibles con éste." + +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +msgid "Use &Live Mail if the account supports it" +msgstr "Utilizar &Live Mail si la cuenta lo soporta" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +msgid "Choose this option to use the email client used by the rest of KDE." +msgstr "" +"Seleccione esta opción para utilizar el cliente de correo electrónico " +"definido por KDE." + +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" +msgstr "Utilizar el cliente de correo electrónico predeterminado de &KDE" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "Utilizar un cliente de correo electrónico &instalado:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, 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: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +msgid "&Save all received files in one directory:" +msgstr "&Guardar los archivos recibidos en una carpeta:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "&Utilizar los puertos entre" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "y" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "para las transferencias de archivo" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Presione aquí para abrir las preferencias de su cuenta" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Presione aquí para eliminar el emoticono seleccionado" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "Su comentario:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +msgid "Your comment is about:" +msgstr "Su comentario es sobre:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "Algo que le gusta" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "Algo que no le gusta" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "Un comportamiento erróneo de la aplicación" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "Una nueva característica que desea" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +#, fuzzy +msgid "Specify an email address to be contacted back:" +msgstr "Indique una dirección de correo electrónico para ser contactado" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "I&mágenes" + +#~ msgid "Ink message" +#~ msgstr "Mensaje a mano alzada" + +#~ msgid "" +#~ "If you have added any custom emoticons, click this button to view them, " +#~ "so you can easily insert them in your messages." +#~ msgstr "" +#~ "Si usted ha agregado emoticonos personalizados, presione este botón para " +#~ "verlos, de esta manera podrá insertarlos fácilmente en sus mensajes." + +#~ msgid "&Do not filter" +#~ msgstr "&No filtrar" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "" +#~ "Mostrar una notificación emergente cuando este &contacto se conecte/" +#~ "desconecte" + +#~ msgid "File format used for saving:" +#~ msgstr "Formato de archivo utilizado para guardar:" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Emoticonos personalizados de esta cuenta:" + +#~ msgid "Show the feedback buttons bar on the windows" +#~ msgstr "Muestra la barra de botones de retroalimentación en las ventanas" + +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Ignorar este &emoticono" + +#~ 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!" + +#~ msgid "Ed&it Notes" +#~ msgstr "Ed&itar notas" + +#~ 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 "" +#~ "No se pudo recuperar una fecha correcta de sus historiales! Esto sucede " +#~ "probablemente porque este historial fue generado con una versión antigua " +#~ "de KMess" + +#~ 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 "" +#~ "Sus historiales parecen estar dañados o pertenecen a una versión antigua " +#~ "de KMess. KMess puede intentar migrar sus historiales. ¿Desea hacerlo " +#~ "ahora?" + +#~ msgid "" +#~ "Migration terminated.\n" +#~ "Tried to migrate %1 items\n" +#~ "%2 items successfully migrated\n" +#~ "%3 items could not have been migrated." +#~ msgstr "" +#~ "Migración terminada.\n" +#~ "Intentados migrar: %1 elementos\n" +#~ "%2 elementos migrados correctamente\n" +#~ "%3 elementos no pudieron ser migrados." + +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Eliminar la imágen" + +#~ msgid "Search for C&ontact" +#~ msgstr "Buscar &contacto" + +#~ msgid "Search by &Interest" +#~ msgstr "Buscar por &interés" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "lord_jotape@yahoo.com.ar, elpreto@kde.org.ar" + +#~ 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." + +#~ 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." + +#~ 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." + +#~ 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" + +#~ 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 "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." + +#~ msgid "%1





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





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





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





has gone idle" +#~ msgstr "%1 se ha puesto Inactivo" + +#~ msgid "Popup Notifications" +#~ msgstr "Notificaciones e&mergentes" + +#~ 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 "" +#~ "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" + +#~ 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 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" + +#~ 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" + +#~ msgid "Network" +#~ msgstr "Ventana de Red" + +#~ 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" + +#~ 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." + +#~ msgid "Picture:" +#~ msgstr "Foto:" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "" +#~ "Le permite elegir que programa de correo electrónico abrirá KMess cuando " +#~ "intente ver un e-mail." + +#~ msgid "Use a specified command:" +#~ msgstr "Usar un comando especifico:" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "Esta cuenta no tiene una bandeja de entrada de Hotmail!" + +#~ msgid "Email: " +#~ msgstr "Email" + +#~ msgid "Remove group" +#~ msgstr "Eliminar grupo" + +#~ msgid "Show &Display Pictures" +#~ msgstr "Mostrar foto" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "Mensaje nuevo en su bandeja de entrada" + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "%1 mensajes nuevos en su bandeja de entrada" + +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "La transferencia de %1 falló. No se pudo abrir el archivo" + +#~ msgid "Sidebar" +#~ msgstr "Barra lateral" + +#~ msgid "New contact's group" +#~ msgstr "Nuevo &Contacto" + +#~ msgid "Enter your login information:" +#~ msgstr "Introduzca los datos de su cuenta:" + +#~ msgid "Your friendly name:" +#~ msgstr "Su nombre (nick):" + +#~ msgid "Your password:" +#~ msgstr "Su contraseña:" + +#~ msgid "Status to set at login:" +#~ msgstr "Estado al iniciar sesión:" + +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Mostrar una notificación cuando se reciba correo" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Organizar las carpetas de conversaciones por:" + +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Mostrar &gráficos en los mensajes" + +#~ msgid "Use Hotmail" +#~ msgstr "Usar Hotmail" + +#~ msgid "says:" +#~ msgstr "dice:" + +#~ msgid "Current name: " +#~ msgstr "Nombre actual: " + +#~ 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 no ha podido conectar con el servidor de MSN Messenger. " +#~ "
Asegurese que esta conectado a internet
Error %1 (código %2)." + +#~ msgid "The remote server has closed the connection." +#~ msgstr "El servidor ha cerrado la conexión." + +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "¿Mostrar estado del servicio .NET?" + +#~ msgid "Received user confirmation" +#~ msgstr "Confirmación de usuario recibida..." + +#~ msgid "Transfer to notification server" +#~ msgstr "Transferencia al servidor de notificación" + +#~ msgid "The server is too busy" +#~ msgstr "El servidor está ocupado" + +#~ msgid "The server is unavailable" +#~ msgstr "El servidor no está disponible" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "KMess recibió un mensaje de error desconocido del servidor: %1" + +#~ msgid "Warning: Server closes for maintenance in 1 minute!" +#~ msgstr "" +#~ "Advertencia: El servidor cierra por mantenimiento dentro de 1 minuto!" + +#~ msgid "Add contact" +#~ msgstr "Agregar contacto" + +#~ msgid "KMess Notification" +#~ msgstr "Notificación de correo" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Javier Cuesta Alcocer Jaume Corbí Sabater Christian Kaiser" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "yovoya30ks@hotmail.com achane4@gmail.com ckaiser139@gmail.com" + +#~ msgid "Show/Hide &Contact Sidebar" +#~ msgstr "Mostrar/Ocultar &barra lateral" + +#~ msgid "Away - Idle" +#~ msgstr "Ausente - Inactivo" + +#~ msgid "chat-style-text" +#~ msgstr "Estilo de la ventana de conversación:" + +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "" +#~ "El nombre de usuario o dirección de correo proporcionado no es válido" + +#~ msgid "(Away)" +#~ msgstr "(Ausente)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Vuelvo enseguida)" + +#~ msgid "(Busy)" +#~ msgstr "(Ocupado)" + +#~ msgid "(Invisible)" +#~ msgstr "(Desconectado)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Ausente - Inactivo)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Salí a comer)" + +#~ msgid "(On the Phone)" +#~ msgstr "(Al teléfono)" #~ msgid "The current status of your contact." #~ msgstr "El estado actual de su contacto" +#~ msgid "The contact is listening to music" +#~ msgstr "Este contacto aún no este en su lista." + #~ msgid "File transfer dialog message" #~ msgstr "Mensaje de transferencia de archivos" diff --git a/po/et.po b/po/et.po index b9fed75..3f9b8ec 100644 --- a/po/et.po +++ b/po/et.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: ee\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" "PO-Revision-Date: 2003-03-20 16:14+0100\n" "Last-Translator: Jyri Toomessoo \n" "Language-Team: Estonian \n" @@ -15,3026 +15,6618 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Jyri Toomessoo" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "nuubik@hotmail.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "Olen arvutist eemal" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Sinu nimi" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "sina@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Login sisse..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Olen arvutist eemal" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." msgstr "" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 #, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "&Eemalda Kontakt" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "lahkus jutukast." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "lahkus jutukast." + +#: chat/chat.cpp:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr " nokib nuppe." + +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr " et al." + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr " (See on automaat teade)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr " on liinil" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr " on liinil" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr " on liinil" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr " on liinil" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr " on liinil" + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr " on liinil" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr " on liinil" + +#: chat/chat.cpp:1291 +#, kde-format +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." +msgstr "" + +#: chat/chat.cpp:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" + +#: chat/chat.cpp:1312 +#, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" + +#: chat/chat.cpp:1333 +#, kde-format +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:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr " on liinil" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "ei l4inud kohale." + +#: chat/chat.cpp:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr " on liinil" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "Saadan faili " + +#: chat/chatmessagestyle.cpp:382 +#, fuzzy, kde-format msgid "%1 says:" msgstr "lausub:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Yhenda" + +#: chat/chatview.cpp:300 +#, kde-format 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:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, kde-format msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 #, fuzzy msgid "Add this &Emoticon..." msgstr "Tahan &Smile'si" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Tahan &Smile'si" + +#: chat/chatview.cpp:834 #, fuzzy msgid "Send &Email" msgstr "&Saada epost" -#: chat/chatview.cpp:926 +#: chat/chatview.cpp:838 #, fuzzy -msgid "Copy E&mail" -msgstr "Epost" +msgid "Add &Contact" +msgstr "&Lisa Kontakt" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Eposti aadress:" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:948 +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "&Jutusta" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Saada &Fail" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Jutt" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" - -#: chat/chatwindow.cpp:260 -#, fuzzy -msgid "%1 has joined the chat." -msgstr "lisandus jutukasse." - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "lahkus jutukast." - -#: chat/chatwindow.cpp:315 -#, fuzzy -msgid "%1 has left the chat." -msgstr "lahkus jutukast." - -#: chat/chatwindow.cpp:575 -#, fuzzy -msgid "%1 - Chat" -msgstr "Jutt" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 #, fuzzy msgid "Contacts" msgstr "&Lisa Kontakt" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "Tahan &Smile'si" -#: chat/chatwindow.cpp:799 +#: chat/chatwindow.cpp:128 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "Tahan &Smile'si" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (See on automaat teade)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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:1502 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:1791 +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "" + +#: chat/chatwindow.cpp:451 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "ei l4inud kohale." +msgid "&Invite..." +msgstr "&Kutsu" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "" - -#: chat/chatwindow.cpp:1976 +#: chat/chatwindow.cpp:452 #, fuzzy -msgid "%1 is typing." -msgstr " nokib nuppe." - -#: chat/chatwindow.cpp:1985 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr " nokib nuppe." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +msgid "Send a &File..." msgstr "Saada &Fail" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "Alusta &Vestlust" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 #, fuzzy msgid "Send a &Nudge!" msgstr "Saada &Fail" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." msgstr "" -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" msgstr "" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Kutsu" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Jutusta" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "Muuda &Kirja" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "Muuda Kirja &Varvi" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Topi yks smile'i" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "Tahan &Smile'si" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Kuva/Peida &Kontakti Kylgriba" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Kuva ajatempel jutus" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Kuva, peida kontakti kylgriba" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:484 +#, fuzzy +msgid "Meeting" +msgstr "Seaded" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Saada &Fail" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "O&tsi Kontakti" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "&Lisa Kontakt" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "O&tsi Kontakti" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Tahan &Smile'si" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "O&tsi Kontakti" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Tahan &Smile'si" + +#: chat/chatwindow.cpp:533 +#, fuzzy +msgid "&Font" +msgstr "&Yhenda" + +#: chat/chatwindow.cpp:534 +#, fuzzy +msgid "Font &Color" +msgstr "Muuda Kirja &Varvi" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "&Jutusta" + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Jutt" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "Jutt" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr " nokib nuppe." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr " nokib nuppe." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr " nokib nuppe." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Alusta &Vestlust" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" msgstr "&Saada epost" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/contactframe.cpp:299 kmessview.cpp:601 #, fuzzy msgid "&View Profile" msgstr "&Kuva Profiil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Omadused" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "&Lisa Kontakt" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 #, fuzzy msgid "A&llow Contact" msgstr "&Luba Kontakt" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 #, fuzzy msgid "&Delete Contact" msgstr "&Eemalda Kontakt" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "&Blokeeri Kontakt" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "&Eemalda Blokaad" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 #, fuzzy msgid "&Friendly Name" msgstr "Sinu tore nimi:" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 #, fuzzy msgid "&Email Address" msgstr "Eposti aadress:" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +#, fuzzy +msgid "Song &Name" +msgstr "Sinu nimi" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +#, fuzzy +msgid "&Information" +msgstr "Kuva eposti info kontakti loendis" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Pilt:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" msgstr "" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "Tahan &Smile'si" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "" + +#: chat/contactframe.cpp:753 #, fuzzy msgid "Blocked" msgstr "(Blokeeritud)" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Eemal" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Kohe tagasi" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Tegevuses" +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "Lisa kontakt" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Offline'is" +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Kasutajad" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Kaua vait" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Toitumas" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +#, fuzzy +msgid "Remove" +msgstr "Eemaldatud" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +#, fuzzy +msgid "Web Messenger" +msgstr "Veebi kujundus" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "Veebi kujundus" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, fuzzy, kde-format +msgid "Windows Live Messenger %1" +msgstr "Veebi kujundus" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Veebi kujundus" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Tegevuses" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Eemal" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Eemal teatega" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Kohe tagasi" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Telefoneerin" -#: chat/contactframe.cpp:558 -msgid "The contact is %1" -msgstr "" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Toitumas" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Peidus" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Offline'is" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Mu Staatus" + +#: contact/msnstatus.cpp:218 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "&Katkesta" + +#: dialogs/addcontactdialog.cpp:49 +#, fuzzy +msgid "Add a Contact" msgstr "Lisa kontakt" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Sisesta eposti aadress keda soovid lisada:" - -#: dialogs/addcontactdialog.cpp:88 -#, fuzzy -msgid "The e-mail address given was invalid!" -msgstr "Kasutaja nimi on vale" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 #, fuzzy msgid "Add New Emoticon" msgstr "Tahan &Smile'si" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "Tahan &Smile'si" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Sisesta Eemal teade" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "" #: dialogs/awaymessagedialog.cpp:37 -msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" -msgstr "" -"Sisesta teade mis automaatselt edastatakse\n" -"neile kes sinuga suhelda yritavad:" - -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Kasuta alternatiiv nime selle iskiku puhul" - -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Teata mulle kui see inimene tuleb vai lahkub" - -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Pilt:" - -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Heli:" - -#: dialogs/contactpropertiesdialog.cpp:229 #, fuzzy +msgid "Automatic Away Message" +msgstr "Sisesta Eemal teade" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "katkes. ei saanud faili avada." + +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Login sisse..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Logi kogu jutt" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "on lisanud sind oma kontaktidesse. Kas sa tahad:" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "on lisanud sind oma kontaktidesse. Kas sa tahad:" + +#: dialogs/contactpropertiesdialog.cpp:282 +#, fuzzy, kde-format msgid "Contact Properties for %1" msgstr "Kontakti omadused " -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Yhenduses" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +#, fuzzy +msgid "No messages yet" +msgstr "Kuva ajatempel jutus" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Sinu teate kirjatyyp:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Sinu teate kirjatyyp:" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "Eposti aadress: " -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Hetke nimi: " +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Eposti klient" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "&Lisa Kontakt" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "&Lisa Kontakt" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" msgstr "" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "&Jutusta" + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "" - -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Yhenduses" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 #, fuzzy msgid "File Transfers" msgstr "Faili ylekanne valmis." -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "(Blokeeritud)" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&Eemalda Kontakt" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Pilt:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Oled kindel et tahad konto kustutada?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Pilt:" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 #, fuzzy msgid "Smile" msgstr "Epost" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 #, fuzzy msgid "Sad" msgstr "ja" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 #, fuzzy msgid "Disappointed" msgstr "Yhenduseta" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 #, fuzzy msgid "Secret telling" msgstr "Seaded" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 #, fuzzy msgid "Be right back" msgstr "Kohe tagasi" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 #, fuzzy msgid "Sun" msgstr "Heli:" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 #, fuzzy msgid "Clapping" msgstr "Jutustamine" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 #, fuzzy msgid "Snail" msgstr "&Saada epost" -#: emoticontheme.cpp:783 -msgid "Black sheep" +#: emoticontheme.cpp:880 +msgid "Sheep" msgstr "" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "Epost" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 #, fuzzy msgid "Clock" msgstr "(Blokeeritud)" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 #, fuzzy msgid "Camera" msgstr "Sinu nimi" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 #, fuzzy msgid "Money" msgstr "Kuu" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:911 #, fuzzy -msgid "KMess Icon" +msgid "KMess icon" msgstr "KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" msgstr "" -#: kmess.cpp:288 kmess.cpp:292 +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Yhendus serveriga jupsib." + +#: initialview.cpp:380 #, fuzzy -msgid "Add a group" +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Yhendus serveriga jupsib." + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Yhenda" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Eposti aadress:" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Eposti aadress:" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "Kuva eposti info kontakti loendis" + +#: kmess.cpp:248 +#, fuzzy +msgid "New Group" +msgstr "Uus &Grupp" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "&Lisa Grupp" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Sisesta uus nimi sellele grupile:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Eemal teatega" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "" - -#: kmess.cpp:715 -#, fuzzy +#: kmess.cpp:576 +#, fuzzy, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "Oled kindel et tahad grupi kustutada?" -#: kmess.cpp:718 +#: kmess.cpp:578 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "&Eemalda Kontakt" -#: kmess.cpp:720 +#: kmess.cpp:580 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "Eemaldatud" -#: kmess.cpp:760 -#, fuzzy +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" msgstr "Oled kindel et tahad grupi kustutada?" -#: kmess.cpp:763 +#: kmess.cpp:636 #, fuzzy -msgid "Remove group" -msgstr "Ee&malda Grupp" +msgctxt "dialog button" +msgid "Remove" +msgstr "Eemaldatud" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "Seda erilist gruppi ei saa muuta" -#: kmess.cpp:805 kmess.cpp:809 +#: kmess.cpp:676 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "Ym&ber nimeta Grupp" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Yhenduses" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Sisesta uus nimi sellele grupile:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Ei suutnud tuvastada" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Yhenduse sai taim-audi" + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Yhenduseta" -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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:1448 +#, kde-format +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:1673 +#: kmess.cpp:1460 +#, kde-format +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:1466 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Eposti Teade" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Uus &Kasutaja" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Uus &Kontakt" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Uus &Grupp" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "O&tsi Kontakti" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Otsi &Huvide alusel" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Kasutaja &Seaded" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Tegevused" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Yh&enda" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Katkesta" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Kuva Mu &Profiil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Mu Staatus" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "&Yhenda" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Katkesta" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Kuva Mu &Profiil" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "Kuva &Lubatud Kontaktid" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 #, fuzzy msgid "Show &Offline Contacts" msgstr "Kuva &Lubatud Kontaktid" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "Kuva &Eemaldatud Kontaktid" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Pilt:" - -#: kmessinterface.cpp:281 -msgid "Show &Network Window" +#: kmessinterface.cpp:170 +msgid "Show &History Box" msgstr "" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Kuva/Peida &Kontakti Kylgriba" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "Tahan &Smile'si" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" +msgstr "Pilt:" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "&Sorteeri Kontaktid" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "Uus &Kontakt" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "Uus &Grupp" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "O&tsi Kontakti" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "Uus &Kasutaja" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Uus &Kasutaja" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "Epost" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Grupp" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Sidus/Vallas" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:199 +msgid "Mixed" msgstr "" -#: kmessview.cpp:113 -msgid "Now listening to %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." msgstr "" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" msgstr "" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, fuzzy, kde-format +msgid "[%1] %2 goes online" +msgstr " on offline'is" + +#: kmessview.cpp:360 +#, fuzzy, kde-format +msgid "[%1] %2 goes offline" +msgstr " on offline'is" + +#: kmessview.cpp:599 #, fuzzy msgid "Cha&t" msgstr "Jutt" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Omadused" - -#: kmessview.cpp:623 +#: kmessview.cpp:610 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "Ee&malda Grupp" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Liiguta Gruppi" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 #, fuzzy msgid "&Copy to Group" msgstr "&Liiguta Gruppi" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "&Liiguta Gruppi" + +#: kmessview.cpp:695 #, fuzzy msgid "Move Group &Down" msgstr "&Liiguta Gruppi" -#: kmessview.cpp:675 +#: kmessview.cpp:696 #, fuzzy msgid "Move Group &Up" msgstr "&Liiguta Gruppi" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "Ee&malda Grupp" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "Ym&ber nimeta Grupp" -#: kmessview.cpp:1723 +#: kmessview.cpp:1136 #, fuzzy -msgid "You have 1 new e-mail in your inbox." -msgstr "uus kiri postkastis" +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: kmessview.cpp:1727 +#: kmessview.cpp:1145 #, fuzzy -msgid "You have %1 new emails in your inbox." -msgstr "uut kirja postkastis" +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Eposti aadress:" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Eemal)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Eposti klient" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Kohe tagasi)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Tegevuses)" +#: kmessview.cpp:1168 +msgid "No" +msgstr "" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Peidus)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "(Blokeeritud)" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Kaua vait)" +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Sinu teate kirjatyyp:" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Toitumas)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Sinu teate kirjatyyp:" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Telefoniga)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Sisene automaatselt selle aadressiga" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "&Lisa Kontakt" +msgstr[1] "&Lisa Kontakt" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "&Lisa Kontakt" +msgstr[1] "&Lisa Kontakt" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "sa ei saa logida hotmail'i selle nimega." + +#: kmessview.cpp:1834 +msgid "No Chat History found." +msgstr "" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +#, fuzzy +msgid "Current developer" +msgstr "GnomeMeeting arendaja" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Saksa keelestanud, testimine, dokumentatsioon, ja veeb" -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "Veebi kujundus" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +#, 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:74 msgid "Cartoon emoticons" msgstr "Liikuvad smile'd" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Algne helitaust" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Araabia keelestamine, faili salvestamise paranduseinternatsionaliseerimine." -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 #, fuzzy msgid "More Arabic translation" msgstr "Veel Tyrgi keelestamist" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Braziilia ja Portigali keelde pannud" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Braziilia ja Portigali keelde pannud" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 #, fuzzy msgid "Catalan translation" msgstr "Kataloonia keelde pannud" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Korea keelde pannud" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Lihtsustatud Hiina keelde pannud" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 #, fuzzy msgid "More Simplified Chinese translation" msgstr "Lihtsustatud Hiina keelde pannud" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 #, fuzzy msgid "Traditional Chinese translation" msgstr "Kataloonia keelde pannud" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Kataloonia keelde pannud" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 #, fuzzy msgid "Danish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 #, fuzzy msgid "More Danish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "Taani keelde pannud" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 #, fuzzy msgid "More Dutch translation" msgstr "Taani keelde pannud" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Veel Tyrgi keelestamist" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "Prantsuse keelde pannud" + +#: main.cpp:111 #, fuzzy msgid "Estonian translation" msgstr "Korea keelde pannud" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 #, fuzzy msgid "Finnish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 #, fuzzy msgid "More Finnish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "Prantsuse keelde pannud" -#: main.cpp:106 +#: main.cpp:117 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "Prantsuse keelde pannud" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 #, fuzzy msgid "More French translation" msgstr "Prantsuse keelde pannud" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 #, fuzzy msgid "Hungarian translation" msgstr "Korea keelde pannud" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Korea keelde pannud" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 #, fuzzy msgid "More Italian translation" msgstr "Korea keelde pannud" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "Korea keelde pannud" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Norra keelde pannud" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "Korea keelde pannud" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "Korea keelde pannud" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 #, fuzzy msgid "Slovenian translation" msgstr "Korea keelde pannud" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 msgid "Spanish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 #, fuzzy msgid "More Spanish translation" msgstr "lisa Hispaania keelde panekut" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 #, fuzzy msgid "Swedish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "Hispaania keelde pannud" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 #, fuzzy msgid "Thai translation" msgstr "Tai keelde pannud" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 msgid "Turkish translation" msgstr "Tyrgi keelde pannud" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "Veel Tyrgi keelestamist" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "Online" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Faili ylekanne valmis." + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Xinerama parandused" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Algne faili rabamis kood" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "Eri internatsionaliseerimise parandused." + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "Eri internatsionaliseerimise parandused." -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "GnomeMeeting arendaja" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Kutt kellel on kott peas" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspiraator ja osa koodist" -#: main.cpp:139 +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 #, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "Hyppava teate kood" -#: main.cpp:140 +#: main.cpp:174 msgid "Idle timer code" msgstr "EemalTaimeri kood" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:179 #, fuzzy msgid "Your name here?" msgstr "Sinu nimi" -#: main.cpp:144 -msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" -"If you feel your name is missing here, please contact us too!" +#: main.cpp:182 +#, fuzzy +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Sinu nimi" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Eposti aadress: " + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "O&tsi Kontakti" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Sisene automaatselt selle aadressiga" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" msgstr "" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Lubatud" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Eemaldatud" + +#: network/applications/application.cpp:294 #, fuzzy msgid "The contact cancelled the session." msgstr "Sa loobusid kutsest." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 #, fuzzy msgid "The contact rejected the invitation." msgstr "Kontakt keeldus kutsest." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 #, fuzzy msgid "You have cancelled the session." msgstr "Sa loobusid kutsest." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Sa keeldusid kutsest." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to
accept or cancel?" msgstr "" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." msgstr "" -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, 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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" msgstr "katkes. ei saanud faili avada." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -#, fuzzy +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "katkes. ei saanud faili avada." + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not 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:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, fuzzy, kde-format msgid "Connecting to %1, port %2" msgstr "Yhenduse sai taim-audi" -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -#, fuzzy -msgid "The transfer was cancelled" -msgstr "Ylekanne kinnitatud." +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Sa loobusid kutsest." -#: network/applications/filetransfer.cpp:370 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Sa loobusid kutsest." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Sa loobusid kutsest." + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "Yhenduse sai taim-audi" -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -#, fuzzy -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." msgstr "Edukalt rabatud fail: " -#: network/applications/filetransfer.cpp:600 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Edukalt rabatud fail: " + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." msgstr "katkes. ei saanud faili avada." -#: network/applications/filetransfer.cpp:604 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." msgstr "katkes. Yhendust ei saanud avada" -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -#, fuzzy -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." msgstr "Saadan faili " -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 -msgid "Transfer accepted." -msgstr "Ylekanne kinnitatud." +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Sa loobusid kutsest." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "Sa loobusid kutsest." -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "katkes. ei saanud faili avada." - -#: network/applications/filetransferp2p.cpp:531 -#, fuzzy -msgid "The contact cancelled the transfer." +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." msgstr "Sa loobusid kutsest." -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "katkes. ei saanud faili avada." - -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "katkes. Yhendust ei saanud avada" - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "Saadan faili " - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Sind on kutsutud kohtumisele (kasutades GnomeMeeting'ut)." -#: network/applications/gnomemeeting.cpp:114 -#, fuzzy +#: network/applications/gnomemeeting.cpp:118 +#, fuzzy, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Stardin GnomeMeeting'u. Yhendan " -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Kutsun kontakti kohtumisele." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "" - -#: network/applications/mimeapplication.cpp:119 +#: network/applications/mimeapplication.cpp:154 #, fuzzy -msgid "The invitation was aborted. An internal error occured." -msgstr "Kontakt keeldus kutsest." - -#: network/applications/mimeapplication.cpp:125 -#, fuzzy -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "katkes. Ei suutnud avada soketit" - -#: network/applications/mimeapplication.cpp:130 -#, fuzzy -msgid "The invitation was aborted. Timeout while waiting for file data." +msgid "The invitation was rejected. It is not supported by the other client." msgstr "Sa loobusid kutsest." -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "" +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "Kontakt keeldus kutsest." -#: network/applications/mimeapplication.cpp:141 +#: 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:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "Sa loobusid kutsest." + +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "katkes. Ei suutnud avada soketit" + +#: network/applications/mimeapplication.cpp:186 #, fuzzy msgid "The invitation was aborted." msgstr "Sa loobusid kutsest." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Sind kutsuti selle isiku lauda jagama." -#: network/applications/msnremotedesktop.cpp:155 -#, fuzzy +#: network/applications/msnremotedesktop.cpp:159 +#, fuzzy, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Stardin KRDC. Yhendun " -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 -msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " -"support it." -msgstr "" - -#: network/applications/p2papplication.cpp:1501 +#: network/applications/p2papplication.cpp:215 #, fuzzy -msgid "The transfer failed. Data preparation failed." +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Kontakt kutsub sind alustama " + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess does not " +"support it." +msgstr "katkes. Ei suutnud avada soketit" + +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." msgstr "Sa loobusid kutsest." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakt keeldus kutsest." - -#: network/applications/p2papplication.cpp:1624 -#, fuzzy -msgid "The transfer failed." -msgstr "Asja rabamine nagu " - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" - -#: network/applications/p2papplication.cpp:2038 +#: network/applications/p2papplication.cpp:1192 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "Sa loobusid kutsest." -#: network/applications/p2papplication.cpp:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 #, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Kontakt keeldus kutsest." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3274 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "katkes. Ei suutnud avada soketit" - -#: network/applications/p2papplication.cpp:3293 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "Kontakt keeldus kutsest." - -#: network/applications/p2papplication.cpp:3670 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "katkes. Ei suutnud avada soketit" - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "" +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakt keeldus kutsest." + +#: network/applications/p2papplicationbase.cpp:627 +#, fuzzy +msgid "The transfer failed." +msgstr "Asja rabamine nagu " + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "katkes. Ei suutnud avada soketit" + +#: network/applications/p2papplicationbase.cpp:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Kontakt keeldus kutsest." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not open data source." +msgstr "katkes. Ei suutnud avada soketit" + +#: network/applications/voiceconversation.cpp:71 #, fuzzy msgid "You are invited to start a voice conversation." msgstr "Sind kutsuti selle isiku lauda jagama." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 #, fuzzy msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "Sind on kutsutud kohtumisele (kasutades GnomeMeeting'ut)." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 #, fuzzy msgid "You have cancelled the voice conversation." msgstr "Sa loobusid kutsest." -#: network/applications/voiceconversation.cpp:211 +#: network/applications/voiceconversation.cpp:205 #, fuzzy -msgid "The invitation was cancelled. The audio device couldn't be opened." +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "Sa loobusid kutsest." -#: network/applications/voiceconversation.cpp:222 -#, fuzzy +#: network/applications/voiceconversation.cpp:218 +#, fuzzy, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Stardin GnomeMeeting'u. Yhendan " -#: network/applications/voiceconversation.cpp:228 -#, fuzzy +#: network/applications/voiceconversation.cpp:224 +#, fuzzy, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Stardin GnomeMeeting'u. Yhendan " -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 #, fuzzy msgid "Inviting the contact to a voice conversation." msgstr "Kutsun kontakti kohtumisele." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -#, fuzzy +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, fuzzy, kde-format msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "Kontakt kutsub sind alustama " -#: network/extra/msnftpconnection.cpp:122 +#: network/applications/webcamtransferp2p.cpp:113 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "Asja rabamine nagu " +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Sa loobusid kutsest." -#: network/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "Sind kutsuti selle isiku lauda jagama." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Sa loobusid kutsest." + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Sa loobusid kutsest." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:410 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, fuzzy, kde-format +msgid "Sending file %1" +msgstr "Saadan faili " + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "katkes. ei saanud faili avada." -#: network/extra/msnftpconnection.cpp:411 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy -msgid "Couldn't open a local port." +msgid "Could not open a local port." msgstr "katkes. ei saanud faili avada." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:481 -#, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. A connection could not be made." msgstr "katkes. Yhendust ei saanud avada" -#: network/extra/msnftpconnection.cpp:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:586 -#, fuzzy +#: network/extra/msnftpconnection.cpp:574 +#, fuzzy, kde-format msgid "Receiving file %1" msgstr "Raban faili " -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" msgstr "" -#: network/msnconnection.cpp:733 -#, fuzzy -msgid "1 ping lost" -msgstr "Raban loendid" - -#: network/msnconnection.cpp:737 -#, fuzzy -msgid "%1 pings lost" -msgstr "Raban loendid" - -#: network/msnconnection.cpp:752 -#, fuzzy -msgid "The connection to the server was lost." -msgstr "Yhendus serveriga jupsib." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Lubatud" +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "Sisesta eposti aadress keda soovid lisada:" -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Eemaldatud" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +#: network/msnconnection.cpp:389 +msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:740 -#, fuzzy -msgid "Show MSN Messenger Service status?" -msgstr "Kuvan .NET teenuse staatuse?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Serveri Viga" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy -msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "Yhendus katkestatud teise logini kasuks" - -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "Saavutati synkroon" - -#: network/msnnotificationconnection.cpp:1690 -#, fuzzy -msgid "Authenticating" -msgstr "Ei suutnud tuvastada" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Saabus kasutaja kinnitus" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." +#: network/msnconnection.cpp:393 +msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Saadan teate serverile" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "" - -#: network/msnnotificationconnection.cpp:2034 +#: network/msnconnection.cpp:396 #, fuzzy -msgid "Connecting..." -msgstr "Yhenda" - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -#, fuzzy -msgid "There was an internal error in KMess: %1" -msgstr "Serveris oli sisene viga" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" - -#: network/msnnotificationconnection.cpp:2252 -#, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "Kasutaja nimi on vale" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:400 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "Su kontakti loendisse ei mahu enam" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 #, fuzzy msgid "This contact is already on your list" msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 #, fuzzy msgid "This contact is not on your list" msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2279 +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" + +#: network/msnconnection.cpp:436 #, 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:2282 +#: network/msnconnection.cpp:440 #, fuzzy -msgid "This group can't be changed" +msgid "This group cannot be changed" msgstr "Seda erilist gruppi ei saa muuta" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "Su kontakti loendisse ei mahu enam" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" msgstr "" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, fuzzy, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Serveris oli sisene viga" + +#: network/msnconnection.cpp:462 +#, fuzzy +msgid "Invalid Group" +msgstr "Ym&ber nimeta Grupp" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "Saadan teate serverile" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" +#: network/msnconnection.cpp:484 +msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" msgstr "" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" +#: network/msnconnection.cpp:497 +msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "Sinu nimi" + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Asja rabamine nagu " + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "" + +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" +msgstr "Sa loobusid kutsest." + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 #, fuzzy msgid "Bad friend name" msgstr "Sinu tore nimi:" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:547 +#, fuzzy +msgid "Authentication ticket was incorrect" +msgstr "Ei suutnud tuvastada" + +#: network/msnconnection.cpp:550 +msgid "You cannot start a chat with someone while you are invisible" msgstr "" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" +#: network/msnconnection.cpp:558 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" msgstr "" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" +#: network/msnconnection.cpp:561 +msgid "Your Passport account needs to be verified first" +msgstr "" + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" msgstr "Serveris oli sisene viga" -#: network/msnnotificationconnection.cpp:2411 +#: network/msnconnection.cpp:595 #, fuzzy -msgid "The server is too busy" -msgstr "Server on umbes" +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "Serveris oli sisene viga" -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Server pole saadaval" - -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "Otsa teatis server on maas" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 #, fuzzy msgid "The server is going down" msgstr "Server tuleb maha varsti" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" msgstr "Server tuleb maha varsti" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 #, fuzzy msgid "The server is not available" msgstr "Server pole saadaval" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "Ei suutnud tuvastada" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "See isik on offline'is v6i peidus" - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1648 +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "ei l4inud kohale." +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Serveri Viga" -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 +#: network/msnnotificationconnection.cpp:1337 #, fuzzy -msgid "Connection timeout" -msgstr "Yhenduse sai taim-audi" +msgid "Authenticating..." +msgstr "Ei suutnud tuvastada" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 +#: network/msnnotificationconnection.cpp:1361 #, fuzzy -msgid "%1 has sent you a nudge!" -msgstr " on liinil" +msgid "Authenticated" +msgstr "Ei suutnud tuvastada" -#: notification/notificationchat.cpp:196 +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 #, fuzzy -msgid "%1 has sent you a wink!" -msgstr " on liinil" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr " on liinil" - -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr " on liinil" - -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "Sa loobusid kutsest." - -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "Sa loobusid kutsest." - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "Asja rabamine nagu " - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "" - -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" -msgstr " on liinil" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" -msgstr " on liinil" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" -msgstr " on liinil" - -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" -msgstr " on liinil" - -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" -msgstr " on liinil" - -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" -msgstr " on liinil" - -#: notification/notificationcontactstatus.cpp:74 -#, fuzzy -msgid "%1 is now online" -msgstr " on liinil" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "Saada" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "Uus Rida" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Lisa kontakt" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, fuzzy, no-c-format -msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "on lisanud sind oma kontaktidesse. Kas sa tahad:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, fuzzy, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, fuzzy, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "Ei lisa seda kontakti, aga lase neil vaadata su olekut" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, fuzzy, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "Blokeeri see isik nii, et ta ei saaks sind segada ega vaadata." - -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" -msgstr "" - -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, fuzzy, no-c-format -msgid "Enter your login information:" -msgstr "Voi sisesta login info:" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "Eposti aadress:" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "Parool:" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "" - -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "Pea profiil meeles" - -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" +msgid "Connecting..." msgstr "Yhenda" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" msgstr "" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, fuzzy, no-c-format -msgid "Listening to %1" -msgstr "Saadan faili " +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "minutit" +msgstr[1] "minutit" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, fuzzy, no-c-format -msgid "KMess Notification" -msgstr "Eposti Teade" +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/msnnotificationconnection.cpp:2108 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "Ei suutnud tuvastada" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "Serveris oli sisene viga" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" +msgid "" +"

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

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:2932 +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:2935 +#, kde-format +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:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2956 +#, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "Yhendus serveriga jupsib." + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "Serveris oli sisene viga" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +#, fuzzy +msgid "Connection time limit exceeded" +msgstr "Yhenduse sai taim-audi" + +#: network/msnsockettcp.cpp:380 +#, fuzzy +msgid "1 ping lost" +msgstr "Raban loendid" + +#: network/msnsockettcp.cpp:384 +#, fuzzy, kde-format +msgid "%1 pings lost" +msgstr "Raban loendid" + +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "Yhendus serveriga jupsib." + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +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 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Server pole saadaval" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Server pole saadaval" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" +msgstr " on liinil" + +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" +msgstr " on liinil" + +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr " on liinil" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "" + +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" +msgstr " on liinil" + +#: notification/chatnotification.cpp:199 +#, fuzzy, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr " on liinil" + +#: notification/chatnotification.cpp:203 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr " on liinil" + +#: notification/chatnotification.cpp:207 +#, fuzzy, kde-format +msgid "%1 has sent you a wink!" +msgstr " on liinil" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +#, fuzzy, kde-format +msgid "%1 is sending you a file!" +msgstr " on liinil" + +#: notification/chatnotification.cpp:215 +#, fuzzy, kde-format +msgid "%1 has sent you an invitation!" +msgstr " on liinil" + +#: notification/chatnotification.cpp:222 +#, fuzzy, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "Sa loobusid kutsest." + +#: notification/chatnotification.cpp:223 +#, fuzzy, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "Sa loobusid kutsest." + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "" + +#: notification/chatnotification.cpp:231 +#, fuzzy, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "Sa loobusid kutsest." + +#: notification/chatnotification.cpp:232 +#, fuzzy, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "Sa loobusid kutsest." + +#: notification/chatnotification.cpp:233 +#, fuzzy, kde-format +msgid "%1 has accepted your invitation!" +msgstr " on liinil" + +#: notification/chatnotification.cpp:240 +#, fuzzy, kde-format +msgid "%1 has ended the webcam session!" +msgstr "Sa loobusid kutsest." + +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" +msgstr "Asja rabamine nagu " + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, fuzzy, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Asja rabamine nagu " + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr " on liinil" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&Saada epost" + +#: 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 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " nokib nuppe." + +#: 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 "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +#, fuzzy +msgid "Display Picture" +msgstr "Pilt:" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "Pilt:" + +#: settings/accountpage.cpp:539 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Seaded" + +#: settings/accountsettingsdialog.cpp:78 +#, fuzzy +msgid "Account" +msgstr "Kasutajad" + +#: settings/accountsettingsdialog.cpp:79 +#, fuzzy +msgid "My Account" +msgstr "Kasutajad" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "&Lisa Kontakt" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Jutustamine" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Jutu logimine" + +#: 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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "Oled kindel et tahad konto kustutada?" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"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:371 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "" + +#: settings/chatstylepage.cpp:375 +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 "Tahan &Smile'si" + +#: settings/emoticonspage.cpp:233 +#, fuzzy, kde-format +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:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Kasutajad" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, fuzzy, no-c-format -msgid "Your friendly name:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "Eposti Teade" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +msgid "Select Files Directory" +msgstr "Salvesta jutu failid sellesse pea kausta:" + +#: 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "Tahan &Smile'si" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "&Lisa Kontakt" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +#, fuzzy +msgid "S&end" +msgstr "Saada" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Jutusta" + +#. 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: file: chat/contactswidget.ui:107 +#. 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 +#, 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: 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:273 +#, fuzzy +msgid "Email address:" +msgstr "Eposti aadress: " + +#. 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 "Sisesta uus nimi sellele grupile:" + +#. 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 +#, fuzzy +msgid "" +"Enter a message to be automatically sent to people who try to message you." +msgstr "" +"Sisesta teade mis automaatselt edastatakse\n" +"neile kes sinuga suhelda yritavad:" + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +msgid "&Specify an automatic away message:" +msgstr "Sisesta Eemal teade" + +#. 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Jutu logimine" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +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 the following groups of your contact list:" +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "Ei lisa seda kontakti, aga lase neil vaadata su olekut" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" +msgstr "Blokeeri see isik nii, et ta ei saaks sind segada ega vaadata." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "Eemaldatud" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "Grupp" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Kasuta alternatiiv nime selle iskiku puhul" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Kuva teated kui kontaktid lahkuvad" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "Heli:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Pilt:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Pilt:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +#, fuzzy +msgid "&Clear Cache" +msgstr "&Jutusta" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "Eemaldatud" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "&Luba Kontakt" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "Sisesta eposti aadress keda soovid lisada:" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "&Lisa Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, 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:198 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "&Lisa Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "(Blokeeritud)" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +#, fuzzy +msgid "Send" +msgstr "Saada" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "&Jutusta" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "(Blokeeritud)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +#, fuzzy +msgid "Password:" +msgstr "Parool:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "Pea profiil meeles" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +#, fuzzy +msgid "R&emember password" +msgstr "Parool:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "Uus &Kasutaja" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Yhenda" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Tegevused" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Kasutajad" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +#, fuzzy +msgid "Your Account Information" +msgstr "Kasutaja &Seaded" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +#, fuzzy +msgid "&Friendly name:" msgstr "Sinu tore nimi:" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Sinu eposti aadress:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 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: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Sinu parool:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +#, fuzzy +msgid "&Email address:" +msgstr "Eposti aadress: " -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, fuzzy, no-c-format -msgid "Display picture:" -msgstr "Pilt:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +#, fuzzy +msgid "&Password:" +msgstr "Parool:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "Parool:" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +#, fuzzy msgid "C&hange..." +msgstr "&Kutsu" + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, fuzzy, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Pilt:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Sisene alati selle kontoga automaatselt alguses" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +#, fuzzy +msgid "Re&member the settings of this account" +msgstr "Pea profiil meeles" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Sisene alati selle kontoga automaatselt alguses" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +#, fuzzy +msgid "Login &as" +msgstr "Logi kogu jutt" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You cannot change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "Pea profiil meeles" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Alarmid" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "Eposti Teade" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Muuda olek \"Kaua vait\" kui vaikid" + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Kuuluta ennast kaua vaikivaks peale" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "minutit" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" msgstr "Kuva teated kui kontaktid lahkuvad" -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "Online" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +#, fuzzy +msgid "Saved accounts:" +msgstr "Kasutajad" -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "Kasutajad" + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +#, fuzzy +msgid "&Remove" +msgstr "Eemaldatud" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " msgstr "" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "Sisesta Eemal teade" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "Jutu logimine" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Saada &Fail" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Saada &Fail" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "Offline'is" +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Kuva teade kui kiri tuleb \"teistesse kausta\"" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Peida teade peale" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "sekundit" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 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. " +"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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Salvesta jutu failid sellesse pea kausta:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "Aasta" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Salvesta jutud peakausta" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Salvesta jutud peakausta" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "Salvesta jutu failid sellesse pea kausta:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +#, fuzzy +msgid "Chat Settings" +msgstr "Seaded" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +#, fuzzy +msgid "&Show emoticons" +msgstr "Tahan &Smile'si" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "Tahan &Smile'si" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +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:648 +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:654 +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:657 +#, 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:663 +#, fuzzy +msgid "Show &date" +msgstr "&Lisa Kontakt" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "Tahan &Smile'si" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +#, fuzzy +msgid "Your &message font:" +msgstr "Sinu teate kirjatyyp:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "Sunni kontakti teated kasutama seda kausta:" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "&Jutusta" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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/alertswidget.ui line 300 -#: rc.cpp:313 -#, fuzzy, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Muuda olek \"Kaua vait\" kui vaikid" +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Su kontakti loendisse ei mahu enam" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +#, fuzzy +msgid "Always" +msgstr "Eemal" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Su kontakti loendisse ei mahu enam" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +#, fuzzy +msgid "Never" +msgstr "Serveri Viga" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Pilt:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Kuuluta ennast kaua vaikivaks peale" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "minutit" - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Jutu logimine" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, fuzzy, no-c-format -msgid "Log &all chats" -msgstr "Logi kogu jutt" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Salvesta jutu failid sellesse pea kausta:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Korralda jutu kaustad:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "Aasta" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, fuzzy, no-c-format -msgid "Month" -msgstr "Kuu" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "P4ev" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Salvesta jutud peakausta" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Sinu teate kirjatyyp:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Sunni kontakti teated kasutama seda kausta:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, fuzzy, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Kuva ajatempel jutus" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, fuzzy, no-c-format -msgid "S&how time in chat messages" -msgstr "Kuva ajatempel jutus" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Eposti klient" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Kasuta Hotmail'i" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Kasuta kindlat k4sku:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Eposti Teade" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, fuzzy, no-c-format -msgid "Show email information" -msgstr "Kuva eposti info kontakti loendis" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "" - -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Kuva teade kui kiri tuleb \"teistesse kausta\"" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +#, fuzzy msgid "&Emoticon Themes" msgstr "Tahan &Smile'si" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Tahan &Smile'si" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +#, fuzzy msgid "&Custom Emoticons" msgstr "Liikuvad smile'd" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Tahan &Smile'si" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Kasutajad" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "(Blokeeritud)" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +#, fuzzy msgid "Re&name" msgstr "Sinu nimi" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +#, fuzzy msgid "Remo&ve" msgstr "Eemaldatud" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" msgstr "" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "lausub:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#: settings/accountswidget.cpp:421 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 #, fuzzy -msgid "Display Picture" -msgstr "Pilt:" +msgid "&Specify a custom command:" +msgstr "Sisesta Eemal teade" -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "" - -#: settings/accountswidget.cpp:486 +#. 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:827 rc.cpp:862 +#, no-c-format msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." msgstr "" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Seaded" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "" -#: settings/settingsdialog.cpp:93 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 #, fuzzy -msgid "Account" -msgstr "Kasutajad" +msgid "Email Client" +msgstr "Eposti klient" -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Jutustamine" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Oled kindel et tahad konto kustutada?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" - -#: systemtraywidget.cpp:91 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +msgid "Use &Live Mail if the account supports it" msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +msgid "&Save all received files in one directory:" +msgstr "Salvesta jutu failid sellesse pea kausta:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "ja" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "Faili ylekanne valmis." + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "Sinu nimi" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "Sinu nimi" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Kuva ajatempel jutus" + +#, fuzzy +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Teata mulle kui see inimene tuleb vai lahkub" + +#, fuzzy +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Pea profiil meeles" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Tahan &Smile'si" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Pilt:" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "O&tsi Kontakti" + +#~ msgid "Search by &Interest" +#~ msgstr "Otsi &Huvide alusel" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Sinu eposti aadress:" + +#, 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 "&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 "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:" + +#, fuzzy +#~ msgid "Speed:" +#~ msgstr "Serveri Viga" + +#~ msgid "Use a specified command:" +#~ msgstr "Kasuta kindlat k4sku:" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "Epost" + +#, fuzzy +#~ msgid "Remove group" +#~ msgstr "Ee&malda Grupp" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Pilt:" + +#, fuzzy +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "uus kiri postkastis" + +#, fuzzy +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "uut kirja postkastis" + +#, fuzzy +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "katkes. ei saanud faili avada." + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Kuva/Peida &Kontakti Kylgriba" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "Uus &Kontakt" + +#, fuzzy +#~ msgid "Enter your login information:" +#~ msgstr "Voi sisesta login info:" + +#, fuzzy +#~ msgid "Your friendly name:" +#~ msgstr "Sinu tore nimi:" + +#~ msgid "Your password:" +#~ msgstr "Sinu parool:" + +#, fuzzy +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Kuva teade kui kiri tuleb \"teistesse kausta\"" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Korralda jutu kaustad:" + +#, fuzzy +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Kuva ajatempel jutus" + +#~ msgid "Use Hotmail" +#~ msgstr "Kasuta Hotmail'i" + +#~ msgid "says:" +#~ msgstr "lausub:" + +#~ msgid "Current name: " +#~ msgstr "Hetke nimi: " + +#, fuzzy +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Kuvan .NET teenuse staatuse?" + +#~ msgid "Received user confirmation" +#~ msgstr "Saabus kasutaja kinnitus" + +#~ msgid "Transfer to notification server" +#~ msgstr "Saadan teate serverile" + +#, fuzzy +#~ msgid "The server is too busy" +#~ msgstr "Server on umbes" + +#~ msgid "The server is unavailable" +#~ msgstr "Server pole saadaval" + +#~ msgid "Add contact" +#~ msgstr "Lisa kontakt" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "Eposti Teade" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Jyri Toomessoo" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "nuubik@hotmail.com" + +#~ msgid "Away - Idle" +#~ msgstr "Kaua vait" + +#, fuzzy +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "Kasutaja nimi on vale" + +#~ msgid "(Away)" +#~ msgstr "(Eemal)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Kohe tagasi)" + +#~ msgid "(Busy)" +#~ msgstr "(Tegevuses)" + +#~ msgid "(Invisible)" +#~ msgstr "(Peidus)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Kaua vait)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Toitumas)" + +#~ msgid "(On the Phone)" +#~ msgstr "(Telefoniga)" + #, fuzzy #~ msgid "File transfer dialog message" #~ msgstr "Faili ylekanne valmis." @@ -3066,12 +6658,6 @@ msgstr "" #~ msgid "Notification message" #~ msgstr "Programmi teade" -#~ msgid "You can't login to hotmail with this account." -#~ msgstr "sa ei saa logida hotmail'i selle nimega." - -#~ msgid "The connection to the server failed." -#~ msgstr "Yhendus serveriga jupsib." - #~ msgid "You may not be connected to the internet." #~ msgstr "Oled kindel, et sul netiyhendus on?" @@ -3095,14 +6681,6 @@ msgstr "" #~ msgid "Show popup notifications for program events" #~ msgstr "Kuva teated programmi syndmustest" -#, fuzzy -#~ msgid "Server:" -#~ msgstr "Serveri Viga" - -#, fuzzy -#~ msgid "Connection good" -#~ msgstr "Yhenduse sai taim-audi" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "Server on umbes" @@ -3115,10 +6693,6 @@ msgstr "" #~ msgid "New chat notification:" #~ msgstr "Eposti Teade" -#, fuzzy -#~ msgid "%1 is offline" -#~ msgstr " on offline'is" - #, fuzzy #~ msgid "You have new mail:" #~ msgstr "Sul on uus kiri" @@ -3130,16 +6704,6 @@ msgstr "" #~ "in your inbox" #~ msgstr "sinu postkastis" -#, fuzzy -#~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in another folder" -#~ msgstr "teises kaustas" - -#~ msgid "and" -#~ msgstr "ja" - #~ msgid "says: " #~ msgstr "lausub:" @@ -3150,13 +6714,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" @@ -3165,10 +6722,6 @@ msgstr "" #~ msgid "Chat - %1" #~ msgstr "Jutt" -#, fuzzy -#~ msgid "Chat - %1 et al." -#~ msgstr " et al." - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't create a socket." #~ msgstr "katkes. Ei suutnud avada soketit" @@ -3181,11 +6734,3 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Raba uusi smile'si ja helisi" - -#, fuzzy -#~ msgid "Chat message layout:" -#~ msgstr "Sinu teate kirjatyyp:" - -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "Sinu nimi" diff --git a/po/fi.po b/po/fi.po index 14e9f8f..3054e05 100644 --- a/po/fi.po +++ b/po/fi.po @@ -5,1608 +5,2984 @@ # Markus Vuori , 2006. # Joonas Niilola , 2006. # Jussi Timperi , 2007. +# Antony Hussi, 2009. msgid "" msgstr "" "Project-Id-Version: fi\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2007-08-12 22:01+0300\n" -"Last-Translator: Jussi Timperi \n" -"Language-Team: Finnish\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" +"PO-Revision-Date: 2009-05-09 22:58+0300\n" +"Last-Translator: Antony Hussi\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" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Markus Vuori, Joonas Niilola, Jussi Timperi" +#: account.cpp:45 +msgid "I am away from my computer" +msgstr "Olen poissa koneeltajjd" -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "markus@vuoret.net, juippis@roskakori.org, jussi.timperi@gmail.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" -msgstr "Olen poissa koneelta" - -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Nimesi" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "sinä@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Kirjaudutaan sisään..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Olen poissa koneelta" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "%1 lähettää olion: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" +"Löydettiin suojaamattomia käyttäjätilin salasanaoja.
Haluatko " +"viedä salasanasi KDE.n lompakkoon nimeltä %1'. Säilyttääkseen suojaamattomia " +"salasanoja tai poistaa ne.

Huomio: ei ole suositeltavaa " +"säilyttää suojaamattomia salasanoja, jollei KDE:n lompakko käytetä. " +"Suojaamattomat salasanat on luettavissa KMess asetus-tiedostoissa." -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Suojattu salasanojen säilöntä" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Tuo" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Poista" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Pidä" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"Ei voida lähettää kutsua, keskustelijoiden ollessa enemmän kuin yksi." +"Aloita erillinen keskustelu kontaktin kanssa, jolle haluat lähettää kutsun." + +#: chat/chat.cpp:138, kde-format +msgid "%1 has joined the chat." +msgstr "%1 liittyi keskusteluun" + +#: chat/chat.cpp:191, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "%1 poistui keskustelu, keskutelu päättyi." + +#: chat/chat.cpp:197, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 poistui keskustelusta." + +#: chat/chat.cpp:359, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 ja %2 " + +#: chat/chat.cpp:367, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 ja muut" + +#: chat/chat.cpp:663, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Viesti lähetettiin atuomaattisesti)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" +"Ei voitu tallentaa kirjattuja viestejä keskustelusta:
Hakemistoa " +" "%1" ei ole olemassa." + +#: chat/chat.cpp:949 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Lähetit vinkkauksen!" + +#: chat/chat.cpp:954, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Lähetit "%1"vinkkauksen!" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" +"Keskustelu on pysäytetty. Syynä että et ole yhteydessä LIve Messenger " +"palveluun." + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Yhteysongelmia" + +#: chat/chat.cpp:1154 +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 "" +"Liian monta hymiöitä viimeisessä viestissä. Ainoastaan ensimmäiset " +"seitsemän lähetetään." + +#: chat/chat.cpp:1167, kde-format +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." +msgstr "%1 Lähetti äänileikkeen. Ominaisuutta ei ole tuettuna." + +#: chat/chat.cpp:1181, kde-format +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 Lähetti toiminta-viestin. Ominaisuutta ei ole tuettuna." + +#: chat/chat.cpp:1196, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "" +"%! Lähetti Live Messenger! ominaisuuden. Ominaisuutta ei ole tuettuna." +"" + +#: chat/chat.cpp:1222, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"Vastaanotit vinkkauksen from %1. Ominaisuus on kytkettynä pois päältä. " +"Voit aktivoida ominaisuuden " +"käyttäjänhallinsta." + +#: chat/chat.cpp:1232, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"Vastaanotit "%2" vinkkauksen %1. Ominaisuus on kytketty " +"päältä pois. Voit aktivoida ominaisuuden " +"käyttäjänhallinsta." + +#: chat/chat.cpp:1262, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 lähetti vinkkauksen" + +#: chat/chat.cpp:1269, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 lähetti vinkkauksen: "%2"!" + +#: chat/chat.cpp:1291, kde-format +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." +msgstr "" +"Vastaanotit vinkkauksen %1, muttei pystytty näyttämään. Tarkista " +"onko"cabextract" paketti asennettuna." + +#: chat/chat.cpp:1300, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Vastaanotit "%2" vinkkauksen %1, mutta ei voitu näyttämään. " +"Tarkista että olet asentanu paketin "cabextract"." + +#: chat/chat.cpp:1312, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"Vastaanotit vinkkauksen %1, mutta ei voitu näyttää. Purkaminen " +"epäonnistui paketistä käyttäen "cabextract"." + +#: chat/chat.cpp:1321, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"Vastaanotit "%2" vinkkauksen %1, mutta ei voitu näyttämään. " +"Purkaaminen epäonnistui paketistä hyödyntäen "cabextract"." + +#: chat/chat.cpp:1333, kde-format +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 "" +"Vastaanotit vinkkauksen %1, mutta ei voitu näyttämään. Tietoa ei " +"pystytty lukemaan." + +#: chat/chat.cpp:1342, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" +"Vastaanotit "%2" vinkkauksen %1, mutta ei voitu näyttämään. " +"Tietoa ei pystytty lukemaan." + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 katkaisi yhteyden. Viestit jotka tämän jälkeen lähetetäään. " +"Toimitetaan seuraavana kerran hänen kirjautuessa sisään." + +#: chat/chat.cpp:1389, kde-format +msgid "%1 has gone offline." +msgstr "%1 poistui." + +#: chat/chat.cpp:1399, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 Vaihtoi tilakseen "%2"" + +#: chat/chat.cpp:1430, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 lähetti herätteen" + +#: chat/chat.cpp:1463 +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 "Kaikki käyttäjät" + +#: chat/chat.cpp:1476, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Epäonnistui lähettämään herätteen käyttäjälle %1." + +#: chat/chat.cpp:1481, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "Epäonnistui lähettämänään vinkkauksen käyttäjälle %1." + +#: chat/chat.cpp:1491, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "" +"Epäonnistui lähettämään käsinkirjoitetun viestin käyttäjälle %1." + +#: chat/chat.cpp:1506, kde-format +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 "Epäonnistuin lähettämään viestin %2:
%1" + +#: chat/chat.cpp:1589, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "" +"Tiedostoa "%1" ei löytyny tietokoneelta ja lataaminen " +"epäonnistui." + +#: chat/chat.cpp:1626, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Lähetit herätteen!" + +#: chat/chat.cpp:1632 +msgid "You have sent a nudge!" +msgstr "Lähetit herätteen!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" +"%1 on tällähetkellä poissa. Lähetetyt viestit toimitetaan hänen " +"kirjautuessa uudelleen." + +#: chat/chatmaster.cpp:1372, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 lähetti vinkkauksen: "%2"" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 sanoo:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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 "Keskuste %1
Alkoi: %2" + +#: chat/chatmessageview.cpp:366 +#, kde-format +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 "Keskustelu alkoi: %2" + +#: chat/chatmessageview.cpp:406, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Keskustelut tallentuivat %1" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" -msgstr "" +msgstr "Lisää hymiö: %1" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Yhdistä uudelleen" + +#: chat/chatview.cpp:300, kde-format 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." +"Ei voitu tallentaa keskusteluja hakemistoon %1\n Varmista että on " +"käyttäjänoikeudet hakemistoon kirjottamiseen." -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458, kde-format msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" -msgstr "" -"Tiedosto %1 on jo olemassa.\n" -"Haluatko ylikirjoittaa sen?" +"Do you want to overwrite it?" +msgstr "Tiedosto %1 löytyi koneelta.\n Haluatko uudellenkirjoittaa tiedoston?" -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Ylikirjoita tiedosto" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Yli&kirjoita" -#: chat/chatview.cpp:919 -#, fuzzy +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." -msgstr "Näytä &hymiöt" +msgstr "Lisää hymiö..." -#: chat/chatview.cpp:924 -#, fuzzy +#: chat/chatview.cpp:828 +msgid "Hide this &Emoticon" +msgstr "Piilota hymiö" + +#: chat/chatview.cpp:834 msgid "Send &Email" -msgstr "&Lähetä sähköposti" +msgstr "Lähetä sähköposti" -#: chat/chatview.cpp:926 -#, fuzzy -msgid "Copy E&mail" -msgstr "Sähköposti" +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "Lisää yhteystiedot" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +msgid "Copy E&mail Address" +msgstr "Kopioi sähköpostiosoite" + +#: chat/chatview.cpp:848 msgid "Visit &Link" -msgstr "" +msgstr "Katso linkki" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" -msgstr "" +msgstr "Kopio osoite" -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "&Kopioi teksti" +#: chat/chatview.cpp:868 +msgid "&Copy Text" +msgstr "Kopioi teksti" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" -msgstr "&Valitse Kaikki" +msgstr "Valitse Kaikki" -#: chat/chatview.cpp:948 -#, fuzzy -msgid "Save chat to &File" -msgstr "Tallenna &Tiedostoon" +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "Löydä teksti..." -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Keskustele" +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +msgid "C&lear Chat" +msgstr "Tyhjennä keskustelu" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" -"Et voi aloittaa tätä kutsua, koska tässä keskustelussa on useita " -"keskustelukumppaneita." +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." +msgstr "Tallenna keskustelu tiedostoon.." -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 on liittynyt keskusteluun." - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "%1 poistunut keskustelusta." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 poistunut keskustelusta." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Keskustele" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 ja %2 - Keskustele" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 ja muut - Keskustele" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" -msgstr "Yhteistiedot" +msgstr "Käyttäjät" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Hymiöt" -#: chat/chatwindow.cpp:799 -#, fuzzy -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Hymiölni" + +#: chat/chatwindow.cpp:337 +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 "" +"Useita välilehtiä on auki ikkunassa. Haluatko sulkea nykyisen tai " +"kaikki ikkunat?

Huomio: voit sulkea kaikki ikkunat yhdellä " +"kertaa painamalla ALT-F4." + +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Sulje välilehti" + +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "Sulje välilehdet" + +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Sulje aktiivinen välilehti" + +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "Kutsu..." + +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." +msgstr "Lähetä tiedosto..." + +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "Nettikamera keskustelu" + +#: chat/chatwindow.cpp:454 +msgid "Start a &Meeting" +msgstr "Aloita tapaaminen" + +#: chat/chatwindow.cpp:455 +msgid "Send a &Nudge!" +msgstr "Lähetä heräte!" + +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." +msgstr "Tallenna keskustelu..." + +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "Sulje välilehdet" + +#: chat/chatwindow.cpp:462 +msgid "Change &Font" +msgstr "Vaihda kirjaisin" + +#: chat/chatwindow.cpp:463 +msgid "Change Font &Color" +msgstr "Vaihda kirjaisimen väri" + +#: chat/chatwindow.cpp:470 +msgid "Show &Emoticons" +msgstr "Näytä hymiöt" + +#: chat/chatwindow.cpp:471 +msgid "Show S&tatus Messages" +msgstr "Näytä tilan viestit" + +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "Paneelit" + +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "Käytä oikeankirjoituksen tarkistamista" + +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "Ryhmäkeskustelu" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Heräte" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Lähetä tiedosto" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "Edellinen välilehti" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "Seruaava välilehti" + +#: chat/chatwindow.cpp:507 +msgid "Enable or disable the contacts panel" +msgstr "Kytke tai kytke pois päältä käyttäjät paneelin" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Käyttäjät" + +#: chat/chatwindow.cpp:513 +msgid "Enable or disable the standard emoticons panel" +msgstr "Kytke tai kytke pois päältä hymiö-paneeli" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" msgstr "Hymiöt" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Tämä viesti lähetettiin automaattisesti)" +#: chat/chatwindow.cpp:519 +msgid "Enable or disable the custom emoticons panel" +msgstr "Kytke tai kytke pois päältä muokatut hymiöt-paneeli" -#: chat/chatwindow.cpp:1493 -msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "" -"Oliota ei voitu näyttää. Varmista, että sinulla on 'cabextract' asennettuna." +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Hymiöni" -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "Oliota ei voitu näyttää. Dataa ei voitu lukea." +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "Kirjaisin" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "Olet vastaanottanut olion henkilöltä %1" +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "Kirjaisimen väri" -#: chat/chatwindow.cpp:1791 -#, fuzzy -msgid "The message '%1' could not be sent." -msgstr "Viestiä \"%1\" ei vastaanotettu." +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "Tyhjennä keskusteluikkuna" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "Olet saanut herätteen henkilöltä %1!" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Olet lähettänyt herätteen henkilölle %1!" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Lähetit herätteen!" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 kirjoittaa viestiä." - -#: chat/chatwindow.cpp:1985 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1 ja %2 - Keskustele" - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Lähetä &Tiedosto" - -#: chat/chatwindowinterface.cpp:174 -msgid "Start a &Meeting" -msgstr "Aloita &Ryhmäkeskustelu" - -#: chat/chatwindowinterface.cpp:175 -msgid "Send a &Nudge!" -msgstr "Lähetä &Heräte!" - -#: chat/chatwindowinterface.cpp:177 +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" msgid "Start or Stop a &Conversation" -msgstr "&Aloita tai lopeta keskustelu" +msgstr "Aloita tai pysäytä keskustelu" -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Tallenna keskustelu" - -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Kutsu" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Keskustele" - -#: chat/chatwindowinterface.cpp:221 -msgid "Change &Font" -msgstr "&Vaihda kirjasin" - -#: chat/chatwindowinterface.cpp:222 -msgid "Change Font &Color" -msgstr "Vaihda kirjasimen väri&ä" - -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Lisää hymiö" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." msgstr "" +"Käytit väärää kutsua /status komennossa. Oikea kutsu on: /status " +"online | away | brb | busy | lunch | phone | invisible.
Voidaan " +"myös käyttää oikotietä kuten /online tai /phone." -#: chat/chatwindowinterface.cpp:320 -msgid "Show &Emoticons" -msgstr "Näytä &hymiöt" +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Väärä kutsu /stats komennossa" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Näytä/Piilota &yhteystietopalkki" +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "Ei voida kutsua /block komentoa ryhmäkeskustelussa." -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Näytä tai piilota yhteystietopalkki" +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "Ei voida käyttää /block komentoa!" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "&Lähetä sähköposti" +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "Et voida käyttää /unblock komentoa ryhmäkeskustelussa." -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "Ei voida käyttää /unblock komentoa!" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" +"Väärä komento %1. Haluatko että viesti on komentona, " +"muotoile viestisi toisenlaiseksi /." + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Tuntematon komento" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Keskustelu" + +#: chat/chatwindow.cpp:1610, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Keskustelu" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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 "" +"Oletko varma että haluat piilottaa valikkon? Valikko näytetään " +"uudelleen painaessa pikanäppäintä: %1" + +#: chat/chatwindow.cpp:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Piilota valikko" + +#: chat/chatwindow.cpp:1887, kde-format +msgid "%1 is typing..." +msgstr "%1 Kirjoittaa.." + +#: chat/chatwindow.cpp:1897, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 ja %2 kirjoittavat..." + +#: chat/chatwindow.cpp:1901, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 ja %3 kirjittavat..." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" +"Ei voida näyttää käsinkirjoitettua viestiä %1. Yhteensopimaton Windows " +"LIve Messenger 8.5." + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

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

Kesskustelu

Käyttäjä:
  • %1
Keskustelu aloitettu:
%2
Yhdistää " +"käyttäjätiliin:
%3
" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "Aloita yksityinen keskustelu" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +msgid "&Send Email" +msgstr "Lähetä sähköposti" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" -msgstr "&Näytä profiili" +msgstr "Näytä profiili" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "Ominaisuudet" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" -msgstr "&Lisää yhteystieto" +msgstr "Lisää käyttjä" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" -msgstr "Salli &keskustelukumppani" +msgstr "Salli käyttäjä" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" -msgstr "&Poista yhteystieto" +msgstr "Poista käyttäjä" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" -msgstr "&Estä keskustelukumppani" +msgstr "Estä käyttäjä" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" -msgstr "&Salli käyttäjä" +msgstr "Salli käyttäjä" -#: chat/contactframe.cpp:241 -#, fuzzy +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" msgstr "Lempinimesi:" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" -msgstr "" +msgstr "Henkilökohtainen viesti" -#: chat/contactframe.cpp:243 -#, fuzzy +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" -msgstr "Sähköpostiosoite:" +msgstr "Sähköpostisoite:" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "" +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "Kappaleen nimi" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "Tietoa" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "Näytä kuva" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "Muistio" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "Hymiöt" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "Kopioi" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Estetty" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Poissa" +#: chat/contactframe.cpp:765, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Käyttäjä on %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Tulen pian takaisin" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" +"

Et ole vielä lisänny muokattua hymiöitä.

Lisätäkseen " +"uusia " +"paina tästä.

" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Kiireinen" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Lisää keskusteluun" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Poissa linjoilta" +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Lisää uusi" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Poissa - jouten" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Muokkaa" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Lounaalla" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Poista" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

Et ole vielä lisänny yhtään vinkkauksia.

Lisätäkseen, " +"pyydä käyttäjän lähettämään!

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messnger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger robootti" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Winwos Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 yhteensopivuus" + +#: contact/contactbase.cpp:335, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 yhteensopivuus" + +#: contact/contactbase.cpp:353 +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger yhteensopivuus" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Paikalla" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Kiireinen" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Poissa" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Poissa (automaatisella vastauksella)" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Ei aktiivinen" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Tulen pian takaisin" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Puhelimessa" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "Tämä keskustelukumppani ei ole paikalla" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Lounaalla" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "keskustelu-tyyli-teksti" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Näkymätön" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Poissa linjoilta" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "Lisää yhteystieto" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "Oma tila" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Syötä lisättävän henkilön sähköpostiosoite:" +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Katkaise yhteys" -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "Annettu sähköpostiosoite on virheellinen!" +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Lisää uusi käyttäjä" -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 -#, fuzzy +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" -msgstr "Näytä &hymiöt" +msgstr "Lisää uusi hymiö" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -#, fuzzy -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" -"Tiedosto %1 on jo olemassa.\n" -"Haluatko ylikirjoittaa sen?" +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Muokkaa hymiöitä" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Kirjoita poissaoloviesti" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "Hymiö \"%1\"on asennettuna. Haluatko korvata?" #: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Automaatinen poissaolon viesti" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Keskusteluhistoria" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Kirjoita viesti, joka lähetetään automaattisesti\n" -"henkilölle, joka yrittää lähettää sinulle viestin:" +"Ilmeni ongelma avatessa kirjattua keskustelua. Yleiseensä ongelman on " +"käyttäoikedet, tarkista onko oikeus lukea/kirjoittaa hakemistoon " +""%1". Muussa tapauksessa kirjatut keskustelut voivat " +"koruptoitua." -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Käytä tälle henkilölle vaihtoehtoista nimeä" +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Ei voitu avata keskusteluhistoriaa" -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Näytä viestikupla, kun tämä henkilö kirjautuu sisään tai ulos" +#: dialogs/chathistorydialog.cpp:567 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Ladataan..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Kuva:" +#: dialogs/chathistorydialog.cpp:589 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Ei kirjattuja keskusteluja" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Ääni:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Käyttäjäsi on lisätty" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"on lisänny käyttäjäsi listalleen." + +#: dialogs/contactaddeduserdialog.cpp:65, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"on lisänny käyttäjäsi listalleen." + +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" -msgstr "Yhteystiedon %1 ominaisuudet" +msgstr "Yhteystiedot %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Sähköpostiosoite: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Yhdistetty" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Nykyinen nimi: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "Ei ole nähny" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "Ei viestejä" + +#: dialogs/contactpropertiesdialog.cpp:419, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Viimeksi nähty: %1" + +#: dialogs/contactpropertiesdialog.cpp:420, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Viimeisin viesti: %1" + +#: dialogs/contactpropertiesdialog.cpp:421, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Sähköpostiosoite: %1" + +#: dialogs/contactpropertiesdialog.cpp:422, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Sähköpostiohjelma: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Oletko varma että haluat näyttää kuvan käyttäjille?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "Kopioi käyttäjän kuva" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "Valittu tiedostotyyppi ei ole tuettuna Phonon:ssa." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "Tukematon tiedostotyyppi" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Kutsu käyttäjä" + +#: dialogs/listexportdialog.cpp:83, kde-format +msgid "Export Contact List for %1" +msgstr "Vie käyttäjälista %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Ei vietävää" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Tiedosto olemassa" + +#: dialogs/listexportdialog.cpp:159, kde-format +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Tiedosto %1 on jo olemassa. Haluatko ylikirjoittaa sen?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Vienti onnistunu" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "Käyttäjälistan vienti onnistui" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" -msgstr "Verkkoyhteysikkuna" +msgstr "Verkkoyhteisikkuna" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Tallenna välilehti" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "tallenna välilehti" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Tyhjennä välilehti" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "tyhjennä välilehti" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Sulje välilehti" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "Sulje välilehdet" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Yhteyksiä ei ole saatavilla. Verkkoikkunaa ei voi avata." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "Yhteksiä ei saatavissa.\nEi voida avata yhteyttä" -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" -"Verkkoikkunan lokia ei voitu tallentaa. Varmista, että sinulla on " +"Ei voitu tallentamaan verkkoyhteyden lokia. Varmista, että sinulla on " "kirjoitusoikeudet kansioon johon loki tallennetaan." -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "Yhteysvälilehteä ei voida sulkea." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"Komennon lähettäminen palvelimelle on vaarallinen tehtävä.
Varoitus: " +"komento voi aiheuttaa vain yhteyden sulkemista tai mahdollisesti vakavempaa." +"
Haluatko jatkaa viestin lähettämistä?" + +#: dialogs/networkwindow.cpp:1303 +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 "" +"Lähetys ei lopu uuteen rivin komeenton ('\\r\\n')!
Haluatko sen " +"lisättävän?" + +#: dialogs/networkwindow.cpp:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Ei voida lähettää komentoa yhteydellä!" + +#: 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 "" +msgstr "Keskeytetty" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Epäonnistui" -#: dialogs/transferentry.cpp:202 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Tietokone" +msgstr "Onnistui" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 Mt" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 kt" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 tavua" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 vastaanotettu %2." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 lähetty %2." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "loputon" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" msgstr "Tiedostosiirrot" -#: emoticontheme.cpp:542 -#, fuzzy +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "Käytä" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Poista" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "Vaihda tai poista näytettävä kuva" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "Oletko varma että haluat poistaa näyttää poistettavan kuvasi?" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Poista näytettävä kuva" + +#: emoticontheme.cpp:627, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -"Verkkoikkunan lokia ei voitu tallentaa. Varmista, että sinulla on " -"kirjoitusoikeudet kansioon johon loki tallennetaan." +"Ei voitu tallentaa hymiö teemaa. Varmista että on käyttöoikeudet kirjottaa " +"teema kansioon %1'." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Hymy" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" -msgstr "Olio" +msgstr "Vinkkaus" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Kieli ulkona" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Iso hymy" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Surullinen" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Itkee" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "Vihainen" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Hämillään" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Häpeissään" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Pettynyt" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Kuuma" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Hampaat paljaana" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Nörtti" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Sairas" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Yllättynyt" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Juhlii" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Uninen" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Miettii" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Älä kerro kenellekään" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" -msgstr "Salainen juttu" +msgstr "Salainen kertomus" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Pyörittelee silmiään" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Sarkastinen" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Tietämätön" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Tulen pian takaisin" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Enkeli" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Halaa vasemmalta" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Poju" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Punainen sydän" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Punainen ruusu" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "Peukku pystyssä" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Koiran naama" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Aurinko" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Piru" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Halaa oikealta" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Tyttö" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Särkynyt sydän" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Kuihtunut ruusu" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Peukku alas" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Kissan naama" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Nukkuva puolikuu" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Punaiset huulet" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Taputtaa" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Ristityt sormet" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Lentokone" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Kilpikonna" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Etana" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Musta lammas" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Lammas" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Vuohi" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Vampyyrilepakko" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" -msgstr "Olutmuki" +msgstr "Olutlasi" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" -msgstr "Martini-lasi" +msgstr "Martiinilasi" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "Kahvikuppi" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Synttärikakku" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Lautanen" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Kulho" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Tähti" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Sateenkaari" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Myrskypilvi" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Salama" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Sateenvarjo" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Palmusaari" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "Puhelinvastaanotin" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" -msgstr "Kännykkä" +msgstr "Matkapuhelin" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "Sähköposti" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Kello" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Filminpätkä" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Huomautus" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Käsiraudat" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Raha" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Hehkulamppu" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "Savuke" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "Jalkapallo" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Lahja ja kumarrus" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Tietokone" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +msgid "KMess icon" msgstr "KMess-ikoni" -#: kmess.cpp:261 kmess.cpp:346 -#, fuzzy -msgid "The contact address you have entered is not valid: '%1'" -msgstr "Annettu yhteystiedon osoite ei ole kelvollinen: %1" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Ei voitu yhdistää: käyttätiliä ei löydy" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "Ei voitu yhdistää: käyttätilille ei ole tallennettua salasanaa" + +#: initialview.cpp:280 initialview.cpp:375, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Odottaa uudelleen yhdistämistä...
<Yhdistä nyt" + +#: initialview.cpp:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Verkkoyhteyttä ei ole saatavilla" + +#: initialview.cpp:401 +#, kde-format +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] "" +"Odota %1 sekunttia ennen uudelleen yhdistämistä...
Yhdistä " +"nyt" +msgstr[1] "" +"Odota %1 sekunttia ennen uudelleen yhdistämistä...
" +"Reconnect now!" + +#: initialview.cpp:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "Yhdistä" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "Peruuta" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Kirjoita sähköpostisoitteesi ja salasanasi" + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "kirjoita sähköpostisoitteesi" + +#: kmess.cpp:218, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Käyttäjä %1 löytyi listaltasi." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Näytä tiedot" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Uusi ryhmä" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Lisää ryhmä" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Anna ryhmälle uusi nimi:" +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Nimeä ryhmäsi:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Poissa (Automaattivastaus)" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "" - -#: kmess.cpp:715 +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" -" Oletko varma että haluat poistaa yhteystiedon %1 " +" Oletko varma että haluat poistaa käyttäjän %1" "yhteystietoluettelostasi?" -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "Poista yhteystieto" +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "Poista käyttäjä" -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "Poista ja estä" +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "Poista ja estä käyttäjä" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" +"Ryhmä %1 ei ole tyhjä. Poista ensiksi kaikki käyttäjät listalta." + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Ryhmän poistaminen" + +#: kmess.cpp:633, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" -"Oletko varma, että haluat poistaa ryhmän %1 yhteystietolistastasi?" -"" +"Oletko varma, että haluat poistaa ryhmän %1 Käyttäjälistaltasi<" +"/qt>" -#: kmess.cpp:763 -msgid "Remove group" -msgstr "Poista ryhmä" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Poistettu" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." msgstr "Tämä on erityinen ryhmä eikä sitä voi muuttaa." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "Nimeä ryhmä uudelleen" +#: kmess.cpp:676 +msgid "Rename Group" +msgstr "Uudelleennimeä ryhmä" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Yhdistetty" +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "Anna uusi nimi ryhmälle:" -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "Yhteys poikki" - -#: kmess.cpp:1669 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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.

" +"

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

" 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.

" +"

Ei voida yhdistää automaattisesti käyttätilille %1:
Salasana " +"täytyy ensiksi tallentaa

" -#: kmess.cpp:1673 -msgid "Error with notifications" +#: kmess.cpp:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automaattinen kirjautuminen epäonnistui" + +#: kmess.cpp:1039 +msgid "Connection could be down..." +msgstr "Yhteys voi olla mahdollisesti katki..." + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Yhteyskatkesi" + +#: kmess.cpp:1448 +#, kde-format +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 "

Etsi seuraavista kansioista:
%1

" + +#: kmess.cpp:1460, kde-format +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 "" +"

Ei voida toistaa ääiä tai ilmoituksia.

Tiedostoa " +"'eventsrc' ei löytynyt seuraavista kansioista: %1

Tarkista asennettu " +"ohjelma.

" + +#: kmess.cpp:1466 +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Virhe ilmoituksissa" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Uusi &Tili" +#: kmess.cpp:1744, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Uusi &Yhteystieto" +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "Yhdistä" -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Uusi &Ryhmä" +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Katkaise yhteys" -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "&Etsi yhteystietoa" +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Näytä käyttäjä" -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Etsi &Kiinnostusten perusteella" +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "Näytä sallitut käyttäjät" -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Tilin &Asetukset" +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "Näytä poissaolevat käyttäjät" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "Näytä poistetut käyttäjät" + +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Näytä historia" #: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Toiminnot" +msgid "&Show Search Bar" +msgstr "Näytä hakurivi" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Näytä tyhjät ryhmät" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "Näytä kuvankoko" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "Järjestä käyttäjät" + +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Näytä tiedonsiirrot" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Uusi käyttäjä" + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Uusi ryhmä" + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "Vie käyttäjälista..." + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "Näytä keskustelujen historia..." + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Uusi käyttäjätili..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Muokkaa käyttätiliä..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Muokkaa KMess..." #: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "&Yhdistä" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Katkaise yhteys" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Näytä oma &profiili" +msgid "Show Selection &Menu" +msgstr "Näytä valitut valikko" #: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Oma tila" +msgid "Do Not Display" +msgstr "Ei näytetä" -#: kmessinterface.cpp:220 -msgid "&Connect" -msgstr "&Yhdistä" +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Pieni" -#: kmessinterface.cpp:275 -msgid "Show &Allowed Contacts" -msgstr "&Näytä sallitut yhteystiedot" +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Keskikokoinen" -#: kmessinterface.cpp:276 -msgid "Show &Offline Contacts" -msgstr "Näytä myös &poissaolevat" +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Iso" -#: kmessinterface.cpp:277 -msgid "Show &Removed Contacts" -msgstr "Näytä &poistetut yhteystiedot" - -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Keskustelukuvake" - -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "&Näytä verkkoikkuna" - -#: kmessinterface.cpp:285 -msgid "&Sort Contacts by" -msgstr "&Yhteystietojen järjestys..." - -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:197 msgid "Group" msgstr "Ryhmä" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Paikalla/Poissa" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Näytä &siirtoikkuna" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Sekoitettu" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Kuuntelee nyt %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "Näytä verkkoyhteys" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "(%1) Yhdisti %2" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 yhdisti" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 katkaisi yhteyden" + +#: kmessview.cpp:599 msgid "Cha&t" -msgstr "Keskus&tele" +msgstr "Keskustelu" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Ominaisuudet" +#: kmessview.cpp:610 +msgid "&Remove From Group" +msgstr "Poista ryhmästä" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "&Poista ryhmästä" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "Siirrä ryh&mään" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" -msgstr "&Kopioi ryhmään" +msgstr "Kopioi ryhmään" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "Siirrä ryhmään" + +#: kmessview.cpp:695 msgid "Move Group &Down" -msgstr "Siirrä ryhmää &alas" +msgstr "Siirrä ryhmää alemmas" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" -msgstr "Siirrä ryhmää &ylös" +msgstr "Siirrä ryhmää ylemmäs" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" -msgstr "Poista ryh&mä" +msgstr "Poista ryhmä" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" -msgstr "&Uudelleennimeä ryhmä" +msgstr "Uudelleennimeä ryhmä" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "Postilaatikossasi on 1 uusi sähköposti" +#: kmessview.cpp:1136 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Käyttäjää ei ole listättynä hänen yhteystietojen listalla." -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "Postilaatikossasi on %1 uutta sähköpostia" +#: kmessview.cpp:1145 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Sähköpostiosoite:" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Poissa)" +#: kmessview.cpp:1152 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Asiakasohjelma" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Tulen pian takaisin)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "Kyllä" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Kiireinen)" +#: kmessview.cpp:1168 +msgid "No" +msgstr "Ei" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Näkymätön)" +#: kmessview.cpp:1171 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Estetty" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Poissa - Jouten)" +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Viimeksi ollu paikalla" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Lounaalla)" +#: kmessview.cpp:1206 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Viimeisin viesti" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Puhelimessa)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Ryhmä %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Kirjaudu automaattisesti annetulla sähköpostiosoitteella" +#: kmessview.cpp:1224, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 käyttäjä, %2 paikalla" +msgstr[1] "%1 käyttäjät, % paikalla" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "Käyttäjä" +msgstr[1] "Käyttäjät" + +#: kmessview.cpp:1651 +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:1652 +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 "" +"Kirjoita viesti käyttäjälle, joilloin näkevät viestisi lisäksi nimimerkkisi." + +#: kmessview.cpp:1833 +msgid "You have not chatted with this contact yet." +msgstr "Et ole keskustelu käyttäjän kanssa." + +#: kmessview.cpp:1834 +msgid "No Chat History found." +msgstr "Ei keskusteluhistoriaa löydetty" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 uusi sähköpostiviesti" +msgstr[1] "%1 uusi sähköpostiviestiä" + +#: kmessviewdelegate.cpp:148, kde-format +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, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "Live Messenger asiakasohjelma KDE:lle" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "kehittäjä ja projektin aloittaja" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "Kehittäjä" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "Projektin tukija" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Tämänhetkiset kehittäjät" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "" -"Saksankielinen käännös, testaus, dokumentointi, kotisivut, " +"Saksankielinen kääntämisnen, testaus, dokumentointi, kotisivut, " "projektinhallinta, jne..." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "Web-suunnittelu" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" msgstr "" -"Italiankielinen käännös sekä oletushymiöt ja keltainen/sininen/violetti " -"hymiövalikoima" -#: main.cpp:81 +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" +"Ensisijainen ja keltainen/sininen/violette hymiö paketit, italiaksi " +"kääntäminen" + +#: main.cpp:74 msgid "Cartoon emoticons" -msgstr "Cartoon-hymiöteema" +msgstr "Cartoon hymiöt" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "Oletus ääniteema" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "KMess ikonit Oxygen tyylisenä" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "Käännösten ylläpitäjä" #: main.cpp:82 -msgid "Default sound theme" -msgstr "Oletusääniteema" - -#: main.cpp:86 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Arabinkielinen käännös, tiedoston tallentamisen kansainvälistämiskorjaus." -#: main.cpp:87 -#, fuzzy +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 msgid "More Arabic translation" -msgstr "Lisää turkinkielisiä käännöksiä" +msgstr "Lisää Arabiankielistä käännöstä" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "Brazilian Portugalinen-kielinen käännös" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Lisää Brasilian-Portugalinkielinen kääntämine" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" #: main.cpp:88 -msgid "Brazilian Portuguese translation" -msgstr "Portugalinkielinen käännös (Brasilia)" +msgid "Maurício Arozi Moraes" +msgstr "" -#: main.cpp:89 -#, fuzzy +#: main.cpp:90 msgid "Catalan translation" -msgstr "Katalankielinen käännös" +msgstr "Katalonian käännös" + +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" #: main.cpp:91 -#, fuzzy -msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgid "Adrià Arrufat" msgstr "" -"Yksinkertaistetun kiinankielinen käännös, tiedostonlähetyksen bugikorjaus" -#: main.cpp:92 -#, fuzzy -msgid "More Simplified Chinese translation" -msgstr "" -"Yksinkertaistetun kiinankielinen käännös, tiedostonlähetyksen bugikorjaus" +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "Lisää Kataloniaksi käännöstä" #: main.cpp:93 -#, fuzzy -msgid "Traditional Chinese translation" -msgstr "Perinteinen kiinankielinen käännös" +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" +"Yksinkertaistettu Kiinaksi käännös, tiedoston lähettämisen virheen " +"korjaaminen, proxy koodi" + +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "Lisää Yksinkertaistetun Kiinaksi kääntäminen" #: main.cpp:95 -#, fuzzy -msgid "Danish translation" -msgstr "Tanskankielinen käännös" +msgid "Cheng Yang" +msgstr "" #: main.cpp:96 -#, fuzzy -msgid "More Danish translation" -msgstr "Lisää Tanskankielistä käännöstä" +msgid "Traditional Chinese translation" +msgstr "Perinteinen KIinaksi käännös" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" #: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "Lisää perinteistä Kiinaksi käännettynä" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "Tanskakielinen käännös" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 +msgid "More Danish translation" +msgstr "Lisää Tanskakieliseksi kääntäminen" + +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "Hollanninkielinen käännös" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" -msgstr "Lisää Hollanninkielistä käännöstä" +msgstr "Lisää Hollanninkielistä kääntämistä" -#: main.cpp:100 -#, fuzzy +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "Lisää Saksankielisestä kääntämistä ja Kreikaksi kääntäminen" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +msgid "More Greek translation" +msgstr "Lisää Kreikankielisestä kääntämistä" + +#: main.cpp:111 msgid "Estonian translation" msgstr "Eestinkielinen käännös" -#: main.cpp:101 -#, fuzzy +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 msgid "Finnish translation" msgstr "Suomenkielinen käännös" -#: main.cpp:102 main.cpp:103 -#, fuzzy -msgid "More Finnish translation" -msgstr "Lisää Suomenkielistä käännöstä" +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" -#: main.cpp:105 +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 +msgid "More Finnish translation" +msgstr "Lisää Suomenkielistä kääntämistä" + +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "Ranskankielinen käännös" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" -msgstr "Ranskankielinen lisäkäännös, MSN6 hymiö -määritykset" +msgstr "Lisää Ranskankielistä kääntämistä, MSN6 hymiö-määritykset" -#: main.cpp:107 -#, fuzzy +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" -msgstr "Ranskankielinen käännös" +msgstr "Lisää Ranskankielistä kääntämistä" -#: main.cpp:109 -#, fuzzy +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "Unkarinkielinen käännös" -#: main.cpp:110 main.cpp:111 -#, fuzzy -msgid "More Italian translation" -msgstr "Koreankielinen käännös" +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" -#: main.cpp:112 +#: main.cpp:123 +msgid "More Hungarian translation" +msgstr "Lisää Unkarinkieliset käännökset" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 +msgid "More Italian translation" +msgstr "Lisää Italiankielistä kääntämistä" + +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" +"Lisää Italiankielistä kääntämistä, ryhmä valinnat 'käyttäjän lisääminen' " +"valinnat" + +#: main.cpp:127 msgid "Korean translation" msgstr "Koreankielinen käännös" -#: main.cpp:113 -#, fuzzy +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "Norjankielinen käännös" -#: main.cpp:115 -msgid "Slovenian translation" -msgstr "Sloveniankielinen käännös" - -#: main.cpp:116 -msgid "Spanish translation" -msgstr "Espanajankielinen käännös" - -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 -#, fuzzy -msgid "More Spanish translation" -msgstr "Espanankieliset lisäkäännökset" - -#: main.cpp:121 -msgid "Swedish translation" -msgstr "Ruotsinkielinen käännös" - -#: main.cpp:123 -#, fuzzy -msgid "Thai translation" -msgstr "Thaimaankielinen käännös" - -#: main.cpp:124 -msgid "Turkish translation" -msgstr "Turkinkielinen käännös" - -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "Lisää turkinkielisiä käännöksiä" - -#: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:128 +msgid "Øyvind Sæther" msgstr "" #: main.cpp:130 -msgid "P4-Context field support" +msgid "Serbian translation" +msgstr "Sloveniankielinen käännös" + +#: main.cpp:130 +msgid "Zoran Milovanović" msgstr "" -#: main.cpp:131 +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "Sloveniankielinen käännös" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "Sloveniankielinen käännös" + +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 +msgid "Spanish translation" +msgstr "Espanajankielinen käännös" + +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 +msgid "More Spanish translation" +msgstr "Lisää Espanankielistä kääntämistä" + +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 +msgid "Swedish translation" +msgstr "Ruotsinkielinen käännös" + +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +msgid "More Swedish translation" +msgstr "Lisää Ruotsinkielistä kääntämistä" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 +msgid "Thai translation" +msgstr "Thaimaankielinen käännös" + +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 +msgid "Turkish translation" +msgstr "Turkinkielinen käännös" + +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "Lisää turkinkielistä kääntämistä" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "MSNP12 tuki, lukuisia päivityksiä" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "Guido Solinds" + +#: main.cpp:154 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" +"Kuvat yhteystietolistalle, käyttäjän asiakasohjelman tiedot ja keskustelun " +"kirjaisimen lähentäminen" + +#: main.cpp:155 +msgid "File transfer thumbnails" +msgstr "Tiedostonsiirto peukalonkuvat" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 +msgid "P4-Context field support" +msgstr "P4 sisällönhallinnan tuki" + +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Xinerama-korjaukset" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Alkuperäinen tiedostojen vastaanottokoodi" -#: main.cpp:133 -msgid "Various internationalization fixes." -msgstr "Erilaisia kansainvälistämiskorjauksia." +#: main.cpp:159 +msgid "KWallet support" +msgstr "KWallet tuki" -#: main.cpp:134 +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Vaihtoehtona ilmoituksien ja vinkkien kieltäminen tai viimeisen viestin " +"päivä ominaisuudet." + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "IRC-tyylinen komennot keskustelu ikkunassa" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "Kekusteluhistorian dialoogi" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "Lukuisia kansainvälisiämisen korjauksia" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 +msgid "Various internationalization fixes." +msgstr "Lukuisia kansainvälistämis korjauksia." + +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "GnomeMeeting-kehittäjä" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Kaveri jolla on kassi päänsä päällä" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspiraatio ja ohjelmakoodi" -#: main.cpp:139 -#, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Puhekuplakoodit, alustava P2P-koodi, MSN:n käsittelijäkoodi" +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" -#: main.cpp:140 +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "Vanhat puhekuplakoodi, p2p koodi ja MSN käyttäytyminen" + +#: main.cpp:174 msgid "Idle timer code" msgstr "Joutenololaskurin koodi" -#: main.cpp:141 -msgid "Close-to-tray icon screenshot code" +#: main.cpp:174 +msgid "KScreensaver" msgstr "" -#: main.cpp:144 -#, fuzzy -msgid "Your name here?" -msgstr "Nimesi" +#: main.cpp:175 +msgid "BasKet" +msgstr "" -#: main.cpp:144 +#: main.cpp:175 +msgid "Close-to-tray icon screenshot code" +msgstr "Sulje-ilmaisinalueelle ikonin kuvankaappaus koodi" + +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "Muokattu kaatumisen hallinnoinnin toteutus" + +#: main.cpp:179 msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" msgstr "" +"Tervetuloa lähettämään virhekorjauksia ja päivityksiä KMess " +"keskustelu-sivuille\nNimen puuttuessa listalta, iilmoita asiasta" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:179 +msgid "Your name here?" +msgstr "Nimesi?" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Nimet?" + +#: main.cpp:183 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Sähköpostiosoite: " + +#: main.cpp:189 +msgid "Do not show the contact list window initially" +msgstr "Ei näytetä yhteystietolistaa käynnistyksen yhteydessä" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Kirjaudu automaattisesti annetulla sähköpostiosoitteella" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "Aja virheen tarkistus (Ainoastaan kehittäjien versioissa)" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "Yksilöt" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Sallittu" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Poistettu" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." -msgstr "Keskustelukumppani katkaisi istunnon." +msgstr "Käyttäjä katkaisi istunnon." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." -msgstr "Keskustelukummpani hylkäsi kutsun." +msgstr "Käyttäjä hylkäsi kutsun." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." -msgstr "Olet katkaissut istunnon." +msgstr "Olet peruuttanu istunnon." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Olet hylännyt kutsun." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540, kde-format msgid "Do you want to accept or cancel?" msgstr "Haluatko hyväksyä vai hylätä ?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581, kde-format msgid "Click to cancel." msgstr "Paina hylätäksesi." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, 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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Käyttäjä lähetti tiedoston: "%1" (%2)." -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346, kde-format +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, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu tallentaa." + +#: network/applications/filetransfer.cpp:295, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu avata." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Yhdistetään kohteeseen %1, portti %2" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Siirto peruuntui" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Yhteys muodostettu" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Siirrettiin onnistuneesti tiedosto: %1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei ole." - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu lukea." - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Lähetetään tiedostoa %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Siirto hyväksytty." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Yhdistetään kohteeseen %1, portti %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Käyttäjä keskeytti "%1" tiedoston lähettämisen." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Katkaisit "%1" tiedoston lähettämisen." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Olet hylänny "%1" tiedoston lähettämisen." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Yhteys muodostettiin" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Lähetit "%1" tiedoston onnistuneest." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679, kde-format +msgid "Successfully received the file "%1"." +msgstr ""%1" tiedoston siirtäminen onnistui." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "" +""%1" tiedoston siirtäminen päonnistui. Tiedostoa ei ole olemassa." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "" +""%1" tiedoston siirtäminen epäonnistui. Tiedostoa ei voitu lukea." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Lähettää tiedoston "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Käyttäjä hyväksy "%1" tiedoston siirtämisen." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" -msgstr "" +msgstr "Keskustelee asetuksista yhteyden luomiseksi" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 -#, fuzzy +#: 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 "Tiedostonsiirtokutsu peruttu viallisen vastaanotetun datan vuoksi." - -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu avata" - -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Keskustelukumppani peruutti siirron." - -#: network/applications/filetransferp2p.cpp:586 -msgid "File could not be written" msgstr "" +"Kutsu tiedoston lähettämiseen peruutettiin. Viallista tietoa vastaanotettiin." -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei ole." +#: network/applications/filetransferp2p.cpp:404, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Hyväksyit "%1" tiedoston siirtämisen." -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu lukea." +#: network/applications/filetransferp2p.cpp:615 +msgid "File could not be written" +msgstr "Tiedostoa ei voitu kirjottaa" -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "Lähetetään tiedostoa %1" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Sinut on kutsuttu tapaamiseen (GnomeMeeting)." -#: network/applications/gnomemeeting.cpp:114 -#, fuzzy +#: network/applications/gnomemeeting.cpp:118, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Käynnistetään GnomeMeeting. Yhdistetään: %1" -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "Kutsutaan keskustelukumppania tapaamiseen." +msgstr "Kutsutaan käyttäjä tapaamiseen." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is not supported by the other client." msgstr "Kutsu peruuntui. Toisen käyttäjän sovellus ei tue kutsua." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." +#: 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:125 -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:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "" +"Kutsu keskeytyi. Odotusaika ylittyi käyttäjän hyväksyntää odotettaessa." -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "Kutsu keskeytyi. Aikaraja ylittyi dataa odotettaessa." +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "Kutsu keskeytyi. Odotusaika ylittyi dataa odotettaessa." -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "Kutsu keskeytyi. Kytkentäkeskus sulki chat-yhteyden." +#: network/applications/mimeapplication.cpp:180 +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "Kutsu keskeytyi. Kytkentäkeskus sulki keskustelu yhteyden." -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Kutsu keskeytyi." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "Sinut on kutsuttu jakamaan henkilön työpöytä." +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this contact's desktop." +msgstr "Sinut on kutsuttu jakamaan käyttäjän työpöytä." -#: network/applications/msnremotedesktop.cpp:155 -#, fuzzy +#: network/applications/msnremotedesktop.cpp:159, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Käynnistetään KRDC. Yhdistetään: %1." -#: network/applications/p2papplication.cpp:276 -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:215 +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Käyttäjä kusuit sinut tapahtumaan. Ominaisuus ei ole tuettuna" -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" -"Kutsu peruttiin. Keskustelukumppani lähetti dataa, jota KMess ei tue tai " -"joka on viallista." +"Kutsu perutettiin. Käyttäjä lähetti vriheellistä dataa tai ei tueta " +"ominaisuutta." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "Siirto epäonnistui. Tietojen valmistelu ei onnistunut." +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "Siirtäminen epäonnistui. Datan valmistaminen epäonnistui." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Keskustelukumppani hylkäsi kutsun. Tapahtui sisäinen virhe." - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "Siirto epäonnistui." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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/p2papplication.cpp:2038 -#, fuzzy +#: network/applications/p2papplication.cpp:1192 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "Kutsu peruuntui. Viesti ei kohdistunut meihin." +msgstr "Kutsu peruutettiin. Viesti ei ollu tarkoitettu käyttäjällesi." -#: network/applications/p2papplication.cpp:2584 -#, fuzzy +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "" -"Siirto epäonnistui. Keskustelukumppani lähetti dataa, jota KMess ei tue tai " -"joka on viallista." +"Siirtäminen epäonnistui. Käyttäjä lähetti virheellistä dataa tai ei " +"ominaisuutta ole tuettuna." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Käyttäjä kieltäytyi kutsusta. Tapahtui sisäinen virhe." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Odotetaan yhteyttä kohteeseen %1, portti %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 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:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Siirto epäonnistui. Aikaraja ylittyi hyväksyntää odotettaessa." - -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "Siirto epäonnistui. Tapahtui sisäinen virhe." - -#: network/applications/p2papplication.cpp:3670 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "Siirto epäonnistui. Tietojen lähdettä ei saatu auki." - -#: network/applications/p2papplication.cpp:4844 -#, fuzzy +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" -msgstr "Odotetaan yhteystietolistaa..." +msgstr "Odotetaan yhteyttä" -#: network/applications/p2papplication.cpp:5013 -#, fuzzy +#: network/applications/p2papplication.cpp:3423 msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." -msgstr "" -"Kutsu peruuntui. Aikaraja ylittyi odotettaessa keskustelukumppanin " -"hyväksyntää." +msgstr "Kutsu peruuntui. Odotusaika ylitettiin kutsun hyväkysymisessä." -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." -msgstr "" -"Kutsu peruuntui. Aikaraja ylittyi odotettaessa yhteyden onnistumista tai " -"epäonnistumista." +msgstr "Kutsu peruuntui. Odotusaika ylittyi dataa odotettaessa." -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "Kutsu peruuntui. Aikaraja ylittyi dataa odotettaessa." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "Kutsu peruuntui. Odotusaika ylittyi dataa odotettaessa." -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Käyttäjä hylkäsi kutsun. Tapahtui sisäinen virhe." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Siirto epäonnistui." + +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Tiedostonsiirto epäonnistui" + +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." +msgstr "Tiedostonsiirtäminen epäonnistui. Tapahtui sisäinen virhe." + +#: network/applications/p2papplicationbase.cpp:1208 +msgid "The transfer failed. Could not open data source." +msgstr "Tiedostonsiirtäminen epäonnistui. Ei voitu avata lähdettä." + +#: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Sinut kutsuttiin aloittamaan puhekeskustelu." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" @@ -1614,1475 +2990,3691 @@ msgstr "" "Sinut kutsuttiin aloittamaan puhekeskustelu, mutta tukea ominaisuudelle ei " "ole asennettu" -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "Olet keskeyttänyt äänikeskustelun." +msgstr "Keskeytit äänikeskustelun." -#: network/applications/voiceconversation.cpp:211 -#, fuzzy -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "Kutsu on peruuntunut. Äänilaitetta ei saatu avattua." +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "Kutsu keskeytettiin, äänentoistolaitetta ei voitu avata." -#: network/applications/voiceconversation.cpp:222 -#, fuzzy +#: network/applications/voiceconversation.cpp:218, kde-format msgid "Start voice conversation. Connecting to %1." -msgstr "Äänikeskustelua aloitetaan. Yhdistetään: %1" +msgstr "Aloitetaan äänikeskustelu. Yhdistetään %1." -#: network/applications/voiceconversation.cpp:228 -#, fuzzy +#: network/applications/voiceconversation.cpp:224, kde-format msgid "Start voice conversation. Listening on %1." -msgstr "Äänikeskustelua aloitetaan. Kuunnellaan: %1" +msgstr "Aloitetaan äänikeskustelu. Kuunnellaan: %1" -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." -msgstr "Kutsutaan keskustelukumppania äänikeskusteluun." +msgstr "Kutsutaan käyttäjä äänikeskusteluun." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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." +msgstr "Käyttäjä kutsuu sinua '%1', mutta ei vielä ole toteutettu." -#: network/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Tiedoston %1 siirto peruutettiin." +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Webkameran kutsuminen keskeytettin. Virheellistä dataa vastaaotettiin." -#: network/extra/msnftpconnection.cpp:136 +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Pyydetty näyttämään webkameraa." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this contact's webcam." +msgstr "Kutsuttiin katsomaan webkameraa." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webkamera" + +#: network/extra/msnftpconnection.cpp:120, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Keskeytit tiedostonsiirtämisen: "%1" ." + +#: network/extra/msnftpconnection.cpp:126, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Käyttäjä keskeytti tiedostonsiirron: "%1"." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" +msgstr "Epäonnistui" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Lähetetään tiedostoa %1" + +#: network/extra/msnftpconnection.cpp:398, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "" +"Tiedostonsiirtäminen %1 epäonnistu. Ei voitu avata paikallista porttia." -#: network/extra/msnftpconnection.cpp:410 -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:399 +msgid "Could not open a local port." +msgstr "Ei voitu yhdistää paikalliseen porttiin." -#: network/extra/msnftpconnection.cpp:411 -#, fuzzy -msgid "Couldn't open a local port." -msgstr "Tiedoston %1 siirto epäonnistui. Paikallinen portti on kiinni." - -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Alustetaan tiedostonsiirtoa" -#: network/extra/msnftpconnection.cpp:481 -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:469, kde-format +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "Tiedostonsiirtäminen %1 epäonnistui. Yhteyttä ei voitu luoda." -#: network/extra/msnftpconnection.cpp:482 -#, fuzzy +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "Ei saada yhteyttä luotua: %1" +msgstr "Ei saatu luotua yhteyttä." -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Vastaanotetaan tiedostoa %1" -#: network/msnconnection.cpp:140 -#, fuzzy -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "Väärä komento kutsu" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "Väärä komento parametrib" + +#: network/msnconnection.cpp:384 +msgid "The email address you have tried to add is not a Live Messenger account" msgstr "" -"KMess ei saanut yhteyttä MSN-palveluun. \n" -"Järjestelmävirhe: %1 (koodi %2)." +"Yrititettiin lisätä sähköpostiosoitetta, joka ei ole Live Messenger " +"käyttäjätili" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping hukattu" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Domain name puuttuu" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 pingiä hukattu." +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Olet jo kirjautunu sisään" -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "Yhteys palvelimeen katosi." +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" +msgstr "Annettu käyttäjänimi on virheellinen" -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "Etäpalvelin katkaisi yhteyden." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Sallittu" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Poistettu" - -#: network/msnnotificationconnection.cpp:545 +#: network/msnconnection.cpp:400 msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" 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:740 -msgid "Show MSN Messenger Service status?" -msgstr "Näytetäänkö MSN Messenger -palvelun tila?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Palvelinvirhe" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy -msgid "" -"You have been disconnected because you connected from another MSN 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:1553 -msgid "Got synchronization" -msgstr "Synkronoidaan" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Lähetetään käyttöoikeustietoja" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Vastaanotetaan vahvistus" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Odotetaan yhteystietolistaa..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Siirretään tietoa ilmoituspalvelimelle" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "Tunnustautuminen epäonnistui. Tarkista tilinimi ja salasana." - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Yhdistetään..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess on vastaanottanut tuntemattoman käskyn palvelimelta: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Tapahtui sisäinen KMess-virhe: %1" - -#: network/msnnotificationconnection.cpp:2243 -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:2252 -msgid "The account name given is invalid" -msgstr "Annettu tilin nimi on virheellinen" - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" -"Annettu tilin nimi on virheellinen tai MSN passport -tiliäsi ei ole vielä " +"Annettu tilin nimi on virheellinen tai MSN passport tiliäsi ei ole vielä " "vahvistettu" -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" -msgstr "Yhteystietolistasi on täynnä" +msgstr "Yhteystieto listasi on täynnä" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "Väärä SBP parametri" + +#: network/msnconnection.cpp:411 msgid "This contact is already on your list" msgstr "Tämä yhteystieto on jo listallasi" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 msgid "This contact is not on your list" msgstr "Tämä yhteystieto ei ole listallasi" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" -msgstr "Tämä keskustelukumppani ei ole paikalla" +msgstr "Käyttäjä ei ole paikalla" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Yhteystietolistallasi on liian monta ryhmää" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Tila on jo valittuna" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "Tätä ryhmää ei voi muuttaa" +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "Käyttäjää ei voitu lisätä sallittuihin eikä estettyjen listalle" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:432 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "Ryhmän nimi on käyttössä yhteystieto listallasi, muuta nimeä." + +#: network/msnconnection.cpp:436 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30" +msgstr "" +"Käyttäjä listalla on liian monta ryhmää, sallitty määrä enintään 30:ntä." + +#: network/msnconnection.cpp:440 +msgid "This group cannot be changed" +msgstr "Ryhmän nimeä ei voida muuttaa" + +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "Käyttäjää ei ole lisättynä ryhmälle." + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "Tämä ryhmä ei ole tyhjä" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "" -"Tämä ryhmänimi on jo käytössä Messenger- tai Hotmail-yhteystietoilistallasi" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "Ryhmän nimi on liian pitkä. Ei voi olla pitempi kuin 61tavua" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "Ryhmän nimi liian pitkä" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "Yrittää muuttaa ryhmää \"0\"" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Tapahtui sisäinen KMess-virhe: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Virheellinen ryhmä" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "Tyhjä domain" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "Väädä ADL komentotapa" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "Kytkentäpalvelimessa tapahtui virhe" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" msgstr "Siirto kytkentäpalvelimelle epäonnistui" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "" +msgstr "Yhteysvirhe (MSNSLP) yhteys epäonnistui" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "" +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Tarvittavat kentät puuttuvat" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "" +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "Et ole kirjatuneena" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Avaat istuntoja liian nopeaan tahtiin" +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "Käyttäjätiliä on kielletty kirjautumasta LIve Messenger palveluun." -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Sinulla on liian monta istuntoa avoinna" +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "Komento kytkettynä poispäältä" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:500 +msgid "Your account is banned" +msgstr "Käyttätili on estetty" + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Epäonnistui" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "Väärä komento" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "Aukaiset keskustelu-istunnot liian nopeasti" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "Avoimena liian monta keskustelu-istuntoa" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "Odottamaton komento jono" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" -msgstr "Virheellinen ystävän nimi" +msgstr "Virheellinen nimimerkki" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "Palvelin ilmoittaa KMessin tulvivan sitä datalla" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "Väärä CVR tieto" -#: network/msnnotificationconnection.cpp:2359 -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:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -"Sinulla on lasten passport-tunnus ja tarvitset vanhempiesi hyväksynnän " -"keskustellaksesi verkossa." +"Palvelin ilmoittaa KMess:in floodavan liian paljon tietoa yhdellä kertaa." -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Passport-tunnuksesi pitää ensin vahvistaa." +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "Tunnistaminsnen oli väärä" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN virhe" +#: network/msnconnection.cpp:550 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "" +"Ei voida aloittaa keskustelua käyttäjän kanssa, hänen ollessa näkymätön" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Tapahtui sisäinen palvelinvirhe" +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "Ei hyväksytä uusia käyttäjiä" -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "Palvelin on liian kiireinen" +#: network/msnconnection.cpp:558 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" +"Sinulla on Kids Passport käyttäjätili, tarvitset huoltajan läsnäoloa " +"keskustellakseen." -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Palvelin ei ole saatavilla" +#: network/msnconnection.cpp:561 +msgid "Your Passport account needs to be verified first" +msgstr "Passport käyttätili on ensiksi vahvistettava" -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "Väärä USR lipuke" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "Virhe avatessa yhteystietoja, yritä uudelleen" + +#: network/msnconnection.cpp:584 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"Live Messenger palvelu ei ole väkiaikaisesti saavutettavissa. Tapahtui " +"sisäinen virhe" + +#: network/msnconnection.cpp:595 +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" +"Live Messenger palvelu ei ole väliaikaisesti saavutettavissa. Palvelussa on " +"ruuhkaa" + +#: network/msnconnection.cpp:599 msgid "Peer notification server down" -msgstr "Tarkastuspalvelin alhaalla" +msgstr "Ilmoituspalvelin alhaalla" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" -msgstr "Palvelin on menossa alas" +msgstr "Palvelin sammutetaan" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" -msgstr "Palvelin on pian menossa alas" +msgstr "Palvelin sammutetaan" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "Kirjoittaminen on estetty" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "Istunto on ylikuormitettu" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" -msgstr "Palvelin ei ole saatavilla" +msgstr "Palvelin ei ole tavoiteltavissa" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "Tunnistautuminen epäonnistui" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Ei vastaanoteta uusia tavoitteita" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" -"KMess on vastaanottanut tuntemattoman virheilmoituksen palvelimelta: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Varoitus: Palvelin sulkeutuu huollettavaksi 1 minuutin kuluttua!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -"MSN Palvelin on ilmoittanut, että se menee alas huollettavaksi minuutin " -"kuluttua." +"Vastaanotettiin tuntematon virhekoodi: %1
Lisää teknistätiedot: %2" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Varoitus: Palvelin sulkeutuu huollettavaksi %1 minuutin kuluttua!" +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN virhe" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "Yrittää takaisinpaluuta HTTP kutsulla..." + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "Tunnistetaan..." + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "Tunnistettu" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "Vaihtaa palvelinta..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Yhdistetään..." + +#: network/msnnotificationconnection.cpp:1940, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Vastaanotettiin tuntematon virhe palvelimelta: %1" + +#: network/msnnotificationconnection.cpp:2100, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuutti" +msgstr[1] "%1 minuuttia" + +#: network/msnnotificationconnection.cpp:2103, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Palvelin suljetaan huollettavaksi %1 minuutin kuluttua" + +#: network/msnnotificationconnection.cpp:2108, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "Live Messenger palvelin sujletaan huollettavksi %1 minuutin kuluttua" + +#: network/msnnotificationconnection.cpp:2309, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "Ei voinnu käsitellä poissaolon aikaisia viestejä.
Lisätietoja: %1" + +#: network/msnnotificationconnection.cpp:2310 +#, fuzzy +msgid "SOAP client is no longer valid." +msgstr "SOAP ohjelma ei ole enään" + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "Tunnistamisen odotusaika ylittyi" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Odotetaan yhteystietolistaa..." + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Varoitus: %1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "MSN varoitus" + +#: network/msnnotificationconnection.cpp:2869, kde-format +msgid "
Internal error reason: %1" +msgstr "
Sisäinen virheen syy: %1" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" -"KMess ei voinut käsitellä Poissa linjoilta -viestejä.\n" -"\n" -"Lisätiedot: %1" +"

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

" +msgstr "Tunnustautuminen epäonnistui. Tarkista käyttäjännimi ja salasana." -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

Käyttäjä %1 yhdistettiin muualta.

" + +#: network/msnnotificationconnection.cpp:2920, kde-format +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"Tunnistautuminen epäonnistui, KMess ei voinut käsitellä passport " -"kirjautumista.\n" -"\n" -"Lisätiedot: %1" +"Yhteys on katkaistiin, olet yhdistäny %1 käyttäjällä toiselta " +"ohjelmalta tai muualta." -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: passive notification message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"KMess ei saanut yhteyttä etäweb-palveluun.\n" -"\n" -"Lisätiedot: %1" +"

Ei voitu yhdistää LIve Messenger palveluun.
Tarvitset tunnistetuksi " +"ennen yhdistäkseen verkkoon?

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Henkilö on poissa linjoilta tai näkymätön." - -#: network/msnswitchboardconnection.cpp:1052 -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:1648 -#, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "Viestiä \"%1\" ei vastaanotettu." - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Ei saada yhteyttä luotua: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Yhteyden aikakatkaisu" - -#: notification/notificationchat.cpp:169 -#, fuzzy -msgid "In %1's chat: %2" -msgstr "Henkilön %1 keskustelussa" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:175 -#, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "Henkilön %1 keskustelu vaatii huomiota!" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 -#, fuzzy -msgid "%1 has sent you a nudge!" -msgstr "on lähettänyt sinulle herätteen!" - -#: notification/notificationchat.cpp:196 -#, fuzzy -msgid "%1 has sent you a wink!" -msgstr "on lähettäny sinulle olion!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 on nyt paikalla" - -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "on lähettäny sinulle olion!" - -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "Olet katkaissut istunnon." - -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "Keskustelukumppani peruutti siirron." - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "" - -#: notification/notificationchat.cpp:218 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 on kirjautunut ulos" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" - -#: notification/notificationchat.cpp:220 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 on kirjautunut ulos" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "Tiedoston %1 siirto peruutettiin." - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "" - -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1 on kirjautunut ulos" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 on nyt paikalla" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 on kirjautunut ulos" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 on nyt paikalla" - -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 on kirjautunut ulos" - -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 on nyt paikalla" - -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 on nyt paikalla" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 on nyt paikalla" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Uusi sähköposti:
'%1'
kirjoittanut '%2'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "Lä&hetä" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "Uusi rivi" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Tämä yhteystieto ei ole listallasi" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Lisää yhteystieto" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/msnnotificationconnection.cpp:2935, kde-format +msgctxt "Connection error: detailed message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"

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 "" -"%1\n" -"on lisännyt sinut yhteystietolistalleen. Haluatko:" +"KMess ei saanut yhteyttä Live Messenger palvelimiin.
Mahdollisesti voi " +"olla ongelmia yhteyden kanssa tai Live Messenger palvelimet ovat " +"tavoittamissa.
Sivuille tunnistautumisessa voi olla ongelma tai " +"vaaditaan proxy tavoittaakseen verkkoa.Paina tästä<7a>" +"tarkistakseen Messenger-palvelun tilan sivuilta." -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "&Lisää tämä yhteystieto \"Ystävät\"-listallesi" +#: network/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "Ei yhdistäny Live Messenger-palveluun." -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "&Älä lisää tätä henkilöä listalle, mutta anna hänen nähdä tilasi" +#: network/msnnotificationconnection.cpp:2956, kde-format +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ä LiveMessenger palvelimiin.
Mahdollisesti voi " +"olla ongelmia yhteyden kanssa tai Live Messenger palvelimet ovat " +"tavoittamissa.
Sivuille tunnistautumisessa voi olla ongelma tai " +"vaaditaan proxy tavoittaakseen verkkoa.Paina tästä<7a>" +"tarkistakseen Messenger-palvelun tilan sivuilta." -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "&Estä tätä henkilöä ottamasta sinuun yhteyttä ja näkemästä sinua" +#: network/msnnotificationconnection.cpp:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Virhe: %1

" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "&Siivoa" +#: network/msnnotificationconnection.cpp:2969 +#, kde-format +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Live Messenger palvelin raportoi virheen:

%1

" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Syötä kirjautumistiedot:" +#: network/msnnotificationconnection.cpp:2980 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Messenger palveluvirhe: %1

" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "Sähköpostiosoite:" +#: network/msnnotificationconnection.cpp:2982 +#, kde-format +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

The Live Messenger palvelu raportoi virheestä:

%1

" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "Salasana:" +#: network/msnnotificationconnection.cpp:2990 +#, kde-format +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Virhe: %1

" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" +#: network/msnnotificationconnection.cpp:2992 +#, kde-format +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

Tapahtui sisäisen virhe:

%1

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

Network connection lost.

" +msgstr "

Verkkoyhteys katkesi

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

Connection to the Live Messenger server has been lost.

" +msgstr "Yhteys palvelimeen katkesi" + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

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

" +msgstr "" +"

Kehittäjät:
Virhe numero: %1
Virhe lanka: %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "Syötä käyttäjänimi ja salasana yhdistäkseen verkko proxyyn." + +#: network/msnsockethttp.cpp:686, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "Tapahtui sisäinen virhe: %1" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" +"%1 (Sisäinen virhekoodi: %2)
Vastaa: %3 %4
" +"Uudelleenohjataan: %5" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "Yhteys aikakatkaistiin" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping hukattu" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pingiä hukattu." + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "Yhteys palvelimeen menettiin" + +#: network/soap/addressbookservice.cpp:777, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" +"Yritettiin lisätä sähköpostiosoitetta \"%1\", joka ei ole hyväksyttävä " +"sähköpostiosoite." + +#: network/soap/addressbookservice.cpp:787, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" +"Yritettiin lisätät sähköpostiosoitetta \"%1\", joka ei kuuluu Live Messenger " +"käyttätilille." + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "EI hyväksytty palvelu pyyntö (%1)" + +#: network/soap/httpsoapconnection.cpp:408, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Palvelu ei ole tavoitettavissa (%1)" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Liian monta uudelleenohjaamis pyyntöä palvelusta" + +#: network/soap/httpsoapconnection.cpp:523 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Poissaolon viesti palvelua ei ole tällähetkellä saatavilla" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "Live Messenger palvelussa ongelmia" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Ei hyväksytty palvelu pyyntö %1 (%2)" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Ei vastaa palvelu pyyntöihin" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Tapahtui odottamaton virhe palvelimelta (%1)" + +#: notification/chatnotification.cpp:172, kde-format +msgid "In %1's chat:
%2" +msgstr "%1
keskustelussa:
%2" + +#: notification/chatnotification.cpp:176, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 sanoo:
'%2'" + +#: notification/chatnotification.cpp:180, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 lähetti poissaollessa viestin:
'%2'" + +#: notification/chatnotification.cpp:187, kde-format +msgid "%1's chat requests attention!" +msgstr "%1 keskustelu vaatii huomioita" + +#: notification/chatnotification.cpp:192, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 lähetti käsinkirjoitetun viestin!" + +#: notification/chatnotification.cpp:203, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 lähetti herätteen!" + +#: notification/chatnotification.cpp:207, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 lähetti vinkkauksen!" + +#: notification/chatnotification.cpp:213, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 haluaa käyttää webkameraa!\t" + +#: notification/chatnotification.cpp:214, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 lähettää tiedoston!" + +#: notification/chatnotification.cpp:215, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 lähetti kutsun!" + +#: notification/chatnotification.cpp:222, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 peruutti webkamera-istunnon!" + +#: notification/chatnotification.cpp:223, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 keskeytti tiedonsiirron!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1peruutti" + +#: notification/chatnotification.cpp:231, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 hyväksyttiin käyttämään webkameraa\t!" + +#: notification/chatnotification.cpp:232, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 hyväksyi tiedostonsiirron!" + +#: notification/chatnotification.cpp:233, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 hyväksyi kutsun!" + +#: notification/chatnotification.cpp:240, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 päätti webkameran-istunnon!" + +#: notification/chatnotification.cpp:241, kde-format +msgid "The file transfer with %1 is done!" +msgstr "Tiedonsiirtäminen %1 onnistui!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1lopetti" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1webkamera istuntu peruuntui" + +#: notification/chatnotification.cpp:250, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Tiedonsiirtäminen %1 epäonnistui!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1istunnossa virhe" + +#: notification/contactstatusnotification.cpp:91, kde-format +msgid "%1
is now online" +msgstr "%1
yhdisti" + +#: notification/contactstatusnotification.cpp:92, kde-format +msgid "%1
has gone away" +msgstr "%1
poistui" + +#: notification/contactstatusnotification.cpp:93, kde-format +msgid "%1
will be right back" +msgstr "%1
tulen kohta takaisin" + +#: notification/contactstatusnotification.cpp:94, kde-format +msgid "%1
is now busy" +msgstr "%1
kiireinen" + +#: notification/contactstatusnotification.cpp:95, kde-format +msgid "%1
has become invisible" +msgstr "%1
näkymätön" + +#: notification/contactstatusnotification.cpp:96, kde-format +msgid "%1
has gone idle" +msgstr "%1
joutilaana" + +#: notification/contactstatusnotification.cpp:97, kde-format +msgid "%1
has logged out" +msgstr "%1
kirjautui ulos" + +#: notification/contactstatusnotification.cpp:98, kde-format +msgid "%1
is on the phone" +msgstr "%1
puhelimessa" + +#: notification/contactstatusnotification.cpp:99, kde-format +msgid "%1
is out for lunch" +msgstr "%1
lounaalla" + +#: notification/newemailnotification.cpp:90, kde-format +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'
käyttäjältä '%2'" + +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Aloita keskustelu" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Jätä viesti" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Näytä viesti" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Tietoa" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Lue sähköposti" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Piilota" + +#: 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 "" +"Sulkemalla pääikkunasta pitää KMess:in aktiivisena. Käytä 'Poistu' valintaa " +"Yhdistä valikosta, poistuakseen ohjelmasta." + +#: 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 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" msgstr "" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "Muista tämä profiili" +#: notification/systemtraywidget.cpp:246, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Yhdistä" +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Selaa..." -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Syötä henkilökohtainen viestisi tähän" +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Selaa ja rajaa kuva..." -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Kuuntele kappaletta %1" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Valitse edellinen kuva..." -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess-ilmoitus" +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Keskustelukuvake" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "Näyttettävän kuvakkeen lataus epäonnistui" + +#: settings/accountpage.cpp:539 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Tapahtui virhe yrittäessä vaihtaa näytettävää kuvaa.\nTarkista että olet " +"valinnu olemassa olevan kuva-tiedoston." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Asetukset" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Käyttäjätili" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Käyttäjätili" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Yhteystiedot" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Keskustelee" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Keskustelun kirjoitus lokiin" + +#: 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 "" +"Paina tästä poistaakseen rekistöröidyn käyttäjän listaltasi.\nEt voi poistaa " +"nykyistä käyttäjiä tai vieras käyttäjää, mikä poistetaan kun katkaiset " +"yhtyeden." + +#: settings/accountsettingsdialog.cpp:206, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"Annettu sähköpostiosoite on virheellinen eikä voida käyttää käyttätiliä " +"varten: %1'" + +#: settings/accountsettingsdialog.cpp:214, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "Annettu sähköpostiosoite on käytössä: %1'" + +#: 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:160, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Oletko varma että haluat poistaa käyttätilin '%1'
Kaikki " +"asetukset käyttätililtä poistetaan." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Stacy" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Mahtavaa!" + +#: settings/chatstylepage.cpp:375 +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 "Voit käyttää enintään 7 kirjainta hymiöiden pikakomentoon." + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid Emoticon Name" +msgstr "Vääränlainen hymiön nimi" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Korvaa nykyiset hymiöt" + +#: settings/emoticonspage.cpp:233, kde-format +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Oletko varma että haluat poistaa hymiön \"%1\" ?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Poista hymiö" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "Asetukset" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Käyttäjätilit" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Lempinimesi:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Ilmoitus" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." +msgstr "Ei havaittu valittavia internet selaimia." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Ei havaittuja valitsettavia sähköposti ohjelmia." + +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "Komentokehoitteessa on määriteltävä käynnistettävä internet selain!" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 "" +"Määritelty komento käynnistää internet selasin ei sisällä '%u' " +"parametriä. Ilman sitä internet sivujen näyttäminen ei toimi.
Haluatko " +"että komento lisätään?" + +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "" +"Komentokehoitteessa on määriteltävä käynnistettävä sähköposti ohjelmisto." + +#: 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 emails will not work." +"
Do you want KMess to add it for you?" +msgstr "" +"Määritelty komento käynnistää sähköposti ohjelmaa ei sisällä '%u' " +"parametriä. Ilman sitä sähköpostin kirjoittaminen ei toimi.
Haluatko " +"että komento lisätään?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "Valitsit hakemiston mihin tallennetaan tiedostot" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Valitse hakemisto mihin tallentaa" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Lähetä " + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

Ei voinnu lukea asetus-tiedostoja

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "Lähetä kommentti kehittäjille" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "Näytä palaute ikonit" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Tervetuloa testiversioon %1" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Tervetuloa %1" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" +"Jokaisella kerralla kun tunnet koet hyvän tai turhauttavan kokemuksen. Paina " +"vastaavaa naama-ikonia ikkunan otsikkorivin alhaalta ja lyhyesti mainitse " +"mistä pidit tai inhosit ja paina 'Lähetä';" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" +"Jokaisella kerralla kun koet hyvän kokemuksen. Paina hymyilevää naama-ikonia " +"ikkunan otsikkorivin alhaalta ja lyhyesti mainitse mistä pidit tai inhosit " +"ja paina 'Lähetä';" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" +"Jokaisella kerralla kun koet turhauttavan kokemuksen. Paina alapäin " +"osoittavaa naama-ikonia ikkunan otsikkorivin alhaalta ja lyhyesti mainitse " +"mistä pidit tai inhosit ja paina 'Lähetä';" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" +"Kun koet vääränlaisetn käyttämisen ohjelmistossa. Paina hajalla-olevaa " +"ikonia ikkunan otsikkorivin alhaalta ja lyhyesti mainitse mistä pidit tai " +"inhosit ja paina 'Lähetä';" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Pidän uudesta luonteesta, virkistävää uudistus." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "En pidä auttajan tervetulosivuista. Liian aikaa kuluttava." + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"

Ohjelman vääränlainen käyttäytymine painettaessa lissää nappulaa, " +"mitään ei tapahdu." + +#: utils/likeback/likeback.cpp:388 +msgctxt "Welcome dialog text, usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Haluan uuden ominaisuuden mahdollistaen työn lähettämistä sähköpostin " +"avulla." + +#: utils/likeback/likeback.cpp:401 +msgctxt "Welcome dialog text, us=the developers, it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Parantaakseen tuotetta, palaute on tärkeätä." + +#: utils/likeback/likeback.cpp:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Esimerkki" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Auta kehittämään ohjelmaa" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Lähetä kommentti kehittäjille" + +#: utils/likeback/likebackdialog.cpp:139 +#, kde-format +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 "" +"Kirjoitaessa %1 (Tarvittaessa voit hyödyntääverkko " +"kääntäjä-työkalua apunasi).
" + +#: utils/likeback/likebackdialog.cpp:146 +#, kde-format +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 "" +"Kirjottaessa %1 tai %2 (Tarvittaessa voit hyödyntääverkko " +"kääntäjä-työkalua apunasi).
" + +#: utils/likeback/likebackdialog.cpp:159 +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 "" +"Lähettämällä kommentteja, mahdollistaen ohjelman kehittymisen. Yrittäen " +"lähettää mahdollisiman monta positiivistä ja negatiivistä kommenttia.
" + +#: utils/likeback/likebackdialog.cpp:168 +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 "" +"Älä pyydä uutta ominaisuutta, tämän tyyppiset pyynnöistä ei välitetä
" + +#: utils/likeback/likebackdialog.cpp:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "

Lähettämällä kehittäjille mielipiteesi %1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:216, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "Annettu sähköpostiosoite ei ole kelvollinen, eikä voida käyttää: %1'" + +#: utils/likeback/likebackdialog.cpp:290 +msgctxt "Dialog box text" +msgid "" +"

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

Thanks for your time.

" +msgstr "" +"

Kommentti on onnistuneesti lähetetty. Mahdollistaen tuoteen kehittymisen." +"

Kiitoksia ajastasi.

" + +#: utils/likeback/likebackdialog.cpp:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kommentti lähetetty" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" +"

Tapahtui virhe yrittäessä lähettää palautetta.

Yritä myöhemmin " +"uudelleen.

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Palauteen lähettämisessä virhe" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +msgid "Standard text mode" +msgstr "Oletus kirjoitus tila" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to the standard text mode." +msgstr "Paina tästä vaihtaakseen oletus teksti tila" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "Käsinkirjoittamisen tila" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "" +"Paina tästä vaihtaakseen käsinkirjoituksen tila, voit kirjottaa tai piirtää " +"käsinkirjoitettuja viestejä." + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Oleitus hymiöt" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Paina tästä näyttääkseen oletus Live Messenger hymiöt, jolloin helposti " +"pystyt lisämään ne viestiisi." + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "Muokatut hymiöt" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Paina tästä näytettäväksi kaikki omat hymiöini, jolloin helposti pystyt " +"lisämään ne viestiisi." + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "Vinkki" + +#. 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 "Paina nappulasta nähdäksesi kaikki vinkkaukset." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "Uusi rivi" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "Lähetä" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "Keskustelu" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Työkalurivi" + +#. 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 "Paina tästä näyttäkseen käyttäjän kohtaisen valikon" + +#. i18n: file: chat/contactswidget.ui:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Paina tästä avatakseen käyttätilin asetukset" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "Clear area" +msgstr "Tyhjennä" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "Pen color" +msgstr "Kynän väri" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen size" +msgstr "Kynän koko" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "Erase brush" +msgstr "Pyyhi" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Aloie ryhmät" + +#. 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 "Syötä sähköpostiosoite, jonka haluat lisätä käyttäjälistallesi" + +#. 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:273 +msgid "Email address:" +msgstr "Sähköpostiosoite: " + +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Luo pikakuvake hymiöille:" + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Valite kuvan-tiedosto:" + +#. 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 "" +"KIrjoita viesti joka automattisesti lähetetään ihmisille jotka yrittävät " +"viestitellä." + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "Määrittele automaattinen poissa-olon viesti:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "Etsi yhteystiedoista..." + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Kirjattujen keskusteluiden suodatin" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Suodatettu keskustelusta" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "Suoritettu" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "Suodatetty päiväyksen mukaan" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "Keneltä" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +msgstr "Kenelle" + +#. 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ä haluat tehdä?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +msgid "&Add this person to the following groups of your contact list:" +msgstr "Lisää tämä henkilö seuraaviin ryhmiin listaltasi:" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "Älä lisää henkilöä, mutta näytetään hänelle tilamme" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +msgid "&Block this person from contacting you and seeing your status" +msgstr "Estä käyttäjää näkemästä tai keskustelematta kanssasi" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "Paina nappulasta palauttaaksesi näytettävän kuvan käyttäjältä" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "Palauta" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "Ryhmät:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this contact" +msgstr "Käytä toissijaista nimeä käyttäjälle" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +msgid "Disable notifications for this contact" +msgstr "Poista käytöstä ilmoitukset käyttäjältä" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "Ääni:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +msgid "&Display Pictures" +msgstr "Näytä kuvat" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "Paina tästä käyttääksesi kuvaa profiilissasi" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "Käytä oletuskuvana" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Tyhjennä välimuisti" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"Voit valita piilottaakseen vastaanotetut hymiöt. Oikealla " +"klikkauksessa vastaanotetusta hymiöistä ja valitset\"Piilota hymiöt\". Tämän " +"sivun avulla voidaan myös palauttaa piilotetut hymiöt." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "Paina tästä palauttaaksesi valitut hymiöt" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +msgid "Resto&re" +msgstr "Palauta" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Sallitut käyttäjät" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +msgid "Invite a person not on your contact list:" +msgstr "Kutsu käyttäjä joka ei ole listallasi." + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +msgid "Enter the email address of a person to invite" +msgstr "Syötä sähköpostiosoite, jonka haluat kutsua" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +msgid "Invited Contacts" +msgstr "Kutsu käyttäjät" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Vie objekti" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Tyyli" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Käyttäjät:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Valitse kaikki" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "Valitsematta kaikki" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Vie..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Sulje" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "Komenna välilehteä" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Komento:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Tyyppi:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Standard" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Lähetä" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Komento kuorma (voi olla tyhjä):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "KSqueezedTextLabel" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Avaa" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Peruuta" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "Lataa" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "Lähetä" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "Siivoa" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "Sulje" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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 "" +"Paina tästä näyttäkseen asetukset käyttätililtäsi tai selatakseen " +"hiiren rullala tallennettuja käyttätilejä." + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:276 +msgid "" +"Enter here the email address of your registered Passport or Live account" +msgstr "Syötä sähköpostiosoite rekistöröityyn Passport tai Live käyttätilille" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Salasana:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "Syötä käyttätilin salasana" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "Tila yhdistäessä:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "Valitse tilasi onnistunessa yhdistämään." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "Valittuna tallennetaan käyttätilisi" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +msgid "Remem&ber account" +msgstr "Muista käyttätili" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "Valittuna käyttätilisi muistetaan ja salasanasi tallennetaan." + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +msgid "R&emember password" +msgstr "Muista salasanasi" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "Paina tästä käyttääkseen tai peruuttaakseen yhteyden" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Uusi käyttätili" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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 "" +"Paina tästä rekistöröidääkseen uusi Live käyttätili
Voidaan myös " +"käyttää voimassaolevaa sähköpostiosoitetta" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "Unohtuiko salasana?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Paina tästä päästääkseen LIve sivustolle, päästääkseen resetoimaan " +"käyttätilin salasanan." + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "Yhdistä" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "Näytä" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "Toiminnot" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "Muoto" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "Käyttäjätili" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "Käyttätilin tiedot" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." msgstr "Syötä nimi, jonka haluat paikalla olevien yhteystietojesi näkevän." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Sähköpostiosoitteesi:" +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "Lempinimesi:" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 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/" +"Syötä MSN Passport sähköpostiosoite käyttäjätililtäsi. Voit rekistöröidä " +"uuden käyttäjätilin osoittesta http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Salasanasi:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "Sähköpostiosoite:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password 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/" +"Syötä salasanasi MSN Passport käyttätiliä varten. Voit rekistöröidä uuden " +"käyttätilin osoitteesta http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Keskustelukuvake:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "Salana:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, fuzzy, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "Muista salana" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." -msgstr "&Vaihda..." +msgstr "Muuta" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Älä näytä keskustelukuv&aketta" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "Ei käytetä" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Muista tämän tilin asetukset" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -"Valinta \"Muista tämä profiili\" jätettiin pois kirjauduttaessa sisään, " -"joten määrityksesi eivät tallennu oletuksena. Ota käyttöön tämä valinta, kun " -"haluat tallentaa tilisi asetukset.\n" -"\n" -"On suositeltavaa hyväksyä tämä valinta, ellet käytä KMessiä vieraana tai " -"olet julkisella tietokoneella (vaikkapa Internet-kahvilassa)." +"Vaihtoehtona \"Muista käyttäjätili\" oli valitsematta kun " +"kirjauduttiin sisään. Asetukset eivät oletuksena tallenneta. Valinnan " +"aktivoidessa jos haluat tallentaa käyttätilin asetukset järjestelmään.\n\n" +"Suositeltavaa olisi aktivoida vaihtoedoksi, jollet käytä KMess:iä vieras tai " +"julkisissa tietokoneissa (esim. nettikahvilat)." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Käynnistettäessä kirjaudu automaattisesti tällä tunnuksella" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "Muista käyttätilin asetukset" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." -msgstr "Jos valittu, KMess kirjautuu sisään automaattisesti tällä tunnuksella." +msgstr "Aktivoituna, KMess kirjautaa sisään automattisesti käyttäjätililtä" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +msgid "Log in &with this account automatically" +msgstr "Kirjaudu sisään automaattisesti" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Kirjaudu sisään" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Tarvitset yhdistää Passport sivustolle varmistakssen sähköpostiosoitteesi " +"voimassaolon." + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +msgid "" +"You cannot 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." +"Et voi vaihtaa nimeäsi kun Passport sähköpostiosoitetta ei ole varmistettu." -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "Pyydä varmistussähköpostia" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "Mene sivulle accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"Tarvtiset Passport käyttätilin yhdistääkseen Live Messenger verkkoon. " +"Voit rekistöröidä nykyisellä sähköpostiosoitteella register.passport.com tai " +"käyttää Live Mail käyttätiliä yhdistääkseen." + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live 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." +"Yhdistäkseen Live Messenger palveluun, tarvitset rekistöröidyn " +"sähköpostiosoitteen Passport käyttäjätilille." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" -msgstr "Luo uusi tili" +msgstr "Luo uusi käyttäjätili" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "http://register.passport.com" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" -msgstr "Mene sivulle register.passport.com" +msgstr "Mene sivuille register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Hälytykset" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "Tilan asektukset" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "Virhe ilmoituksissa" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Näytä ilmoitus kun yhteystieto lähtee pois linjoilta" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "Paikalla" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, fuzzy, no-c-format +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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, puhekupla näkyy ruudulla myös silloin, kun yhteystieto katoaa " -"linjoilta." +" Valittaessa tila muuttuu automaattisesti \"Joutilaaksi\" kun et käytä " +"tietokonetta muutamaan minuuttiin. Tämä vaihtoehto " +"ei ole valittavissa, jos KMess on käännetty ilman tukea ominaisuudelle.<" +"/html>" -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Vaihda tilaksi \"ei aktiivisena\" kun ei aktiivisena" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, fuzzy, no-c-format +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" -"Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto katoaa " -"linjoilta." +"Määrittele valittujen minuutin mukaan, ennen kuin muutta KMess:in tilakseen " +"\"Ei aktiiviseksi\"" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, fuzzy, no-c-format -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: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, fuzzy, no-c-format -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: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "Poissa linjoilta" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -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: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Näytä tiedote kun saat sähköpostia \"muihin kansioihin\"" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Piilota puhekuplat " - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Muuttaa sekuntien määrää, jolloin puhekuplat katoavat." - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "sekunnin kuluttua" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, fuzzy, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "Ravistele keskusteluikkunaa kun vastaanotetaan tai lähetetään heräte" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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 "" -"

Kun keskustelukumppanit haluavat huomiosi, he voivat lähettää " -"herätteen. Oletuksena keskusteluikkunaa ravistellaan kun heräte " -"vastaanotetaan tai lähetetään. Älä valitse tätä asetusta jos ravisteluefekti " -"on liian tungetteleva.

\n" -"

KMess rajoittaa ravisteluefektiä vaika tämä olisi valittuna. " -"Keskustelukumppanit voivat lähettää useita herätteitä kerralla, mutta KMess " -"ravistelee keskusteluikkunaa vain ensimmäisellä herätteellä.

" - -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, fuzzy, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Ilmoita keskustelukumppaneille mitä kappaletta kuuntelen." - -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" -"Jos käytössä, Kmess ilmoittaa keskustelukumppaneille mitä kuuntelet. Tämä " -"tieto haetaan aktiivisista musiikkisoitinohjelmista." - -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "&Vaihda tilaksi \"Poissa-jouten\", kun olet ollut hetken poissa" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Jos valittu, tilasi muuttuu automaattisesti \"Poissa-Jouten\", kun et käytä " -"tietokonetta muutamaan minuuttiin." - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 msgid "Become idle after" -msgstr "Vaihda tila kun on kulunut" +msgstr "Vaihda tilaa ajan kuluttua" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -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/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 msgid "minutes" msgstr "minuuttia" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Keskustelun kirjoitus lokiin" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "&Tallenna lokiin kaikki keskustelut" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "Jos valittu, keskustelut tallennetaan määritettyyn hakemistoon." - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Tallennettujen keskustelujen juurihakemisto:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 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/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Järjestä keskusteluhakemistot:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -"KMess luo automaattisesti alahakemistot, kun valitset lokien " -"järjesteltäväksi vuoden, kuukauden tai päivän mukaan." +"Tapahtui kun KMess on köännetty ilman tukea \"XScreenSaver\" Xorg " +"kirjastoa, mikä tunnistaa käyttäjän aktiivisuuden. Suositellaan tutustumaan " +"paketinhallintaan lisätietoja varten." -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"Ei voida aktivoida automaattista tilaa. KMess on käännetty ilman " +"aktiivsuuden tunnistajaa." + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "Kytke pois päältä ilmoittamiset kun olet \"Kiireinen\"" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "Talennetut käyttäjätilit" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" +"Paina tästä luodaakseen uusi käyttäjätili valmiiksi luodulla Live " +"käyttäjätilillä" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +msgid "&Add Account..." +msgstr "Lisää käyttäjätili" + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" +msgstr "Valitse käyttätili ja paina tästä tästä muokkaakseen sitä" + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "Muokkaa" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +msgid "Select an account and click here to delete it" +msgstr "Valitset käyttäjätilit and painamalla tästä poistaaksen sen" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:500 +msgid "&Remove" +msgstr "Poista" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "Aktivoi keskustelujen tallantamisen myöhäisempää katsomista varten" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" +"

Atkvioidessa keskustelujen kirjaamisen, jokainen keskustelu " +"tallennetaan" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "Aktivoi keskustelujen kirjaamisen." + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"Aktivoituna, KMess tallentaa keskustelujen viestit HTML tai teksti-muotoon." + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +msgid "Additionally save chat logs to file" +msgstr "Ylimääräistt tallennetut viestit tiedostoon" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "Vaihtoehdon valitsemalla määrittelet mitenviestit tallennetaan." + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +msgid "Save chat logs as:" +msgstr "Talenna keskustelujen viestit:" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\n" +"

Tiedostonmuodon valittaessa olisi hyvin tärkeätä.

\n" +"

Keskustelun viestit tallennetaan HTML-muotoon, joka on helposti " +"luettavissa kaikilla internet selaimillla. Avatessa toiselta tietokoneelta, " +"ei pystytä näyttämään kuvia ja tunne-ikoneita.

\n" +"

Keskustelun viestit tallennetaan teksti-muotoon, joka on helposti " +"luettavissa kaikkialla. Eivät sisällä tekstin muotoilua, kuvia eikä " +"tunne-ikoneita.

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "Internet sivu (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "Teksti" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Vaihtoehto mahdollistaa, kuinka KMess järjestelee kirjattujen keskutelujen " +"viestit määriteltyssä hakemistossa alhaalla." + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" +"Vaihtoehdosta riippuen KMess luo hakemiston järjestääkseen kirjattujen " +"keskutelujen viestit. Käytä \"What's This?\" valintaa määrittääkseen " +"asetukset valitusta." + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +msgid "Separate logged chats by:" +msgstr "Erittele kirjattujut keskustelut:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "Luo hakemisto järjestääkseen keskustelut vuoden mukaan" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" +"Vaihtoehtona on keskutelujen viestien kirjaamisen vuoden mukaan.\n " +"Löydät hakemistosta tallennettujen viestit vuosien mukaan jaeteltuna, " +"ryhmitettynä kaikki vuoden keskustelut\n Esim. keskustelu 29. Lokakuuta 2008 " +"tallentuun loki-tiedosto hakemistoon: \n " +"/2008/päivämäärä-ja-kontaktin-nimi.html" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 msgid "Year" msgstr "Vuosittain" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Kuukausittain" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Päivittäin" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Tallenna kaikki keskustelut samaan hakemistoon" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Keskustelujen kirjasinlaji:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Pakota keskustelukavereiden viesteihin kirjasinlaji:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" msgstr "" -"Sallii käytettävän tätä fonttia ennemmin kuin keskustelukavereiden " -"määrittämiä." +"Luo hakemisto järjestäkseen keskusteluviestit vuoden ja kuukauden mukaan" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Keskustelun tyyli:" +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" +"Vaihtoehtona on keskutelujen viestien kirjaamisen vuoden ja kuukauden " +"mukaan.\n Löydät hakemistosta tallennetut viestit vuosien mukaan jaeteltuna." +" Sisältäen hakemiston kuukausille johon ovat tallentuneet ja niiden sisältä " +"kuukauden tallennetut viestit\n Esim. keskustelu 29. Lokakuuta 2008 " +"tallennetaan loki-tiedosto hakemistoon: \n " +"/2008/11/päivämäärä-ja-kontaktin-nimi.html" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "Vuoden ja kuukauden mukaan" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"Luo hakemisto mihin järjestetetään kirjatut keskustelut vuoden, kuukauden ja " +"päivän mukaan." + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" +"Vaihtoehtona on keskutelujen viestien kirjaamisen vuoden, kuukauden ja " +"päivän mukaan.\n Löydät hakemistosta tallennetut viestit vuosien mukaan " +"jaeteltuna. Sisältäen hakemiston kuukausille johon ovat tallentuneet ja " +"niiden sisältä päivät joihin ovat tallentuvat\n Esim. keskustelu 29. " +"Lokakuuta 2008 tallennetaan loki-tiedosto hakemistoon: \n /2008/11/29/päivämäärä-ja-kontaktin-nimi.html" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "Vuosi, kuukausi ja päivä" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "" +"Talenna kaikki loki-tiedostot samaan hakemistoon mikä määritelty alempana" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" +"Vaihtoehdolla mahdollistetaan tallentamaan kaikki loki-tiedostot samaan " +"kansioon, ilman järjestämistä." + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "Ei järjestetä tiedostoja" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "Paina tästä valitakseen hakemiston" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "Hakemisto johon loki-tiedostot tallentuvat" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "Valitse hakemisto, johon haluat tallentaa loki-tiedostot." + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +msgid "Save chat logs in the following directory:" +msgstr "Tallenna keskustelujen loki-tiedostot seuraavaan kansioon:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "Tyyli" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "Sallii KMessin kaikkien keskustelujen teeman vaihdon." - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "&Näytä grafiikat viesteissä" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Ottaa käyttöön hymiöt keskusteluissa." - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Näytä &aika viesteissä" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Näyttää aikaleiman jokaisessa viestissä." - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" msgstr "" -"Käytä kirjasin&efektejä viesteissä, esim. *lihavointi*, /kursiivi/ ja " -"_alleviivaus_" +"Sallii KMessin kaikkien keskustelujen teeman vaihdon.\n" +"\n" +"Sallii teeman vaihtamisen keskustelujen viesteissä." -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:624 +msgid "&Chat style:" +msgstr "Keskustelu tyyli:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "Hae tyyliä..." + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "Keskustelu asetukset" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Aktivoimalla tunne-ikonien ulkoasun keskustelu ikkunassa." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:636 +msgid "&Show emoticons" +msgstr "Näytä tunne-ikonit" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +msgid "Show &winks" +msgstr "Näytä silmäniskut" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"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 "" -"Mahdollistaa kirjasinefektit seuraavalla tavalla: Kirjoittamalla " -"*lihavoitua*, /kursivoitua/ ja _alleviivattua_ tekstiä, saat lihavoitua, " -"kursivoitua tai alleviivattua tekstiä." +"Vaihtoehtona valituksi viestit ryhmitettään samalta kontaktilta. " +"Kontaktin lähettäessä useita viestejä, KMess ryhmittää viestit yhdeksi " +"viestiksi. Tämä riippuu valitusta keskustelutyylistä." -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:648 msgid "&Group follow-up messages from the same contact" msgstr "&Ryhmitä allekkain samalta henkilöltä tulleet viestit" -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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." +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:654 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Aktivoi ajan näyttämisen jokaisessa keskustelu viestissä." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:657 +msgid "S&how timestamp" +msgstr "Näytä aika" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +msgid "Show &date" +msgstr "Näytä päiväys" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +msgid "Show s&econds" +msgstr "Näytä sekunnit" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "&Teksti" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." 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ä." +"Tämä on kirjasimen tyyli ja väri, jota käytetään keskusteluviesteissäsi." -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Sähköpostiohjelma" +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "Viestin kirjaisin:" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "Ohjelma, jota KMess käskee näyttämään sähköpostiviestit." - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Käytä Hotmailia" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Määritä komento itse:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Sähköposti-ilmoitin" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Näytä sähköpostitiedot" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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." +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." 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." +"Vaihtoehto mahdollistaa kirjasimen tyylin ja värien yliajamiselta kontaktin " +"viesteiltä valituilla kirjaisimella ja värillä." -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Näytä tiedote kun saat sähköpostia \"muihin kansioihin\"" +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +msgid "&Force messages from your contacts to use this font:" +msgstr "Pakota viestien käyttämään fonttiasi:" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +msgid "Chat Window Formatting" +msgstr "Keskusteluikkunan muotoilu" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 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 "" -"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." +"Aktivoi kirjasin tehosteet. Kirjoita *paksennettuna*, /kursivoituna/ " +"ja _alleviivattuna_ näin mahdollista sanojen ilmestymistä paksunnettuna, " +"kursivoituna tai alleviivattuna." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format +#. i18n: file: settings/chatstylepage.ui:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Käytä kirjasin tehosteita viestissä, kuten *paksunnettuna*, /kursivoituna/ " +"ja _alleviivattuna_" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "Aktivoi \"Messenger Plus!\" ominaisuus" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "Käyttäytyminen" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" +"

Kun keskutelukumppasi haluaisi saada huomioitais. He voiva lähettää " +"herätteen. Oletuksena keskusteluikkuna ravistaa kun heräte vastaanotetaan " +"tai on lähetty. Ominaisuuden ollessa liian haitallinen, ominaisuuden voidaan " +"kytkeä poispäältä

\n" +"

Ominaisuuden ollessa aktiivisena KMess yrittää vielä rajoissaan ravistaa. " +"Kontanti voi lähettää useita herätteitä kerrallaan, mutta KMess ravistaa " +"vain kerran keskusteluikkunaa.

" + +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Ravista keskusteluruutua kun heräte on vastaanotettu tai lähetetty" + +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +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 "" +"

Valitteassa vaihtoehdoksi. Näet kuvasi kontaktilistalla ja muiden " +"kuvan jotka ovat samssa kesksutelussa.

" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "Näytä oma kuvasi keskusteluikkunassa" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "Ryhmä keskustelu samassa ikkunasta:" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "aina" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "Ainoastaan kontakteille samassa ryhmässä" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "Ei koskaan" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +msgid "Display Options" +msgstr "Näytä asetukset" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." +msgstr "" +" Valittaessa ilmoitetaan sähköpostiviestin saapuessa " +"laatikkoon. Lukemattomien viestien määrä ilmoitetaan yhteystietolistan " +"päällä. " +"Tämä vaihtoehto on tuettuna ainoastaan Live Mail käyttäjille." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "Näytä lukemattomien viestien määrä" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." +msgstr "" +" Valittaessa kontaktit näkevät kuunneltavan kappaleen nimen. Nimi " +"noudetaan sillä hetkellä soitetulla soittimelta." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" +msgstr "Näytä kontakeilla kuunneltavan kappaleen nimi" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "Aktiivisena, KMess logo näytetään taustakuvana kontaktilistalla." + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "Näytä taustakuva" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "Listaa muotoilut" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "Aktivoi \"Messenger &Plus!\" muotoilu" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "Näytä sähköpostiosoite kontakteisssa heidän nimien sijaan." + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" -msgstr "Hymiöt" +msgstr "Tunne-ikoni teemat" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" -msgstr "Hymiöiden tyyli:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +msgid "Available emoticon themes:" +msgstr "Käytettävät tunne-ikoni teemat:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" -msgstr "Cartoon-hymiöteema" +msgstr "Tunne-ikonit" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, fuzzy, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Muista tämän tilin asetukset" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +msgid "Available custom emoticons:" +msgstr "Käytettävät tunne-ikonit:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "" +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" +msgstr "Paina tästä lisätäkseen uusi tunne-ikoni." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "Kello" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +msgid "Add Ne&w..." +msgstr "Lisää uusi" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" +msgstr "Paina tästä uudelleen nimetäkseen valittu tunne-ikoni." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 msgid "Re&name" -msgstr "&Uudelleennimeä ryhmä" +msgstr "Uudelleen nimeäminen" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "" +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "Paina tästä poistaakseen tunne-ikoni." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" msgstr "Poistettu" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "Internetselain" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "Valitse vaihtoehdoksi käyttää selainta, jota KDE käyttää." + +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "Käytä oletus selainta" + +#. 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:814 rc.cpp:849 +msgid "Select this option to choose from a list of installed browsers." +msgstr "Valitse vaihtoehdoksi listalta asennettu selain." + +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:817 +msgid "&Use an installed browser:" +msgstr "&Käytä asennettua selainta" + +#. 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:820 rc.cpp:855 +msgid "Choose this option to enter the path to your favorite browser." +msgstr "Valitse vaihtoehdoksi polku, jossa sijaitsee suosikki selaimesi." + +#. 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:823 rc.cpp:858 +msgid "&Specify a custom command:" +msgstr "&Määrittele komento:" + +#. 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:827 rc.cpp:862 #, no-c-format -msgid "Select an emoticon and click here to delete it." +msgid "" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." msgstr "" +"Määrittele käytettävän ohjelman polku avatakseen linkkejä; %u' korvatakseen " +"linkeillä'URL." -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 #, no-c-format -msgid "says:" -msgstr "sanoo:" +msgid "Use '%u' to insert the URL in the command line." +msgstr "Käytä %u' lisätäkseen URL-osoite komentokehoitteessa." -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Selaa ja rajaa kuvaa..." +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "Sähköpostiohjelma" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Keskustelukuvake" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Keskustelukuvakkeen lataus epäonnistui" - -#: settings/accountswidget.cpp:486 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -"Keskustelukuvan vaihdossa tapahtui virhe.\n" -" Varmista että valitsit oikean kuvatiedoston" +"Valitse vaihtoehdoksi Live Mail verkkosähköposti yhdistäkseen käyttäjätiliä, " +"joka on tuettuna Live Mail palvelussa." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Asetukset" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +msgid "Use &Live Mail if the account supports it" +msgstr "Käytä &Live Mail jos käyttäjätili tukee sitä" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Käyttäjätili" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Keskustelee" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Oletko varma, että haluat poistaa tämän tilin?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Valitsemalla vaihtoehdon käyttääkseen sähköpostiohjelmistoa, jota KDE " +"käyttää." -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Stacy" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" +msgstr "Käytä &KDE:n oletus sähköpostiohjelmaa" -#: settings/settingsdialog.cpp:782 -#, fuzzy -msgid "Great!" -msgstr "Vuohi" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "Käytä &asennettua sähköpostiohjelma" -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "Käytä %u' lisäämään sähköpostiosoitteen komentokehoitteessa." -#: systemtraywidget.cpp:91 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +msgid "&Save all received files in one directory:" +msgstr "&Tallenna vastaanotetut tiedostot kansioon:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "&Portit väliltä" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "ja" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "Tiedostonsiirtäminen" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "Paina tästä kertoaaksesi kehittäjille mistä pidit" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu." +" " msgstr "" -"Pääikkunan ei sammuta KMessiä, vaan se pysyy käynnissä ilmoitusalueella. " -"Käytä 'Yhdistä -> Lopeta' valikosta sulkeaksesi ohjelman." +"Valitse yhdestä näistä lähettääkseen kehittäjille kommenttia " +"ohjelmistosta. Voit kytkeä ominaisuuden pois päältä \"Show Feedback Icons\" " +"auta valikosta." -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Pienennetään ilmoitusalueelle" +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "Paina tästä kertoaaksen kehittäjille mistä et pitäny." + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "Paina tästä kertoakseen kehittjäjille ongelmasta ohjelmistossa" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" +"Paina tästä kertoaaksen kehittäjille uudesta ominaisuudesta, jonka haluaisit " +"ohjelmistoon." + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "Kommenttisi:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +msgid "Your comment is about:" +msgstr "Kommenttis on:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "Mistä pidät" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "Mistä et pidä" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "Ohjelmiston vääränlainen käyttäyminen" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "Uusi ominaisuus" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "Määrittele sähköpostiosoite, johon otetaan yhteyttä:" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" +"Määrittele sähköpostiosoite, josta kehittäjät voivat pyytää " +"lisätietoja tai kertomaan lisättiinkö pyydetty ominaisuus.
\n" +" Sähköpostiosoitetta ei tulla käyttämään muuhun kuin tiedonantoon.<" +"/html>" -#: systemtraywidget.cpp:278 #, fuzzy -msgid "%1 %2" -msgstr "%1 Mt" +#~ msgid "Ink message" +#~ msgstr "Näytä &aika viesteissä" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "" +#, fuzzy +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Näytä viestikupla, kun tämä henkilö kirjautuu sisään tai ulos" + +#, fuzzy +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Muista tämän tilin asetukset" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Näytä &hymiöt" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Keskustelukuvake" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "&Etsi yhteystietoa" + +#~ msgid "Search by &Interest" +#~ msgstr "Etsi &Kiinnostusten perusteella" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Sähköpostiosoitteesi:" + +#~ 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ä." + +#~ 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." + +#, 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 "" +#~ "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 "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:" + +#, fuzzy +#~ msgid "Speed:" +#~ msgstr "Palvelin:" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "Ohjelma, jota KMess käskee näyttämään sähköpostiviestit." + +#~ msgid "Use a specified command:" +#~ msgstr "Määritä komento itse:" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "Sähköposti" + +#~ msgid "Remove group" +#~ msgstr "Poista ryhmä" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Keskustelukuvake" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "Postilaatikossasi on 1 uusi sähköposti" + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "Postilaatikossasi on %1 uutta sähköpostia" + +#, fuzzy +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu avata" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Näytä/Piilota &yhteystietopalkki" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "Uusi &Yhteystieto" + +#~ msgid "Enter your login information:" +#~ msgstr "Syötä kirjautumistiedot:" + +#~ msgid "Your friendly name:" +#~ msgstr "Lempinimesi:" + +#~ msgid "Your password:" +#~ msgstr "Salasanasi:" + +#, fuzzy +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Näytä tiedote kun saat sähköpostia \"muihin kansioihin\"" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Järjestä keskusteluhakemistot:" + +#~ msgid "&Show graphics in chat messages" +#~ msgstr "&Näytä grafiikat viesteissä" + +#~ msgid "Use Hotmail" +#~ msgstr "Käytä Hotmailia" + +#~ msgid "says:" +#~ msgstr "sanoo:" + +#~ msgid "Current name: " +#~ msgstr "Nykyinen nimi: " + +#, 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 ei saanut yhteyttä MSN-palveluun. \n" +#~ "Järjestelmävirhe: %1 (koodi %2)." + +#~ msgid "The remote server has closed the connection." +#~ msgstr "Etäpalvelin katkaisi yhteyden." + +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Näytetäänkö MSN Messenger -palvelun tila?" + +#~ msgid "Received user confirmation" +#~ msgstr "Vastaanotetaan vahvistus" + +#~ msgid "Transfer to notification server" +#~ msgstr "Siirretään tietoa ilmoituspalvelimelle" + +#~ msgid "The server is too busy" +#~ msgstr "Palvelin on liian kiireinen" + +#~ msgid "The server is unavailable" +#~ msgstr "Palvelin ei ole saatavilla" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "" +#~ "KMess on vastaanottanut tuntemattoman virheilmoituksen palvelimelta: %1" + +#~ msgid "Warning: Server closes for maintenance in 1 minute!" +#~ msgstr "Varoitus: Palvelin sulkeutuu huollettavaksi 1 minuutin kuluttua!" + +#~ msgid "Add contact" +#~ msgstr "Lisää yhteystieto" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "Sähköposti-ilmoitin" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Markus Vuori, Joonas Niilola, Jussi Timperi" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "markus@vuoret.net, juippis@roskakori.org, jussi.timperi@gmail.com" + +#~ msgid "Away - Idle" +#~ msgstr "Poissa - jouten" + +#~ msgid "chat-style-text" +#~ msgstr "keskustelu-tyyli-teksti" + +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "Annettu sähköpostiosoite on virheellinen!" + +#~ msgid "(Away)" +#~ msgstr "(Poissa)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Tulen pian takaisin)" + +#~ msgid "(Busy)" +#~ msgstr "(Kiireinen)" + +#~ msgid "(Invisible)" +#~ msgstr "(Näkymätön)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Poissa - Jouten)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Lounaalla)" + +#~ msgid "(On the Phone)" +#~ msgstr "(Puhelimessa)" + +#, fuzzy +#~ msgid "The contact is listening to music" +#~ msgstr "Tämä yhteystieto ei ole listallasi" #~ msgid "File transfer dialog message" #~ msgstr "Tiedostonsiirtodialogiviesti" @@ -3174,18 +6766,9 @@ msgstr "" #~ msgid "An error occured" #~ msgstr "Tapahtui virhe" -#~ msgid "You can't login to hotmail with this account." -#~ msgstr "Et voi kirjautua sisään Hotmailiin tällä tunnuksella." - -#~ msgid "The connection to the server failed." -#~ msgstr "Yhdistäminen palvelimeen epäonnistui." - #~ msgid "You may not be connected to the internet." #~ msgstr "Mahdollisesti sinulla ei ole yhteyttä Internetiin." -#~ msgid "webcam" -#~ msgstr "webcam" - #~ msgid "There was a problem connecting to the proxy." #~ msgstr "Välityspalvelimeen yhdistämisessä oli ongelmia." @@ -3195,9 +6778,6 @@ msgstr "" #~ msgid "says" #~ msgstr "sanoo" -#~ msgid "has sent you" -#~ msgstr "on lähettänyt sinulle" - #~ msgid "Ctrl+Return" #~ msgstr "Ctrl+Return" @@ -3245,31 +6825,15 @@ msgstr "" #~ msgid "Preview:" #~ msgstr "Esikatselu:" -#~ msgid "&Browse..." -#~ msgstr "&Selaa..." - -#~ msgid "&Use the default picture" -#~ msgstr "&Käytä oletuskuvaa" - #~ msgid "If enabled, KMess uses it's default picture in chat conversations." #~ msgstr "Jos valittu, KMess käyttää sen oletuskuvaa keskusteluissa." #~ 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:" -#~ msgid "Type:" -#~ msgstr "Tyyppi:" - #~ msgid "User ID:" #~ msgstr "Käyttäjän ID:" @@ -3282,9 +6846,6 @@ msgstr "" #~ msgid "SOCKS5 Proxy" #~ msgstr "SOCKS5-välityspalvelin" -#~ msgid "Server:" -#~ msgstr "Palvelin:" - #~ msgid "Proxy" #~ msgstr "Välityspalvelin" diff --git a/po/fr.po b/po/fr.po index 9392309..d817773 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,528 +6,1315 @@ # 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: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2007-10-17 09:48+0200\n" -"Last-Translator: Andrea Blankenstijn \n" -"Language-Team: Français \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" +"PO-Revision-Date: 2009-04-19 22:08+0200\n" +"Last-Translator: \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" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Choplair, Andrea Blankenstijn" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "chopinou AT choplair DOT org, darkan9el AT gmail DOT com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "Je ne suis pas devant mon ordinateur" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Votre pseudo" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "vous@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Connexion en cours..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Je ne suis pas devant mon ordinateur" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "%1 vous envoie un clin d'œil : %2" - -#: chat/chatmessagestyle.cpp:296 -msgid "%1 says:" -msgstr "%1 dit :" - -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 -msgid "Add this emoticon: %1" -msgstr "Ajouter cette émoticône : %1" - -#: chat/chatview.cpp:463 +#: accountsmanager.cpp:559 +#, kde-format msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." msgstr "" -"Impossible d'archiver la conversation. Vérifiez d'avoir les droits " -"d'écriture dans le répertoire où les archives sont enregistrées." +"Certains mots de passe stockés sans sécurité ont été trouvés.
Voulez-vous importer les mots de passe dans le portefeuille KDE Walled " +"nommé '%1', ne rien faire, ou définitivement les supprimer ?

Note : Il n'est pas recommandé de laisser les mots de passe stockés sans " +"sécurité si KDE Wallet est disponible, sinon vos mots de passe peuvent être " +"facilement lisibles dans les fichiers de configuration de KMess." -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Stockage du mot de passe sécurisé" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importer" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Supprimer" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Parti" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" msgid "" -"The file '%1' already exists.\n" -"do you want to overwrite it?" -msgstr "Le fichier « %1 » existe déjà.
Voulez-vous l'écraser ?" - -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 -msgid "Overwrite File" -msgstr "Écraser le fichier" - -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 -msgid "Over&write" -msgstr "&Ecraser" - -#: chat/chatview.cpp:919 -msgid "Add this &Emoticon..." -msgstr "Afficher les &Emoticônes" - -#: chat/chatview.cpp:924 -msgid "Send &Email" -msgstr "&Envoyer un e-mail" - -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "Copier l'adresse e-mail" - -#: chat/chatview.cpp:931 -msgid "Visit &Link" -msgstr "Suivre le &lien" - -#: chat/chatview.cpp:933 -msgid "Copy &Address" -msgstr "Copier l'adresse" - -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "&Copier le texte" - -#: chat/chatview.cpp:947 -msgid "Select &All" -msgstr "Tout &sélectionner" - -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "&Enregistrer la conversation" - -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Conversation" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." msgstr "" -"Vous ne pouvez pas lancer cette invitation car il y a plusieurs contacts " -"dans cette conversation." +"Vous ne pouvez pas lancer d'invitations car il y a plusieurs contacts dans " +"cette conversation. Merci de réessayer en lançant une autre conversation " +"avec le contact que vous vouliez inviter." -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 a rejoint la conversation." +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 a rejoint la conversation." -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." msgstr "La conversation est devenue inactive, %1 a quitté la conversation." -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 a quitté la conversation." +#: chat/chat.cpp:197 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 a quitté la conversation." -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Conversation" +#: chat/chat.cpp:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 et %1" -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 et %1 - Conversation" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." msgstr "%1 etc. - Conversation" -#: chat/chatwindow.cpp:737 -msgid "Contacts" -msgstr "Contacts" +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Ce message a été envoyé automatiquement)" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 -msgid "Emoticons" -msgstr "Emoticônes" - -#: chat/chatwindow.cpp:799 -msgid "My emoticons" -msgstr "Mes émoticônes" - -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Ce message a été envoyé automatiquement)" - -#: chat/chatwindow.cpp:1493 +#: chat/chat.cpp:829 +#, fuzzy, kde-format 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:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Vous avez envoyé un clin d'oeil." + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Vous avez envoyé un clin d'oeil." + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "Le chat a été désactivé car vous n'êtes plus connecté" + +#: chat/chat.cpp:1144 +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:1154 +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 "" +"Il y avait trop d'émoticones personnalisés différents dans votre " +"derniere message. Seuls les 7 premiers seront envoyés." + +#: chat/chat.cpp:1167 +#, fuzzy, kde-format +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." +msgstr "" +"%1 vous a envoyé un clip vocal mais KMess ne supporte pac cette " +"fonction pour l'instant." + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger 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:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"Le clin d'oeil n'a pas pu être affiché. Les données n'ont pas pu être lues." + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"Le clin d'oeil n'a pas pu être affiché. Les données n'ont pas pu être lues." + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 vous a envoyé un clin d'œil !" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 vous a envoyé un clin d'œil !" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." msgstr "" "Le clin d'oeil n'a pas pu être affiché. Vérifiez que \"cabextract\" soit " "bien installé." -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Le clin d'oeil n'a pas pu être affiché. Vérifiez que \"cabextract\" soit " +"bien installé." + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"Le clin d'oeil n'a pas pu être affiché. Vérifiez que \"cabextract\" soit " +"bien installé." + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"Le clin d'oeil n'a pas pu être affiché. Vérifiez que \"cabextract\" soit " +"bien installé." + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "Vous avez reçu un clin d'oeil de la part de %1" +#: chat/chat.cpp:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 est hors ligne. Tous les messages envoyés lui seront délivrés la " +"prochaine fois qu'il ou elle se connectera." + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 a rejoint la conversation." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 a rejoint la conversation." + +#: chat/chat.cpp:1430 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 vous a envoyé un wizz !" + +#: chat/chat.cpp:1463 +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:1476 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Impossible d'envoyer un wizz à %1 !" + +#: chat/chat.cpp:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 a rejoint la conversation." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +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/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "Vous avez reçu un wizz de la part de %1 !" +#: chat/chat.cpp:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Vous avez envoyé un nudge à %1 !" -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Vous avez envoyé un wizz à %1 !" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" +#: chat/chat.cpp:1632 +msgid "You have sent a nudge!" msgstr "Vous avez envoyé un wizz !" -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 est en train d'écrire." +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" +"%1 est actuellement hors ligne. Tous les messages envoyés lui seront " +"délivrés à sa prochaine connexion." -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 et %1 - sont en train d'écrire." +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 vous envoie un clin d'œil : %2" -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 et %3 autres sont en train d'écrire." +#: chat/chatmessagestyle.cpp:382 +#, kde-format +msgid "%1 says:" +msgstr "%1 dit :" -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format +msgid "Add this emoticon: %1" +msgstr "Ajouter cette émoticône : %1" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Reconnexion" + +#: chat/chatview.cpp:300 +#, kde-format +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 "" +"Impossible d'archiver la conversation dans le dossier '%1'.\n" +" Vérifiez d'avoir les droits d'écriture dans le répertoire où les archives " +"sont enregistrées." + +#: chat/chatview.cpp:439 +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|Page Web (*.html)\n" +"*.txt|Document texte (*.txt)\n" +"*.xml|Document XML (*.xml)" + +#: chat/chatview.cpp:458 +#, kde-format +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 ?" + +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "Écraser le fichier" + +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "&Ecraser" + +#: chat/chatview.cpp:825 +msgid "Add this &Emoticon..." +msgstr "Afficher les &Emoticônes" + +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Afficher les &Emoticônes" + +#: chat/chatview.cpp:834 +msgid "Send &Email" +msgstr "&Envoyer un e-mail" + +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "&Ajouter le Contact" + +#: chat/chatview.cpp:842 +msgid "Copy E&mail Address" +msgstr "Copier l'adresse &E-mail :" + +#: chat/chatview.cpp:848 +msgid "Visit &Link" +msgstr "Suivre le &lien" + +#: chat/chatview.cpp:852 +msgid "Copy &Address" +msgstr "Copier l'adresse" + +#: chat/chatview.cpp:868 +msgid "&Copy Text" +msgstr "&Copier le texte" + +#: chat/chatview.cpp:869 +msgid "Select &All" +msgstr "Tout &sélectionner" + +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "Trouver le &texte..." + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +msgid "C&lear Chat" +msgstr "Effacer &la conversation" + +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." +msgstr "Enregistrer la conversation dans le &fichier..." + +#: chat/chatwindow.cpp:115 +msgid "Contacts" +msgstr "Contacts" + +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Emoticônes" + +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Mes émoticônes" + +#: chat/chatwindow.cpp:337 +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 "" +"Il y a plusieurs onglets ouverts dans cette fenêtre de chat. Voulez-" +"vous seulement fermer l'onglet actuel, ou tous les onglets ?

Note: Vous pouvez fermer tous les onglets en même temps en pressant Alt" +"+F4." + +#: chat/chatwindow.cpp:340 +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:341 +msgid "Close All Tabs" +msgstr "Fermer tous les onglets" + +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Fermer l'onglet courant" + +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "&Inviter" + +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." msgstr "Envoyer un &Fichier" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "Conversation Webcam" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "Démarrer une &Conférence" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 msgid "Send a &Nudge!" -msgstr "Envoyer un &Wizz" +msgstr "Envoyer un &Wizz !" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Démarrer ou Arréter une &Conversation" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." msgstr "Sauvegarder la conversation" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Inviter" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "Fermer tous les onglets" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Conversation" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "Changer la &Police" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "Changer la &Couleur" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Insérer une émoticône" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "Afficher les &Emoticônes" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Afficher/Masquer la barre &latérale" +#: chat/chatwindow.cpp:471 +msgid "Show S&tatus Messages" +msgstr "Afficher les messages de statut" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Afficher ou masquer la barre latérale" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "&Panneaux" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "Utili&Ser la correction orthographique" + +#: chat/chatwindow.cpp:484 +#, fuzzy +msgid "Meeting" +msgstr "Paramètres" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Envoyer un Wizz" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Envoyer un &Fichier" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "Onglet p&récédent" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "Onglet suivant" + +#: chat/chatwindow.cpp:507 +msgid "Enable or disable the contacts panel" +msgstr "Activer ou désactiver le panneau de contacts" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contacts" + +#: chat/chatwindow.cpp:513 +msgid "Enable or disable the standard emoticons panel" +msgstr "Activer ou désactiver le panneau des émoticônes standards" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticônes" + +#: chat/chatwindow.cpp:519 +msgid "Enable or disable the custom emoticons panel" +msgstr "Activer ou désactiver le panneau des émoticônes personnalisées" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mes émoticônes" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "&Police" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "Changer la &Couleur" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "Effacer la fenêtre de Chat" + +#: chat/chatwindow.cpp:603 +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:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" +"Vous avez utilisé une syntaxe incorrecte pour la commande /status. La " +"bonne syntaxe est: /status online|away|idle|brb|busy|lunch|phone|" +"invisible.
Vous pouvez aussi utiliser des raccourcis comme /" +"online ou /phone." + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Syntaxe incorrecte pour la commande /status" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" +"Vous ne pouvez pas utiliser la commande /block dans un chat groupé." + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "Impossible d'utiliser la commande /block" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" +"Vous ne pouvez pas utiliser la commande /unblock dans un chat groupé." + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "Impossible d'utiliser la commande /unblock !" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" +"Commande inconnue %1. Si votre message n'est pas une commande, " +"rajoutez / au début du message." + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Commande inconnue" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Conversation" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Conversation" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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 "" +"Etes-vous sûr de vouloir masquer la barre de menu ? Vous pouvez la " +"réafficher en utilisant le raccourci : %1" + +#: chat/chatwindow.cpp:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Masquer le menu" + +#: chat/chatwindow.cpp:1887 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 est en train d'écrire..." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 et %1 sont en train d'écrire..." + +#: chat/chatwindow.cpp:1901 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 et %3 autres sont en train d'écrire..." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, fuzzy, kde-format +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:297 +msgid "&Start Private Chat" +msgstr "Démarrer une Conférence privée" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +msgid "&Send Email" msgstr "&Envoyer un e-mail" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "&Voir son Profil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Propriétés" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "&Ajouter le Contact" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" msgstr "Autoriser &le Contact" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" msgstr "&Supprimer le contact" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "&Bloquer le Contact" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "&Débloquer le Contact" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" msgstr "&Pseudonyme" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "&Message Personnel" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" -msgstr "&Adresse e-mail :" +msgstr "Adresse &e-mail :" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "&Copier..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "&Nom du morceau" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Information" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Avatar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "&Notes" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "&Emoticônes" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "&Copier" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Bloqué" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Absent" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Le contact est %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Bientôt de retour" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" +"

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

Pour ajouter de nouveaux émoticones, cliquez ici !

" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Occupé" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Ajouter à la conversation" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Déconnecté" +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Ajouter un nouveau" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Absent - Inactif" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Edition" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Parti manger" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Supprimer" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

Vous n'avez pas de clins d'oeil.

Pour en ajouter de " +"nouveaux, demandez à vos contacts de vous envoyer !

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Robot Messenger" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "Compatible MSN Messenger %1" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Compatible Windows Live Messenger %1" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Compatible Windows Live Messenger %1" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "En ligne" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Occupé" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Absent" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Absent avec auto-réponse" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inactif" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Bientôt de retour" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Au téléphone" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "Ce contact n'est pas en ligne" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Parti manger" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "Thème de la fénêtre de discussion :" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Invisible" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Ce compte n'a pas de boîte de réception Hotmail !" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Déconnecté" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Mon Statut" + +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Déconnecter" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" msgstr "Ajouter un Contact" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Entrer l'adresse e-mail de la personne que vous voulez ajouter :" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "L'adresse e-mail que vous avez spécifiée est invalide !" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Ajouter une nouvelle émoticône" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -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:130 +msgid "Edit Emoticon" +msgstr "Editer l'émoticône" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Rédiger un message d'Absence" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +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:37 +msgid "Automatic Away Message" +msgstr "Rédiger un message automatique d'absence" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Historique de la fenêtre de discussion :" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Tappez le message qui sera automatiquement envoyé\n" -"aux personnes qui tenteront de vous contacter :" +"Il y a eu une erreur en ouvrant l'historique. C'est certainement un problème " +"de permissions, vérifiez si vous avez accès en lecture/écriture au dossier " +""%1". Sinon, vos historiques sont peut être corrompus." -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Choisir un autre pseudo pour cette personne" +#: dialogs/chathistorydialog.cpp:250 +#, 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/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Afficher une Bulle quand ce contact se connecte ou se déconnecte" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Connexion en cours..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Image : " +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "&Archiver toutes les conversations" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Son : " +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Vous avez été ajouté par quelqu'un" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"vous a ajouté(e) dans sa liste de contact." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"vous a ajouté(e) dans sa liste de contact." + +#: dialogs/contactpropertiesdialog.cpp:282 +#, fuzzy, kde-format msgid "Contact Properties for %1" msgstr "Propriétés du contact %s" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Adresse e-mail : " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Connecté" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Pseudo actuel : " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "Pas encore aperçu" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "Pas de messages pour le moment" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Vue pour la dernière fois : %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Dernier message : %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Adresse e-mail : %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Client e-mail : %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Contacts" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "" +"L'invitation a été rejetée. La fonctionnalité n'est pas supportée par " +"l'autre client." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "Type de fichier non supporté" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Inviter des contacts" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "Fenêtre du réseau" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Sauvegarder l'onglet" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "S&auvegarder l'onglet" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Effacer l'onglet" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "Effacer l'ong&let" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Fermer l'onglet" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "Fermer tous les ong&lets" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." +#: dialogs/networkwindow.cpp:1086 +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:928 +#: dialogs/networkwindow.cpp:1130 +#, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." 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:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "Impossible de fermer l'onglet de connexion principal." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"Envoyer des commandes au serveur est une opération risquée.
Si vous ne " +"savez pas exactement ce que vous faîtes, au mieux vous serez juste " +"déconnecté, mais les conséquences peuvent être graves.
Vous êtes " +"avertis !
Voulez-vous continuer et envoyer ce message ?" + +#: dialogs/networkwindow.cpp:1303 +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:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Impossible d'envoyer cette commande pour ce type de connection." + +#: 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 "" +msgstr "Annulé" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Echec !" -#: dialogs/transferentry.cpp:202 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Ordinateur" +msgstr "Complet" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" -msgstr "%1 Mo" +msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" -msgstr "%1 ko" +msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 octets" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 sur %2 reçus." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 sur %2 envoyé." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "inifini" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" -msgstr "Transferts de fichiers" +msgstr "Transfert de fichiers" -#: emoticontheme.cpp:542 +#: 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 "Choose or Remove Your Display Picture" +msgstr "Choisissez ou supprimez votre avatar" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Etes-vous sûr(e) de vouloir supprimer cet avatar ?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Avatar" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -535,343 +1322,410 @@ 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:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Sourire" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "Clin d'œil" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Tirrage de langue" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Grand sourire" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Triste" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "En pleur" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "En colère" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Perplexe" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Géné" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Déçu" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Lunette de soleil" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Dents sorties" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Nerd" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Malade" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Etonné" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Fête" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Fatigué" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Songeur" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Bouche cousue" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Chuchotement" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Mouvement occulaire" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Sarcastique" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" -msgstr "Hésitant" +msgstr "Je ne sais pas" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Bientôt de retour" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Ange" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Calin gauche" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Homme" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Cœur rouge" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Rose rouge" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +#, fuzzy +msgid "Thumbs up" msgstr "Pouce en haut" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Tête de chien" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Soleil" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Démon" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Calin droite" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Femme" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Cœur brisé" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Rose fanée" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Pouce en bas" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Tête de chat" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Demi-lune assoupie" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Lèvres rouges" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Applauddisement" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Doigts croisés" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Voiture" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Avion" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Tortue" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Escargot" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Mouton noir" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Mouton" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Chèvre" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Chauve sourie" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Choppe de bière" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "Verre de Martini" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "Tasse de café" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Gateau d'anniversaire" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Couverts" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Bol" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Etoille" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Arc-en-ciel" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Mauvais temps" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Eclair" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Parapluie" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Île avec palmier" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" -msgstr "Combinet téléphonique" +msgstr "Combiné téléphonique" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Téléphone portable" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "E-mail" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Horloge" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Appareil photo" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Bobine de film" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Note" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Menottes" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Argent" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" -msgstr "Ampoulle" +msgstr "Ampoule" -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "Cigarette" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "Ballon de foot" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "Ballon de football" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Cadeau emballé" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Ordinateur" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" msgstr "Icone KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "L'adresse de contacte que vous avez saisie est invalide : %1" +#: initialview.cpp:239 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Reconnection impossible : le compte n'a pas été trouvé." -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" +#: initialview.cpp:252 +#, fuzzy +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:375 +#, kde-format +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:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Connection Internet indisponible" + +#: initialview.cpp:401 +#, fuzzy, kde-format +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:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Connexion" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "Annuler" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "S'il vous plaît, indiquez votre adresse e-mail et votre mot de passe." + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Saisissez une adresse e-mail valide." + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Le contact %1 est déjà présent dans votre liste." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Information sur le contact" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Nouveau Groupe" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Ajouter un Groupe" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Entrer le nouveau nom pour ce groupe :" +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Entrer un nom pour le nouveau groupe :" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Absent avec auto-réponse" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Inactif" - -#: kmess.cpp:715 +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -879,15 +1733,32 @@ msgstr "" "Etes-vous sûr(e) de vouloir supprimer %1 de votre liste de " "contact ?" -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "Supprimer le Contact" +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "Supprimer le contact" -#: kmess.cpp:720 -msgid "Remove and block" +#: kmess.cpp:580 +msgid "Remove and Block" msgstr "Supprimer et bloquer" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" +"Le groupe \"%1\" n'est pas vide : supprimer tous les contacts de ce " +"groupe et réessayer !" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Supprimé du groupe" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" @@ -895,219 +1766,430 @@ msgstr "" "Etes-vous sûr(e) de vouloir supprimer le groupe %1 de votre liste " "de contact ?" -#: kmess.cpp:763 -msgid "Remove group" -msgstr "Supprimer le Groupe" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Supprimé" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "C'est un groupe spécial qui ne peut être changé." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" +#: kmess.cpp:676 +msgid "Rename Group" msgstr "Renommer le Groupe" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Connecté" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Entrer le nouveau nom pour ce groupe :" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" +"

Impossible de s'identifier automatiquement \"%1\" :
vous " +"devez d'abord enregistrer le mot de passe du compte !

" + +#: kmess.cpp:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "L'authentification automatique a échouée" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Connexion en cours..." + +#: kmess.cpp:1109 +msgctxt "Status bar message" msgid "Disconnected" msgstr "Déconnecté" -#: kmess.cpp:1669 +#: kmess.cpp:1448 +#, kde-format +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 l'a cherché dans les dossiers suivants :
%1

" + +#: kmess.cpp:1460 +#, kde-format +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 'eventsrc' 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 " +"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:1673 -msgid "Error with notifications" +#: kmess.cpp:1466 +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Erreur avec notifications" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nouve&au Compte" +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Nouveau &Contact" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Nouveau &Groupe" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "Rech&ercher un Contact" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Rechercher par &Intérêts" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "&Paramètres du Compte" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "Ac&tions" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Con&nexion" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Déconnexion" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Voir mon &Profil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Mon Statut" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "&Connexion" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Déconnexion" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Voir mon &Profil" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "Afficher les Contacts &Autorisés" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "Afficher les Contacts &Déconnectés" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "Afficher les Contacts Supp&rimés" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Avatar" +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Historique de la fenêtre de discussion" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Afficher la fenêtre du &Réseau" +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "Afficher la barre de recherche" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Affich&er les groupes vides" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "Taille &des Avatars" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "Cla&sser les Contacts par" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Afficher la fenêtre de &Transfert" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Nouveau &Contact..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Nouveau &Groupe..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "&Exporter la liste des contacts..." + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "&Historique des conversations :" + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Nouve&au Compte..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Configuration du Compte..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Configurer &KMess..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Voir le menu Sélection" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Ne pas afficher" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Petit" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Moyen" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Large" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Groupe" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Connecté/Déconnecté" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Afficher la fenêtre de &Transfert" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Mélangé" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "En train d'écouter %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "Afficher la fenêtre du &Réseau" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Indentifié avec %2" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 vient de se connecter" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 vient de se déconnecter" + +#: kmessview.cpp:599 msgid "Cha&t" msgstr "Conversa&tion" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Propriétés" - -#: kmessview.cpp:623 -msgid "&Remove from group" +#: kmessview.cpp:610 +msgid "&Remove From Group" msgstr "Supp&rimer du groupe" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "Déplacer dans le &Groupe" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" msgstr "&Copier dans le groupe" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "Déplacer dans le &Groupe" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "Placer le Groupe en &Bas" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "Placer le Groupe en &Haut" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "Suppri&mer le Groupe" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "Re&nommer le Groupe" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "Vous avez 1 nouveau message dans votre boîte de réception." +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "&Ajouter cette personne dans votre liste de contact" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "Vous avez %1 nouveaux messages dans votre boîte de réception." +#: kmessview.cpp:1145 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Adresse e-mail :" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Absent)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Client e-mail : %1" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Bientôt de retour)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "Oui" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Occupé)" +#: kmessview.cpp:1168 +msgid "No" +msgstr "Non" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Invisible)" +#: kmessview.cpp:1171 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloqué" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Absent - Inactif)" +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Vue pour la dernière fois" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Parti manger)" +#: kmessview.cpp:1206 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Dernier message" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Au téléphone)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Groupe %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Se connecter automatiquement avec ce compte" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +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" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contact" +msgstr[1] "Contacts" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Rédigez ici votre message perso>" + +#: kmessview.cpp:1652 +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 "" +"Tapez ici un message à montrer à vos contacts : ils le verront avec votre " +"pseudo" + +#: kmessview.cpp:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Vous avez rejeté l'invitation." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "Historique de la fenêtre de discussion :" + +#: kmessview.cpp:2020 +#, fuzzy, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 nouveau mail" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "Un client MSN Messenger pour KDE" + +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, 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 "Developer and project founder" +msgstr "Développeur et fondateur du projet" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Développeur" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Support du projet" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Développeur actif" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:124 +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:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -1115,192 +2197,576 @@ msgstr "" "Traduction allemande, tests, documentation, webmaster, gestion du projet, " "etc." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 msgid "Web design" msgstr "Design web" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:73 +#, 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:74 msgid "Cartoon emoticons" msgstr "Les Emoticons \"Cartoon\"" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Thème sonore par defaut" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "Icône KMess pour le style Oxygen" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "Responsable de la traduction" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Traduction arabe, Correction de l'internationalisation des fichiers " "sauvegardés." -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "Traduction arabe supplémentaire" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Traduction portugaise/brésilienne" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Traduction portugaise / brésilienne supplémentaire" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "Sergio Rafael Lemke" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "Maurício Arozi Moraes" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Traduction catalane" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "Adrià Arrufat" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Traduction italienne supplémentaire" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 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:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "Traduction chinois simplifié supplémentaire" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "Traduction chinois traditionnel" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "Traduction chinois traditionnel supplémentaire" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:99 msgid "Danish translation" msgstr "Traduction danoise" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:100 msgid "More Danish translation" msgstr "Traduction danoise supplémentaire" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 msgid "Dutch translation" msgstr "Traduction néerlandaise" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" msgstr "Traduction néerlandaise supplémentaire" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "Traduction allemande, grecque supplémentaires" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "Traduction française supplémentaire" + +#: main.cpp:111 msgid "Estonian translation" msgstr "Traduction estonienne" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:112 msgid "Finnish translation" msgstr "Traduction finnoise" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:113 main.cpp:114 msgid "More Finnish translation" msgstr "Traduction finnoise supplémentaire" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:116 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:116 msgid "French translation" msgstr "Traduction française" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" msgstr "Traduction française supplémentaire, définitions des emoticons de MSN6" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" msgstr "Traduction française supplémentaire" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "Traduction hongroise" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:123 +msgid "More Hungarian translation" +msgstr "Traduction hongroise supplémentaire" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:124 main.cpp:125 msgid "More Italian translation" msgstr "Traduction italienne supplémentaire" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "Traduction italienne supplémentaire." + +#: main.cpp:127 msgid "Korean translation" msgstr "Traduction coréenne" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "Traduction norvégien oriental (Norsk Bokmål)" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:130 +msgid "Serbian translation" +msgstr "Traduction serbe" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "Traduction slovaque" + +#: main.cpp:133 +#, fuzzy +msgid "Matjaž Kaše" +msgstr "Matjaž kaše" + +#: main.cpp:133 msgid "Slovenian translation" msgstr "Traduction slovène" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:135 msgid "Spanish translation" msgstr "Traduction espagnole" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 msgid "More Spanish translation" msgstr "Traduction espagnole supplémentaire" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "Manuel Ramírez" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:144 msgid "Swedish translation" msgstr "Traduction suédoise" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "Traduction suédoise" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:147 msgid "Thai translation" msgstr "Traduction thaï" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:148 msgid "Turkish translation" msgstr "Traduction turque" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "Traduction turque supplémentaire" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "Support d'MSNP12, divers correctifs" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Transferts de fichiers" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "support du champ P4-Context" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Correction Xinerama" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Code Original pour le transfert de fichier" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "Support de KWallet" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "Historique de la fenêtre de discussion :" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "Corrections d'internationalisation diverses." + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "Corrections d'internationalisation diverses." -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "Développeur de GnomeMeeting" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Le gars avec un sac sur la tête" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspirations et code allant avec" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:173 +#, fuzzy +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:140 +#: main.cpp:174 msgid "Idle timer code" msgstr "Code du compteur d'inactivité" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:175 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 -msgid "Your name here?" -msgstr "Votre nom ici ?" +#: main.cpp:176 +msgid "Amarok" +msgstr "Amarok" -#: main.cpp:144 +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 #, fuzzy msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" msgstr "" "Vous êtes les bienvenus à envoyer vos corrections de bugs et vos patches sur " @@ -1308,285 +2774,381 @@ msgstr "" "S'il vous semble que votre nom manque à cette liste, s'il vous plaît " "contactez-nous également !" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:179 +msgid "Your name here?" +msgstr "Votre nom ici ?" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Vos pseudos" + +#: main.cpp:183 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Vos adresses e-mail : " + +#: main.cpp:189 +#, fuzzy +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:190 +msgid "Autologin with the given email address" +msgstr "Se connecter automatiquement avec ce compte" + +#: main.cpp:195 +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:1823 +msgid "Individuals" +msgstr "Individus" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Autorisé" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Supprimé" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." msgstr "Le contact a annulé la session." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "Le contact a rejeté l'invitation." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Vous avez annulé la session.." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Vous avez rejeté l'invitation." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to accept or cancel?" msgstr "Voulez-vous accepter ou refuser ?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." msgstr "Cliquez pour annuler." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +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:209 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +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 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"Le transfert du fichier "%1" a échoué. Impossible d'enregistrer " +"le fichier." + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le fichier." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Connexion à %1, port %2" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Le transfert a été annulé" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Connexion établie" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Fichier transféré avec succès : %1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Le transfert de %1 a échoué. Le fichier n'existe pas." - -#: network/applications/filetransfer.cpp:604 -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." - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Envoi du fichier %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Transfert accepté." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Connexion à %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Le contact a annulé le transfert du fichier "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Vous avez annulé le transfert du fichier "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the 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:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Fichier transféré avec succès "%1"." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Fichier reçu avec succès "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "Le transfert de %1 a échoué. Le fichier n'existe pas." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the 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:774 +#: network/applications/filetransferp2p.cpp:851 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Envoi du fichier "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the 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:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "" "L'invitation au transfert du fichier a été annulée. Des données invalides " "ont été reçues." -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "Le transfert de % a échoué. Impossible d'ouvrir le fichier" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Vous avez accepté le transfert du fichier "%1"." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Le contact a annulé le transfert." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" +msgstr "Le fichier ne peut pas être écrit" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Le transfert de %1 a échoué. Le fichier n'existe pas." - -#: network/applications/filetransferp2p.cpp:779 -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." - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "Envoi du fichier %1" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "" "Vous êtes invité à démarrer une conférence (en utilisant GnomeMeeting)." -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Démarrage de GnomeMeeting. Connexion à %1." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Invitation du contact pour à une conférence." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is 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:119 -msgid "The invitation was aborted. An internal error occured." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +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:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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:130 -msgid "The invitation was aborted. Timeout while waiting for file data." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +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:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +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:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "L'invitation a été annulée." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Vous êtes invité(e) à partager le bureau de cette personne." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Démarrage de KRDC. Connexion à %1." -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." msgstr "" -"Le contact essaye d'utiliser une fonctionnalité MSN6 que KMess ne supporte " -"par encore." +"Le contact vous invite à démarrer '%1', mais cette fonctionnalité n'est pas " +"encore implantée." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" "L'invitation a été annulée. Le contact a envoyé des données invalides, ou " "bien KMess ne les comprend pas." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." msgstr "Le transfert à échoué. La préparation des données a échouée." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -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:1624 -msgid "The transfer failed." -msgstr "Le transfert a échoué." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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/p2papplication.cpp:2038 +#: network/applications/p2papplication.cpp:1192 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:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not 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:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Le contact a rejeté l'invitation. Une erreur interne s'est produite." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "En attente d'une connexion à %1, port %2." -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 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:3274 -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/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "Le transfert a échoué. Une erreur interne est survenue." - -#: network/applications/p2papplication.cpp:3670 -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:4844 -#, fuzzy +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" -msgstr "En attente de la liste de contact..." +msgstr "En attente de connection" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "" "L'invitation a été annulée. Trop·de·temps·s'est " "écoulé·sans·que·l'utilisateur·n'accepte." -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "" "L'invitation a été annulée. Trop·de·temps·s'est écoulé·en attendant que la " "connexion s'établisse." -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." msgstr "" "L'invitation a été annulée. Trop·de·temps·s'est écoulé·en attente de donnée." -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +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/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Le transfert a échoué." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Le transfert a échoué. Une erreur interne est survenue." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" @@ -1594,735 +3156,2035 @@ msgstr "" "Vous êtes invité(e) à démarrer une conférence, mais le support de cette " "fonctionnalité n'est pas installé." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "Vous avez annulé la conversation vocale." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "" "L'invitation a été annulée. Le périphérique audio n'a pas pu être ouvert." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Démarrage de la conversation vocale. Connexion à %1." -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Démarrage·de·la·conversation·vocale. A l'écoute sur %1." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "Invitation du contact à une conversation vocale." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Le transfert de %1 a été annulé." - -#: network/extra/msnftpconnection.cpp:136 -msgid "Failed" -msgstr "" - -#: network/extra/msnftpconnection.cpp:410 -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:411 +#: network/applications/webcamtransferp2p.cpp:113 #, fuzzy -msgid "Couldn't open a local port." +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/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Vous avez demandé à voir votre webcam." + +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this contact'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:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Vous avez annulé le transfert du fichier "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Le contact a annulé le transfert du fichier "%1"." + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "Echec" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Envoi du fichier %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le port local." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not open a local port." +msgstr "Impossible d'ouvrir le port local." + +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Amorce du transfert de fichier" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +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:482 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "Impossible d'établir la connexion : %1" -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Réception du fichier %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "Syntaxe de commande invalide" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "Paramètre de commande invalide" + +#: network/msnconnection.cpp:384 +msgid "The email address you have tried to add is not a Live Messenger account" msgstr "" -"KMess n'est pas arrivé à se connecter au service de messagerie MSN.\n" -"Veuillez vérifier d'être connecté à internet.\n" -"Erreur système : %1 (code %2)." +"L'e-mail que vous avez essayé d'ajouter n'est pas un compte Live Messenger" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 perte de ping" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Nom de domaine incorrect" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "% pertes de pings" +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Déja connecté en" -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "La connexion avec le serveur a été perdue." +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" +msgstr "Le nom de compte saisi est invalide" -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "Le serveur distant a interrompu la connexion." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Autorisé" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Supprimé" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -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:740 -msgid "Show MSN Messenger Service status?" -msgstr "Voir l'état du service de messagerie MSN ?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Erreur du serveur" - -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:400 #, fuzzy msgid "" -"You have been disconnected because you connected from another MSN 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:1553 -msgid "Got synchronization" -msgstr "Synchronisation" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Authentification" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Confimation d'utilisateur reçue" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "En attente de la liste de contact..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Transfert au serveur de notification" - -#: network/msnnotificationconnection.cpp:1919 -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:2034 -msgid "Connecting..." -msgstr "Connexion en cours..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess a reçu une commande inconnue de la part du serveur: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Il y a eu une erreur interne dans KMess : %1" - -#: network/msnnotificationconnection.cpp:2243 -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:2252 -msgid "The account name given is invalid" -msgstr "Le nom de compte entré est invalide" - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"This 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:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "Votre liste de contacts est pleine" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "Paramètre SBP invalide" + +#: network/msnconnection.cpp:411 msgid "This contact is already on your list" msgstr "Ce contact est déjà présent dans votre liste" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 msgid "This contact is not on your list" msgstr "Ce contact n'est pas dans votre liste" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "Ce contact n'est pas en ligne" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Votre liste de contacts contient trop de groupes" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Déja dans ce mode" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "Ce groupe ne peut pas être modifié" +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" +"Ce contact ne peut être mis à la fois dans la liste noire et la liste blanche" -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "Ce groupe n'est pas vide" - -#: network/msnnotificationconnection.cpp:2288 +#: network/msnconnection.cpp:432 +#, fuzzy msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +"The group name is already present in your contact list. Please use a " +"different name" msgstr "" "Ce nom de groupe est déjà utilisé dans votre liste de contact MSN ou Hotmail" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "Ce nom de groupe est trop long" +#: network/msnconnection.cpp:436 +#, fuzzy +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:2300 +#: network/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Ce groupe ne peut pas être modifié" + +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "Le contact n'a pas été ajouté au groupe" + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "Ce groupe n'est pas vide" + +#: network/msnconnection.cpp:453 +#, fuzzy +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/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "Tentative de changement de group \"0\"" + +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Il y a eu une erreur interne dans KMess : %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Groupe invalide" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "Domaine vide" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "Mauvais format de commande ADL" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "Echec de commutation" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" msgstr "Le transfert vers le serveur de commutation a échoué" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Erreur de connexion directe (MSNSLP), la connexion a échouée" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "Erreur en accédant à la liste de contact, réessayez plus tard" +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Champ requis manquant" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "Non connecté" + +#: network/msnconnection.cpp:492 +#, fuzzy +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "

Activer la connection au service Live Messenger.

" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "La commande est désactivée" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" msgstr "Votre compte est banni." -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Vous ouvrez des sessions trop rapidement" +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Le transfert a échoué." -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "Mauvaise commande de données" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "Vous ouvrez des sessions de conversations trop rapidement" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" msgstr "Vous avez trop de sessions ouvertes" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" msgstr "Nom antipathique" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "Mauvaise donnée CVR" + +#: network/msnconnection.cpp:540 +#, 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:2359 -msgid "You can't start a chat with someone while you are invisible." +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "Le ticket d'authentification est incorrect" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot 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:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "Nouveaux contacts non acceptés" + +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"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:2366 -msgid "Your passport needs to be verified first." +#: network/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" msgstr "Votre compte Passport doit d'abord être vérifié." -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - Erreur MSN" +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "Mauvais ticket USR" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Il y a eu une erreur interne au serveur" +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "Erreur en accédant à la liste de contact, réessayez plus tard" -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "Le serveur est occupé" +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"Le service MSN est temporairement indisponible suite à une erreur interne." -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Le serveur est indisponible" +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "Le service MSN est temporairement indisponible, le serveur est saturé" -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "Le serveur de notification est innaccessible" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" msgstr "Le serveur va être innaccessible" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" msgstr "Le·serveur·va·bientôt être·innaccessible" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "L'écriture bloque" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "La session sature" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" msgstr "Le serveur est indisponible" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "L'authentification a échouée" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Nouveaux directeurs non acceptés" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess a reçu un message d'erreur inconnu de la part du serveur: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Attention : Le serveur s'arrêtera pour maintenance dans 1 minute !" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "Le serveur MSN subira un arrêt pour maintenance dans une minute" +"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:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Attention : Le serveur s'arrêtera pour maintenance dans %1 minutes !" +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Erreur MSN" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "Essai de connection HTTP..." + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "Authentification..." + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "Authentifié" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "Basculer sur un autre seveur..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Connexion en cours..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +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:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minute" +msgstr[1] "minutes" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Le serveur est arrêté pour maintenance dans %1 !" + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "Le serveur MSN subira un arrêt pour maintenance dans %1." + +#: network/msnnotificationconnection.cpp:2309 +#, fuzzy, kde-format +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:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." msgstr "" -"Échec d'authentification, KMess ne peut procéder au login passport.

" -"Détails : %1" -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "L'authentification a échouée (délai dépassé)" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "En attente de la liste de contact..." + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Attention: %1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Avertissement MSN" + +#: network/msnnotificationconnection.cpp:2869 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Erreur interne pour la raison : %1" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"Kmess n'a pas pu accéder au service web à distance.\n" -"\n" -"Détails : %1" +"

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

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Cette personne est déconnectée ou invisible." +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

Le compte %1 est connecté depuis un autre endroit.

" -#: network/msnswitchboardconnection.cpp:1052 -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/msnnotificationconnection.cpp:2920 +#, kde-format +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/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "Le message \"%1\" n'a pas été reçu !" +#: network/msnnotificationconnection.cpp:2932 +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 "" +"

Impossible de vous connecter sur le service Windows Live Messenger.
Maybe you need to authenticate before you can access the network?

" -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Impossible d'établir la connexion : %1" +#: network/msnnotificationconnection.cpp:2935 +#, fuzzy, kde-format +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/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" +#: network/msnnotificationconnection.cpp:2954 +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:2956 +#, fuzzy, kde-format +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'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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Erreur: %1

" + +#: network/msnnotificationconnection.cpp:2969 +#, kde-format +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:2980 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Erreur du Service Messenger: %1

" + +#: network/msnnotificationconnection.cpp:2982 +#, kde-format +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:2990 +#, kde-format +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

KMess Erreur: %1

" + +#: network/msnnotificationconnection.cpp:2992 +#, kde-format +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:3003 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Connection au réseau perdu.

" + +#: network/msnnotificationconnection.cpp:3005 +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:3061 +#, kde-format +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 "" +"Saisissez votre identifiant et mot de passe pour accéder au proxy réseau." + +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Erreur interne code : %2)" + +#: network/msnsockethttp.cpp:696 +#, kde-format +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:364 +msgid "Connection time limit exceeded" +msgstr "Temps limite de connexion dépassé" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 perte de ping" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pertes de pings" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "La connexion avec le serveur a été perdue." + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "L'adresse e-mail spécifiée, \"%1\", n'est pas valide !" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" +"L'adresse e-mail spécifiée, \"%1\", n'appartient pas à un compte Live " +"Messenger !" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Requête du service web invalide (%1)" + +#: network/soap/httpsoapconnection.cpp:408 +#, kde-format +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:479 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "Trop de redirections du service de login" -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Temps limite de connexion" +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Le serveur est indisponible" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "Dans la conversation de %2" +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "Le service web Live Messenger rencontre des problèmes" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 dit :
'%2'" +#: network/soap/httpsoapconnection.cpp:543 +#, fuzzy, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Réponse du service web invalide (%1)" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 vous a envoyé un message hors ligne :
'%2'" +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Pas de réponse du service web" -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "Conversation de %1 demande votre attention" +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Type de réponse inattendue du serveur (%1)" -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1 :
%2" +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "Dans la discussion de %1 :
%2" -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 Vous a envoyez un wizz !" +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 dit :
'%2'" -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1 vous a envoyé un clin d'œil !" +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 vous a envoyé un message différé :
'%2'" -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 désire utiliser la webcam !" +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "Conversation avec %1 demande votre attention !" -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 vous envoie un fichier !" +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 vous a envoyé une invitation !" +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 vous a écrit un message à main levée !" -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 a annulé la session webcam !" +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 Vous a envoyez un wizz !" -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 a annulé le transfert de fichier !" +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 vous a envoyé un clin d'œil !" -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 désire utiliser la webcam !" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 vous envoie un fichier !" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 vous a envoyé une invitation !" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 a annulé la session webcam !" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 a annulé le transfert de fichier !" + +#: notification/chatnotification.cpp:224 +#, fuzzy, kde-format +msgid "%1's activity has been canceled!" msgstr "L'activité de %1 a été annulée !" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 a accepté d'afficher la webcam !" +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 a accepté d'afficher la webcam !" -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 a accepté le transfert de fichier !" +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 a accepté le transfert de fichier !" -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 a accepté votre invitation !" +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 a accepté votre invitation !" -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 a mis fin à la session webcam !" +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 a mis fin à la session webcam !" -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" msgstr "Le transfert de fichier avec %1 est terminé !" -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" +#: notification/chatnotification.cpp:242 +#, fuzzy, kde-format +msgid "%1's activity has ended!" msgstr "L'activité de %1 s'est terminée !" -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "La session webcam de %1 a échouée !" +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "La session webcam de %1 a échouée !" -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "Le transfert de fichier avec %1 a échoué !" +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Le transfert de fichier avec %1 a échoué !" -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" +#: notification/chatnotification.cpp:251 +#, fuzzy, kde-format +msgid "%1's activity has ended with an error!" msgstr "L'activité de %1 s'est terminée avec une erreur !" -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 s'est absenté" +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
est maintenant connecté" -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 sera de retour dans un instant" +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
vient de s'absenter" -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 est maintenant occupé" +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
sera de retour dans un instant" -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 s'est déconnecté" +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
is désormais occupé" -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 est devenu invisible" +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
est devenu invisible" -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 est passé inactif" +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
a été ralenti" -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 est partit manger" +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
s'est déconnecté" -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 téléphone" +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
Au téléphone" -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 s'est connecté" +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
est partit manger" -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "E-mail reçu :
« %1 »
de « %2 »" +#: notification/newemailnotification.cpp:90 +#, kde-format +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'" -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "&Envoyer" +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Démarrer une conversation" -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "Nouvelle ligne" +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Laissez un message" -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Bar latérale" +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Voir le message" -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Ce contact n'est pas dans votre liste" +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Détails" -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Cliquez ici pour affiche le profil de ce contact." +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Lire l'e-mail" -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Cliquez pour envoyer un e-mail à ce contact." +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Masquer" -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Entrez un raccourci pour cette émoticône :" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Choisissez une image _" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Ajouter le contact" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: notification/systemtraywidget.cpp:78 +#, fuzzy msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" -"%1\n" -"vous a ajouté(e) dans sa liste de contact. Que voulez-vous faire ?" +"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." -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "&Ajouter cette personne dans votre liste de contact." +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Ancrage dans le System Tray" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "&Ne pas ajouter ce contact, mais le laisser voir votre statut." +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "&Empêcher cette personne de vous contacter et de voir votre statut." +#: notification/systemtraywidget.cpp:246 +#, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " - %1 (%2)" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "&Vider" +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Parcourir..." -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Saisissez vos identifiants de connexion :" +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Parcourir et couper l'image..." -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "Adresse e-mail :" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Voir les images..." -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Mot de passe :" +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Avatar" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "État à la connexion" +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "Le téléchargement de l'avatar a échoué." -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "Mémoriser ce profil" +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Une erreur est survenue en tentant de modifier votre avatar.\n" +"Vérifiez bien d'avoir sélectionner un fichier image valide." -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Connexion" +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Paramètres" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Rédigez ici votre message perso " +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Compte" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "En train d'écouter %1" +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Mon compte" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "Notification KMess" +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Contacts" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Conversation" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Archivage des conversations" + +#: 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 "" +"Cliquez ici pour supprimer votre compte de la liste des comptes " +"enregistrés.\n" +"Vous ne pouvez pas supprimer un compte actuellement connecté ni un compte " +"invité, qui sera de toutes façons supprimé à la déconnexion." + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "L'adresse e-mail que vous avez saisie est invalide : %1" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "L'adresse e-mail que vous avez saisi est déjà utilisée : '%1'" + +#: 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:160 +#, fuzzy, kde-format +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 '%1' ? Tous les paramètres " +"seront également supprimés." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Salut, comment ça va ? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Stacy" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Super !" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Je viens /juste/ de rentrer de mes vacances en Italie !" + +#: 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/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 +#, kde-format +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 KMess" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Comptes" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Votre pseudonyme :" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notifications" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web 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 web browser!" +msgstr "" +"Vous devez indiquez une commande à executer pour lancer un navigateur web " +"personnalisé !" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 "" +"La commande que vous avez spécifié pour lancer un navigateur web " +"personnalisé ne contient pas le paramètre '%u'. Sans cela, ouvrir des sites " +"web ne marchera pas.
Voulez-vous que KMess l'ajoute pour vous ?" + +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "" +"Vous devez indiquez une commande à executer pour lancer un client mail " +"personnalisé !" + +#: 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 emails will not work." +"
Do you want KMess to add it for you?" +msgstr "" +"La commande que vous avez spécifié pour lancer un client mail personnalisé " +"ne contient pas le paramètre '%u'. Sans cela, envoyer des emails ne marchera " +"pas.
Voulez-vous que KMess l'ajoute pour vous ?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "Vous devez choisir un dossier pour la réception de vos fichiers !" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Sélectionner le répertoire des fichiers" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Envoyez avec KMess" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess ne peut pas accéder au fichiers de configuration !

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "Envoyer un message aux développeur&s" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "Afficher les icones de Support" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +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:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Bienvenue sur %1." + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +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:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" +"Je n'aime pas la page d'accueil de cet assistant. Trop de temps perdu." + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"L'application ne fonctionne pas correctement quand je clique sur le " +"bouton Ajouter. Rien ne se passe." + +#: utils/likeback/likeback.cpp:388 +#, fuzzy +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:401 +#, fuzzy +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:404 +#, fuzzy +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Exemple" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +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:290 +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:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Commentaire envoyé" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +msgid "Standard text mode" +msgstr "Mode texte standard" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to the standard text mode." +msgstr "Cliquez ici pour basculer en mode texte standard." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "Mode écriture à main levée" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "" +"Cliquez ici pour passer en mode dessin, vous pourrez ainsi écrire ou " +"dessiner un message" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Émoticônes standards" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +#, fuzzy +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Cliquez ici pour afficher tous les émoticones par défaut d'MSN, vous pourrez " +"ainsi les insérer plus facilement dans vos messages." + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +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 "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Cliquez sur ce bouton pour montrer tous les émoticones personnalisées, ainsi " +"vous pourrez facilement les insérer dans vos messages." + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "&Envoyer" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Conversation" + +#. 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: file: chat/contactswidget.ui:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Cliquez ici pour ouvrir les paramètres du compte" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "Clear area" +msgstr "Tout effacer" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "Pen color" +msgstr "Couleur du crayon" + +#. 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 "Gomme" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Groupe initial" + +#. 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 à votre liste " +"de contacts :" + +#. 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:273 +msgid "Email address:" +msgstr "Adresse E-mail : " + +#. 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: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Choisissez une image : " + +#. 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 "" +"Tappez le message qui sera automatiquement envoyé aux personnes qui " +"tenteront de vous contacter :" + +#. 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: 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: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Archivage des conversations" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Filtrer par &conversation" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "Filtrer par &date" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "de" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +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 "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 the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "&Empêcher cette personne de vous contacter et de voir votre statut." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +#, fuzzy +msgid "Click this button to restore the display picture of this contact" +msgstr "Cliquez ici pour affiche le profil de ce contact." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Récupéré" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Groupes :" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Choisir un autre pseudo pour cette personne" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Me notifier quand mes contacts :" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Son : " + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Avatar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, 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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "Utiliser comme avatar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Effacer les données du cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +#, fuzzy +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"\n" +" Vous pouvez cacher les émoticones envoyés par ce contact. \n" +" Faites un clic droit sur un émoticone reçu et choisissez \"Cacher " +"cet \n" +" émoticone\". Avec cette page, vous pouvez restorer les émoticones " +"cachés.\n" +" " + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Cliquez ici pour supprimer l'émoticône sélectionnée" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "&Récupéré" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Contacts à inviter" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +msgid "Invite a person not on your contact 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:183 +msgid "Enter the email address of a person to invite" +msgstr "Saisissez l'e-mail du contact que vous souhaitez inviter" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +msgid "Invited Contacts" +msgstr "Contacts invités" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Elements à exporter :" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Format" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Contacts : " + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Tout sélectionner" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "Tout &désélectionner" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Exporter..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Fermer" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +#, fuzzy +msgid "Command to Current Tab" +msgstr "Fermer l'onglet" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Commande : " + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Type : " + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Standard" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Envoyer" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Commande payload (facultatif)" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Ouvrir" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Annuler" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "&Télécharger" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "Envoyer" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "Vider" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "Fermer" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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 "" +"Cliquez ici pour afficher les options pour le compte actuellement " +"sélectionné, ou faites défiler en utilisant la molette de la souris pour " +"naviguer entre les différents comptes sauvegardés" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:276 +msgid "" +"Enter 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: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Mot de passe :" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +#, fuzzy +msgid "Enter here your account's password" +msgstr "Saisissez votre mot de passe" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "Etat à la connexion" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "Choix du status MSN lorsque la connection a réussie." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +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:294 +msgid "Remem&ber account" +msgstr "Mémoriser ce profil" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +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:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Cliquez ici pour commencer à utiliser KMess ou pour annuler le temps " +"d'attente d'une connection" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Nouveau Compte" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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 "" +"Cliquez ici pour créer un nouveau compte Live.
Vous pouvez aussi " +"utiliser une adresse email existante" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "Mot de passe oublié ?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Cliquer ici pour vous connecter au site web de Live Messenger afin de " +"réinitialiser votre mot de passe" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Connexion" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Vue" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Actions" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, fuzzy +msgid "Form" +msgstr "Format" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "&Info sur le compte" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +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:354 +msgid "Enter a name other contacts should see when you are connected." msgstr "" "Entrez le nom que vous voulez que vos contacts voient lorsque vous " "apparaissez en ligne." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Votre adresse e-mail :" +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "&Pseudonyme : " -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 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: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Votre mot de passe :" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "Adresse &E-mail : " -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -2330,40 +5192,41 @@ msgstr "" "Entrez le mot de passe de votre compte MSN Passport. Vous pouvez créer un " "nouveau compte sur http//register.passport.com/." -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Avatar :" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "Mot de &passe :" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "En®istrer le mot de passe :" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." msgstr "&Changer..." -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Ne pas afficher d'avatar" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "&Ne pas utiliser" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Mémoriser les paramêtres de ce compte" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" "L'option \"Mémoriser ce profil\" est restée déselectionnée alors que vous " "vous connectiez, ainsi vos paramètres ne seront pas sauvegardés par défaut. " @@ -2372,702 +5235,1811 @@ 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: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Se &connecter automatiquement avec ce compte au démarrage" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "Mémoriser les paramètres de ce compte" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "Si activé, KMess se connectera automatiquement avec ce compte." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "État utilisé à la connexion" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +msgid "Log in &with this account automatically" +msgstr "Se connecter automatiquement avec ce compte au démarrage" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Connecter en t&ant que" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Vous devez vous connecter au site Passport pour confirmer votre adresse " +"email." + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +msgid "" +"You cannot 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." +"votre compte Passport n'a pas été vérifiée." -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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." - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "Demander un e-mail de vérification" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "Aller sur accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"\n" +" Vous avez besoin d'un compte Passport pour vous connecter " +"au réseau de \n" +"messagerie MSN. Vous pouvez vous enregistrer avec votre adresse e-mail \n" +"actuelle sur register.passport.com ou utiliser un compte Hotmail pour vous \n" +"connecter.\n" +" " + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live 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: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" msgstr "Créer un nouveau compte" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "Aller sur register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Alertes" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "Options de Statut" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Notification popup" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Me notifier quand mes contacts :" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "Se &connectent" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy 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: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Débutent une conversation avec moi" - -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -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." - -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "M'&envoient un message" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -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: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Changent d'état" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -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: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "Se &déconnectent" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -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: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Afficher une notification lors de la réception d'un e-mail" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Masquer les popups après" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Choisissez la durée d'affichage des popups de notification." - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "secondes" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -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: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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 "" -"

Quand des contacts veulent attirer votre attention, ils peuvent " -"envoyer un wizz. Par défaut la fenêtre de conversation remue lors de " -"l'envois ou de la réception d'un wizz. Désactivez cette option si vous " -"considérez cet effet vibratoire comme trop indisposant.

\n" -"

Notez toute de même que quand cette option est activée, KMess limite " -"quand même le remou. Les contacts peuvent en effet envoyer une tripotée de " -"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: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Informer les contacts du morceau que j'écoute." - -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -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: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Changer le statut en \"Absent - &Inactif\" quand vous êtes inactif" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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." -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Apparaître comme innactif après" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Changer le statut en \"Absent - &Inactif\" quand vous êtes inactif" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" "Choisissez le délai d'innactivité, en minute, avant que KMess ne change " "votre statut en \"Absent - Innactif\"." -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Apparaître comme inactif après" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 msgid "minutes" msgstr "minutes" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Archivage des conversations" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "&Archiver toutes les conversations" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Archiver les conversations dans ce répertoire :" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"Impossible d'activer l'auto-inactivité. KMess a été compilé sans support de " +"la détection de l'inactivité." + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "Masquer les notifications quand mon état est occupé" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "Sauvegarder les comptes : " + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +#, fuzzy +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live 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:482 +msgid "&Add Account..." +msgstr "&Ajouter un compte..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Choisissez une émoticône et cliquez ici pour la supprimer." + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "&Edition" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +#, 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:500 +msgid "&Remove" +msgstr "Supp&rimé" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" +"Cochez cette case pour sauvegarder vos concersations pour les revoir plus " +"tard" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "Activer l'archivage des conversations" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +#, fuzzy +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"Si activé, KMess sauvegarde vos historiques en HTML ou en fichiers textes" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Enregistrer les conversations dans des fichiers" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +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:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +msgid "Save chat logs as:" +msgstr "Enregistrer les conversations comme :" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "Pages Web (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "Texte plein" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Ces options vous permettent de choisir comment KMess va organiser vos " +"historiques dans le répertoire spécifié ci-dessous" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +#, fuzzy +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.\n" +" " +msgstr "" +"\n" +" En fonction des options que vous choisissez ici, KMess va " +"créer des répertoires pour vous aider à organiser vos historiques.\n" +" Utilisez l'option \"Qu'est-ce que c'est\" sur une option pour plus " +"de détails.\n" +" " + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +msgid "Separate logged chats by:" +msgstr "Classer les historiques par :" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +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:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "Année" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +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:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "Année suivie du mois" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +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:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "Année suivie du mois et du jour" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Enregistrer toutes les conversations dans le répertoire parent" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "Ne pas organiser les fichiers " + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "Cliquez ici pour choisir un répertoire" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "Le dossier dans lequel tous vos historiques seront sauvegardés" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." msgstr "" "Sélectionnez le répertoire de votre système dans lequel vous souhaiteriez " "enregistrer les conversations." -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organiser le dossier des conversations archivées par :" +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +msgid "Save chat logs in the following directory:" +msgstr "Archiver les conversations dans ce répertoire :" -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -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: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "St&yle" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "Année" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Mois" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Jour" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Enregistrer toutes les conversations dans le répertoire parent" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Police de vos messages :" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Contraindre les messages des contacts à utiliser cette police :" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Thème de la fénêtre de discussion :" - -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 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/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Afficher les &images dans les messages" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:624 +msgid "&Chat style:" +msgstr "Thème de la fenêtre de dis&cussion :" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "Obtenir de &nouveaux styles..." + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +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:633 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." msgstr "Active l'affichage d'émoticônes dans les conversations." -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Afficher l'&heure à côté des messages" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:636 +msgid "&Show emoticons" +msgstr "&Afficher les Emoticônes" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -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:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +msgid "Show &winks" +msgstr "Afficher les Emoticônes" -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" -"&Utiliser les effets de police dans les messages, ex : *gras*, /italique/ et " -"_souligné_" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, fuzzy 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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "Re&grouper les suites de messages d'un même contact" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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." +"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/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Client e-mail" +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:648 +msgid "&Group follow-up messages from the same contact" +msgstr "Re&grouper les suites de messages d'un même contact" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:654 +msgid "Enables the appearance of a timestamp in each chat message." msgstr "" -"Vous pouvez choisir quel logiciel de messagerie KMess doit lancer pour lire " -"vos e-mails." +"Active l'affichage de l'heure correspondant à la recepetion de chaque " +"message." -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Utiliser Hotmail" +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:657 +msgid "S&how timestamp" +msgstr "Afficher l'&heure à côté des messages" -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Utiliser une commande spécifique :" +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +msgid "Show &date" +msgstr "Afficher la &date" -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Notification d'e-mails" +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +msgid "Show s&econds" +msgstr "Affich&er les secondes" -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Afficher les infos relatives aux e-mails" +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "&Texte" -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +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:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "Police de vos &messages :" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, 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." +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." 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 " +"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: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +msgid "&Force messages from your contacts to use this font:" +msgstr "Contraindre les messages de vos contacts à utiliser cette police :" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Alertes de la fenêtre de discussion" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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 "" +"\n" +" Rend possible l'utilisation d'effet de police. Ecrire " +"*gras*, /italique/ ou _souligné_ fait que les mots encradrés apparaissent " +"respectivement en gras, \n" +"italiques ou soulignés.\n" +" " + +#. i18n: file: settings/chatstylepage.ui:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +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:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +#, fuzzy +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "Activer le format MSN Plus" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "&Comportement" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" +"\n" +"

Quand des contacts veulent attirer votre attention, ils peuvent \n" +"envoyer un wizz. Par défaut la fenêtre de conversation remue lors de \n" +"l'envoi ou de la réception d'un wizz. Désactivez cette option si vous \n" +"considérez cet effet vibratoire comme trop indisposant.

\n" +"

Notez toute de même que quand cette option est activée, KMess limite \n" +"quand même le remou. Les contacts peuvent en effet envoyer une tripotée de \n" +"wizz en un intervalle réduit, mais dans ce cas là KMess ne fera s'agiter " +"la \n" +"fenêtre de conversation qu'à la réception du premier wizz.

\n" +" " + +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +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: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +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:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "Afficher votre propre avatar &dans la fenêtre de conversation" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "Reg&ouper les conversations dans la même fenêtre :" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "Toujours" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "Pour les contacts du même groupe" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "Jamais" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +msgid "Display Options" +msgstr "Afficher les options" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." +msgstr "" +"\n" +" Si activé, une popup apparait lorsqu'un nouvel e-mail est " +"arrivé dans votre \n" +"boite de réception. Le nombre de messages non-lus est afiché au dessus de " +"la \n" "liste de contact. Cette option n'est disponible que pour les comptes Hotmail." +"\n" +" " -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "" -"Afficher une notification lorsqu'un e-mail est reçu dans d'autres dossiers" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "Afficher le nombre de mails non l&us" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +#, fuzzy msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." 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." +"\n" +" Si activé, KMess informe les contacts du morceau de musique " +"que vous êtes en train \n" +"d'écouter. Cette information est obtenue depuis votre logiciel de lecture " +"audio, s'il est en activité et supporté. \n" +" " -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" +msgstr "Informer les contacts du morceau que j'écoute." + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" +"Si activé, le logo de KMess sera affiché au fond de la liste de contacts." + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "Afficher l'&image d'arrière-plan" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "Format de la liste de contacts" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +#, fuzzy +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "Activer le format MSN &Plus" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "Afficher l'adresse &email des contacts à la place de leur pseudo" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" msgstr "Thèmes d'&émoticônes" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Styles d'émoticônes disponibles :" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" msgstr "Émoticônes &personnalisées" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Émoticônes personnalisée de ce compte :" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +msgid "Available custom emoticons:" +msgstr "Émoticones personnalisées :" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "Ajouter" +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" +msgstr "Cliquez ici pour ajouter une nouvelle émoticône personnalisée" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Cliquez" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +msgid "Add Ne&w..." +msgstr "Ajouter un nouveau..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Cliquez ici pour ajouter une nouvelle émoticône personnalisée pour envoyer à " -"vos contacts." +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" +msgstr "Cliquez ici pour renommer l'émoticone sélectionnée" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 msgid "Re&name" -msgstr "Re&nommer le Groupe" +msgstr "Re&nommer" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "" +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "Cliquez ici pour supprimer l'émoticône sélectionnée" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" msgstr "Supprimer" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Choisissez une émoticône et cliquez ici pour la supprimer." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "Navigateur web" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "dit :" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "Choisissez cette option pour utiliser le navigateur par défaut de KDE." -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Parcourir et couper l'image " +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "&Utiliser le navigateur par défaut de KDE" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Avatar" +#. 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:814 rc.cpp:849 +msgid "Select this option to choose from a list of installed browsers." +msgstr "Choisissez le navigateur parmi ceux disponibles." -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Le téléchargement de l'avatar a échoué." +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:817 +msgid "&Use an installed browser:" +msgstr "&Utiliser un navigateur déjà installé : " -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. 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:820 rc.cpp:855 +msgid "Choose this option to enter the path to your favorite browser." msgstr "" -"Une erreur est survenue en tentant de modifier votre avatar.\n" -"Vérifiez bien d'avoir sélectionner un fichier image valide." +"Choisissez cette option pour entrer le chemin du navigateur de votre choix." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Paramètres" +#. 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:823 rc.cpp:858 +msgid "&Specify a custom command:" +msgstr "&Spécifiez une commande personnalisée : " -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Compte" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Conversation" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Etes-vous sûr(e) de vouloir supprimer ce compte ?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Salut, comment ça va ? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Stacy" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Super !" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Je viens /juste/ de rentrer de mes vacances en Italie !" - -#: systemtraywidget.cpp:91 +#. 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:827 rc.cpp:862 +#, no-c-format msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." 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:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Ancrage dans le System Tray" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Utiliser '%u' pour insérer une URL dans la ligne de commande." -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "Client e-mail" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +msgid "Use &Live Mail if the account supports it" +msgstr "Utiliser Live Mail si le compte le supporte" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +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: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" +msgstr "Utiliser le client Email par défaut de KDE" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "Utiliser un client e-mail déjà installé : " + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, 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: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +msgid "&Save all received files in one directory:" +msgstr "&Archiver toutes les conversations dans ce répertoire :" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +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:881 +msgid "and" +msgstr "et" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "pour le transfert de fichiers" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Cliquez ici pour ouvrir les paramètres du compte" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Cliquez ici pour supprimer l'émoticône sélectionnée" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "Votre commentaire : " + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +msgid "Your comment is about:" +msgstr "Votre avis est : " + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "Quelque chose que vous aimez" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "Quelque chose que vous détestez" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "Aider à l'amélioration de l'application" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "Vous désirez une nouvelle fonctionnalité" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +#, fuzzy +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 (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "Images" + +#~ msgid "Ink message" +#~ msgstr "Message à main levée" + +#~ msgid "" +#~ "If you have added any custom emoticons, click this button to view them, " +#~ "so you can easily insert them in your messages." +#~ msgstr "" +#~ "Si vous avez ajouté des émoticônes personalisées, cliquez ici pour les " +#~ "afficher, vous pourrez ainsi les insérer plus facilement dans vos " +#~ "messages." + +#~ msgid "&Do not filter" +#~ msgstr "Ne pas filtrer" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Afficher une Popup quand ce contact se connecte ou se déconnecte" + +#~ msgid "File format used for saving:" +#~ msgstr "Format de fichier pour la sauvegarde : " + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Émoticônes personnalisées de ce compte :" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "

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

" + +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Ignorer cet &émoticône" + +#, fuzzy +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "Ne peut pas bloquer maintenant !" + +#~ msgid "Ed&it Notes" +#~ msgstr "Ed&iter les notes" + +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Effacer l'avatar" + +#~ msgid "Search for C&ontact" +#~ msgstr "Rechercher par C&ontact" + +#~ msgid "Search by &Interest" +#~ msgstr "Rechercher par &Intérêts" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Vos e-mails :" + +#~ 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." + +#~ 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." + +#~ 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 "" +#~ "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 "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." + +#~ msgid "Picture:" +#~ msgstr "Image : " + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "" +#~ "Vous pouvez choisir quel logiciel de messagerie KMess doit lancer pour " +#~ "lire vos e-mails." + +#~ msgid "Use a specified command:" +#~ msgstr "Utiliser une commande spécifique :" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "Ce compte n'a pas de boîte de réception Hotmail !" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "E-mail" + +#~ msgid "Remove group" +#~ msgstr "Supprimer le Groupe" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Avatar" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "Vous avez 1 nouveau message dans votre boîte de réception." + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "Vous avez %1 nouveaux messages dans votre boîte de réception." + +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "Le transfert de % a échoué. Impossible d'ouvrir le fichier" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Bar latérale" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "Nouveau &Contact" + +#~ msgid "Enter your login information:" +#~ msgstr "Saisissez vos identifiants de connexion :" + +#~ msgid "Your friendly name:" +#~ msgstr "Votre pseudonyme :" + +#~ msgid "Your password:" +#~ msgstr "Votre mot de passe :" + +#~ msgid "Status to set at login:" +#~ msgstr "État utilisé à la connexion" + +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Afficher une notification lors de la réception d'un e-mail" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Organiser le dossier des conversations archivées par :" + +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Afficher les &images dans les messages" + +#~ msgid "Use Hotmail" +#~ msgstr "Utiliser Hotmail" + +#~ msgid "says:" +#~ msgstr "dit :" + +#~ msgid "Current name: " +#~ msgstr "Pseudo actuel : " + +#, 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 n'est pas arrivé à se connecter au service de messagerie MSN.\n" +#~ "Veuillez vérifier d'être connecté à internet.\n" +#~ "Erreur système : %1 (code %2)." + +#~ msgid "The remote server has closed the connection." +#~ msgstr "Le serveur distant a interrompu la connexion." + +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Voir l'état du service de messagerie MSN ?" + +#~ msgid "Received user confirmation" +#~ msgstr "Confimation d'utilisateur reçue" + +#~ msgid "Transfer to notification server" +#~ msgstr "Transfert au serveur de notification" + +#~ msgid "The server is too busy" +#~ msgstr "Le serveur est occupé" + +#~ msgid "The server is unavailable" +#~ msgstr "Le serveur est indisponible" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "KMess a reçu un message d'erreur inconnu de la part du serveur: %1" + +#~ msgid "Warning: Server closes for maintenance in 1 minute!" +#~ msgstr "Attention : Le serveur s'arrêtera pour maintenance dans 1 minute !" + +#~ msgid "Add contact" +#~ msgstr "Ajouter le contact" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "Notification d'e-mails" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Choplair, Andrea Blankenstijn" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "chopinou AT choplair DOT org, darkan9el AT gmail DOT com" + +#~ msgid "Show/Hide &Contact Sidebar" +#~ msgstr "Afficher/Masquer la barre &latérale" + +#~ msgid "Away - Idle" +#~ msgstr "Absent - Inactif" + +#~ msgid "chat-style-text" +#~ msgstr "Thème de la fénêtre de discussion :" + +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "L'adresse e-mail que vous avez spécifiée est invalide !" + +#~ msgid "(Away)" +#~ msgstr "(Absent)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Bientôt de retour)" + +#~ msgid "(Busy)" +#~ msgstr "(Occupé)" + +#~ msgid "(Invisible)" +#~ msgstr "(Invisible)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Absent - Inactif)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Parti manger)" + +#~ msgid "(On the Phone)" +#~ msgstr "(Au téléphone)" #~ msgid "The current status of your contact." #~ msgstr "L'état actuel de votre contact." +#, fuzzy +#~ msgid "The contact is listening to music" +#~ msgstr "Ce contact n'est pas dans votre liste" + #~ msgid "File transfer dialog message" #~ msgstr "Transferts de fichiers" diff --git a/po/hu.po b/po/hu.po index f5a05ac..7c6036e 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: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2007-12-02 19:10+0100\n" -"Last-Translator: rezso \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\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,871 +21,1759 @@ msgstr "" "X-Poedit-Language: Hungarian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Country: HUNGARY\n" +"X-Previous-Translators: rezso \n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Páder Rezső (rezso)" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "rezso@rezso.net" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "Nem vagyok a gépnél" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Neved" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Bejelentkezés..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Nem vagyok a gépnél" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, fuzzy, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored 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:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Biztonságos jelszótárolás" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importálás" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Törlés" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Megtartás" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "Nem tudod elindítani a meghívást, mert több partnerrel társalogsz." + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 csatlakozott a társalgáshoz." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "%1 elhagyta a társalgást, inaktívvá vált." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +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." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 és %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 és mások" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Ez egy automatikusan küldött üzenet)" + +#: chat/chat.cpp:829 +#, fuzzy, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" +"A KMess nem tudta elmenteni a társalgás.
A megadott „%1” könyvtár " +"nem létezik." + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Animációt kaptál %1 partnertől" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Animációt kaptál %1 partnertől" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +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:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1 hangklipet küldött, de a KMess ezt még nem támogatja." + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger 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:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +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:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +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:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 animációt küldött!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 animációt küldött!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +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:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +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:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"A %1 partnertől kapott wink animáció nem jeleníthető meg, mert a " +"cabextracttal nem sikerült kicsomagolni." + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"A %1 partnertől kapott wink animáció nem jeleníthető meg, mert a " +"cabextracttal nem sikerült kicsomagolni." + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 csatlakozott a társalgáshoz." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 csatlakozott a társalgáshoz." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 rezgő figyelmeztetést küldött!" + +#: chat/chat.cpp:1463 +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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 csatlakozott a társalgáshoz." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +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:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Rezgő figyelmeztetést küldtél %1 partnernek" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Rezgő figyelmeztetést küldtél!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 animációt küld: %2" -#: chat/chatmessagestyle.cpp:296 +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 üzenete:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, fuzzy, kde-format +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:366 +#, fuzzy, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "%1 emotikon hozzáadása" -#: chat/chatview.cpp:463 -msgid "" -"Could not save chat log. 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." +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Újrakapcsolódás" -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:300 +#, kde-format +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 "" +"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:439 +#, 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:458 +#, fuzzy, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Fájl felülírása" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "&Felülírás" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." -msgstr "&Emotikon hozzáadása" +msgstr "&Emotikon hozzáadása…" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "&Emotikon hozzáadása…" + +#: chat/chatview.cpp:834 msgid "Send &Email" msgstr "&E-mail küldése" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "E-&mail másolása" +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "Partner &felvétele" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "&E-mail cím másolása" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "Ugrás a &link címére" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "&Cím másolása" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "&Szöveg másolása" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "&Mindent kijelöl" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "Társalgás mentése &fájlba" +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "Szöveg &keresése…" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Társalgás" +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +msgid "C&lear Chat" +msgstr "&Ablak törlése" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "Nem tudod elindítani a meghívást, mert több partnerrel társalogsz." +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." +msgstr "Társalgás mentése &fájlba…" -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 csatlakozott a társalgáshoz." - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "%1 elhagyta a társalgást, inaktívvá vált." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 elhagyta a társalgást." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Társalgás" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 és %2 - Társalgás" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 és mások - Társalgás" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Partnerek" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emotikonok" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" msgstr "Saját emotikonok" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Ez egy automatikusan küldött üzenet)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 +#, fuzzy msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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 "" -"Az animáció nem jeleníthető meg. Győződj meg róla, hogy a 'cabextract' " -"telepítve van." +"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:1502 -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/chatwindow.cpp:340 +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:1603 -msgid "You have received a wink from %1" -msgstr "Animációt kaptál tőle: %1 " +#: chat/chatwindow.cpp:341 +#, fuzzy +msgid "Close All Tabs" +msgstr "&Minden fül bezárása" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "'%1' üzenet nem lett elküldve." +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "Aktuális fül bezárása" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "%1 rezgő figyelmeztetést küldött." +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "&Meghívás…" -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Rezgő figyelmeztetést küldtél neki: %1" +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." +msgstr "&Fájl küldése…" -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Rezgő figyelmeztetést küldtél!" +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "Webkamerás társalgás" -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 ír." - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 és %2 üzenetet írnak." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 és %3 üzenetet írnak." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "&Fájl küldése" - -#: chat/chatwindowinterface.cpp:174 +# FIXME -- biztos mindenki tudja, hogy ez a GnomeMeeting/Ekiga jellegű Meetingre vonatkozik? +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "&Megbeszélés kezdése" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 msgid "Send a &Nudge!" msgstr "Rezgő figyelmeztetés küldése" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "&Megbeszélés indítása vagy befejezése" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." +msgstr "Társalgás mentése…" -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Társalgás mentése" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "&Minden fül bezárása" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Meghívás" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Társalgás" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "&Betűtípus módosítása" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" -msgstr "Betűtípus &színének módosítása" +msgstr "Betűk &színének módosítása" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Emotikon beszúrása" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "&Emotikonok megjelenítése" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "&Partnerek oldalsáv megjelenítése/elrejtése" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "&Idő megjelenítése" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Partnerek oldalsáv megjelenítése/elrejtése" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "&Panelek" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "E-mail küldé&se" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "&Helyesírásellenőrzés engedélyezése" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +# FIXME -- biztos mindenki tudja, hogy ez a GnomeMeeting/Ekiga jellegű Meetingre vonatkozik? +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "Megbeszélés" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Megbökés" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "&Fájl küldése" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Partnerpanel be- és kikapcsolása" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Partnerek" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Szabványos emotikonok paneljának be- és kikapcsolása" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emotikonok" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Saját emotikonok paneljának be- és kikapcsolása" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Saját emotikonok" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "&Betűtípus" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "Betűk &színe" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "Ablak törlése" + +#: chat/chatwindow.cpp:603 +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:1026 +#, fuzzy +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +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:1029 +#, fuzzy +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Hibás /status szintaxis" + +#: chat/chatwindow.cpp:1092 +#, fuzzy +msgid "You cannot use the /block command in a group chat." +msgstr "Nem blokkolhatsz senkit egy csoportos társalgásban." + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +#, fuzzy +msgid "You cannot use the /unblock command in a group chat." +msgstr "Nem blokkolhatsz senkit egy csoportos társalgásban." + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +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:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Ismeretlen parancs" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Társalgás" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Társalgás" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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/chatwindow.cpp:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Menü elrejtése" + +#: chat/chatwindow.cpp:1887 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 ír…" + +#: chat/chatwindow.cpp:1897 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 és %2 ír…" + +#: chat/chatwindow.cpp:1901 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 és még %3 résztvevő ír…" + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, fuzzy, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

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:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "&Privát beszélgetés indítása" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "&E-mail küldése" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "&Profil megjelenítése" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Tulajdonságok" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "Partner &felvétele" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" msgstr "Partner &engedélyezése" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" msgstr "Partner &törlése" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "Partner ti<ása" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "Partner tiltásának &feloldása" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" msgstr "&Baráti név" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "&Személyes üzenet" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" msgstr "&E-mail cím" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "&Másolás..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Információ" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Megjelenítendő kép" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "&Feljegyzések" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "Emotikonok" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" +msgstr "&Másolás…" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Letiltott" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Távol" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "A partner %1 állapotú" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Rögtön jövök" +#: chat/emoticonswidget.cpp:289 +#, fuzzy +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not 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/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Elfoglalt" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Beszúrás a társalgásba" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Kijelentkezve" +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Ú&j hozzáadása…" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Nincs a gépnél" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Szerkesztés" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Ebéd" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Törlés" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not 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:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 verzióval kompatibilis" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 verzióval kompatibilis" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 verzióval kompatibilis" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Elérhető" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Elfoglalt" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Távol" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Távol, automatikus válasszal" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inaktív" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Rögtön jövök" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Telefon" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "A partner nincs bejelentkezve" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Ebéd" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "Társalgás szövegének stílusa" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Láthatatlan" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "A fiókhoz nem tartozik Hotmail cím!" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Kijelentkezve" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Státuszom" + +#: contact/msnstatus.cpp:218 +#, 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:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "A felvenni kívánt személy e-mail címe:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "A megadott e-mail cím érvénytelen!" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Új emotikon hozzáadása" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "\"%1\" emotikon már létezik, lecseréled?" +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Emotikon szerkesztése" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Távollét üzenet megadása" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "„%1” emotikon már létezik, lecseréled?" #: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "Automatikus távolléti üzenet" + +#: dialogs/chathistorydialog.cpp:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "&Társalgás stílusa:" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Add meg az automatikus válaszüzenetet\n" -"amit azok fognak megkapni, akik üzenni akarnak neked:" -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Alternatív név használata e személyhez" +#: dialogs/chathistorydialog.cpp:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Nem nyitható meg a helyi port." -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Buborékjelző megjelenítése, amikor a partner be- vagy kijelentkezik" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Kapcsolódás..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Kép:" +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Nincs bejelentkezve" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Hang:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Valaki felvett a kontaktlistájára" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"felvett a partnerlistájára." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +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:282 +#, kde-format msgid "Contact Properties for %1" msgstr "%1 partner adatai" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "E-mail cím: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Kapcsolódva" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Jelenlegi név:" +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "Még nem láttuk online" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "Nem üzent még sose" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Utoljára láttuk: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Utoljára üzent: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-mail cím: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Kliens: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Partnerek" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "A meghívás elutasítva. A másik kliens nem támogatja." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Partner meghívása" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Partnerlista elmentése megtörtént" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" -msgstr "Hálózat ablak" +msgstr "Hálózatablak" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Fül mentése" +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "Fül &mentése" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Fül törlése" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "Fül &törlése" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Fül bezárása" +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" +msgstr "&Minden fül bezárása" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Nincsenek kapcsolatok. A hálózat ablak nem nyitható meg." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Nincsenek kapcsolatok.\n" +"A hálózatablak nem nyitható meg." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"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:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "A fő kapcsolat fül nem zárható be." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +#, fuzzy +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"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:1303 +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:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Ilyen fajta kapcsolatnak nem lehet parancsot küldeni!" + +#: 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 "Megszakítva" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Sikertelen!" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "Kész" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 byte" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "%1 / %2 fogadva" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 / %2 fogadva." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "%1 / %2 elküldve" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 / %2 elküldve." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "végtelen" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" msgstr "Fájlátvitelek" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Kiválaszt" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Törlés" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Válaszd ki vagy töröld az avatarodat" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Biztosan törölni akarod ezt a fiókot?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Megjelenítendő kép" + +#: emoticontheme.cpp:627 +#, kde-format 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:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Mosoly" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" -msgstr "Animáció" +msgstr "Kacsintás" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Nyelvöltés" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Vigyor" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Szomorú" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Sír" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "Mérges" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Zavarodott" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Zavarban van" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Csalódott" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Forró" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Vicsorgás" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Idióta" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Beteg" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Meglepett" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Party" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Álmos" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Gondolkodó" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Ne mondd el senkinek" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Titok" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Meglepődik" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Gúnyos" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Nem tudom" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Rögtön jövök" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Angyal" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Ölelés (fiú)" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Fiú" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Vörös szív" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Vörös rózsa" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "Oké!" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Kutya pofa" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Nap" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Ördög" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Ölelés (lány)" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Lány" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Törött szív" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Hervadó rózsa" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Na ne..." -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Macska pofa" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Alvó félhold" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Vörös ajkak" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Taps" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Keresztezett ujjak" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Autó" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Repülőgép" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Teknős" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" -msgstr "Kígyó" +msgstr "Csiga" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Fekete bárány" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Birka" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Kecske" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Denevér" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Söröskorsó" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "Martinis pohár" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "Kávéscsésze" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Születésnapi torta" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Tányér" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Tál" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Csillag" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Szivárvány" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Viharfelhő" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Villámlás" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Esernyő" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Sziget pálmafával" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "Telefonkagyló" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "E-mail" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Óra" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Filmszalag" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Jegyzet" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Bilincs" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Pénz" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Izzó" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "Cigaretta" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "Focilabda" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Ajándék" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Számítógép" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" msgstr "KMess ikon" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "A megadott partnercím érvénytelen: '%1'" +#: initialview.cpp:239 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Nem lehet újracsatlakozni, mert nem található a fiók." -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" +#: initialview.cpp:252 +#, fuzzy +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:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Internetkapcsolatra vár…" + +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Nincs internetkapcsolat" + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Kapcsolódás" + +#: initialview.cpp:601 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Mégsem" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Töltsd ki mint az e-mail címedet, mind a jelszavadat." + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Helytelen e-mail cím" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "%1 partner már szerepel a listádon" + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Partner információ" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Új csoport" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Csoport hozzáadása" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "A csoport új neve:" +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Az új csoport neve:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Távol automatikus válasszal" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Inaktív" - -#: kmess.cpp:715 +#: kmess.cpp:576 +#, kde-format 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:718 -msgid "Remove contact" +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" msgstr "Partner törlése" -#: kmess.cpp:720 -msgid "Remove and block" +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" msgstr "Törlés és tiltás" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Csoport törlése" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" @@ -888,672 +1781,1379 @@ msgstr "" "Biztosan el akarod távolítani %1 csoportot a partnerlistádról?" -#: kmess.cpp:763 -msgid "Remove group" -msgstr "Csoport törlése" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Törlés" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "Speciális csoport, nem módosítható" -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "Csoport átnevezése" +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "Csoport át&nevezése" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Kapcsolódva" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "A csoport új neve:" -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "Kijelentkezett" - -#: kmess.cpp:1669 +#: kmess.cpp:753 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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.

" +"

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

" 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.

" +"

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

" -#: kmess.cpp:1673 -msgid "Error with notifications" +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatikus bejelentkezés nem sikerült" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Kapcsolódás..." + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Kijelentkezve" + +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, kde-format +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:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Hiba az értesítéseknél" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Új &fiók" +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Új &partner" +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "&Kapcsolódás" -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Új &csoport" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "Partner k&eresése" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Keresés ér&deklődés szerint" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Fiók &beállítások" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Műveletek" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Bejele&ntkezés" - -#: kmessinterface.cpp:188 +#: kmessinterface.cpp:161 msgid "&Disconnect" msgstr "&Kijelentkezés" -#: kmessinterface.cpp:189 +#: kmessinterface.cpp:162 msgid "Show My &Profile" msgstr "&Profilom megjelenítése" -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Státuszom" - -#: kmessinterface.cpp:220 -msgid "&Connect" -msgstr "&Kapcsolat" - -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "&Engedélyezett partnerek megjelenítése" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "&Kijelentkezett partnerek megjelenítése" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "&Törölt partnerek megjelenítése" -#: kmessinterface.cpp:278 +#: kmessinterface.cpp:170 #, fuzzy -msgid "Show &Display Pictures" -msgstr "Kép megjelenítése" +msgid "Show &History Box" +msgstr "&Társalgás stílusa:" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "&Hálózat ablak megjelenítése" +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "&Keresőmező megjelenítése" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Üres &csoportok megjelenítése" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "&Avatarok mérete" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "Partnerek &rendezési módja" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Á&tviteli ablak megjelenítése" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Új &partner…" + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Új &csoport…" + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "Partnerlista exportálása…" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "&Társalgás stílusa:" + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Új &fiók…" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Új &fiók…" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "&KMess beállításai…" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Kijelölés &menüje" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Ne mutassa" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Kicsi" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Közepes" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Nagy" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Csoport" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Á&tvitel ablak megjelenítése" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Vegyes" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Vétel itt: %1" +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "&Hálózatablak megjelenítése" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "<Írd be ide a személyes üzeneted>" +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Bejelentkezés %2 felhasználóként" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 bejelentkezett" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 kijelentkezett" + +#: kmessview.cpp:599 msgid "Cha&t" msgstr "&Társalgás" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Tulajdonságok" - -#: kmessview.cpp:623 -msgid "&Remove from group" +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" msgstr "Tör&lés a csoportból" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "Á&thelyezés másik csoportba" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" msgstr "&Másolás másik csoportba" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "Á&thelyezés másik csoportba" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "Csoport mozgatása &lefelé" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "Csoport mozgatása &felfelé" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "Csoport &törlése" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "Csoport át&nevezése" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "1 új leveled érkezett." +# 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:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Az illető &felvétele a kontaktlistára" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "%1 új leveled érkezett." +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-mail cím:" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Távol)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Kliens: %1" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Rögtön jövök)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Elfoglalt)" +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "Jegyzet" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Láthatatlan)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Letiltott" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Nincs a gépnél)" +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Utoljára láttuk: %1" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Ebéd)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Utoljára üzent: %1" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Telefon)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "%1 csoport" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Automatikus bejelentkezés a megadott e-mail címmel" +#: kmessview.cpp:1224 +#, kde-format +msgctxt "Contacts counters in normal group tooltip" +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" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 partner" +msgstr[1] "%1 partner" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Add meg a személyes üzeneted itt>" + +#: kmessview.cpp:1652 +#, 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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Visszautasítottad a meghívást." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "&Társalgás stílusa:" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 új e-mail" +msgstr[1] "%1 új e-mail" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "Egy MSN Messenger kliens KDE-hez" + +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, 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 "Developer and project founder" +msgstr "Fejlesztő, a projekt alapítója" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Fejlesztő" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Projekttámogatás" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Aktív fejlesztő" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:124 +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:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 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:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 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:73 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:73 +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:74 msgid "Cartoon emoticons" msgstr "Cartoon emotikonok" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Alapértelmezett hangok" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "Oxygen stílusú KMess ikon" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotisz Papadopulosz" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 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:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "További arab fordítások" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Brazíliai portugál fordítás" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "További brazíliai portugál fordítás" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Katalán fordítás" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "További olasz fordítások" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "Lin Hao-Hsziang" + +#: main.cpp:93 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:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "Liu Szi-Zsuang" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "További egyszerűsített kínai fordítás" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "Hagyományos kínai fordítás" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Jen-Csu Csen" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Hagyományos kínai fordítás" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 msgid "Danish translation" msgstr "Dán fordítás" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:100 msgid "More Danish translation" msgstr "További dán fordítások" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 msgid "Dutch translation" msgstr "Holland fordítás" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" msgstr "További holland fordítások" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "Német fordítás folytatása, görög fordítás" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "További francia fordítások" + +#: main.cpp:111 msgid "Estonian translation" msgstr "Észt fordítás" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:112 msgid "Finnish translation" msgstr "Finn fordítás" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:113 main.cpp:114 msgid "More Finnish translation" msgstr "További finn fordítások" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:116 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:116 msgid "French translation" msgstr "Francia fordítás" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" msgstr "További francia fordítás, MSN6 emotikon definíciók" -#: main.cpp:107 -msgid "More French translation" -msgstr "Francia fordítás" +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" -#: main.cpp:109 +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:118 main.cpp:119 main.cpp:120 +msgid "More French translation" +msgstr "További francia fordítások" + +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "Magyar fordítás" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:123 +msgid "More Hungarian translation" +msgstr "További magyar fordítások" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:124 main.cpp:125 msgid "More Italian translation" msgstr "További olasz fordítások" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "Koreai fordítás" -#: main.cpp:113 -msgid "Norsk Bokmål translation" -msgstr "Norvég Bokmal fordítás" +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" -#: main.cpp:115 +#: main.cpp:128 +msgid "Norsk Bokmål translation" +msgstr "Bokmål norvég fordítás" + +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "Szlovén fordítás" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "Szlovák fordítás" + +#: main.cpp:133 +#, fuzzy +msgid "Matjaž Kaše" +msgstr "Matjaž kaše" + +#: main.cpp:133 msgid "Slovenian translation" msgstr "Szlovén fordítás" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:135 msgid "Spanish translation" msgstr "Spanyol fordítás" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 msgid "More Spanish translation" msgstr "További spanyol fordítások" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:144 msgid "Swedish translation" msgstr "Svéd fordítás" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "Svéd fordítás" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:147 msgid "Thai translation" msgstr "Thai fordítás" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:148 msgid "Turkish translation" msgstr "Török fordítás" -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "További török fordítás" +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" -#: main.cpp:129 +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "További török fordítások" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "MSNP12 támogatás, különböző javítások" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:154 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:130 +#: main.cpp:155 +msgid "File transfer thumbnails" +msgstr "Fájlátvitelek előnézeti képei" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "P4-Context mező támogatás" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Ximerama javítások" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Eredeti fájl vételi kód" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "KWallet támogatás" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "Figyelmeztetések blokkolása, winkek kikapcsolása, utolsó üzenet ideje" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "IRC-szerű parancsok a társalgási ablakban" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "&Társalgás stílusa:" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "Különböző többnyelvűségi javítások" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "Különböző többnyelvűségi javítások." -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "GnomeMeeting fejlesztő" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" -msgstr "Mindenes" +msgstr "Az ürge a papírszatyorral a fején" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Alapötlet és kódrészletek" -#: main.cpp:139 -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:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" -#: main.cpp:140 +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:173 +#, fuzzy +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:174 msgid "Idle timer code" msgstr "Tétlenségi időzítő kódja" -#: main.cpp:141 -msgid "Close-to-tray icon screenshot code" -msgstr "" +#: main.cpp:174 +msgid "KScreensaver" +msgstr "KScreensaver" -#: main.cpp:144 +#: main.cpp:175 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:175 +msgid "Close-to-tray icon screenshot code" +msgstr "Tálcára zárás screenshot kód" + +#: main.cpp:176 +msgid "Amarok" +msgstr "Amarok" + +# FIXME -- öööö, hogy van az magyarul, hogy crash? XD +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "Saját crashkezelő implementáció" + +#: main.cpp:179 +#, fuzzy +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" +"Ö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:179 msgid "Your name here?" msgstr "A te neved itt lesz?" -#: main.cpp:144 -#, fuzzy -msgid "" -"You are welcome to sent 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" -"Ha úgy érzed, a neved hiányzik innét, vedd fel velünk a kapcsolatot!" +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Neved" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "E-mail cím:" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Partnerlista elmentése megtörtént" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Automatikus bejelentkezés a megadott e-mail címmel" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "Debug teszt futtatása (csak fejlesztői változatnál)" + +# FIXME -- ugh. +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "Egyének" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Engedélyezett" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Törölve" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." msgstr "A partner visszavonta a folyamatot." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "A partner visszautasította a meghívást." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Visszavontad a folyamatot." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Visszautasítottad a meghívást." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to
accept or cancel?" -msgstr " Elfogadod vagy elutasítod?" +msgstr "Elfogadod vagy elutasítod?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." msgstr "Visszavonás." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +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:209 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +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 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "%1 fájl átvitele sikertelen. A fájlt nem sikerült elmenteni." + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." msgstr "%1 fájl átvitele sikertelen. A fájl nem nyitható meg." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Kapcsolódás %1 címhez, %2 porton" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Az átvitel megszakítva" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "A kapcsolat lérejött" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "%1 fájl átvitele sikeres." - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1 átvitele sikertelen. A fájl nem található." - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 átvitele sikertelen. A fájl nem olvasható." - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "%1 fájl küldése." - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Átvitel elfogadva." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Kapcsolódás %1 címhez, %2 porton" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "A partner visszavonta „%1” fájl átvitelét." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Visszavontad „%1” fájl átvitelét." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Visszautasítottad „%1” fájl átvitelét." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "A kapcsolat létrejött" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "%1 fájl sikeresen átküldve." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "%1 fájl sikeresen fogadva." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "%1 átvitele sikertelen. A fájl nem található." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "%1 átvitele sikertelen. A fájl nem olvasható." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "%1 fájl küldése (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the 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:3217 msgid "Negotiating options to connect" msgstr "Opciók egyeztetése a kapcsolódáshoz" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "A fájlátvitel meghívás törölve. A vett adat rossz." -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "%1 fájl átvitele sikertelen. A fájl nem nyitható meg." +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Elfogadtad „%1” fájl átvitelét." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "A partner visszavonta a küldést." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "A fájl nem írható" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1 átvitele sikertelen. A fájl nem található." - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 átvitele sikertelen. A fájl nem olvasható." - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "%1 fájl küldése (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: 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)." -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Ekiga (GnomeMeeting) indítása. Kapcsolódás: %1." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Partner meghívása megbeszélésre." -#: network/applications/mimeapplication.cpp:109 -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." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "A meghívás elutasítva. A másik kliens nem támogatja." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +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:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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:130 -msgid "The invitation was aborted. Timeout while waiting for file data." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +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:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +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:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "A meghívás megszakítva." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "A partner az asztala megosztását kezdeményezte." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "KRDC indítása. Kapcsolódás: %1." -#: network/applications/p2papplication.cpp:276 -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:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "A partner '%1' meghívást küldött, de ez nem támogatott." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" "A meghívás megszakítva. A partner rossz adatot küldött, vagy a KMess nem " "támogatja azt." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." msgstr "Az átvitel nem sikerült. Adatelőkészítés sikertelen." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -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:1624 -msgid "The transfer failed." -msgstr "Az átvitel nem sikerült." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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:2038 +#: network/applications/p2papplication.cpp:1192 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:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not 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:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "A partner elutasította a meghívást. Belső hiba lépett fel." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Várakozás kapcsolatra %1 címmel, %2 porton" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 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:3274 -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/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "Az átvitel nem sikerült. Belső hiba lépett fel." - -#: network/applications/p2papplication.cpp:3670 -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:4844 +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" msgstr "Várakozás a kapcsolódásra" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." 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:5022 +#: network/applications/p2papplication.cpp:3432 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred 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:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred 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/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +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/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Az átvitel nem sikerült." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Az átvitel nem sikerült. Belső hiba lépett fel." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" @@ -1561,725 +3161,2070 @@ msgstr "" "Hang alapú beszélgetésre kaptál meghívást, de ennek támogatása nincs " "telepítve" -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "Törölted a hang alapú beszélgetést." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "A meghívás törölve. Az audio eszköz nem nyitható meg." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Hang alapú beszélgetés indítása. Kapcsolódás: %1" -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Hang alapú beszélgetés indítása. Vétel: %1" -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "Partner meghívása hang alapú beszélgetésre." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "%1 átvitele törölve." +#: 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:136 +# 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 +#, fuzzy +msgid "You are invited to view this contact'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:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Visszavontad „%1” fájl átvitelét." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "A partner visszavonta „%1” fájl átvitelét." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Sikertelen" -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "%1 fájl küldése" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "%1 átvitele sikertelen. Nem nyitható meg a helyi port." -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not open a local port." msgstr "Nem nyitható meg a helyi port." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Fájlátvitel előkészítése" -#: network/extra/msnftpconnection.cpp:481 -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 +#, kde-format +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:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Nem hozható létre kapcsolat." -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "%1 fájl vétele" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." -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)" +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "Helytelen parancsformátum" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping elveszett" +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "Helytelen parancs paraméter" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 ping elveszett" +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "A megadott e-mail cím nincs regisztrálva az MSN Messengerhez" -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "A szerverkapcsolat elveszett." +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Hiányzó domainnév" -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "A távoli szerver lezárta a kapcsolatot." +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Már be vagy jelentkezve" -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Engedélyezett" +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" +msgstr "A megadott fióknév érvénytelen" -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Törölve" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -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." - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "MSN Messenger Service állapotának megjelenítése?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Szerverhiba" - -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:400 #, fuzzy msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "" -"Nem tudsz bejelentkezni.\n" -"Más klienssel vagy más helyről már bejelentkeztél.\n" -" " +"This 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:1553 -msgid "Got synchronization" -msgstr "Szinkronizálás" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Azonosítás" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Fogadott felhasználói megerősítés" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Várakozás a partnerlistára..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Adatok küldése a kapcsolatkezelő szervernek" - -#: network/msnnotificationconnection.cpp:1919 -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:2034 -msgid "Connecting..." -msgstr "Kapcsolódás..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "A KMess ismeretlen parancsot kapott a szervertől: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "KMess belső hiba: %1" - -#: network/msnnotificationconnection.cpp:2243 -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" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "A megadott fióknév érvénytelen." - -#: network/msnnotificationconnection.cpp:2255 -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." - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "A partnerlistád megtelt" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "Helytelen SBP paraméter" + +#: network/msnconnection.cpp:411 msgid "This contact is already on your list" msgstr "A partner már szerepel a listádon" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 msgid "This contact is not on your list" msgstr "A partner nincs rajta a listádon" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "A partner nincs bejelentkezve" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Túl sok csoport van a partnerlistádon (max: 30)" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Már ebben a módban vagy" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" +#: network/msnconnection.cpp:428 +#, fuzzy +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/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"A csoportnév már használatban van a Messenger vagy Hotmail partnerlistádon. " +"Adj meg egy másik nevet." + +#: network/msnconnection.cpp:436 +#, fuzzy +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/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" msgstr "A csoport nem módosítható" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "A partner nem lett felvéve ebbe a csoportba" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "A csoport nem üres" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "" -"A csoportnév már használatban van a Messenger vagy Hotmail partnerlistádon" +#: network/msnconnection.cpp:453 +#, fuzzy +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:2291 -msgid "The group name is too long" -msgstr "A csoport neve túl hosszú (max. 61 karakter)" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "A „0” csoportot próbáltad megváltoztatni" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "KMess belső hiba: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Hibás csoport" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "Üres domain" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "Helytelen ADL parancs formátum" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "Az üzenetkezelő szerver nem érhető el" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" msgstr "A küldés az üzenetkezelő szervernek nem sikerült" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Közvetlen kapcsolat (MSNSLP) hiba, a kapcsolódás sikertelen" -#: network/msnnotificationconnection.cpp:2316 -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/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Egy kötelező mező hiányzik" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "Nincs bejelentkezve" + +#: network/msnconnection.cpp:492 +#, fuzzy +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "Ezt a fiókot eltiltották az MSN szolgáltatás használatától." + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "Parancs letiltva" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" msgstr "A fiókod tiltott." -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Túl gyorsan nyitod meg a folyamatokat" +#: network/msnconnection.cpp:504 +msgid "Challenge response failed" +msgstr "Sikertelen kihívásválasz" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Túl sok nyitott folyamatod van" +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "Rossz parancsadat" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "Túl gyorsan nyitsz meg társalgási kapcsolatokat" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "Túl sok nyitott társalgásod van" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "Nem várt parancssorozat" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" msgstr "Rossz megjelenítendő név" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "Rossz CVR adat" + +#: network/msnconnection.cpp:540 +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:2359 -msgid "You can't start a chat with someone while you are invisible." +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "Az autentikációs jegy hibás" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" msgstr "Nem kezdeményezhetsz társalgást, amíg láthatatlan vagy." -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr "Korlátozott passportod van, szülői beleegyezés kell a csevegéshez." +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "Nem fogad új partnereket" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Először meg kell erősítened a passportodat." +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"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:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN hiba" +#: network/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "Először meg kell erősítened a Passportodat." -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Belső szerverhiba" +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "Rossz USR jegy" -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "A szerver foglalt" +#: network/msnconnection.cpp:575 +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:2416 -msgid "The server is unavailable" -msgstr "A szerver nem érhető el" +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"Az MSN szolgáltatás ideiglenesen nem elérhető, belső szerverhiba lépett fel." -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger 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/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "A kapcsolatjelző szerver nem működik" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" msgstr "A szerver leáll" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" msgstr "A szerver hamarosan leáll" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" -msgstr "Írás tiltva" +msgstr "Blokkoló írás" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "A folyamat túlterhelt" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" msgstr "A szerver nem érhető el" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "Azonosítás sikertelen" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Nem fogad új megbízásokat" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "A KMess ismeretlen hibaüzenetet kapott a szervertől: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Figyelmeztetés: a szerver le fog állni karbantartásra 1 perc múlva!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -"Az MSN szerver jelezte, hogy egy percen belül le fog állni karbantartásra." +"A KMess ismeretlen hibakódot kapott a szervertől: %1
Technikai " +"részletek: %2" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Figyelmeztetés: a szerver le fog állni karbantartásra %1 perc múlva!" +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN hiba" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "Megpróbáljuk inkább HTTP-n…" + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "Azonosítás…" + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "Azonosítva" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "Váltás egy másik szerverre…" + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Kapcsolódás..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +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:2100 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "1" +msgstr[1] "%1" + +# TAG -- maintenance_minutes +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "A szerver le fog állni karbantartásra %1 perc múlva!" + +# TAG -- maintenance_minutes +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" +"Az MSN szerver jelezte, hogy %1 percen belül le fog állni karbantartásra." + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +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:2310 +msgid "SOAP client is no longer valid." +msgstr "A SOAP kliens elvesztette érvényességét." + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "Azonosításra használható időkeret lejárt" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Várakozás a partnerlistára…" + +#: network/msnnotificationconnection.cpp:2796 +#, fuzzy, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN üzenet

%1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
KMess belső hiba: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, fuzzy +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"A KMess nem tudja feldolgozni a kijelentkezett állapotban kapott " -"üzeneteket.\n" -"\n" -"Részletek: %1" +"

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

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"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/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: passive notification message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"A Kmess nem tudja elérni a távoli webszolgáltatást.\n" -"\n" -"Részletek: %1" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "A partner nincs bejelentkezve, vagy láthatatlan." - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/msnnotificationconnection.cpp:2935 +#, fuzzy, kde-format +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 partner egy MSN7 lehetőséget kezdeményezett, amit a KMess nem támogat." +"

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/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "Nem fogadott üzenet: \"%1\"" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Nem hozható létre kapcsolat: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" +#: network/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" msgstr "" -"Szerverprobléma: Túl sok átirányítás a bejelentkeztető szolgáltatástól." -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

" +msgstr "

MSN üzenet

%1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "

A szerverkapcsolat elveszett.%1

" + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Belső hiba kódja: %2)" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" msgstr "Kapcsolódási időtúllépés" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "%1 társalgásában: %2" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping elveszett" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 üzenete:
'%2'" +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 ping elveszett" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 kapcsolat nélküli üzenetet küldött:
'%2'" +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "A szerverkapcsolat elveszett" -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "%1 társalgása figyelmet kér!" +#: network/soap/addressbookservice.cpp:777 +#, fuzzy, kde-format +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" -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1:
%2" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 rezgő figyelmeztetést küldött!" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1 animációt küldött!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 webkamerát szeretne használni." - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 fájlt küld!" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 meghívást küldött!" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 törölte a webkamera kapcsolatot!" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 törölte a fájlátvitelt!" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "%1 aktivitása törölve." - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 elfogadta a webkamera használatát." - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 elfogadta a fájlátvitelt." - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 elfogadta a meghívást." - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 bezárta a webkamera folyamatot." - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "A fájl átvitele kész: %1" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "%1 aktivitása befejeződött." - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "%1 webkamera folyamata sikertelen." - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "A fájlátvitel sikertelen: %1 !" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "%1 aktivitása hibával befejeződött." - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 új státusza: távol" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 új státusza: rögtön jövök" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 új státusza: elfoglalt" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 kijelentkezett" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 láthatatlan" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 új státusza: nincs a gépnél" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 új státusza: ebédel" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 új státusza: telefonál" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 elérhető" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Új e-mail:
'%1'
feladó: '%2'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "&Küldés" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "Új &sor" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Oldalsáv" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "A partner nincs rajta a listádon" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Kattints ide a partnered profiljának megtekintéséhez." - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "E-mail küldéséhez a partnerednek kattints ide." - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Add meg az emotikon kódját:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Válassz egy képfájlt:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Partner felvétele" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/soap/addressbookservice.cpp:787 +#, fuzzy, kde-format +msgctxt "Error message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"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/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -"%1\n" -"felvett a partnerlistájára. A Te választásod:" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Partner &felvétele a \"Barátok\" listájára" +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "A szerver nem érhető el" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "&Nem veszem fel, de láthatja, ha bejelentkezem." +#: network/soap/httpsoapconnection.cpp:479 +#, 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." -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "A szerver nem érhető el" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" msgstr "" -"Partner tiltása (nem léphet kapcsolatba veled és az elérhetőségedet sem " -"láthatja)" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "&Tisztítás" +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Add meg a bejelentkező adatokat:" +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "E-mail cím" +#: network/soap/passportloginservice.cpp:208 +#, fuzzy, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Nem várt választípus" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Jelszó" +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "%1 társalgásában:
%2" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Státusz bejelentkezéskor" +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 üzenete:
„%2”" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "Profil megje&gyzése" +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 kapcsolat nélküli üzenetet küldött:
„%2”" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Kapcsolódás" +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "%1 társalgása figyelmet kér!" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Add meg a személyes üzeneted itt" +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Vétel itt: %1" +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 kézírásos üzenetet küldött!" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess értesítés" +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 rezgő figyelmeztetést küldött!" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 animációt küldött!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 webkamerát szeretne használni." + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 fájlt küld!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 meghívást küldött!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 visszavonta a webkamera kapcsolatot!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 visszavonta a fájlátvitelt!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1 művelete törölve." + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 elfogadta a webkamera használatát." + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 elfogadta a fájlátvitelt." + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 elfogadta a meghívást." + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 bezárta a webkamera kapcsolatot." + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "A fájl átvitele %1 felhasználóval befejeződött." + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1 művelete befejeződött." + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1 webkamera folyamata sikertelen." + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "A fájlátvitel %1 felhasználóval sikertelen!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1 művelete hibával végződött." + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
most elérhető" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
elment" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
rögtön jön" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
most elfoglalt" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
láthatatlanná vált" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
inaktív lett" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
kijelentkezett" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
most telefonál" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
most ebédel" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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/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 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Ördög" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&E-mail küldése" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Elrejtés" + +#: 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 "" +"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/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, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Tallózás…" + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Kép keresése és méretre vágása…" + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Korábbi kép használata…" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Megjelenítendő kép" + +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "A megjelenítendő kép letöltése nem sikerült" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Hiba történt a megjelenítendő kép cseréje közben.\n" +"Győződj meg róla, hogy meglévő képfájlt választottál-e." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Beállítások" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Fiók" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Az én fiókom" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Partnerek" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Társalgás" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Társalgás naplózása" + +#: 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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"A megadott e-mail cím (%1) érvénytelen és nem használható fiókazonosítóként." + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "A megadott e-mail cím (%1) már használatban van." + +#: 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:160 +#, fuzzy, kde-format +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 a „%1” fiókot?
Minden, a fiókhoz tartozó " +"beállítás elvész." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Hello, milyen a kedved most? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Manó" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Nagyon jó!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "/Most/ értem haza egy *remek* buliból!" + +#: 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 "Helytelen parancs paraméter" + +#: 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, kde-format +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" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Megjelenítendő neved:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Értesítések" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "Add meg a nevet, amit partnereid látnak, amikor online vagy." +#: settings/miscellaneouspage.cpp:74 +#, fuzzy +msgid "No selectable web browsers detected." +msgstr "Nem találtunk böngészőt." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "E-mail címed:" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Nem találtunk e-mail klienst." -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +# FIXME -- saját helyett valami más? +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "Meg kell adnod egy konzolparancsot a saját böngésző indításához!" + +#: settings/miscellaneouspage.cpp:291 +#, fuzzy, c-format msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"The console command you have specified to launch a custom web 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?" + +# 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: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 emails 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:344 +msgid "You have to select a directory for the received files!" +msgstr "Ki kell választanod egy könyvtárat a fogadott fájloknak!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Fogadott fájlok könyvtára" + +#: 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:242 +msgid "&Send a Comment to the Developers" +msgstr "Vélemény &küldése a fejlesztőknek" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "&Emotikonok megjelenítése" + +#: utils/likeback/likeback.cpp:319 +#, fuzzy, kde-format +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!" + +#: utils/likeback/likeback.cpp:324 +#, fuzzy, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Üdvözlünk a %1 programban!" + +#: utils/likeback/likeback.cpp:332 +#, fuzzy +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on '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:339 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'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:346 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on '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:356 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on '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:367 +#, fuzzy +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:374 +#, fuzzy +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this 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:381 +#, fuzzy +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows 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:388 +#, fuzzy +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:401 +#, fuzzy +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:404 +#, fuzzy +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:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, fuzzy, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "

Írhatsz egy rövid véleményt a %1 fejlesztőinek.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +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:290 +#, fuzzy +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:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Vélemény elküldve" + +#: utils/likeback/likebackdialog.cpp:304 +#, fuzzy +msgctxt "Dialog box text" +msgid "" +"

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

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:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Hiba a vélemény elküldésekor" + +#. 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 the 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 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 +#, fuzzy +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +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: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 +#, fuzzy +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +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: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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "&Küldés" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Társalgás" + +#. 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: 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: file: chat/contactswidget.ui:107 +#. 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 +#, fuzzy +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 +#, fuzzy +msgid "Pen color" +msgstr "Toll &színe" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +#, fuzzy +msgid "Pen size" +msgstr "Toll mérete" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +#, fuzzy +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 "Írd be ide a felvenni kívánt személy e-mail címét:" + +#. 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:273 +msgid "Email address:" +msgstr "E-mail cím:" + +# 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: 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: 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 amit azok fognak megkapni, akik üzenni " +"akarnak neked:" + +#. 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 "Search through contacts..." +msgstr "Partner &keresése" + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. 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:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Hangos &megbeszélés indítása vagy befejezése" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +msgstr "Autó" + +#. 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 the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "" +"Az illető &tiltása (nem léphet kapcsolatba veled és az elérhetőségedet sem " +"láthatja)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Visszaállítás" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Csoportok:" + +# FIXME -- kicsit fura, majd tekerünk rajta +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "&Alternatív név használata ehhez a személyhez" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Saját emotikonok e fiókhoz:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Hang:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Megjelenítendő kép" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, 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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Megjelenítendő kép" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Fül &törlése" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Kattints ide a kiválasztott emotikon törléséhez" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "&Visszaállítás" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Elérhető partnerek" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact 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:183 +#, fuzzy +msgid "Enter the email address of a person 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:186 +msgid "Invited Contacts" +msgstr "Meghívott partnerek" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Exportálandó elemek:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Formátum" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Partnerek:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Mindet kijelöl" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +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:216 +msgid "Export..." +msgstr "Exportálás…" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Bezárás" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "Parancs küldése az aktuális fülbe" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Parancs:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Típus:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Szabványos" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Küldés" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Parancs adattartalma (payload, lehet üres):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Megnyitás" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Mégsem" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "&Letöltés" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "&Feltöltés" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "&Takarítás" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "&Bezárás" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:276 +#, fuzzy +msgid "" +"Enter 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: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Jelszó:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +#, fuzzy +msgid "Enter here your account's password" +msgstr "Írd be ide a fiókod jelszavát" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "Státusz bejelentkezéskor:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +#, fuzzy +msgid "Choose a status to set when successfully connected." +msgstr "Válaszd ki, mi legyen a státuszod miután bejelentkeztél." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +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:294 +msgid "Remem&ber account" +msgstr "Profil megje&gyzése" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +msgid "R&emember password" +msgstr "Jelszó megjegy&zése" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +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:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Új fiók" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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:324 +msgid "Password forgotten?" +msgstr "Elfelejtett jelszó" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +#, 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:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Kapcsolat" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Nézet" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Műveletek" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, fuzzy +msgid "Form" +msgstr "Formátum" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Fiók" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "Fiók&beállítások" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +msgstr "Add meg a nevet, amit partnereid látnak, amikor be vagy jelentkezve." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "&Baráti név:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +msgid "" +"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: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Jelszavad:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "&E-mail cím:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -2287,272 +5232,749 @@ msgstr "" "Add meg az MSN Passport fiókod jelszavát. Új fiókot a http://register." "passport.com/ címen tudsz létrehozni." -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Megjelenítendő kép:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "&Jelszó:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "Jelszó megjegy&zése" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." -msgstr "&Módosítás..." +msgstr "&Módosítás…" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Ne mutassa a megjelenítendő képet" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "&Ne legyen kép" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Fiók beállításainak megjegyzése" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are 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: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "&Automatikus bejelentkezés e fiókkal induláskor" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "&Fiók beállításainak megjegyzése" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 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: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Beállítandó státusz bejelentkezéskor:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "&Automatikus bejelentkezés ezzel a fiókkal induláskor" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Bejelentkezés &mint" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Meg kell látogatnod a Passport site-ot, hogy megerősítsd, az e-mail címed " +"létezik." + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot 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: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "Megerősítő e-mail kérése" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "Ugrás az accountservices.passport.net címre" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail 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:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy +msgid "" +"To connect to the Live 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: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" msgstr "Új fiók létrehozása" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "Ugrás a register.passport.com címre" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Jelzések" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "Státusz bejelentkezéskor:" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Popup értesítések" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Értesítések megjelenítése amikor egy partner:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "&Elérhető" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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, egy felugró üzenet is megjelenik, amikor egy partnered " -"bejelentkezik." +"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/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "&Társalgást kezdeményez" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +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/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "A KMess ennyi perc után változtatja a státuszod „Inaktív”-ra." + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Távollét ideje" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "perc" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"társalgást kezdeményez." -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "Üz&enetet küld" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"üzenetet küld." -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "&Státusza megváltozik" +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "&Ne legyenek értesítések ha Elfoglalt állapotban vagyok" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "Tárolt fiókok:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +#, fuzzy msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"státusza megváltozik." +"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: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "&Kijelentkezik" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "Fiók &hozzáadása…" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "S&zerkesztés" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +msgid "&Remove" +msgstr "&Törlés" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +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: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +#, fuzzy msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"

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

\n" +"

The chat logs 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!" +"

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

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: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Értesítés, ha e-mail érke&zik" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "Társalgás naplózása" -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Buborékjelző megjelenítése ennyi ideig:" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -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/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "másodperc" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -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: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +# REPORT -- space at the end +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +#, fuzzy 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. " +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +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:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Társalgás mentése fájlba" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +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:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Társalgás mentése fájlba" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +#, fuzzy +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\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: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "HTML-oldal" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "Egyszerű szöveg" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +#, fuzzy +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Itt adhatod meg, hogyan rendezze a KMess az elmentett beszélgetéseket az " +"alul kiválasztott könyvtáron belül." + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +#, fuzzy +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.\n" +" " +msgstr "" +"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: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +msgid "Separate logged chats by:" +msgstr "Elmentett társalgások szétválogatása:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "Könyvtárak létrehozása évek szerint" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" +"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: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "Év szerint" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "Könyvtárak létrehozása év majd hónap szerint" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" +"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: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "Év, majd hónap szerint" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +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:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs 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:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "Év, hónap, majd nap szerint" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs 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:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +#, fuzzy +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"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:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "Sehogy" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "Kattints ide a könyvtár kiválasztásához" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +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:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "Válaszd ki azt a könyvtárat, ahová a társalgásokat szeretnéd menteni." + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following 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:618 +msgid "St&yle" +msgstr "&Téma" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +#, 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:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "Beállítások" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Engedélyezi az emotikonok használatát a társalgásokban." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:636 +msgid "&Show emoticons" +msgstr "&Emotikonok megjelenítése" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "&Emotikonok megjelenítése" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, 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 "" +"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:648 +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:654 +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:657 +#, 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:663 +msgid "Show &date" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "&Emotikonok megjelenítése" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "&Szöveg" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +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:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "Üzeneteid &betűtípusa:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with 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:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +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:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Beszélgetésablak-események" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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 "" +"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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +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:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +#, fuzzy +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "MSN Plus formázás" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" @@ -2564,449 +5986,659 @@ msgstr "" "több rezgő figyelmeztetést is küldhetnek egyszerre, de a KMess csak az " "elsőre reagál.

" -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Az általam hallgatott dal kijelzése a partnereknek." +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +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: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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 "" -"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: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -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: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "&Társalgások egy ablakba helyezése:" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "Mindig" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "Az egy csoportba tartozó partnerekét" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "Soha" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Megjelenítendő kép" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Ha engedélyezett, a státuszod automatikusan \"Nincs a gépnél\" lesz, ha pár " -"percig nem használod a gépet." - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Távollét ideje" - -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -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: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "perc" - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Társalgás naplózása" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "Ö&sszes társalgás naplózása" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Társalgások mentése e könyvtárba:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format -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/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Társalgások mappáinak rendezési módja:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "Év" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Hónap" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Nap" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Összes társalgás mentése a főkönyvtárba" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Üzeneteid betűtípusa:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "" -"Mindig e betűtípus használata a partnerek üzeneteinek megjelenítéséhez:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Társalgás stílusa:" - -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -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/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "&Grafikák megjelenítése a társalgások üzeneteiben" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Emotikonok használatának engedélyezése a társalgásokban." - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "&Idő megjelenítése a társalgások üzeneteiben" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -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/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" -"&Betűformázások használata az üzenetekben, pl. *vastag*, /dőlt/, vagy " -"_aláhúzott_" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "Ugyanazon partner egymást követő üzeneteinek összevonása" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Levelező kliens" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" -"Kiválaszthatod, hogy a KMess melyik levelezőprogramot indítsa el az e-mailek " -"elolvasásához." - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Hotmail használata" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Megadott parancs használata:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "E-mail értesítés" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "E-mail információ megjelenítése" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail 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: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Értesítés, ha e-mail érkezik az \"egyéb mappák\"-ba" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Olvasatlan levelek számának kijelzése" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +#, fuzzy msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." 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ó." +"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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" +msgstr "Az általam hallgatott &dal kijelzése a partnereknek" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +#, fuzzy +msgid "List Formatting" +msgstr "MSN Plus formázás" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +#, fuzzy +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "MSN Plus formázás" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" msgstr "&Emotikon témák" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Jelenlegi emotikon stílusok:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" msgstr "&Saját emotikonok" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Saját emotikonok e fiókhoz:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Jelenlegi emotikon stílusok:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "Ú&j hozzáadása..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" +msgstr "Kattints ide új emotikon felvételéhez" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Kattints" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +msgid "Add Ne&w..." +msgstr "Ú&j hozzáadása…" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Kattints ide új saját emotikonok hozzáadásához, hogy elküldhesd a " -"partnereidnek." +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" +msgstr "Kattints ide a kiválasztott emotikon átnevezéséhez" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 msgid "Re&name" msgstr "Át&nevezés" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "Kattints ide a kiválasztott emotikon átnevezéséhez." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "Kattints ide a kiválasztott emotikon törléséhez" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" msgstr "Tör&lés" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -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/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "Webböngésző" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "üzenete: " +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "Válaszd ezt a lehetőséget a KDE-ben beállított böngésző használatához." -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Kép keresése és vágása..." +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "&KDE alapértelmezett böngésző" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Kép megjelenítése" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "A megjelenítendő kép letöltése nem sikerült" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. 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:814 rc.cpp:849 +msgid "Select this option to choose from a list of installed browsers." 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." +"Válaszd ezt a lehetőséget a telepített böngészők listájából való " +"választáshoz." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Beállítások" +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:817 +msgid "&Use an installed browser:" +msgstr "&Telepített böngésző használata:" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Fiók" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Társalgás" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Biztosan törölni akarod ezt a fiókot?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Hello, milyen a kedved most? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Manó" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Nagyon jó!" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "/Most/ értem haza egy *remek* buliból!" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#. 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:820 rc.cpp:855 +msgid "Choose this option to enter the path to your favorite browser." 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." +"Válaszd ezt a lehetőséget, hogy te adhasd meg a használni kívánt böngészőt." -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Dokkolás a rendszertálcában" +#. 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:823 rc.cpp:858 +msgid "&Specify a custom command:" +msgstr "&Saját parancs:" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. 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:827 rc.cpp:862 +#, 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." -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Használd a %u paramétert az URL parancssorba illesztéséhez." -#~ msgid "The current status of your contact." -#~ msgstr "A partnered jelenlegi státusza." +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "Levelezőkliens" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +msgid "Use &Live Mail if the account supports it" +msgstr "Live Mail használata, amennyiben a fiók támogatja" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +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: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" +msgstr "&KDE alapértelmezett e-mail kliens használata" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "&Egyéb telepített e-mail kliens használata:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "A %u paraméter helyére az e-mail cím fog behelyettesítődni." + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +msgid "&Save all received files in one directory:" +msgstr "&Minden fogadott fájl mentése ebbe a könyvtárba:" + +# 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:878 +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:881 +msgid "and" +msgstr "-tól" + +# TAG -- port_range +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "-ig" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Kattints ide a kiválasztott emotikon átnevezéséhez" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Kattints ide a kiválasztott emotikon törléséhez" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "Megjegyzés:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +msgid "Your comment is about:" +msgstr "Megjegyzésed témája:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "Valami ami tetszik" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "Valami ami nem tetszik" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "A program helytelen működése" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "Új kívánt képesség a programtól" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +#, fuzzy +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 (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "&Képek" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Nem üzent még sose" + +#, fuzzy +#~ msgid "&Do not filter" +#~ msgstr "&Ne legyen kép" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "" +#~ "&Buborékjelző megjelenítése, amikor a partner be- vagy kijelentkezik" + +#~ msgid "File format used for saving:" +#~ msgstr "Mentéshez használt fájlformátum:" + +#~ msgid "Show the feedback buttons bar on the windows" +#~ msgstr "Visszajelzés gombok megjelenítése az ablakokban" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "&Emotikon hozzáadása…" + +#, fuzzy +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "Nem lehet blokkolni" + +#~ msgid "Ed&it Notes" +#~ msgstr "&Megjegyzések szerkesztése" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Megjelenítendő kép" + +#~ msgid "Search for C&ontact" +#~ msgstr "Partner &keresése" + +#~ msgid "Search by &Interest" +#~ msgstr "Keresés ér&deklődés szerint" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "E-mail címed" + +#~ 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." + +#~ 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." + +#, fuzzy +#~ msgid "Conversations Filter" +#~ msgstr "A beszélgetés %2 időpontban kezdődött" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Válaszd ki a módosítandó fiókot, majd kattints ide" + +#, 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 "" +#~ "A Kmess nem tudja elérni a távoli webszolgáltatást.
Részletek: %1" + +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Az azonosítás nem sikerült, a KMess nem tudta feldolgozni a passport " +#~ "bejelentkezést.
Részletek: %1" + +#~ msgid "SOAP connection error: %1" +#~ msgstr "SOAP kapcsolat hiba: %1" + +#~ msgid "Close all tabs" +#~ msgstr "Minden fül bezárása" + +#~ msgid "&Send email" +#~ msgstr "E-mail küldé&se" + +#~ msgid "Save complete" +#~ msgstr "A mentés megtörtént" + +#~ msgid "C&lose all tabs" +#~ msgstr "&Minden fül bezárása" + +#~ msgid "Connect" +#~ msgstr "Kapcsolódás" + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "Nem lehet újracsatlakozni, mert nem található a fiók." + +#~ 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 "Rename group" +#~ msgstr "Csoport átnevezése" + +#~ msgid "Account &Settings..." +#~ msgstr "Fiók&beállítások…" + +#~ msgid "" +#~ "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 "" +#~ "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 d1a0ef9..5955ebe 100644 --- a/po/it.po +++ b/po/it.po @@ -1,532 +1,1326 @@ # 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. +# Andrea Decorte , 2009. msgid "" msgstr "" "Project-Id-Version: it\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2008-02-22 00:36+0100\n" -"Last-Translator: Valerio Pilo \n" -"Language-Team: Italian \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-05-09 20:11+0200\n" +"PO-Revision-Date: 2009-05-09 20:14+0200\n" +"Last-Translator: Andrea Decorte \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" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Valerio Pilo,Vincenzo Reale,David Vignoni" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "amroth@coldshock.net,smart2128@baslug.org," - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 account.cpp:744 +msgid "I am away from my computer" msgstr "Non sono al computer" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Nome" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:217 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "utente@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Mi connetto..." +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored 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 di profilo memorizzate in modo non " +"sicuro.
Desideri importare le password nel Portafogli KDE chiamato '%" +"1', mantenere le password memorizzate in modo non sicuro, o eliminarle " +"permanentemente?

Nota: è raccomandato di non mantenere " +"le password memorizzate non in modo sicuro, perchè esse saranno " +"facilmente leggibili dai file di configurazione di KMess." -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "%1 sta inviando una animoticon: %2" +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Salvataggio Sicuro Password" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importa" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Elimina" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Mantieni" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"Non puoi mandare inviti quando vi sono più contatti in chat. Per favore, " +"apri una chat separata con il contatto destinatario dell'invito." + +#: chat/chat.cpp:135 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 si è unito alla chat." + +#: chat/chat.cpp:188 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "La chat è diventata inattiva, %1 l'ha lasciata." + +#: chat/chat.cpp:194 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 ha lasciato la chat." + +#: chat/chat.cpp:356 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 e %2" + +#: chat/chat.cpp:364 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 e altri" + +#: chat/chat.cpp:660 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Questo messaggio è stato spedito automaticamente)" + +#: chat/chat.cpp:826 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" +"KMess non ha potuto salvare il registro di questa chat.
La " +"cartella dei registri, "%1", non esiste." + +#: chat/chat.cpp:946 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Hai inviato una animoticon!" + +#: chat/chat.cpp:951 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Hai inviato l'animoticon "%1"!" + +#: chat/chat.cpp:984 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" +"La conversazione è stata disabilitata perchè non sei più connesso al server " +"Live Messenger." + +#: chat/chat.cpp:1141 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Si è verificato un problema di connessione." + +#: chat/chat.cpp:1151 +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 "" +"Nel tuo ultimo messaggio c'erano troppe emoticon personali. Solo le prime 7 " +"verranno inviate." + +#: chat/chat.cpp:1164 +#, kde-format +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." +msgstr "%1 ti ha inviato un messaggio vocale, ma KMess non li supporta al momento." + +#: chat/chat.cpp:1178 +#, kde-format +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, ma KMess non li supporta al momento." + +#: chat/chat.cpp:1193 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "%1 has sent you a Live Messenger feature that KMess does not support yet." +msgstr "" +"%1 ti ha inviato una caratteristica di Live Messenger ancora non supportata " +"da KMess." + +#: chat/chat.cpp:1219 +#, kde-format +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. You can " +"re-enable it in the account settings." +msgstr "" +"Hai ricevuto una animoticon da %1, ma l'opzione per mostrarle è stata " +"disabilitata. La puoi riabilitare nella finestra di configurazione del profilo." + +#: chat/chat.cpp:1229 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has been " +"disabled. You can re-enable it in the account settings." +msgstr "" +"Hai ricevuto l'animoticon "%2" da %1, ma l'opzione per mostrarle è " +"stata disabilitata. La puoi riabilitare nella finestra di configurazione del profilo." + +#: chat/chat.cpp:1259 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 ti ha inviato una animoticon!" + +#: chat/chat.cpp:1266 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 ti ha inviato una animoticon: "%2"!" + +#: chat/chat.cpp:1288 +#, kde-format +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." +msgstr "" +"Hai ricevuto una animoticon da %1, ma non è stato possibile mostrarla. " +"Assicurati di avere installato il programma "cabextract"." + +#: chat/chat.cpp:1297 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be displayed. " +"Make sure you have the "cabextract" program installed." +msgstr "" +"Hai ricevuto l'animoticon "%2" da %1, ma non è stato possibile " +"mostrarla. Assicurati di avere installato il programma "" +"cabextract"." + +#: chat/chat.cpp:1309 +#, kde-format +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. Extracting the " +"wink package with "cabextract" has failed." +msgstr "" +"Hai ricevuto l'animoticon da %1, ma non è stato possibile mostrarla. " +"L'estrazione del pacchetto dell'animoticon con "cabextract" è " +"fallita." + +#: chat/chat.cpp:1318 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be displayed. " +"Extracting the wink package with "cabextract" has failed." +msgstr "" +"Hai ricevuto l'animoticon "%2" da %1, ma non è stato possibile " +"mostrarla. L'estrazione del pacchetto dell'animoticon con "" +"cabextract" è fallita." + +#: chat/chat.cpp:1330 +#, kde-format +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:1339 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be displayed. " +"The data could not be read." +msgstr "" +"Hai ricevuto l'animoticon "%2" da %1, ma non è stato possibile " +"mostrarla. I dati non erano leggibili." + +#: chat/chat.cpp:1381 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next time " +"he or she logs in." +msgstr "" +"%1 si è disconnesso. Tutti i messaggi che invierai verranno recapitati alla " +"sua prossima riconnessione." + +#: chat/chat.cpp:1386 +#, kde-format +msgid "%1 has gone offline." +msgstr "%1 si è disconnesso." + +#: chat/chat.cpp:1396 +#, kde-format +msgid "%1 has changed his or her status to "%2"." +msgstr "%1 ha cambiato il suo stato in "%2"." + +#: chat/chat.cpp:1427 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 ti ha inviato un trillo!" + +#: chat/chat.cpp:1460 +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:1473 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Invio del trillo a %1 fallito." + +#: chat/chat.cpp:1478 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "Invio dell'animoticon a %1 fallito." + +#: chat/chat.cpp:1488 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "Invio del disegno a %1 fallito." + +#: chat/chat.cpp:1503 +#, kde-format +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 "Invio del messaggio a %2 fallito:
%1" + +#: chat/chat.cpp:1586 +#, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "" +"Impossibile trovare il file "%1" sul computer; lo scaricamento non " +"è riuscito." + +#: chat/chat.cpp:1623 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Hai inviato un trillo a %1!" + +#: chat/chat.cpp:1629 +msgid "You have sent a nudge!" +msgstr "Hai inviato un trillo!" + +#: chat/chat.cpp:1695 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 non è al momento connesso. Tutti i messaggi inviati verranno recapitati " +"alla sua prossima riconessione." + +#: chat/chatmaster.cpp:1387 +#, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 sta inviando una animoticon: "%2"" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 dice:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Conversazioni con %1 salvate da KMess" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:657 +#, kde-format msgid "Add this emoticon: %1" msgstr "Aggiungi questa emoticon: %1" -#: chat/chatview.cpp:463 -msgid "" -"Could not save chat log. 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." +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Riconnetti" -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:306 +#, kde-format +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 "" +"Impossibile salvare il registro della chat nella cartella '%1'.\n" +"Assicurati di avere i permessi per scrivere nella cartella dove le chat " +"vengono salvate." + +#: chat/chatview.cpp:445 +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:464 +#, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:465 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Sovrascrivi File" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:466 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "So&vrascrivi" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:831 msgid "Add this &Emoticon..." msgstr "Aggiungi questa &Emoticon..." -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:834 +msgid "Hide this &Emoticon" +msgstr "Nascondi questa &Emoticon" + +#: chat/chatview.cpp:840 msgid "Send &Email" msgstr "Invia &Email" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "Copia E&mail" +#: chat/chatview.cpp:844 +msgid "Add &Contact" +msgstr "&Aggiungi Contatto" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:848 +msgid "Copy E&mail Address" +msgstr "Copia Indirizzo &Email" + +#: chat/chatview.cpp:854 msgid "Visit &Link" msgstr "Visita Co&llegamento" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:858 msgid "Copy &Address" msgstr "Copia Colleg&amento" -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "&Copia testo" +#: chat/chatview.cpp:874 +msgid "&Copy Text" +msgstr "&Copia Testo" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:875 msgid "Select &All" msgstr "Selezion&a Tutto" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "Salva conversazione su &file" +#: chat/chatview.cpp:876 +msgid "Find &Text..." +msgstr "Trova &Testo..." -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Chat" +#: chat/chatview.cpp:877 chat/chatwindow.cpp:503 +msgid "C&lear Chat" +msgstr "Pu&lisci Chat" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "Non puoi inviare questo invito a una chat con più di una persona." +#: chat/chatview.cpp:878 +msgid "Save Chat to &File..." +msgstr "Salva Chat su &File..." -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 si è unito alla conversazione." - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "" -"La conversazione è diventata inattiva, %1 ha lasciato la conversazione." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 ha lasciato la conversazione." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Chat" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 e %2 - Chat" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 e altri - Chat" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Contatti" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticon" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" -msgstr "Mie emoticon" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Mie Emoticon" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Questo messaggio è stato spedito automaticamente)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"There are multiple tabs open 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 "" -"Non è stato possibile mostrare l'animoticon. Assicurati di avere installato " -"'cabextract'." +"Ci sono più schede aperte in questa finestra di chat. Desideri chiudere " +"solo la scheda corrente o tutte le schede?

Nota: Puoi anche " +"chiudere tutte le schede contemporaneamente premendo Alt+F4." -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" -"Non è stato possibile mostrare l'animoticon. I dati non erano leggibili." +#: chat/chatwindow.cpp:340 +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:1603 -msgid "You have received a wink from %1" -msgstr "Hai ricevuto una animoticon da %1" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "&Chiudi Tutte le Schede" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "Il messaggio '%1' non è stato inviato." +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Chiudi Scheda Corrente" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "Hai ricevuto un trillo da %1!" +#: chat/chatwindow.cpp:418 +msgid "&Invite..." +msgstr "&Invita..." -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Hai inviato un trillo a %1!" +#: chat/chatwindow.cpp:419 +msgid "Send a &File..." +msgstr "Invia un &File..." -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Hai inviato un trillo!" +#: chat/chatwindow.cpp:420 +msgid "Webcam Chat" +msgstr "Chat con Webcam" -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 sta scrivendo." - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 e %2 stanno scrivendo." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 e altri %3 stanno scrivendo." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Invia un &file" - -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:421 msgid "Start a &Meeting" msgstr "Avvia una con&ferenza" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:422 msgid "Send a &Nudge!" -msgstr "I&nvia un trillo" +msgstr "I&nvia un trillo!" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Avvia o termina una &conversazione" +#: chat/chatwindow.cpp:423 +msgid "Save Chat..." +msgstr "Salva Chat..." -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Salva chat" +#: chat/chatwindow.cpp:424 +msgid "Close &All Tabs" +msgstr "&Chiudi Tutte le Schede" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Invita" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Chat" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:429 msgid "Change &Font" -msgstr "Cambia &carattere" +msgstr "Cambia &Carattere" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:430 msgid "Change Font &Color" -msgstr "Cambia c&olore del carattere" +msgstr "Cambia C&olore del Carattere" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Inserisci emoticon" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:437 msgid "Show &Emoticons" -msgstr "Mostra &emoticon" +msgstr "Mostra &Emoticon" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Mostra/Nascondi panello laterale &Contatto" +#: chat/chatwindow.cpp:438 +msgid "Show S&tatus Messages" +msgstr "Mostra Messaggi di S&tato" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Mostra o nasconde il pannello laterale per il contatto" +#: chat/chatwindow.cpp:444 +msgid "&Panels" +msgstr "&Pannelli" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "Invia &email" +#: chat/chatwindow.cpp:447 +msgid "Use &Spell Checking" +msgstr "Usa &Controllo Ortografico" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:451 +msgid "Meeting" +msgstr "Meeting" + +#: chat/chatwindow.cpp:452 +msgid "Nudge" +msgstr "Trillo" + +#: chat/chatwindow.cpp:453 +msgid "Send a &File" +msgstr "Invia un &file" + +#: chat/chatwindow.cpp:456 chat/chatwindow.cpp:457 +msgid "P&revious Tab" +msgstr "Scheda P&recedente" + +#: chat/chatwindow.cpp:458 chat/chatwindow.cpp:459 +msgid "Ne&xt Tab" +msgstr "Scheda S&uccessiva" + +#: chat/chatwindow.cpp:474 +msgid "Enable or disable the contacts panel" +msgstr "Abilita o disabilita il pannello contatti" + +#: chat/chatwindow.cpp:475 chat/chatwindow.cpp:476 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contatti" + +#: chat/chatwindow.cpp:480 +msgid "Enable or disable the standard emoticons panel" +msgstr "Abilita o disabilita il pannello delle emoticon predefinite" + +#: chat/chatwindow.cpp:481 chat/chatwindow.cpp:482 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticon" + +#: chat/chatwindow.cpp:486 +msgid "Enable or disable the custom emoticons panel" +msgstr "Abilita o disabilita il pannello delle emoticon personalizzate" + +#: chat/chatwindow.cpp:487 chat/chatwindow.cpp:488 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mie Emoticon" + +#: chat/chatwindow.cpp:500 +msgid "&Font" +msgstr "&Carattere" + +#: chat/chatwindow.cpp:501 +msgid "Font &Color" +msgstr "&Colore del Carattere" + +#: chat/chatwindow.cpp:502 +msgid "C&lear Chat Window" +msgstr "Pu&lisci Finestra di Chat" + +#: chat/chatwindow.cpp:570 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Avvia o Termina una &Conversazione" + +#: chat/chatwindow.cpp:993 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" +"Hai usato una sintassi non corretta per il comando /status. La " +"sintassi corretta è: /status online|away|idle|brb|busy|lunch|phone|" +"invisible.
Puoi anche usare le scorciatoie /online, /" +"phone, eccetera." + +#: chat/chatwindow.cpp:996 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Sintassi di /status non Corretta" + +#: chat/chatwindow.cpp:1059 +msgid "You cannot use the /block command in a group chat." +msgstr "Non puoi usare il comando /block in una conversazione di gruppo." + +#: chat/chatwindow.cpp:1061 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "Impossibile usare il comando /block" + +#: chat/chatwindow.cpp:1072 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" +"Non puoi usare il comando /unblock in una conversazione di gruppo." + +#: chat/chatwindow.cpp:1074 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "Impossibile usare il comando /unblock" + +#: chat/chatwindow.cpp:1104 +#, kde-format +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:1107 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Comando Sconosciuto" + +#: chat/chatwindow.cpp:1574 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Chat" + +#: chat/chatwindow.cpp:1578 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Chat" + +#: chat/chatwindow.cpp:1598 kmessinterface.cpp:674 +#, kde-format +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/chatwindow.cpp:1602 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Nascondere la Barra dei Menu" + +#: chat/chatwindow.cpp:1855 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 sta scrivendo..." + +#: chat/chatwindow.cpp:1865 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 e %2 stanno scrivendo..." + +#: chat/chatwindow.cpp:1869 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 e altri %3 stanno scrivendo..." + +#: chat/chatwindow.cpp:2320 +#, kde-format +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
Connesso con " +"il profilo:
%3
" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: chat/chatwindow.cpp:2486 rc.cpp:9 +msgid "Handwriting mode" +msgstr "Modalità scrittura a mano" + +#: chat/chatwindow.cpp:2495 +msgctxt "Label text" +msgid "Handwriting is disabled: KMess cannot send drawings to some of the contacts." +msgstr "" +"La scrittura a mano è disabilitata: KMess non è in grado di mandare i " +"disegni ad alcuni dei contatti." + +#: chat/chatwindow.cpp:2501 +msgctxt "Label text" +msgid "Handwriting is disabled: KMess cannot send drawings to this contact." +msgstr "" +"La scrittura a mano è disabilitata: KMess non è in grado di mandare i " +"disegni a questo contatto." + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: chat/chatwindow.cpp:2509 rc.cpp:27 +msgid "Winks" +msgstr "Animoticon" + +#: chat/chatwindow.cpp:2518 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to some of the contacts." +msgstr "" +"Le animoticon sono disabilitate: KMess non è in grado di mandarle ad alcuni " +"dei contatti." + +#: chat/chatwindow.cpp:2524 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to this contact." +msgstr "" +"Le animoticon sono disabilitate: KMess non è in grado di mandarle a questo " +"contatto." + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "&Avvia una Chat Privata" + +#: chat/contactframe.cpp:298 kmessview.cpp:615 +msgid "&Send Email" +msgstr "Invia &Email" + +#: chat/contactframe.cpp:299 kmessview.cpp:616 msgid "&View Profile" -msgstr "&Visualizza profilo" +msgstr "&Visualizza Profilo" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:618 +msgid "&Properties" +msgstr "&Proprietà" + +#: chat/contactframe.cpp:303 kmessview.cpp:620 msgid "&Add Contact" -msgstr "&Aggiungi contatto" +msgstr "&Aggiungi Contatto" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:621 msgid "A&llow Contact" -msgstr "A&utorizza contatto" +msgstr "A&utorizza Contatto" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:624 msgid "&Delete Contact" -msgstr "Eli&mina contatto" +msgstr "Eli&mina Contatto" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:622 msgid "&Block Contact" -msgstr "&Blocca contatto" +msgstr "&Blocca Contatto" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:623 msgid "&Unblock Contact" -msgstr "Sbl&occa contatto" +msgstr "Sbl&occa Contatto" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:627 msgid "&Friendly Name" msgstr "&Nome Personale" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:628 msgid "&Personal Message" msgstr "Messaggio &Personale" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:629 msgid "&Email Address" msgstr "Indirizzo &Email" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "&Copia..." +#: chat/contactframe.cpp:313 kmessview.cpp:630 +msgid "Song &Name" +msgstr "Nome &Canzone" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Informazioni" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "Immagini Personali" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "&Note" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "&Emoticon" + +#: chat/contactframe.cpp:347 kmessview.cpp:665 +msgid "&Copy" +msgstr "&Copia" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Bloccato" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Assente" - -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Torno subito" - -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Occupato" - -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Non in linea" - -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Assente - Inattivo" - -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "A pranzo" - -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "In linea" - -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "Al telefono" - -#: chat/contactframe.cpp:558 +#: chat/contactframe.cpp:765 +#, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" msgid "The contact is %1" msgstr "Il contatto è %1" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "testo stile chat" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not 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!

" -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Aggiungi alla Conversazione" + +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Aggiungi Nuova" + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Modifica" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Rimuovi" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

Non hai ancora aggiunto nessuna animoticon.

Per " +"aggiungerne di nuove, chiedi ai tuoi contatti di mandartele!

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 o compatibile" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 o compatibile" + +#: contact/contactbase.cpp:354 +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger compatibile" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "In linea" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Occupato" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Assente" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Assente con Risposta Automatica" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inattivo" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Torno subito" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Al telefono" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "A pranzo" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Invisibile" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Questo account non ha una casella di posta di Hotmail!" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Non in linea" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "Aggiungi contatto" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "Il mio &stato" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Inserisci l'indirizzo email della persona che vorresti aggiungere:" +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Disconnetti" -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "L'indirizzo email che hai inserito non è valido!" +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Aggiungi un Contatto" -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Aggiungi Nuova Emoticon" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "L'emoticon \"%1\" esiste già, vuoi sostituirla?" +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Modifica Emoticon" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Specifica un messaggio di assenza" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "L'emoticon \"%1\" esiste già. Vuoi sostituirla?" #: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Messaggio di &Assenza Automatico" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Registro Conversazioni" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Inserisci il messaggio che sarà inviato\n" -"automaticamente a chi cercherà di contattarti:" +"Si è verificato un errore durante l'apertura dei tuoi registri. Comunemente " +"ciò indica un problema di permessi, verifica di avere accesso in " +"lettura e scrittura alla cartella "%1". Altrimenti, i tuoi " +"registri potrebbero essere corrotti." -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Usa un nome alternativo per questo contatto" +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Impossibile aprire il registro delle chat" -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" +#: dialogs/chathistorydialog.cpp:572 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Caricamento..." + +#: dialogs/chathistorydialog.cpp:594 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Nessuna chat salvata" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Sei stato aggiunto da qualcuno" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." msgstr "" -"Mostra un messaggio di avviso quando questo contatto va in linea o non in " -"linea" +"%1\n" +"ti ha aggiunto alla sua lista contatti." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Immagine:" +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +msgid "" +"%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:93 -msgid "Sound:" -msgstr "Suono:" - -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" msgstr "Proprietà del contatto %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Indirizzo email: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:814 kmessview.cpp:1196 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Connesso" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Nome attuale: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1200 +msgid "Not seen yet" +msgstr "Mai visto" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1215 +msgid "No messages yet" +msgstr "Ancora nessun messaggio" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Visto l'ultima volta: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Ultimo messaggio: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Indirizzo email: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Client: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Sei sicuro di voler utilizzare l'immagine personale di questo contatto?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "Copia Immagine del Contatto" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "Il tipo di file selezionato non è supportato da Phonon." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "Tipo di file non supportato" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Invita Contatti" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" -msgstr "Finestra di rete" +msgstr "Finestra di Rete" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Salva scheda" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "S&alva Scheda" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Pulisci scheda" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "Pu&lisci Scheda" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Chiudi scheda" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "&Chiudi Tutte le Schede" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Nessuna connessione presente. Impossibile aprire la Finestra di Rete." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Nessuna connessione è presente.\n" +"Impossibile aprire la Finestra di Rete." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." 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:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "Impossibile chiudere la scheda della connessione principale." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"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:1303 +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:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Impossibile inviare comandi a questo tipo di connessione!" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:766 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "Annullato" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Fallito!" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "Completato" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:741 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:746 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:750 +#, kde-format msgid "%1 bytes" msgstr "%1 byte" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "Ricevuti %1 di %2" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "Ricevuti %1 su %2." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "Inviati %1 di %2" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "Inviati %1 su %2." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "infinito" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:892 msgid "File Transfers" msgstr "Trasferimenti File" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Usa" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Eli&mina" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "Seleziona o Rimuovi la tua Immagine Personale" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "Sei sicuro di voler eliminare questa immagine personale?" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Elimina Immagine Personale" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -534,577 +1328,872 @@ msgstr "" "Impossibile salvare il tema delle emoticon. Assicurati di avere i permessi " "di scrittura per la cartella del tema '%1'." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Sorriso" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" -msgstr "Occhiolino" +msgstr "Animoticon" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Linguaccia" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Sorrisone" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Triste" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Pianto" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "Rabbia" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Confuso" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Imbarazzato" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Disappunto" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Caldo" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Denti scoperti" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Secchione" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Disgustato" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Sorpreso" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Festa" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Sonno" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Pensieroso" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Segreto" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Racconto un segreto" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Stufo" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Sarcastico" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Non saprei" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Torno subito" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Angelico" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Abbraccio (sinistra)" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Ragazzo" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Cuore" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Rosa rossa" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "Pollice in su" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Cane" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Sole" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Demone" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Abbraccio (destra)" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Ragazza" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Cuore spezzato" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Rosa appassita" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Pollice verso" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Gatto" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Mezza luna" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Bacio" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Applauso" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Dita incrociate" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Aereo" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Tartaruga" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Lumaca" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Pecora nera" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Pecora" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Capra" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Pipistrello" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Birra" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "Cocktail" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "Caffè" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Torta di compleanno" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Piatto" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Ciotola" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Stella" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Arcobaleno " -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Nuvoloso" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Fulmine" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Ombrello" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Palme" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "Cornetta" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Cellulare" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "Email" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Orologio" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Fotocamera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Film" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Nota" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Manette" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Soldi" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Lampadina" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "Sigaretta" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "Pallone da calcio" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Regalo" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "KMess" +#: emoticontheme.cpp:911 +msgid "KMess icon" +msgstr "Icona di KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "L'indirizzo del contatto che hai inserito non è valido: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Impossibile riconnettere: profilo non trovato" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "Aggiungi un gruppo" +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "Impossibile riconnettere: questo profilo non ha una password salvata" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Inserisci un nuovo nome per questo gruppo:" +#: initialview.cpp:280 initialview.cpp:375 +#, kde-format +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!" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Assente con risposta automatica" +#: initialview.cpp:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Connessione a Internet non disponibile" -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Inattivo" +#: initialview.cpp:401 +#, kde-format +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 secondi prima della riconnessione...
Riconnetti ora!" -#: kmess.cpp:715 +#: initialview.cpp:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Connetti" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Annulla" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Per favore inserisci sia la tua email che la password" + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Per favore inserisci un indirizzo email valido" + +#: kmess.cpp:218 +#, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Il contatto %1 è già presente nella tua lista contatti." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Informazioni Contatto" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Nuovo Gruppo" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Aggiungi un Gruppo" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Inserisci un nome per il nuovo gruppo:" + +#: kmess.cpp:576 +#, kde-format 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?" +msgstr "Sei sicuro di voler rimuovere il contatto %1 dalla tua lista?" -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "Rimuovi un contatto" +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "Rimuovi Contatto" -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "Rimuovi e blocca" +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "Rimuovi e Blocca" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "Il gruppo %1 non è vuoto! Rimuovi tutti i contatti da esso e riprova!" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Rimozione Gruppo" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" msgid "" "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:763 -msgid "Remove group" -msgstr "Rimuovi un gruppo" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Rimuovi" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "Questo è un gruppo speciale e non può essere modificato." +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." +msgstr "Questo è un gruppo speciale, che non può essere modificato." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "Rinomina un gruppo" +#: kmess.cpp:676 +msgid "Rename Group" +msgstr "Rinomina Gruppo" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Connesso" +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "Inserisci un nuovo nome per questo gruppo:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:754 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" +"

Impossibile effettuare l'accesso automatico con il profilo %1:
prima devi salvare la password del profilo!

" + +#: kmess.cpp:757 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Accesso Automatico Fallito" + +#: kmess.cpp:1041 +msgid "Connection could be down..." +msgstr "La connessione potrebbe essere inattiva..." + +#: kmess.cpp:1111 +msgctxt "Status bar message" msgid "Disconnected" msgstr "Disconnesso" -#: kmess.cpp:1669 +#: kmess.cpp:1450 +#, kde-format +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:1462 +#, kde-format +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 'eventsrc' 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:1673 -msgid "Error with notifications" -msgstr "Errore delle notifiche" +#: kmess.cpp:1468 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Errore delle Notifiche" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nuovo &account" +#: kmess.cpp:1746 +#, kde-format +msgctxt "Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Nuovo &contatto" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Nuovo &gruppo" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "C&erca un contatto" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Cerca per &interessi" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Impo&stazioni account" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Azioni" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Co&nnetti" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Disconnetti" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Mostra il mio &profilo" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "Il mio &stato" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "&Connetti" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Disconnetti" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Mostra il mio &Profilo" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" -msgstr "Mostra cont&atti autorizzati" +msgstr "Mostra Cont&atti Autorizzati" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" -msgstr "Mostra contatti n&on in linea" +msgstr "Mostra Contatti N&on in linea" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" -msgstr "Mostra contatti &rimossi" +msgstr "Mostra Contatti &Rimossi" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Immagine personale" +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Mostra &Box Cronologia" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Mostra fi&nestra di rete" +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "Mostra la Barra di &Ricerca" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Mostra Gruppi &Vuoti" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "&Dimensione Immagini Personali" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" -msgstr "&Ordina contatti per" +msgstr "&Ordina Contatti per" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Mostra Finestra dei &Trasferimenti..." + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Nuovo &Contatto..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Nuovo &Gruppo..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "&Esporta Lista Contatti..." + +#: kmessinterface.cpp:183 kmessview.cpp:617 +msgid "Show Chat &History..." +msgstr "Mostra C&ronologia Conversazioni..." + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Nuovo &Profilo..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Configura Profilo..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Configura &KMess..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Mostra &Menu Selezione..." + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Non Mostrare" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Piccole" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Medie" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Grandi" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Gruppo" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "In linea/Non in linea" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Mostra finestra dei &trasferimenti" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Ordinamento misto" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Sto ascoltando %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "Mostra Fi&nestra di Rete..." -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:328 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Accesso effettuato come %2" -#: kmessview.cpp:613 +#: kmessview.cpp:365 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 si è connesso" + +#: kmessview.cpp:370 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 si è disconnesso" + +#: kmessview.cpp:614 msgid "Cha&t" msgstr "Cha&t" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Proprietà" +#: kmessview.cpp:625 +msgid "&Remove From Group" +msgstr "&Rimuovi dal Gruppo" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "&Rimuovi dal gruppo" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Sposta al gruppo" - -#: kmessview.cpp:641 +#: kmessview.cpp:658 msgid "&Copy to Group" -msgstr "&Copia al gruppo" +msgstr "&Copia al Gruppo" -#: kmessview.cpp:674 +#: kmessview.cpp:659 +msgid "&Move to Group" +msgstr "&Sposta al Gruppo" + +#: kmessview.cpp:710 msgid "Move Group &Down" -msgstr "Sposta &gruppo in basso" +msgstr "Sposta &Gruppo in basso" -#: kmessview.cpp:675 +#: kmessview.cpp:711 msgid "Move Group &Up" -msgstr "Sposta gr&uppo in alto" +msgstr "Sposta Gr&uppo in alto" -#: kmessview.cpp:676 +#: kmessview.cpp:712 msgid "Re&move Group" -msgstr "Ri&muovi gruppo" +msgstr "Ri&muovi Gruppo" -#: kmessview.cpp:677 +#: kmessview.cpp:713 msgid "Re&name Group" -msgstr "Ri&nomina gruppo" +msgstr "Ri&nomina Gruppo" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "Hai un nuovo messaggio di posta." +#: kmessview.cpp:1152 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Questo contatto non ti ha nella sua lista contatti." -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "Hai %1 nuovi messaggi di posta." +#: kmessview.cpp:1161 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Indirizzo email" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Assente)" +#: kmessview.cpp:1168 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Client" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Torno subito)" +#: kmessview.cpp:1180 +msgid "Yes" +msgstr "Sì" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Occupato)" +#: kmessview.cpp:1184 +msgid "No" +msgstr "No" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Invisibile)" +#: kmessview.cpp:1187 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloccato" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Assente - Inattivo)" +#: kmessview.cpp:1207 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Visto l'ultima volta" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(A pranzo)" +#: kmessview.cpp:1222 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Ultimo messaggio" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Al telefono)" +#: kmessview.cpp:1232 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Gruppo %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Accesso automatico con questo indirizzo email" +#: kmessview.cpp:1240 +#, kde-format +msgctxt "Contact counters in normal group tooltip, first part" +msgid "%1 contact, " +msgid_plural "%1 contacts, " +msgstr[0] "%1 contatto," +msgstr[1] "%1 contatti," -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1243 +#, kde-format +msgctxt "Contact counters in normal group tooltip, second part" +msgid "%1 online" +msgid_plural "%1 online" +msgstr[0] "%1 in linea" +msgstr[1] "%1 in linea" + +#: kmessview.cpp:1249 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contatto" +msgstr[1] "%1 contatti" + +#: kmessview.cpp:1669 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Inserisci qui un tuo messaggio personale>" + +#: kmessview.cpp:1670 +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:1853 +msgid "No chat logs could be found for this contact." +msgstr "Non è stato trovato nessun registro delle conversazioni per questo contatto." + +#: kmessview.cpp:1854 kmessview.cpp:1860 +msgid "No chat history found" +msgstr "Nessun registro conversazioni trovato" + +#: kmessview.cpp:1859 +msgid "" +"No chats logs could be found for this contact. Note that new chats are not " +"logged; if you want your chats to be logged, you can enable it in your " +"account settings." +msgstr "" +"Non è stato trovato nessun registro delle conversazioni per questo contatto. " +"Le nuove conversaziono non vengono al momento registrate; se desideri che " +"ciò venga fatto, puoi abilitarlo nelle impostazioni del profilo." + +#: kmessview.cpp:2047 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 nuovo messaggio di posta" +msgstr[1] "%1 nuovi messaggi di posta" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:488 settings/accountpage.cpp:549 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "Un client di Live Messenger per KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Sviluppatore e fondatore del progetto" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Sviluppatore" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Supporto al progetto" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Attuale sviluppatore" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:125 +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:67 main.cpp:162 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:161 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -1112,466 +2201,963 @@ msgstr "" "Traduzione tedesca, test, documentazione, gestione sito web, responsabile " "del progetto, ecc..." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 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:73 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "Set di emoticon gialle/blu/viola, traduzione italiana" + +#: main.cpp:74 msgid "Cartoon emoticons" msgstr "Set di emoticon Cartoon" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Tema sonoro predefinito" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "Icona di KMess in stile Oxygen" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:109 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "Manutentore Traduzioni" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Traduzione araba, internazionalizzazione del correzioni per il salvataggio " "dei file." -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "Ulteriore traduzione araba" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Traduzione portoghese/brasiliano" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Ulteriore traduzione Portoghese Brasiliano" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "Sergio Rafael Lemke" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "Maurício Arozi Moraes" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Traduzione catalana" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "Adrià Arrufat" + +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "Ulteriore traduzione catalana" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 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:92 +#: main.cpp:94 main.cpp:157 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "Ulteriore traduzione in cinese semplificato" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "Traduzione cinese tradizionale" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "Ulteriore traduzione cinese tradizionale" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:99 msgid "Danish translation" msgstr "Traduzione danese" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:100 msgid "More Danish translation" msgstr "Ulteriore traduzione danese" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 msgid "Dutch translation" msgstr "Traduzione olandese" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 main.cpp:107 msgid "More Dutch translation" msgstr "Ulteriore traduzione tedesca" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:107 +msgid "Heimen Stoffels" +msgstr "Heimen Stoffels" + +#: main.cpp:109 +msgid "More German translation, Greek translation" +msgstr "Ulteriore traduzione tedesca, traduzione greca" + +#: main.cpp:110 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:110 +msgid "More Greek translation" +msgstr "Ulteriore traduzione greca" + +#: main.cpp:112 msgid "Estonian translation" msgstr "Traduzione estone" -#: main.cpp:101 +#: main.cpp:112 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:113 msgid "Finnish translation" msgstr "Traduzione finlandese" -#: main.cpp:102 main.cpp:103 +#: main.cpp:113 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:114 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:114 main.cpp:115 msgid "More Finnish translation" msgstr "Ulteriore traduzione danese" -#: main.cpp:105 +#: main.cpp:115 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:117 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:117 msgid "French translation" msgstr "Traduzione francese" -#: main.cpp:106 +#: main.cpp:118 msgid "More French translation, MSN6 emoticon definitions" msgstr "Ulteriore traduzione francese, definizioni emoticon MSN6" -#: main.cpp:107 +#: main.cpp:118 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:119 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:119 main.cpp:120 main.cpp:121 msgid "More French translation" msgstr "Ulteriore traduzione francese" -#: main.cpp:109 +#: main.cpp:120 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:121 +msgid "Scias" +msgstr "Scias" + +#: main.cpp:123 msgid "Hungarian translation" msgstr "Traduzione ungherese" -#: main.cpp:110 main.cpp:111 +#: main.cpp:123 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:124 +msgid "More Hungarian translation" +msgstr "Ulteriore traduzione ungherese" + +#: main.cpp:124 +msgid "Pauli Henrik" +msgstr "Henrik Pauli" + +#: main.cpp:125 main.cpp:126 msgid "More Italian translation" msgstr "Ulteriore traduzione italiana" -#: main.cpp:112 +#: main.cpp:126 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:127 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:127 +msgid "More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" +"Ulteriore traduzione italiana, Scelta del gruppo nella finestra di aggiunta " +"da parte di un contatto" + +#: main.cpp:128 msgid "Korean translation" msgstr "Traduzione coreana" -#: main.cpp:113 +#: main.cpp:128 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:129 msgid "Norsk Bokmål translation" msgstr "Traduzione norvegese Bokmål" -#: main.cpp:115 +#: main.cpp:129 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:131 +msgid "Serbian translation" +msgstr "Traduzione serba" + +#: main.cpp:131 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:133 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:133 +msgid "Slovak translation" +msgstr "Traduzione slovacca" + +#: main.cpp:134 +msgid "Matjaž Kaše" +msgstr "Matjaž Kaše" + +#: main.cpp:134 msgid "Slovenian translation" msgstr "Traduzione slovena" -#: main.cpp:116 +#: main.cpp:136 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:136 msgid "Spanish translation" msgstr "Traduzione spagnola" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:137 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 main.cpp:141 +#: main.cpp:142 main.cpp:143 msgid "More Spanish translation" msgstr "Ulteriore traduzione spagnola" -#: main.cpp:121 +#: main.cpp:138 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:139 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:140 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:141 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:142 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:143 +msgid "Manuel Ramírez" +msgstr "Manuel Ramírez" + +#: main.cpp:145 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:145 msgid "Swedish translation" msgstr "Traduzione svedese" -#: main.cpp:123 +#: main.cpp:146 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:146 +msgid "More Swedish translation" +msgstr "Ulteriore traduzione svedese" + +#: main.cpp:148 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:148 msgid "Thai translation" msgstr "Traduzione thailandese" -#: main.cpp:124 +#: main.cpp:149 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:149 msgid "Turkish translation" msgstr "Traduzione turca" -#: main.cpp:125 main.cpp:126 +#: main.cpp:150 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:150 main.cpp:151 msgid "More Turkish translation" msgstr "Ulteriori traduzioni in turco" -#: main.cpp:129 +#: main.cpp:151 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:154 +msgid "MSNP12 support, various patches" +msgstr "Supporto a MSNP12, patch varie" + +#: main.cpp:154 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:155 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:155 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:130 +#: main.cpp:156 +msgid "File transfer thumbnails" +msgstr "Anteprime nei trasferimenti file" + +#: main.cpp:156 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:157 msgid "P4-Context field support" msgstr "Supporto campo P4-Context" -#: main.cpp:131 +#: main.cpp:158 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:158 msgid "Xinerama fixes" msgstr "Correzioni di Xinerama" -#: main.cpp:132 +#: main.cpp:159 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:159 msgid "Original file receive code" msgstr "Codice originale per la ricezione di file" -#: main.cpp:133 +#: main.cpp:160 +msgid "KWallet support" +msgstr "Supporto a KWallet" + +#: main.cpp:160 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:161 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Opzione di blocco notifiche, opzione di disabilitazione animoticon, date " +"ultimi messaggi" + +#: main.cpp:162 +msgid "IRC-like commands in the chat window" +msgstr "Comandi stile IRC nella finestra di conversazione" + +#: main.cpp:163 +msgid "Chat history dialog" +msgstr "Finestra cronologia conversazioni" + +#: main.cpp:163 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:166 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:166 +msgid "Various internationalization fixes" +msgstr "Varie correzioni all'internazionalizzazione" + +#: main.cpp:167 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:167 msgid "Various internationalization fixes." msgstr "Varie correzioni sull'internazionalizzazione." -#: main.cpp:134 +#: main.cpp:169 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:169 msgid "GnomeMeeting developer" msgstr "Sviluppatore GnomeMeeting" -#: main.cpp:135 +#: main.cpp:170 msgid "Guy with a bag over his head" msgstr "Ragazzo con un sacchetto in testa" -#: main.cpp:138 +#: main.cpp:170 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:173 msgid "Inspiration and assorted code" msgstr "Ispirazione e parti di codice" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +#: main.cpp:173 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:174 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:174 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "" "Vecchio codice fumetti di notifica, codice P2P iniziale, gestore " -"autenticazioni" +"autenticazione MSN" -#: main.cpp:140 +#: main.cpp:175 msgid "Idle timer code" msgstr "Codice tempo di inattività" -#: main.cpp:141 -msgid "Close-to-tray icon screenshot code" -msgstr "" +#: main.cpp:175 +msgid "KScreensaver" +msgstr "KScreensaver" -#: main.cpp:144 +#: main.cpp:176 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:176 +msgid "Close-to-tray icon screenshot code" +msgstr "Codice per l'immagine alla chiusura in tray" + +#: main.cpp:177 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:177 +msgid "Custom crash handler implementation" +msgstr "Implementazione del gestore dei crash personalizzato" + +#: main.cpp:178 +msgid "" +"KNotify not giving focus bug fix and KWin focus stealing prevention " +"workaround" +msgstr "" +"Correzione problema di focus di KNotify e workaround per evitare " +"l'appropriazione del focus da parte di KWin" + +#: main.cpp:178 +msgid "Quassel" +msgstr "Quassel" + +#: main.cpp:181 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\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 al forum di KMess!\n" +"E se pensi che il tuo nome manchi in questa lista, contattaci!" + +#: main.cpp:181 msgid "Your name here?" msgstr "Il tuo nome qui?" -#: main.cpp:144 -msgid "" -"You are welcome to sent 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! " +#: main.cpp:184 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "I vostri nomi" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:185 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "I tuoi indirizzi email" + +#: main.cpp:191 +msgid "Do not show the contact list window initially" +msgstr "Non mostrare la Lista dei Contatti all'avvio" + +#: main.cpp:192 +msgid "Autologin with the given email address" +msgstr "Accesso automatico con questo indirizzo email" + +#: main.cpp:197 +msgid "Run a debug test (developer build only)" +msgstr "Esegue una prova di debugging (solo build per sviluppatori)" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "Altri Contatti" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Autorizzato" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Rimosso" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." msgstr "Il contatto ha chiuso la sessione." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "Il contatto ha rifiutato l'invito." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Hai chiuso la sessione." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Hai rifiutato l'invito." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to accept or cancel?" msgstr "Desideri accettare o rifiutare?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." -msgstr "Fai clic per rifiutare." +msgstr "Fai clic per annullare." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Il contatto vuole inviarti un file: "%1" (%2)." -#: network/applications/filetransfer.cpp:209 -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 +#, kde-format +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:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Connessione a %1, sulla porta %2" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, kde-format +msgid "The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"Il trasferimento del file "%1" non è riuscito. Impossibile salvare " +"il file." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Il trasferimento è stato annullato" +#: network/applications/filetransfer.cpp:295 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "" +"Il trasferimento del file "%1" non è riuscito. Impossibile aprire " +"il file." -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Connessione stabilita" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Trasferimento completato del file: %1" - -#: network/applications/filetransfer.cpp:600 -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:604 -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:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Invio del file %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Trasferimento accettato." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Connessione a %1, sulla porta %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:548 +#, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Il contatto ha annullato il trasferimento del file "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:559 +#, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Hai annullato il trasferimento del file "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:570 +#, kde-format +msgid "You have rejected the transfer of the 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:581 +#: network/applications/filetransferp2p.cpp:674 +#, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Il file "%1" è stato inviato correttamente." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:678 +#, kde-format +msgid "Successfully received the file "%1"." +msgstr "Il file "%1" è stato ricevuto correttamente." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:811 +#, kde-format +msgid "The transfer of the file "%1" failed. The file does not exist." +msgstr "Il trasferimento del file "%1" non è riuscito. Il file non esiste." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:816 +#, kde-format +msgid "The transfer of the 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:774 +#: network/applications/filetransferp2p.cpp:850 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Invio del file "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:888 +#, kde-format +msgid "The contact has accepted the transfer of the 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:3217 msgid "Negotiating options to connect" msgstr "Negoziazione modalità di connessione" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "" -"L'invito a trasferire il file è stato annullato, sono state ricevutidati non " -"validi." +"L'invito a trasferire il file è stato annullato, sono state ricevuti dati " +"non validi." -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "Il trasferimento di %1 non è riuscito. Impossibile aprire il file." +#: network/applications/filetransferp2p.cpp:404 +#, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Hai accettato il trasferimento del file "%1"." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Il contatto ha annullato il trasferimento." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:614 msgid "File could not be written" -msgstr "Impossibile scrivere sul file." +msgstr "Impossibile scrivere sul file" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Il trasferimento di %1 non è riuscito. Il file non esiste." - -#: network/applications/filetransferp2p.cpp:779 -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/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "Invio del file %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "" -"Sei stato invitato a partecipare ad una conferenza (tramite GnomeMeeting)." +msgstr "Sei stato invitato a partecipare ad una conferenza (tramite GnomeMeeting)." -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Avvio di GnomeMeeting. Connessione a %1." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Invio di un invito a partecipare a una conferenza." -#: network/applications/mimeapplication.cpp:109 -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/inktransferp2p.cpp:108 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has tried to send you an handwritten message, but it could not be " +"received." +msgstr "" +"%1 ha cercato di inviarti un disegno, ma non è stato possibile " +"riceverlo." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." +#: network/applications/inktransferp2p.cpp:114 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "The handwritten message to %1 could not be delivered." +msgstr "Impossibile recapitare il disegno a %1." + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "L'invito è stato rifiutato. Il programma del contatto non lo supporta." + +#: 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:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "Invio dell'invito annullato per mancata risposta." - -#: network/applications/mimeapplication.cpp:130 -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:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +#: network/applications/mimeapplication.cpp:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" -"Invio dell'invito annullato a causa della chiusura forzata della connessione." +"Invio dell'invito annullato perché il destinatario non ha accettato nel " +"tempo stabilito." -#: network/applications/mimeapplication.cpp:141 +#: 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 nella ricezione " +"dei dati." + +#: 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:186 msgid "The invitation was aborted." msgstr "Invito annullato." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this contact's desktop." msgstr "Sei stato invitato a condividere il desktop del contatto." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Avvio di KRDC. Connessione a %1." -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by KMess." msgstr "" -"Il contatto ha richiesto una caratteristica di MSN non ancora supportata da " -"KMess." +"Il contatto ti sta invitando ad avviare un'attività, ma essa non è ancora " +"supportata da KMess." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" -"Invito rifiutato a causa di un errore di trasferimento, o di una " +"Invito annullato a causa di un errore di trasferimento, o di una " "caratteristica non supportata da KMess." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "Il trasferimento non è riuscito, a causa di un errore interno." +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "Il trasferimento non è riuscito. La preparazione dei dati è fallita." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -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:1624 -msgid "The transfer failed." -msgstr "Il trasferimento non è riuscito." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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/p2papplication.cpp:2038 +#: network/applications/p2papplication.cpp:1192 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:2584 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +msgid "The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "" -"Il trasferimento non è riuscito. Sono state ricevuti dati non validi, oppure " +"Il trasferimento non è riuscito. Sono stati ricevuti dati non validi, oppure " "KMess non lo supporta." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Il contatto ha rifiutato l'invito, a causa di un errore interno." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Attesa di una connessione a %1, sulla porta %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 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:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Il trasferimento non è riuscito, a causa di una mancata risposta." +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "In attesa di connessione" -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." +#: network/applications/p2papplication.cpp:3423 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "" +"L'invito è stato annullato, a causa di una mancata accettazione entro il " +"tempo limite." + +#: network/applications/p2papplication.cpp:3432 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "" +"L'invito è stato annullato, a causa di una mancata risposta dalla " +"connessione entro il tempo limite." + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "" +"L'invito è stato annullato, a causa di una mancata risposta all'attesa di " +"dati entro il tempo limite." + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +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/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Il trasferimento non è riuscito." + +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"Il trasferimento non è riuscito, a causa di una mancata accettazione entro " +"il tempo limite." + +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." msgstr "Il trasferimento non è riuscito, a causa di un errore interno." -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." +#: network/applications/p2papplicationbase.cpp:1208 +msgid "The transfer failed. Could not open data source." msgstr "" "Il trasferimento non è riuscito, a causa di un errore nell'apertura della " "sorgente dati." -#: network/applications/p2papplication.cpp:4844 -msgid "Waiting for connection" -msgstr "In attesa di connessione" - -#: network/applications/p2papplication.cpp:5013 -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:5022 -msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " -"succeed or fail." -msgstr "" -"L'invito è stato annullato, a causa di una mancata risposta dalla " -"connessione." - -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -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/voiceconversation.cpp:77 +#: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Sei stato invitato a partecipare a una conversazione vocale." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" @@ -1579,1007 +3165,2802 @@ msgstr "" "Sei stato invitato a partecipare a una conversazione vocale ma non è stato " "installato il programma di supporto." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "Hai annullato la conversazione vocale." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "" "L'invito è stato annullato, a causa di un errore nell'apertura della " "periferica audio." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Inizio conversazione vocale. Connessione a %1." -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Inizio conversazione vocale. In attesa da %1." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "Invio dell'invito a partecipare a una conversazione vocale." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Il trasferimento di %1 è stato annullato." +#: 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/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "Sei stato invitato a vedere in webcam questo contatto." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webcam" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Hai chiuso il trasferimento del file "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Il contatto ha annullato il trasferimento del file "%1"." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Fallito" -#: network/extra/msnftpconnection.cpp:410 -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 +#, kde-format +msgid "Sending file %1" +msgstr "Invio del file %1" -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:398 +#, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "Il trasferimento di %1 non è riuscito. Impossibile aprire una porta locale." + +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." msgstr "Impossibile aprire una porta locale." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Avvio del trasferimento" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +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:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Impossibile effettuare la connessione." -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Ricezione del file %1" -#: network/msnconnection.cpp:140 +#: network/msnconnection.cpp:378 +msgid "Invalid command syntax" +msgstr "Sintassi non valida del comando" + +#: network/msnconnection.cpp:382 +msgid "Invalid command parameter" +msgstr "Parametro non valido del comando" + +#: network/msnconnection.cpp:385 +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "" +"L'indirizzo email che hai provato ad aggiungere non è un profilo di Live " +"Messenger" + +#: network/msnconnection.cpp:390 +msgid "Domain name missing" +msgstr "Nome del dominio mancante" + +#: network/msnconnection.cpp:394 +msgid "Already logged in" +msgstr "Già connesso" + +#: network/msnconnection.cpp:397 +msgid "The given account name is invalid" +msgstr "Questo nome di profilo non è valido" + +#: network/msnconnection.cpp:401 msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"KMess non è riuscito ad effettuare la connessione al servizio MSN " -"Messenger.\n" -"Per favore, assicurati di essere connesso a Internet.\n" -"Errore di sistema: %1 (codice %2)." +"Questo nome di profilo non è valido, oppure il tuo profilo Passport non è " +"stato ancora verificato" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping perduto" - -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 ping perduti" - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "La connessione al server è stata persa." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "Il server remoto ha chiuso la connessione." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Autorizzato" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Rimosso" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -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." - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "Mostra lo stato del servizio MSN Messenger" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Errore del server" - -#: network/msnnotificationconnection.cpp:1339 -msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "" -"Sei stato disconnesso perché ti sei connesso con un altro client MSN o da " -"un'altra postazione." - -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "Sincronizzazione avvenuta" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Autenticazione" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Ricevuta conferma utente" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "In attesa della lista contatti..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Trasferimento al server di notifica" - -#: network/msnnotificationconnection.cpp:1919 -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:2034 -msgid "Connecting..." -msgstr "Connessione in corso..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "" -"KMess ha ricevuto un messaggio di errore sconosciuto dal server: \"%1\"" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Errore interno di KMess: %1" - -#: network/msnnotificationconnection.cpp:2243 -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:2252 -msgid "The account name given is invalid" -msgstr "Questo nome di account non è valido" - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" -"Questo nome di account non è valido, oppure il tuo indirizzo email non è " -"stato verificato su MSN Passport." - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:404 msgid "Your contact list is full" msgstr "La tua lista dei contatti è piena" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:409 +msgid "Invalid SBP parameter" +msgstr "Parametro SBP non valido" + +#: network/msnconnection.cpp:412 msgid "This contact is already on your list" msgstr "Questo contatto è già presente nella tua lista" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:416 msgid "This contact is not on your list" msgstr "Questo contatto non è presente nella tua lista" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:420 msgid "This contact is not online" msgstr "Questo contatto non è in linea" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "La tua lista dei contatti ha troppi gruppi" +#: network/msnconnection.cpp:425 +msgid "Already in this mode" +msgstr "Già in questa modalità" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" +#: network/msnconnection.cpp:429 +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 che a " +"quella di blocco" + +#: network/msnconnection.cpp:433 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"Questo nome di gruppo è già usato nella tua lista di contatti di Messenger o " +"di Hotmail. Per favore usa un nome diverso" + +#: network/msnconnection.cpp:437 +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/msnconnection.cpp:441 +msgid "This group cannot be changed" msgstr "Questo è un gruppo speciale e non può essere modificato" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:446 +msgid "Contact is not added to this group" +msgstr "Il contatto non fa parte di questo gruppo" + +#: network/msnconnection.cpp:450 msgid "This group is not empty" msgstr "Questo gruppo non è vuoto" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "" -"Questo nome di gruppo è già usato nella tua lista di contatti di Messenger o " -"di Hotmail" +#: network/msnconnection.cpp:454 +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:2291 -msgid "The group name is too long" -msgstr "Il nome del gruppo è troppo lungo" +#: network/msnconnection.cpp:459 +msgid "Attempted to change group \"0\"" +msgstr "Tentativo di cambiare il gruppo \"0\"" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:459 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Errore interno di KMess: %1" + +#: network/msnconnection.cpp:463 +msgid "Invalid Group" +msgstr "Gruppo non valido" + +#: network/msnconnection.cpp:467 +msgid "Empty domain" +msgstr "Dominio vuoto" + +#: network/msnconnection.cpp:471 +msgid "Wrong ADL command format" +msgstr "Formato del comando ADL errato" + +#: network/msnconnection.cpp:474 msgid "Switchboard server failed" msgstr "Connessione al server di scambio non riuscita" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:477 msgid "Transfer to switchboard server failed" msgstr "Trasferimento al server di notifica non riuscito" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:481 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Errore nella connessione diretta (MSNSLP), connessione non riuscita" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "Errore nell'accesso alla lista contatti, riprova più tardi" +#: network/msnconnection.cpp:485 +msgid "Required field missing" +msgstr "Campo richiesto mancante" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "Il tuo account è stato bandito." +#: network/msnconnection.cpp:489 +msgid "Not logged in" +msgstr "Non connesso" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Stai aprendo sessioni troppo rapidamente" +#: network/msnconnection.cpp:493 +msgctxt "MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "A questo profilo è stato negato l'accesso al servizio Live Messenger" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Hai troppe sessioni aperte" +#: network/msnconnection.cpp:498 +msgid "Command is disabled" +msgstr "Comando disabilitato" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:501 +msgid "Your account is banned" +msgstr "Il tuo profilo è stato bandito" + +#: network/msnconnection.cpp:505 +msgid "Challenge response failed" +msgstr "Risposta alla sfida fallita" + +#: network/msnconnection.cpp:510 +msgid "Bad command data" +msgstr "Dati non validi nel comando" + +#: network/msnconnection.cpp:514 +msgid "You are opening chat sessions too fast" +msgstr "Stai aprendo sessioni di conversazione troppo rapidamente" + +#: network/msnconnection.cpp:518 +msgid "You have too many open chat sessions" +msgstr "Hai troppe sessioni di conversazione aperte" + +#: network/msnconnection.cpp:525 +msgid "Unexpected command sequence" +msgstr "Sequenza non attesa di comandi" + +#: network/msnconnection.cpp:529 msgid "Bad friend name" msgstr "Nome personale non valido" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:535 +msgid "Bad CVR data" +msgstr "Dati CVR non validi" + +#: network/msnconnection.cpp:541 +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:2359 -msgid "You can't start a chat with someone while you are invisible." -msgstr "Non puoi avviare una chat quando sei invisibile." +#: network/msnconnection.cpp:548 +msgid "Authentication ticket was incorrect" +msgstr "Il biglietto di autenticazione non era valido" -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:551 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Non puoi avviare una chat quando sei invisibile" + +#: network/msnconnection.cpp:555 +msgid "Not accepting new contacts" +msgstr "Non accettiamo nuovi contatti" + +#: network/msnconnection.cpp:559 +msgid "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." +"Hai un profilo Passport per bambini, devi chiedere il permesso dei tuoi " +"genitori per poter conversare in linea" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Il tuo account deve essere prima verificato su MSN Passport." +#: network/msnconnection.cpp:562 +msgid "Your Passport account needs to be verified first" +msgstr "Il tuo profilo Passport deve essere prima verificato" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - Errore MSN" +#: network/msnconnection.cpp:566 +msgid "Bad USR ticket" +msgstr "Biglietto USR non valido" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "È avvenuto un errore interno nel server" +#: network/msnconnection.cpp:576 +msgid "Error accessing contact list, try again later" +msgstr "Errore nell'accesso alla lista contatti, riprova più tardi" -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "Il server è occupato" +#: network/msnconnection.cpp:585 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"Il servizio MSN è temporaneamente non disponibile. E' avvenuto un errore " +"interno nel server." -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Il server non è raggiungibile" +#: network/msnconnection.cpp:596 +msgid "The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" +"Il servizio MSN è temporaneamente non disponibile. Il server è troppo " +"occupato" -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:600 msgid "Peer notification server down" msgstr "Connessione al server di scambio notifiche utenti persa" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:604 msgid "The server is going down" msgstr "La connessione al server sta per cadere" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:608 msgid "The server is going down soon" msgstr "La connessione al server cadrà presto" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:613 msgid "Write is blocking" msgstr "Scrittura non permessa" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:617 msgid "Session is overloaded" msgstr "Sessione troppo carica" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:624 msgid "The server is not available" msgstr "Il server non è disponibile" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:628 msgid "Authentication failed" msgstr "Autenticazione non riuscita" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Non accettiamo nuovi principali" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" +#: network/msnconnection.cpp:635 +#, kde-format +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:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Attenzione: Il server chiude per manutenzione tra 1 minuto!" +#: network/msnconnection.cpp:652 network/msnnotificationconnection.cpp:2922 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Errore MSN" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:957 +msgid "Trying the HTTP fallback..." +msgstr "Tentativo di passaggio ad HTTP..." + +#: network/msnnotificationconnection.cpp:1344 +msgid "Authenticating..." +msgstr "Autenticazione..." + +#: network/msnnotificationconnection.cpp:1368 +msgid "Authenticated" +msgstr "Autenticato" + +#: network/msnnotificationconnection.cpp:1438 +msgid "Switching to another server..." +msgstr "Passaggio ad un altro server..." + +#: network/msnnotificationconnection.cpp:1802 +msgid "Connecting..." +msgstr "Connessione in corso..." + +#: network/msnnotificationconnection.cpp:1947 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Ricevuto un messaggio di errore sconosciuto dal server: %1" + +#: network/msnnotificationconnection.cpp:2107 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuto" +msgstr[1] "%1 minuti" + +#: network/msnnotificationconnection.cpp:2110 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Il server chiude per manutenzione tra %1!" + +#: network/msnnotificationconnection.cpp:2115 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "Il server di Live Messenger chiuderà per manutenzione tra %1." + +#: network/msnnotificationconnection.cpp:2316 +#, kde-format +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:2317 +msgid "SOAP client is no longer valid." +msgstr "Il client SOAP non è più valido." + +#: network/msnnotificationconnection.cpp:2587 +msgid "Authentication time limit exceeded" +msgstr "Limite al tempo di autenticazione superato" + +#: network/msnnotificationconnection.cpp:2766 +msgid "Waiting for contact list..." +msgstr "In attesa della lista contatti..." + +#: network/msnnotificationconnection.cpp:2812 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Avviso: %1

" + +#: network/msnnotificationconnection.cpp:2813 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Avviso MSN" + +#: network/msnnotificationconnection.cpp:2885 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Causa dell'errore interno: %1" + +#: network/msnnotificationconnection.cpp:2920 +msgctxt "Connection error: dialog box" msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "Il server MSN ha indicato che chiuderà per manutenzione tra un minuto." +"

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

" +msgstr "" +"

Autenticazione non riuscita, per favore verifica il nome del profilo e la " +"password.

" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Attenzione: Il server chiude per manutenzione tra %1 minuti!" +#: network/msnnotificationconnection.cpp:2933 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

Il profilo %1 si è connesso da un'altra postazione.

" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnnotificationconnection.cpp:2936 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"Impossibile gestire i messaggi non in linea.\n" -"Dettagli: %1" +"

Sei stato disconnesso: ti sei connesso con il profilo %1 da un " +"altro client Messenger, o da un'altra postazione.

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2948 +msgctxt "Connection error: passive notification message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"Autenticazione non riuscita, KMess non è riuscito a elaborare l'accesso a " -"Passport.\n" -"Dettagli: %1" +"

Impossibile connettersi al servizio Live Messenger.
Forse devi " +"autenticarti prima di poter accedere alla rete?

" -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2951 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"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.
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 "" -"Impossibile accedere al servizio web remoto.\n" -"Dettagli: %1" +"

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/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Questa persona non è in linea o è invisibile." +#: network/msnnotificationconnection.cpp:2970 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

Impossibile connettersi al servizio Live Messenger.

" -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/msnnotificationconnection.cpp:2972 +#, kde-format +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 "" -"Questo contatto ti ha invitato a usare una caratteristica che KMess ancora " -"non supporta." +"

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/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "Il messaggio \"%1\" non è stato ricevuto!" +#: network/msnnotificationconnection.cpp:2983 +#, kde-format +msgctxt "Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Errore: %1

" -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Impossibile effettuare la connessione a %1" +#: network/msnnotificationconnection.cpp:2985 +#, kde-format +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/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "Troppe redirezioni da parte del servizio di accesso" +#: network/msnnotificationconnection.cpp:2996 +#, kde-format +msgctxt "Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Errore Servizio Messenger: %1

" -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Mancata risposta durante la connessione" +#: network/msnnotificationconnection.cpp:2998 +#, kde-format +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

" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "Nella chat di %1: %2" +#: network/msnnotificationconnection.cpp:3006 +#, kde-format +msgctxt "Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Errore di KMess: %1

" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 scrive:
'%2'" +#: network/msnnotificationconnection.cpp:3008 +#, kde-format +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

" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 ti ha inviato un messaggio non in linea:
'%2'" +#: network/msnnotificationconnection.cpp:3019 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Connessione di rete persa.

" -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "La chat di %1 richiede attenzione!" +#: network/msnnotificationconnection.cpp:3021 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

La connessione al server Live Messenger è stata persa.

" -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1:
%2" +#: network/msnnotificationconnection.cpp:3077 +#, kde-format +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

" -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 ti ha inviato un trillo!" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "Inserisci nome utente e password per accedere al proxy di rete." -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1 ti ha inviato una animoticon!" +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Codice interno dell'errore: %2)" -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 vuole usare la webcam!" +#: network/msnsockethttp.cpp:696 +#, kde-format +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" -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 ti sta inviando un file!" +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "Limite di tempo per la connessione superato" -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 ti ha mandato un invito!" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping perduto" -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 ha annullato la sessione webcam!" +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 ping perduti" -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 ha annullato il trasferimento file!" +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "La connessione al server è stata persa" -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "L'attività con %1 è stata annullata!" +#: network/soap/addressbookservice.cpp:777 +#, kde-format +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!" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 ha accettato di usare la webcam!" +#: network/soap/addressbookservice.cpp:787 +#, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "L'email specificata, \"%1\", non appartiene ad un profilo di Live Messenger!" -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 ha accettato il trasferimento file!" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:295 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Richiesta al servizio web non valida (%1)" -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 ha accettato il tuo invito!" +#: network/soap/httpsoapconnection.cpp:427 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Il servizio web non è accessible (%1)" -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 ha concluso la sessione webcam!" +#: network/soap/httpsoapconnection.cpp:504 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Troppe redirezioni da parte del servizio web" -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "Il trasferimento file con %1 è stato completato!" +#: network/soap/httpsoapconnection.cpp:548 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Il server per i messaggi non in linea non è al momento disponibile" -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "L'attività con %1 è conclusa!" +#: network/soap/httpsoapconnection.cpp:554 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "Il servizio web Live Messenger ha al momento dei problemi" -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "La sessione webcam con %1 non è riuscita!" +#: network/soap/httpsoapconnection.cpp:568 +#, kde-format +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/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "Il trasferimento di file con %1 non è riuscito!" +#: network/soap/httpsoapconnection.cpp:607 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Nessuna risposta dal servizio web" -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "L'attività con %1 è conclusa con un errore!" +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Risposta inattesa dal server (%1)" -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 non è più al computer" +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "Nella chat di %1:
%2" -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 torna subito" +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 scrive:
'%2'" -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 è occupato" +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 ti ha inviato un messaggio non in linea:
'%2'" -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 si è disconnesso" +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "La chat di %1 richiede attenzione!" -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 è diventato invisibile" +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 è inattivo" +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 ti ha inviato un messaggio scritto a mano!" -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 è andato a pranzo" +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 ti ha inviato un trillo!" -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 è al telefono" +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 ti ha inviato una animoticon!" -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 è ora connesso" +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 vuole usare la webcam!" -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Nuova email:
'%1'
da '%2'" +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 ti sta inviando un file!" -#. i18n: file ./chat/chatviewinterface.ui line 143 +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 ti ha mandato un invito!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 ha annullato la sessione webcam!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 ha annullato il trasferimento file!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "L'attività con %1 è stata annullata!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 ha accettato di usare la webcam!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 ha accettato il trasferimento file!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 ha accettato il tuo invito!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 ha concluso la sessione webcam!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "Il trasferimento file con %1 è stato completato!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "L'attività con %1 è conclusa!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "La sessione webcam con %1 non è riuscita!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Il trasferimento di file con %1 non è riuscito!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "L'attività con %1 si è conclusa con un errore!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
è ora connesso" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
non è più al computer" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
tornerà subito" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
è ora occupato" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
è diventato invisibile" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
è ora inattivo" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
si è disconnesso" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
è al telefono" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
è andato a pranzo" + +#: notification/newemailnotification.cpp:92 +#, kde-format +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'" + +#: 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 nel vassoio di " +"sistema. 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 nel vassoio di sistema" + +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Sfoglia..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Sfoglia e Ritaglia Immagine..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Usa Immagine Precedente..." + +#. i18n: file: settings/accountpage.ui:136 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:458 rc.cpp:381 +msgid "Display Picture" +msgstr "Immagine personale" + +#: settings/accountpage.cpp:488 +msgid "Downloading of display picture failed" +msgstr "Ricezione dell'immagine personale non riuscita" + +#: settings/accountpage.cpp:547 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Si è verificato un errore nel tentativo di cambiare l'immagine personale.\n" +"Controlla di aver selezionato un file di immagine esistente." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Impostazioni" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Profilo" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Il Mio Profilo" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Lista dei Contatti" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Chat" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Registro Conversazioni" + +#: 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 "" +"Clicca qui per eliminare questo profilo dalla lista dei profili registrati.\n" +"Non puoi eliminare né il profilo a cui sei attualmente connesso né un " +"profilo ospite, che verrà eliminato alla disconessione." + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"L'indirizzo di posta che hai inserito non è valido, e non può essere usato " +"per un profilo: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "L'indirizzo di posta che hai inserito è già in uso: '%1'" + +#: settings/accountsettingsdialog.cpp:220 +msgid "Please enter a friendly name for this account." +msgstr "Inserisci per favore un nome personale per questo profilo." + +#: settings/accountsettingsdialog.cpp:301 +msgid "Are you sure you want to delete this account?" +msgstr "Sei sicuro di voler eliminare questo profilo?" + +#: settings/accountsmanagerpage.cpp:160 +#, kde-format +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 il profilo '%1' ?
Tutte le " +"impostazioni di questo profilo andranno perse." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Ciao, come va? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Stacy" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Bene!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Sono /appena/ tornata dalle mie vacanze in Italia!" + +#: 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/emoticonspage.cpp:233 +#, kde-format +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Sei sicuro di voler eliminare l'emoticon \"%1\" ?" + +#: 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 "Profili" + +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notifiche" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." +msgstr "Nessun browser selezionabile è stato rilevato." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Nessun programma di posta selezionabile è stato rilevato." + +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "" +"Devi selezionare un comando da terminale per lanciare un browser " +"personalizzato!" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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, non " +"sarà possibile aprire siti Web.
Vuoi che KMess lo aggiunga per te?" + +#: 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:321 +#, c-format +msgid "" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing emails 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, non sarà " +"possibile comporre le email.
Vuoi che KMess lo aggiunga per te?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "Devi selezionare una cartella per i file ricevuti!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Directory" +msgstr "Seleziona la Cartella" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Invia con KMess" + +#: 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!

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "&Invia Commento agli Sviluppatori" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "Mostra Icone delle &Opinioni" + +#: utils/likeback/likeback.cpp:323 +#, kde-format +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:328 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Benvenuto a %1." + +#: utils/likeback/likeback.cpp:336 +msgctxt "Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on '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:343 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'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:350 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" +"Ogni volta che hai una'esperienza frustrante 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:360 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" +"Se riscontri un comportamento non corretto nel programma, clicca sull'icona " +"con l'oggetto rotto nell'angolo in alto a destra della finestra, descrivi " +"brevemente tale comportamento e premi Invia." + +#: utils/likeback/likeback.cpp:372 +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:380 +msgctxt "Welcome dialog text, usage example" +msgid "I dislike the welcome page of this assistant. Too time consuming." +msgstr "" +"Non mi piace la pagina di benvenuto di questo assistente. Spreca " +"troppo tempo." + +#: utils/likeback/likeback.cpp:388 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"L'applicazione ha un comportamento non corretto cliccando sul " +"pulsante Aggiungi. Non accade nulla." + +#: utils/likeback/likeback.cpp:396 +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 " +"miolavoro per email." + +#: utils/likeback/likeback.cpp:409 +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:412 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Esempio" +msgstr[1] "Esempi" + +#: utils/likeback/likeback.cpp:418 +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:139 +#, kde-format +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 strumento online di traduzione per questo).
" + +#: utils/likeback/likebackdialog.cpp:146 +#, kde-format +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 strumento online di traduzione per questo).
" + +#: utils/likeback/likebackdialog.cpp:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" +"

Puoi fornire agli sviluppatori una breve descrizione delle tue opinioni " +"su %1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +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:290 +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 correttamente. Ci aiuterà a migliorare " +"l'applicazione!

Grazie per il tuo tempo.

" + +#: utils/likeback/likebackdialog.cpp:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Commento Inviato" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" +"

Si è verificato un errore durante l'invio del commento.

Per favore, " +"riprova più tardi.

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Errore Invio Commento" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +msgid "Standard text mode" +msgstr "Modalità standard di testo" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) #: rc.cpp:6 -#, no-c-format +msgid "Click this button to switch to the standard text mode." +msgstr "Clicca questo pulsante per passare alla modalità standard di testo." + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "" +"Clicca questo pulsante per passare alla modalità di scrittura a mano, così " +"da poter scrivere o disegnare un messaggio a mano." + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Set di emoticon standard" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Clicca questo pulsante per mostrare tutte le emoticon predefinite di Live " +"Messenger, in modo da poterle inserire facilmente nei tuoi messaggi." + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "Emoticon personali" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Clicca questo pulsante per mostrare tutte le emoticon personalizzate, in " +"modo da poterle inserire facilmente nei tuoi messaggi." + +#. 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 "Clicca questo pulsante per visualizzare le animoticon disponbili." + +#. 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: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "&A capo" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chat" -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Barra laterale" +#. 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: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Questo contatto non è presente nella tua lista" +#. 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: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Clicca qui per mostrare il profilo di questo contatto." +#. i18n: file: chat/contactswidget.ui:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Clicca qui per aprire le impostazioni relative al tuo profilo" -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Clicca per inviare una email a questo contatto." +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "Clear area" +msgstr "Pulisci area" -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Inserisci un collegamento per questa emoticon:" +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "Pen color" +msgstr "Colore penna " -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format +#. 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" +msgstr "" +"Inserisci l'indirizzo email della persona che vorresti aggiungere ai tuoi " +"contatti" + +#. 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:273 +msgid "Email address:" +msgstr "Indirizzo 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 "Inserisci una scorciatoia per l'emoticon:" + +#. 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: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Aggiungi contatto" +#. 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: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#. 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: 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Filtra Registro Conversazioni" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Filtra per &conversazione" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "process-working" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "Filtra per &data" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "da" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +msgstr "a" + +#. 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 +msgid "&Add this person to the following groups of your contact list:" +msgstr "&Aggiungi questa persona ai seguenti gruppi della tua lista contatti:" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "" +"&Non aggiungere questa persona, ma consenti a lui o lei di vedere il tuo " +"stato" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +msgid "&Block this person from contacting you and seeing your status" +msgstr "" +"&Blocca questa persona e impedisci a lui o lei di contattarti e di vedere il " +"tuo stato" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Ripristina" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Gruppi:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this contact" +msgstr "Usa un nome &alternativo per questo contatto" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +msgid "Disable notifications for this contact" +msgstr "Disabilita notifiche per questo contatto" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Suono:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +msgid "&Display Pictures" +msgstr "&Immagini Personali" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "Clicca qui per usare l'immagine selezionata come tua immagine personale" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "Usa come Immagine Personale" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Pu&lisci Cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "%1\tn ti ha aggiunto alla sua lista contatti. Vuoi:" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". 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 \"Nascondi questa Emoticon\".Da questa pagina puoi ripristinare le " +"emoticon nascoste. " -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "&Aggiungi il contatto alla mia lista di \"Amici\"" +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "Clicca qui per ripristinare l'emoticon selezionata" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "&Non aggiungere il contatto, ma consentigli di vedere il tuo stato" +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +msgid "Resto&re" +msgstr "&Ripristina" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "&Blocca il contatto e impedisci di vedere il tuo stato" +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Contatti Disponibili" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +msgid "Invite a person not on your contact list:" +msgstr "Invita un contatto non nella tua lista contatti:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +msgid "Enter the email address of a person to invite" +msgstr "Inserisci l'indirizzo email di una persona da invitare" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +msgid "Invited Contacts" +msgstr "Contatti Invitati" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Elementi da esportare:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Formato" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Contatti:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Seleziona Tutto" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "Deseleziona Tutto" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Esporta..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Chiudi" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "Comando alla Scheda Corrente" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Comando:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Tipo:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Normale" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME " + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Invia" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Carico del messaggio (può essere vuoto):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Apri" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Annulla" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "&Scaricamenti" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "&Invii" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" msgstr "P&ulisci" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Inserisci i tuoi dati di accesso:" +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "&Chiudi" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "Indirizzo email" +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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 relative al profilo attualmente " +"selezionato, 
oppure scorri con la rotella del mouse per spostarti tra i profili salvati" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Password" +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:276 +msgid "Enter here the email address of your registered Passport or Live account" +msgstr "Inserisci qui l'indirizzo email del tuo profilo registrato Passport o Live" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Stato all'accesso" +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Password:" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "&Ricorda questo profilo" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "Inserisci qui la password del tuo profilo" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Connetti" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "Stato all'accesso:" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Inserisci un tuo messaggio personale qui" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "Scegli uno stato MSN da impostare quando la connessione è riuscita." -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Sto ascoltando %1" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "Se abilitata, KMess si ricorderà di questo profilo" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "Notifiche KMess" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +msgid "Remem&ber account" +msgstr "&Ricorda profilo" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format -msgid "Accounts" -msgstr "Account" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" +"Se scegli di far ricordare un profilo a KMess, puoi anche salvarne la " +"password" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Il tuo nome:" +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +msgid "R&emember password" +msgstr "&Ricorda password" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +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:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Nuovo profilo" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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 profilo 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:324 +msgid "Password forgotten?" +msgstr "Password dimenticata?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +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, per poter 
reimpostare la password del tuo profilo" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Connetti" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Visualizza" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Azioni" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "&Informazioni Profilo" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "Informazioni sul Tuo Profilo" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." msgstr "Inserisci il nome che gli altri contatti vedranno quando sei in linea." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Il tuo indirizzo email:" +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "&Nome Personale:" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 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/" +"Inserisci l'indirizzo email del tuo profilo MSN Passport. Puoi registrare un " +"nuovo profilo su http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "La tua password:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "&Indirizzo email: " -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"Inserisci la password del tuo account MSN Passport. Puoi registrare un nuovo " -"account su http://register.passport.com/" +"Inserisci la password del tuo profilo MSN Passport. Puoi registrare un nuovo " +"profilo su http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Immagine personale:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "&Password:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "Click here to have your password saved by KMess" +msgstr "Clicca qui affinché KMess salvi le tue password" + +#. i18n: file: settings/accountpage.ui:117 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:375 +msgid "" +"If you enable this option, KMess will save your account's password. This way " +"you will not have to enter your password on every start up, in order to log " +"in. Please keep in mind, that other persons that have access to this " +"computer may easily log in to your account, if this option is enabled." +msgstr "" +"Se abiliti questa opzione, KMess salverà la password del tuo profilo. In " +"questo modo non dovrai inserire la password ad ogni accesso. Tieni a mente " +"che questa opzione permetterà di fare facilmente l'accesso ad altre persone " +"che hanno accesso a questo computer." + +#. i18n: file: settings/accountpage.ui:120 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:378 +msgid "&Remember password" +msgstr "&Ricorda password" + +#. i18n: file: settings/accountpage.ui:236 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:384 msgid "C&hange..." msgstr "C&ambia..." -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Non mos&trare un'immagine personale" +#. i18n: file: settings/accountpage.ui:261 +#. i18n: ectx: property (toolTip), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:390 +msgid "Enable this option, if you do not want to use a display picture." +msgstr "Abilita questa opzione se non desideri utilizzate un'immagine personale." -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Ricorda le impostazioni di questo account" +#. i18n: file: settings/accountpage.ui:264 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:393 +msgid "&Do not use" +msgstr "&Non usare" -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:294 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:399 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -"L'opzione \"Ricorda questo profilo\" è stata disabilitata all'accesso, " -"quindi le tue impostazioni non verranno salvate. Abilita questa opzione " -"quando vuoi salvare permanentemente le impostazioni del tuo account su " -"questa macchina.\n" +"L'opzione \"Ricorda profilo\" è stata disabilitata all'accesso, quindi " +"le tue impostazioni non verranno salvate. Abilita questa opzione quando vuoi " +"salvare permanentemente le impostazioni del tuo profilo su questa macchina.\n" "\n" -"È consigliato abilitarla, a meno che non stia usando KMess come ospite o se " -"stai utilizzando una macchina accessibile pubblicamente (ad es. un Internet " -"café)." +"È consigliato abilitarla, a meno che tu non stia usando KMess come ospite o " +"su una macchina accessibile pubblicamente (ad es. in un Internet café)." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "&Accesso automatico con questo account all'avvio" +#. i18n: file: settings/accountpage.ui:297 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:404 +msgid "Re&member the settings of this account" +msgstr "R&icorda le impostazioni di questo profilo" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:307 +#. i18n: ectx: property (toolTip), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:407 msgid "If enabled, KMess automatically logs in with this account." -msgstr "Se abilitata, KMess accederà automaticamente con questo account." +msgstr "Se abilitata, KMess accederà automaticamente con questo profilo." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Stato da impostare all'accesso:" +#. i18n: file: settings/accountpage.ui:310 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:410 +msgid "Log in &with this account automatically" +msgstr "&Accesso automatico con questo profilo" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:322 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:416 +msgid "Login &as" +msgstr "Accesso &come" + +#. i18n: file: settings/accountpage.ui:335 +#. i18n: ectx: property (whatsThis), widget (QComboBox, initialStatus_) +#: rc.cpp:419 +msgid "Here you can select which status KMess should set, after logging in." +msgstr "Qui puoi scegliere quale stato verrà impostato dopo il login." + +#. i18n: file: settings/accountpage.ui:378 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:422 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"È necessario connettersi al sito di Passport per confermare che il tuo " +"indirizzo email esista." + +#. i18n: file: settings/accountpage.ui:381 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:425 +msgid "" +"You cannot 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." +"Non puoi cambiare il tuo nome perché il tuo indirizzo email Passport non è " +"verificato." -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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." - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:428 msgid "Request verification email" msgstr "Richiedi email di verifica" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:431 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:427 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:434 msgid "Go to accountservices.passport.net" msgstr "Vai a accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:446 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:437 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"Hai bisogno di un profilo di Passport per connetterti alla rete " +"LiveMessenger. Puoi registrare il tuo attuale indirizzo email presso " +"register.passport.com oppure utilizzare un account di Hotmail per accedere." + +#. i18n: file: settings/accountpage.ui:449 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:440 +msgid "" +"To connect to the Live 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 " +"Per accedere al servizio Live Messenger, devi registrare un indirizzo email " "come account Passport." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:489 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:443 msgid "Register new account" msgstr "Registra un nuovo account" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:492 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:446 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:495 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:449 msgid "Go to register.passport.com" msgstr "Vai su register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Segnalazioni" +#. i18n: file: settings/accountpage.ui:513 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:452 +msgid "&Status Options" +msgstr "Opzioni dello &Stato" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Notifiche a comparsa" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Mostra notifiche quando i tuoi contatti:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "Si co&nnettono" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:519 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:455 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when you " +"are 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, sarà mostrato un pop-up quando i tuoi contatti si connettono " -"aMSN." +"Se abilitata, il tuo stato sarà cambiato automaticamente a \"Inattivo\" in " +"caso di mancato utilizzo del computer per qualche minuto. Se questa opzione " +"non è disponibile, KMess è stato compilato senza il supporto a questa " +"caratteristica." -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Iniziano una &conversazione con te" +#. i18n: file: settings/accountpage.ui:522 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:458 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Cambia lo s&tato a \"Inattivo\" quando non sei al computer" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountpage.ui:553 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:572 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:579 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:464 rc.cpp:470 rc.cpp:473 +msgid "Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" +"Controlla il numero di minuti dopo il quale KMess cambierà il tuo stato a " +"\"Inattivo\"." + +#. i18n: file: settings/accountpage.ui:556 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:467 +msgid "Become idle after" +msgstr "Diventa inattivo dopo" + +#. i18n: file: settings/accountpage.ui:582 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:476 +msgid "minutes" +msgstr "minuti" + +#. i18n: file: settings/accountpage.ui:615 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -"Se abilitato, sarà mostrato un pop-up quando un contatto inizia una " -"conversazione con te." +"Questo è dovuto al fatto che KMess è stato compilato senza includere " +"l'estensione di Xorg \"XScreenSaver\", che viene utilizzata per rilevare " +"l'attività dell'utente.\n" +"Contatta i creatori del pacchetto in uso per ulteriori dettagli." -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "&Ti inviano un messaggio" +#. i18n: file: settings/accountpage.ui:618 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:482 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"Impossibile attivare il passaggio automatico a Inattivo: KMess è stato " +"compilato senza il rilevamento di inattività." -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/accountpage.ui:644 +#. i18n: ectx: property (toolTip), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:485 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"If enabled, you will not receive any notifications when your status is set " +"to \"Busy\"." msgstr "" -"Se abilitato, sarà mostrato un pop-up ogni volta che ricevi un messaggio da " -"un contatto." +"Se abilitata, nasconde le notifiche quando il tuo stato è impostato su " +"\"Occupato\"." -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Cambiano il loro &stato" +#. i18n: file: settings/accountpage.ui:647 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:488 +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "&Nascondi notifiche quando il tuo stato è impostato su \"Occupato\"" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:26 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:491 +msgid "Saved accounts:" +msgstr "Profili salvati:" + +#. i18n: file: settings/accountsmanagerpage.ui:76 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:494 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -"Se abilitato, sarà mostrato un pop-up anche quando i tuoi contatti cambiano " -"il lorostato su MSN." +"Clicca qui per creare un nuovo profilo di KMess per la tua email già " +"associata ad un profilo Live" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "Si &disconnettono" +#. i18n: file: settings/accountsmanagerpage.ui:79 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:497 +msgid "&Add Account..." +msgstr "&Aggiungi Profilo..." -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:92 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:503 +msgid "Select an account and click here to modify it" +msgstr "Seleziona un profilo e clicca qui per modificarlo" + +#. i18n: file: settings/accountsmanagerpage.ui:95 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:506 +msgid "&Edit" +msgstr "&Modifica" + +#. i18n: file: settings/accountsmanagerpage.ui:108 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:512 +msgid "Select an account and click here to remove it" +msgstr "Seleziona un profilo e clicca qui per rimuoverlo" + +#. i18n: file: settings/accountsmanagerpage.ui:111 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:515 +msgid "&Remove" +msgstr "&Rimuovi" + +#. i18n: file: settings/chatloggingpage.ui:17 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:521 +msgid "Enable this option to have your chats saved for later viewing" +msgstr "" +"Abilita questa opzione per salvare le tue chat così da poterle rivedere in " +"seguito" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:524 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"

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

\n" +"

The chat logs 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 abilitato, sarà mostrato un pop-up anche quando i tuoi contatti si " -"disconnettono." +"

Se abiliti la registrazione delle chat, ogni conversazione fatta " +"verrà salvata in una certa posizione (che può essere specificata qui sotto)." +"

\n" +"

Le chat salvate consentiranno di trovare qualcosa nelle tue vecchie " +"discussioni, ad esempio un link, o puoi usarle per ricordare cosa hai detto " +"a qualcuno in una certa occasione.

\n" +"

Queste possono però anche porre qualche problema di privacy, perchè " +"persone non autorizzate che usino il tuo profilo saranno in grado di " +"leggerle.

\n" +"

Assicurati di tenere questa opzione disabilitata su computer " +"pubblicamente accessibili!

" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Mostra una notifica quando ricevi un'&email" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:530 +msgid "Enable chat logging" +msgstr "Abilita registrazione chat" -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Nascondi pop-up dopo" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -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: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "secondi" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -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: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:533 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. " +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"Se abilitata, KMess salverà le tue chat anche come file HTML o come file di " +"testo semplice" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:536 +msgid "Additionally save chat logs to file" +msgstr "Salva le conversazioni anche su file" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:539 +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:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:542 +msgid "Save chat logs as:" +msgstr "Salva registri delle chat come:" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:545 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, 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 alcuna formattazione del testo, immagini personali, o " +"emoticon.

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:552 +msgid "Web Pages (HTML)" +msgstr "Pagine Web (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:555 +msgid "Plain Text" +msgstr "Testo Semplice" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:558 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Queste opzioni ti consentono di scegliere in quale modo KMess organizzerà le " +"tue chat salvate all'interno della cartella specificata sotto." + +#. i18n: file: settings/chatloggingpage.ui:137 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:561 +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 "" +"A seconda dell'opzione scelta qui, KMess creerà alcune cartelle per " +"aiutarti a mantenere organizzati i tuoi registri delle chat. Usa la funzione " +"\"Aiuto\" o \"Cos'è questo?\" su una opzione specifica per ulteriori " +"dettagli." + +#. i18n: file: settings/chatloggingpage.ui:140 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:564 +msgid "Separate logged chats by:" +msgstr "Separa le chat salvate per:" + +#. i18n: file: settings/chatloggingpage.ui:156 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:567 +msgid "Create a directory to organize chats by year" +msgstr "Crea una cartella per organizzare le chat per anno" + +#. i18n: file: settings/chatloggingpage.ui:163 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:570 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/date-and-contact-name.html

" +msgstr "" +"

Questa opzione dice a KMess di dividere le tue chat solo per anno.\n" +"Troverai una cartella per ogni anno di chat salvate; esse conterranno tutte " +"le chat di quell'anno raggruppate assieme.

\n" +"\n" +"

Una chat fatta il 29 Novembre 2008 sarà salvata nella tua cartella dei " +"registri come:

\n" +"

<cartella dei registri qui>/2008/data-e-nome-contatto.html

" + +#. i18n: file: settings/chatloggingpage.ui:166 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:577 +msgid "Year" +msgstr "Anno" + +#. i18n: file: settings/chatloggingpage.ui:182 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year then by month" +msgstr "Crea cartelle 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:583 +msgid "" +"

This option tells KMess to divide your chat logs 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" +"

A chat had on November 29, 2008 will be saved in your chat logs directory " +"as:

\n" +"

<chat logs directory here>/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 cartella per ogni anno di chat salvate; ognuna conterrà una " +"cartella per ogni mese in cui le chat saranno state salvate; esse " +"conterranno poi tutte le chat di quel mese raggruppate assieme.

\n" +"\n" +"

Una chat avvenuta il 29 Novembre 2008 sarà salvata nella tua cartelle dei " +"registri come:

\n" +"

<directory dei registri qui>/2008/11/data-e-nome-contatto.html

" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:589 +msgid "Year then Month" +msgstr "Anno poi Mese" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:592 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"Crea cartelle 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:595 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/29/date-and-contact-name.html" +msgstr "" +"

Questa opzione dice a KMess di dividere le tue chat per anno, poi " +"per mese e poi ancora per giorno. \n" +"Troverai una cartella per ogni anno di chat salvate. Ognuna conterrà una " +"cartella per ogni mese in cui le chat saranno state salvate; esse a loro " +"volta conterranno una cartella per ogni giorno.

\n" +"\n" +"

Una chat fatta il 29 Novembre 2008 sarà salvata nella tua cartella dei " +"registri come:

\n" +"

<directory dei registri qui>/2008/11/29/data-e-nome-contatto.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:602 +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:605 +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "" +"Posiziona tutte i registri di chat salvati direttamente nella cartella " +"specificata sotto" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:608 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" +"Questa opzione dice a KMess di salvare tutti i tuoi registri di chat nella " +"stessa cartella, senza alcuna organizzazione." + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:611 +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:614 +msgid "Click here to choose a directory" +msgstr "Clicca qui per selezionare una cartella" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:620 +msgid "The directory where all your chat logs will be saved" +msgstr "La cartella dove tutti i tuoi registri di chat verranno salvati" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:623 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" +"Scegli una cartella nella quale desideri salvare le registrazioni delle tue " +"chat." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:626 +msgid "Save chat logs in the following 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:629 +msgid "St&yle" +msgstr "&Stile" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:632 +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:635 +msgid "&Chat style:" +msgstr "Stile &chat:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:638 +msgid "Get &New Styles..." +msgstr "Ottieni &Nuovi Stili..." + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:641 +msgid "Chat Settings" +msgstr "Impostazioni Conversazioni" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (toolTip), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:644 +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:647 +msgid "&Show emoticons" +msgstr "Mostra &emoticon" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:653 +msgid "Enables the appearance of winks in the chat window." +msgstr "Abilita la visualizzazione delle emoticon nella finestra di chat." + +#. i18n: file: settings/chatstylepage.ui:246 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:656 +msgid "" +"If enabled, winks you send or receive will be displayed in the chat window. " +"Please note that in order to use this feature, you need to have a working " +"Flash-plugin installed." +msgstr "" +"Se abilitata, le animoticon inviate e ricevute verranno mostrate nella " +"finestra di chat. Per l'utilizzo di questa funzione è necessario che il " +"plugin Flash sia correttamente installato." + +#. i18n: file: settings/chatstylepage.ui:249 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:659 +msgid "Show &winks" +msgstr "Mostra &animoticon" + +#. i18n: file: settings/chatstylepage.ui:256 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:662 +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 proveniente da uno " +"stesso contatto. Quando un contatto scrive più messaggi di seguito, KMess li " +"raggruppa in un unico messaggio. L'aspetto esatto dipenderà dallo stile di " +"chat utilizzato." + +#. i18n: file: settings/chatstylepage.ui:259 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:665 +msgid "&Group follow-up messages from the same contact" +msgstr "Ra&ggruppa messaggi consecutivi dallo stesso contatto" + +#. i18n: file: settings/chatstylepage.ui:285 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:671 +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:288 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:674 +msgid "S&how timestamp" +msgstr "&Mostra data e ora" + +#. i18n: file: settings/chatstylepage.ui:319 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:680 +msgid "Show &date" +msgstr "Mostra &data" + +#. i18n: file: settings/chatstylepage.ui:349 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:683 +msgid "Show s&econds" +msgstr "Mostra s&econdi" + +#. i18n: file: settings/chatstylepage.ui:362 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:686 +msgid "&Text" +msgstr "&Testo" + +#. i18n: file: settings/chatstylepage.ui:374 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:689 +msgid "This is the font style and color used in your chat messages." +msgstr "Questo stile e colore sarà usato nei tuoi messaggi." + +#. i18n: file: settings/chatstylepage.ui:377 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:692 +msgid "Your &message font:" +msgstr "Carattere per i tuoi &messaggi:" + +#. i18n: file: settings/chatstylepage.ui:458 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:695 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" +"Questa opzione consente di non vedere lo stile usato nei messaggi dai tuoi " +"contatti e di usare invece quelli scelti qui sotto." + +#. i18n: file: settings/chatstylepage.ui:461 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:698 +msgid "&Force messages from your contacts to use this font:" +msgstr "&Forza i messaggi dei contatti ad usare questo carattere:" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:701 +msgid "Chat Window Formatting" +msgstr "Formattazione nella finestra di chat" + +#. i18n: file: settings/chatstylepage.ui:542 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:704 +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 dei caratteri. Scrivere " +"*grassetto*, /corsivo/, e _sottolineato_ farà apparire il testo " +"rispettivamente in grassetto, corsivo e sottolineato." + +#. i18n: file: settings/chatstylepage.ui:545 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:707 +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:555 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableChatFormattingCheckBox_) +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:713 rc.cpp:780 +msgid "" +"Enables the use of \"Messenger Plus!\" formattings in the chat window. " +"For example, [b]this text[/b] will be replaced with this text." +msgstr "" +"Abilita l'utilizzo della formattazione di \"Messenger Plus!\" nella " +"finestra di chat. Per esempio example, [b]questo testo[/b] verrà sostituito " +"con questo testo." + +#. i18n: file: settings/chatstylepage.ui:558 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:716 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "Abilita formattazione \"Messenger &Plus!\"" + +#. i18n: file: settings/chatstylepage.ui:582 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:719 +msgid "&Behavior" +msgstr "&Comportamento" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:722 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" @@ -2591,457 +5972,1134 @@ msgstr "" "scuotimento. I contatti possono inviare più di un trillo alla volta, ma " "KMess scuoterà la finestra solo dopo il primo trillo ricevuto.

" -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "In&forma i contatti su quale canzone sto ascoltando." +#. i18n: file: settings/chatstylepage.ui:592 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:726 +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: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:602 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:732 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"If this option is enabled, your own display picture will be shown in the " +"contacts panel, along with the pictures of the contacts in that chat." 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." +"Quando questa opzione è abilitata, vedrai anche la tua immagine personale " +"nel pannello dei contatti, assieme alle immagini dei contatti presenti nella " +"conversazione." -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Cambia s&tato a \"Assente - Inattivo\" quando non sei al computer" +#. i18n: file: settings/chatstylepage.ui:605 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:735 +msgid "Display your own &display picture in the chat window" +msgstr "&Mostra la tua immagine personale nella finestra di conversazione" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:630 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:738 +msgid "G&roup chats in the same window:" +msgstr "&Raggruppa conversazioni nella stessa finestra:" + +#. i18n: file: settings/chatstylepage.ui:650 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:741 +msgid "Always" +msgstr "Sempre" + +#. i18n: file: settings/chatstylepage.ui:655 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:744 +msgid "For contacts in the same group" +msgstr "Per contatti dello stesso gruppo" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:747 +msgid "Never" +msgstr "Mai" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:750 +msgid "Display Options" +msgstr "Opzioni Di Visualizzazione" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:753 msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +"If enabled, a notification is shown when an email message is received in " +"your inbox. The number of unread email messages is shown above the contact " +"list. This option is only available for Live Mail accounts." msgstr "" -"Se abilitato, il tuo stato sarà cambiato automaticamente a \"Assente - " -"Inattivo\" quando non starai usando il computer per qualche minuto." +"Se abilitata, verrà mostrata una notifica alla ricezione di un messaggio " +"email nella cartella Posta in Arrivo. Il numero di email non lette viene " +"mostrato sopra la lista contatti. Questa opzione è disponibile solamente per " +"gli account Live Mail." -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Diventa inattivo dopo" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:756 +msgid "Display a count of &unread mail" +msgstr "Mostra il n&umero di email non lette" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:759 msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"If enabled, your contacts can see which song you are listening to. This " +"information is retrieved from the currently active media player." msgstr "" -"Controlla il numero di minuti dopo i quali KMess cambierà il tuo stato a " -"\"Assente - Inattivo\"." +"Se abilitata, i tuoi contatti vedranno cosa stai ascoltando. Questa " +"informazione viene ottenuta dal lettore musicale in esecuzione." -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "minuti" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:762 +msgid "Show contacts w&hich song I am listening to" +msgstr "Mostra ai contatti quale &canzone sto ascoltando" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Registrazione conversazioni" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "Registr&a tutte le conversazioni" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Se abilitata, le conversazioni verranno automaticamente salvate nella " -"cartella selezionata." - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Salva i file di chat nella cartella selezionata:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:768 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." msgstr "" -"Scegli la cartella sul tuo sistema dove vuoi salvare le registrazioni delle " -"conversazioni." +"Se abilitata, il logo di KMess verrà mostrato nello sfondo della lista dei " +"contatti." -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organizza cartelle di chat per:" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:771 +msgid "Show background &image" +msgstr "Mostra &immagine di sfondo" -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -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: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:777 +msgid "List Formatting" +msgstr "Formattazione nella lista dei contatti" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "Anno" +#. i18n: file: settings/contactlistpage.ui:71 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:783 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "Abilita formattazione \"Messenger &Plus!\"" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Mese" +#. i18n: file: settings/contactlistpage.ui:78 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:786 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "Mostra l'&email dei contatti al posto del loro nome personale" -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Giorno" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Salva tutte le conversaione nella cartella principale" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Carattere per i tuoi messaggi:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "Questo stile e colore sarà usato nei tuoi messaggi." - -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Forza i messaggi dei contatti ad usare questo carattere:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Stile della chat:" - -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -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/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Mo&stra elementi grafici nei messaggi di conversazione" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Mostra le emoticon nelle conversazioni." - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Mostra &ora nei messaggi di conversazione" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -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/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" -"&Usa effetti dei caratteri nei messaggi per *grassetto*, /corsivo/, e " -"_sottolineato_ " - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "Ra&ggruppa messaggi consecutivi dallo stesso contatto" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Client di posta" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" -"Consente di scegliere quale client di posta elettronica KMess userà per " -"aprire le email." - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Usa il servizio Hotmail" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Usa un comando specifico:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Notifica email" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Mostra l'email nella lista dei contatti" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Mostra una notifica quando ricevi un'email in altre cartelle" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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 "" -"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." - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:789 msgid "&Emoticon Themes" msgstr "Temi di &Emoticon" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "Stili di emoticon disponibili:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:792 +msgid "Available emoticon themes:" +msgstr "Temi di emoticon disponibili:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:795 msgid "&Custom Emoticons" msgstr "Emoti&con Personali" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Emoticon personali per questo account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:798 +msgid "Available custom emoticons:" +msgstr "Emoticon personali disponibili:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "Aggiungi nuo&va..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:801 +msgid "Click here to add a new custom emoticon" +msgstr "Clicca qui per aggiungere una nuova emoticon personale" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Clicca" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:804 +msgid "Add Ne&w..." +msgstr "Aggiungi Nuo&va..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -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: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:810 +msgid "Click here to rename the selected emoticon" +msgstr "Clicca qui per rinominare l'emoticon selezionata" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:813 msgid "Re&name" msgstr "Ri&nomina" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "Clicca qui per rinominare l'emoticon selezionata." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:819 +msgid "Click here to remove the selected emoticon" +msgstr "Clicca qui per eliminare l'emoticon selezionata" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:822 msgid "Remo&ve" msgstr "Rimuo&vi" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:828 +msgid "Web Browser" +msgstr "Browser Web" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:831 +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: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:834 +msgid "&Use the KDE default browser" +msgstr "&Usa il browser predefinito di KDE" + +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:837 rc.cpp:872 +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: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:840 +msgid "&Use an installed browser:" +msgstr "&Usa un browser installato:" + +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:843 rc.cpp:878 +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: 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:846 rc.cpp:881 +msgid "&Specify a custom command:" +msgstr "&Specifica un comando personalizzato:" + +#. 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:850 rc.cpp:885 #, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Seleziona una emoticon e clicca qui per eliminarla." +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; il " +"parametro '%u' verrà rimpiazzato con l'URL del collegamento." -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:854 #, no-c-format -msgid "says:" -msgstr "dice:" +msgid "Use '%u' to insert the URL in the command line." +msgstr "Usa '%u' per inserire l'URL nella riga di comando." -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Sfoglia e ritaglia immagine..." +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:857 +msgid "Email Client" +msgstr "Client di posta" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Immagine personale" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Ricezione dell'immagine personale non riuscita" - -#: settings/accountswidget.cpp:486 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:860 msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -"Si è verificato un errore nel tentativo di cambiare l'immagine personale.\n" -"Verifica di aver selezionato un file immagine corretto." +"Spunta questa casella per usare la webmail Live Mail quando ti connetti con " +"profili che sono compatibili con Live Mail." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Impostazioni" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:863 +msgid "Use &Live Mail if the account supports it" +msgstr "Usa &Live Mail se il profilo la supporta" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Account" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:866 +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." -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Chat" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:869 +msgid "Use the &KDE default email client" +msgstr "Usa il client di posta predefinito di &KDE" -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Sei sicuro di voler eliminare questo profilo?" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:875 +msgid "Use an &installed email client:" +msgstr "Usa un client di posta &installato:" -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Ciao, come va? :)" +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:889 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "Usa '%u' per inserire l'indirizzo di posta nella riga di comando." -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Stacy" +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:895 +msgid "&Save all received files in one directory:" +msgstr "&Salva tutti i file ricevuti in una cartella:" -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Bene!" +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:901 +msgid "&Use ports between" +msgstr "&Usa porte comprese tra" -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Sono /appena/ tornata dalle mie vacanze in Italia!" +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:904 +msgid "and" +msgstr "e" -#: systemtraywidget.cpp:91 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:907 +msgid "for file transfers" +msgstr "per i trasferimenti di file" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:910 +msgid "Click here to tell the developers about something you liked" +msgstr "Clicca qui per comunicare agli sviluppatori qualcosa che ti è piaciuto" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:913 rc.cpp:920 rc.cpp:927 rc.cpp:934 msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " msgstr "" -"Chiudere la finestra principale manterrà KMess aperto, ma nella barra " -"applicazioni. Usa 'Esci' dal menu 'File' per uscire da KMess." +"Clicca su una di queste icone per inviare le tue opinioni su questa " +"applicazione agli sviluppatori. Puoi disabilitare le icone con la voce " +"\"Mostra Icone delle Opinioni\" nel menu Aiuto.\n" +" " -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Riduzione nella vassoio di sistema" +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:917 +msgid "Click here to tell the developers about something you did not like" +msgstr "Clicca qui per comunicare agli sviluppatori qualcosa che non ti è piaciuto" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:924 +msgid "Click here to tell the developers about a problem in the application" +msgstr "Clicca qui per comunicare agli sviluppatori un problema dell'applicazione" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:931 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" +"Clicca qui per comunicare agli sviluppatori nuove caratteristiche che ti " +"piacerebbe fossero aggiunte a questa applicazione" -#~ msgid "The current status of your contact." -#~ msgstr "Lo stato attuale del contatto." +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:938 +msgid "Your comment:" +msgstr "Il tuo commento:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:941 +msgid "Your comment is about:" +msgstr "Il tuo commento riguarda:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:944 +msgid "Something you like" +msgstr "Qualcosa che ti piace" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:947 +msgid "Something you dislike" +msgstr "Qualcosa che non ti piace" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:950 +msgid "An improper behavior of the application" +msgstr "Un comportamento errato dell'applicazione" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:953 +msgid "A new feature you desire" +msgstr "Una nuova caratteristica che ti piacerebbe avere" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:956 +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 (QLabel, label) +#: rc.cpp:959 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +"Your email address will not be used for anything else but this report." +msgstr "" +"Se aggiungi il tuo indirizzo email permetterai agli sviluppatori di " +"contattarti per avere ulteriori informazioni sul rapporto o comunicarti " +"quando la caratteristica richiesta verrà inserita.
\n" +"Il tuo indirizzo email verrà utilizzato solamente per richieste legate a " +"questo rapporto." + +#~ msgctxt "Message shown in the chat window (when the wink name is unknown)" +#~ msgid "You have sent a wink!" +#~ msgstr "Hai inviato una animoticon!" + +#~ msgid "I'm away from my computer" +#~ msgstr "Non sono al computer" + +#~ msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +#~ msgid "" +#~ "It is currently not possible to send a handwritten message to %1, " +#~ "due to an incompatibility with Windows Live Messenger 8.5." +#~ msgstr "" +#~ "Non è al momento possibile inviare un disegno a %1, a causa di una " +#~ "incompatibilità con Windows Live Messenger 8.5." + +#~ msgctxt "Contacts counters in normal group tooltip" +#~ 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" + +#~ msgid "You have not chatted with this contact yet." +#~ msgstr "Non hai ancora chattato con questo contatto." + +#~ msgid "Select an account and click here to delete it" +#~ msgstr "Seleziona un profilo e clicca qui per eliminarlo" + +#~ msgid "Click here to delete the selected emoticon" +#~ msgstr "Clicca qui per eliminare l'emoticon selezionata" + +#~ msgid "I&mages" +#~ msgstr "I&mmagini" + +#~ msgid "Ink message" +#~ msgstr "Scrittura a mano" + +#~ 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 hai aggiunto delle emoticon personali clicca questo pulsante per " +#~ "visualizzarle, in moda da poterle inserire facilmente nei tuoi messaggi." + +#~ msgid "&Do not filter" +#~ msgstr "&Non filtrare" + +#~ msgid "File format used for saving:" +#~ msgstr "Formato di file utilizzato per il salvataggio:" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Emoticon personali per questo profilo:" + +#~ msgid "Show the feedback buttons bar on the windows" +#~ msgstr "Mostra la barra di pulsanti dei commenti sulle finestre" + +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Ignora questa &Emoticon" + +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "Impossibile bloccare in questo momento!" + +#~ msgid "Ed&it Notes" +#~ msgstr "Modifica &Note" + +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Rimuovi Immagine Personale" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "I vostri indirizzi email" + +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "" +#~ "Il contatto ha richiesto una caratteristica di MSN6 non ancora supportata " +#~ "da KMess." + +#~ 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." + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "" +#~ "Mostra un messaggio di avviso a&lla connessione/disconnessione del " +#~ "contatto" + +#~ 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 "" +#~ "Impossibile recuperare una data valida dai tuoi registri! Questo è " +#~ "probabilmente dovuto al fatto che questo registro è stato generato da una " +#~ "versione precedente di KMess" + +#~ 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 "" +#~ "I tuoi registri sembrano danneggiati o sono stati creati da una versione " +#~ "precedente di KMess. KMess può provare a migrare tali registri. Desideri " +#~ "che venga fatto adesso?" + +#, fuzzy +#~ msgid "" +#~ "Migration terminated.\n" +#~ "Tried to migrate %1 items\n" +#~ "%2 items successfully migrated\n" +#~ "%3 items could not have been migrated." +#~ msgstr "" +#~ "Migrazione completata.\n" +#~ "Tentativo di migrare %1 elementi\n" +#~ "%2 elementi migrati con successo\n" +#~ "%3 elementi non sono stati migrati." + +#~ msgid "Alpha logs migration" +#~ msgstr "Migrazione preliminare registri" + +#~ msgid "Search for C&ontact" +#~ msgstr "C&erca un Contatto" + +#~ msgid "Search by &Interest" +#~ msgstr "Cerca per &interessi" + +#~ 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 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." + +#, fuzzy +#~ 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 "" +#~ "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 "" +#~ "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" + +#~ 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 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." + +#~ msgid "Picture:" +#~ msgstr "Immagine:" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "" +#~ "Consente di scegliere quale client di posta elettronica KMess userà per " +#~ "aprire le email." + +#~ msgid "Use a specified command:" +#~ msgstr "Usa un comando specifico:" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "Questo account non ha una casella di posta di Hotmail!" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "Email: %1" + +#~ msgid "Remove group" +#~ msgstr "Rimuovi un gruppo" + +#~ msgid "Show &Display Pictures" +#~ msgstr "Mostra &Immagini Personali" + +#~ msgid "Show &Tool bar" +#~ msgstr "Mostra Barra degli S&trumenti" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "Hai un nuovo messaggio di posta." + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "Hai %1 nuovi messaggi di posta." + +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "Il trasferimento di %1 non è riuscito. Impossibile aprire il file." + +#~ msgid "Sidebar" +#~ msgstr "Barra laterale" + +#~ msgid "New contact's group" +#~ msgstr "Gruppo del nuovo contatto" + +#~ msgid "Enter your login information:" +#~ msgstr "Inserisci i tuoi dati di accesso:" + +#~ msgid "Your friendly name:" +#~ msgstr "Il tuo nome:" + +#~ msgid "Your password:" +#~ msgstr "La tua password:" + +#~ msgid "Status to set at login:" +#~ msgstr "Stato da impostare all'accesso:" + +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Mostra una notifica quando ricevi un'&email" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Organizza cartelle di chat per:" + +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Mo&stra elementi grafici nei messaggi di conversazione" + +#~ msgid "Use Hotmail" +#~ msgstr "Usa il servizio Hotmail" + +#~ msgid "says:" +#~ msgstr "dice:" + +#~ msgid "Current name: " +#~ msgstr "Nome attuale: " + +#~ 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 non è riuscito a connettersi al servizio MSN Messenger.\n" +#~ "Per favore, assicurati di essere connesso a Internet.\n" +#~ "motivo: %1." + +#~ msgid "The remote server has closed the connection." +#~ msgstr "Il server remoto ha chiuso la connessione." + +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Mostra lo stato del servizio MSN Messenger" + +#~ msgid "Received user confirmation" +#~ msgstr "Ricevuta conferma utente" + +#~ msgid "Transfer to notification server" +#~ msgstr "Trasferimento al server di notifica" + +#~ msgid "Developer build warning" +#~ msgstr "Avviso della build per sviluppatori" + +#~ msgid "The server is too busy" +#~ msgstr "Il server è occupato" + +#~ msgid "The server is unavailable" +#~ msgstr "Il server non è raggiungibile" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "" +#~ "KMess ha ricevuto un messaggio di errore sconosciuto dal server, \"%1\"" + +#~ msgid "Warning: Server closes for maintenance in 1 minute!" +#~ msgstr "Attenzione: Il server chiude per manutenzione tra 1 minuto!" diff --git a/po/kmess.pot b/po/kmess.pot index 3ade61d..79c86a6 100644 --- a/po/kmess.pot +++ b/po/kmess.pot @@ -1,2871 +1,5748 @@ # SOME DESCRIPTIVE TITLE. -# This file is put in the public domain. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: _translatorinfo.cpp:1 main.cpp:147 _translatorinfo.cpp:1 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "" - -#: _translatorinfo.cpp:3 main.cpp:147 _translatorinfo.cpp:3 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" -msgstr "" - -#: account.cpp:57 -msgid "Your name" -msgstr "" - -#: account.cpp:60 kmess.cpp:334 -msgid "you@hotmail.com" -msgstr "" - -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "" - -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "" - -#: chat/chatmessagestyle.cpp:296 -msgid "%1 says:" -msgstr "" - -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 -msgid "Add this emoticon: %1" -msgstr "" - -#: chat/chatview.cpp:463 -msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." -msgstr "" - -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 -msgid "" -"The file '%1' already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 -msgid "Overwrite File" -msgstr "" - -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 -msgid "Over&write" -msgstr "" - -#: chat/chatview.cpp:919 -msgid "Add this &Emoticon..." -msgstr "" - -#: chat/chatview.cpp:924 -msgid "Send &Email" -msgstr "" - -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "" - -#: chat/chatview.cpp:931 -msgid "Visit &Link" -msgstr "" - -#: chat/chatview.cpp:933 -msgid "Copy &Address" -msgstr "" - -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "" - -#: chat/chatview.cpp:947 -msgid "Select &All" -msgstr "" - -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "" - -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" - -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "" - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "" - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "" - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "" - -#: chat/chatwindow.cpp:737 -msgid "Contacts" -msgstr "" - -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 -msgid "Emoticons" -msgstr "" - -#: chat/chatwindow.cpp:799 -msgid "My emoticons" -msgstr "" - -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr "" - -#: chat/chatwindow.cpp:1493 -msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "" - -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" - -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "" - -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "" - -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "" - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "" - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "" - -#: chat/chatwindowinterface.cpp:174 -msgid "Start a &Meeting" -msgstr "" - -#: chat/chatwindowinterface.cpp:175 -msgid "Send a &Nudge!" -msgstr "" - -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "" - -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "" - -#: chat/chatwindowinterface.cpp:221 -msgid "Change &Font" -msgstr "" - -#: chat/chatwindowinterface.cpp:222 -msgid "Change Font &Color" -msgstr "" - -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 -msgid "Show &Emoticons" -msgstr "" - -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "" - -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "" - -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "" - -#: chat/contactframe.cpp:232 kmessview.cpp:615 -msgid "&View Profile" -msgstr "" - -#: chat/contactframe.cpp:234 kmessview.cpp:618 -msgid "&Add Contact" -msgstr "" - -#: chat/contactframe.cpp:235 kmessview.cpp:619 -msgid "A&llow Contact" -msgstr "" - -#: chat/contactframe.cpp:236 kmessview.cpp:622 -msgid "&Delete Contact" -msgstr "" - -#: chat/contactframe.cpp:238 kmessview.cpp:620 -msgid "&Block Contact" -msgstr "" - -#: chat/contactframe.cpp:239 kmessview.cpp:621 -msgid "&Unblock Contact" -msgstr "" - -#: chat/contactframe.cpp:241 -msgid "&Friendly Name" -msgstr "" - -#: chat/contactframe.cpp:242 -msgid "&Personal Message" -msgstr "" - -#: chat/contactframe.cpp:243 -msgid "&Email Address" -msgstr "" - -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "" - -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 -msgid "Blocked" -msgstr "" - -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "" - -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "" - -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "" - -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "" - -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "" - -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "" - -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "" - -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "" - -#: chat/contactframe.cpp:558 -msgid "The contact is %1" -msgstr "" - -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 -msgid "Invisible" -msgstr "" - -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" - -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "" - -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 -msgid "Add New Emoticon" -msgstr "" - -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" - -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "" +msgid "" +msgstr "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" + "POT-Creation-Date: 2009-04-21 00:17+0200\n" + "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" + "Last-Translator: FULL NAME \n" + "Language-Team: LANGUAGE \n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: account.cpp:45 +msgid "I am away from my computer" +msgstr "" + +#: account.cpp:54 +msgid "Your name" +msgstr "" + +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "" + +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "" + +#: accountsmanager.cpp:559 +#, possible-kde-format +msgid "Some insecurely stored account passwords have been found.
Do you want to import the passwords to the KDE Wallet named '%1', " + "keep the insecurely stored passwords, or delete them permanently?" + "

Note: it is not recommended to keep insecurely stored " + "passwords if the KDE Wallet is available, because your passwords " + "will be easily readable in the KMess configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "You cannot send invitations when there are multiple contacts in a " + "chat. Please start a separate chat with the contact you wanted to " + "send the invitation to." +msgstr "" + +#: chat/chat.cpp:138 +#, possible-kde-format +msgid "%1 has joined the chat." +msgstr "" + +#: chat/chat.cpp:191 +#, possible-kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "" + +#: chat/chat.cpp:197 +#, possible-kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "" + +#: chat/chat.cpp:359 +#, possible-kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "" + +#: chat/chat.cpp:367 +#, possible-kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "" + +#: chat/chat.cpp:663 +#, possible-kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "" + +#: chat/chat.cpp:829 +#, possible-kde-format +msgid "KMess could not save the log for this chat:
The chat logs " + "directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "" + +#: chat/chat.cpp:954 +#, possible-kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "" + +#: chat/chat.cpp:987 +msgid "The chat has been disabled because you are no longer connected to " + "the Live Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "" + +#: chat/chat.cpp:1154 +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:1167 +#, possible-kde-format +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." +msgstr "" + +#: chat/chat.cpp:1181 +#, possible-kde-format +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:1196 +#, possible-kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "%1 has sent you a Live Messenger feature that KMess does not " + "support yet." +msgstr "" + +#: chat/chat.cpp:1222 +#, possible-kde-format +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. You can re-enable it in the account settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, possible-kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, " + "%2 is the wink name" +msgid "You received the "%2" wink from %1, but displaying " + "winks has been disabled. You can re-enable it in the account settings." +msgstr "" + +#: chat/chat.cpp:1262 +#, possible-kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "" + +#: chat/chat.cpp:1269 +#, possible-kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, " + "%2 is the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "" + +#: chat/chat.cpp:1291 +#, possible-kde-format +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." +msgstr "" + +#: chat/chat.cpp:1300 +#, possible-kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, " + "%2 is the wink name" +msgid "You received the "%2" wink from %1, but it could not " + "be displayed. Make sure you have the "cabextract" program " + "installed." +msgstr "" + +#: chat/chat.cpp:1312 +#, possible-kde-format +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. " + "Extracting the wink package with "cabextract" has failed." +msgstr "" + +#: chat/chat.cpp:1321 +#, possible-kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, " + "%2 is the wink name" +msgid "You received the "%2" wink from %1, but it could not " + "be displayed. Extracting the wink package with "" + "cabextract" has failed." +msgstr "" + +#: chat/chat.cpp:1333 +#, possible-kde-format +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:1342 +#, possible-kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, " + "%2 is the wink name" +msgid "You received the "%2" wink from %1, but it could not " + "be displayed. The data could not be read." +msgstr "" + +#: chat/chat.cpp:1384 +#, possible-kde-format +msgid "%1 has gone offline. Any messages you send will be delivered " + "the next time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, possible-kde-format +msgid "%1 has gone offline." +msgstr "" + +#: chat/chat.cpp:1399 +#, possible-kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "" + +#: chat/chat.cpp:1430 +#, possible-kde-format +msgid "%1 has sent you a nudge!" +msgstr "" + +#: chat/chat.cpp:1463 +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:1476 +#, possible-kde-format +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:1481 +#, possible-kde-format +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:1491 +#, possible-kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "" + +#: chat/chat.cpp:1506 +#, possible-kde-format +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:1589 +#, possible-kde-format +msgid "The file "%1" could not be found on your computer, " + "and the download failed." +msgstr "" + +#: chat/chat.cpp:1626 +#, possible-kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "" + +#: chat/chat.cpp:1632 +msgid "You have sent a nudge!" +msgstr "" + +#: chat/chat.cpp:1698 +#, possible-kde-format +msgid "%1 is currently offline. Any messages you send will be " + "delivered the next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, possible-kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "" + +#: chat/chatmessagestyle.cpp:382 +#, possible-kde-format +msgid "%1 says:" +msgstr "" + +#: chat/chatmessageview.cpp:322 +#, possible-kde-format +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:366 +#, possible-kde-format +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:406 +#, possible-kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:653 +#, possible-kde-format +msgid "Add this emoticon: %1" +msgstr "" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "" + +#: chat/chatview.cpp:300 +#, possible-kde-format +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:439 +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:458 +#, possible-kde-format +msgid "The file '%1' already exists.\n" + "Do you want to overwrite it?" +msgstr "" + +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "" + +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "" + +#: chat/chatview.cpp:825 +msgid "Add this &Emoticon..." +msgstr "" + +#: chat/chatview.cpp:828 +msgid "Hide this &Emoticon" +msgstr "" + +#: chat/chatview.cpp:834 +msgid "Send &Email" +msgstr "" + +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "" + +#: chat/chatview.cpp:842 +msgid "Copy E&mail Address" +msgstr "" + +#: chat/chatview.cpp:848 +msgid "Visit &Link" +msgstr "" + +#: chat/chatview.cpp:852 +msgid "Copy &Address" +msgstr "" + +#: chat/chatview.cpp:868 +msgid "&Copy Text" +msgstr "" + +#: chat/chatview.cpp:869 +msgid "Select &All" +msgstr "" + +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +msgid "C&lear Chat" +msgstr "" + +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." +msgstr "" + +#: chat/chatwindow.cpp:115 +msgid "Contacts" +msgstr "" + +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:337 +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:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "" + +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "" + +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "" + +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." +msgstr "" + +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "" + +#: chat/chatwindow.cpp:454 +msgid "Start a &Meeting" +msgstr "" + +#: chat/chatwindow.cpp:455 +msgid "Send a &Nudge!" +msgstr "" + +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:462 +msgid "Change &Font" +msgstr "" + +#: chat/chatwindow.cpp:463 +msgid "Change Font &Color" +msgstr "" + +#: chat/chatwindow.cpp:470 +msgid "Show &Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:471 +msgid "Show S&tatus Messages" +msgstr "" + +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +msgid "Enable or disable the contacts panel" +msgstr "" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "" + +#: chat/chatwindow.cpp:513 +msgid "Enable or disable the standard emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:519 +msgid "Enable or disable the custom emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "" + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:1026 +msgid "You used an incorrect syntax for the /status command. The " + "correct syntax is: /status online|away|idle|brb|busy|lunch|phone|" + "invisible.
You can also use shortcuts like /online or " + "/phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, possible-kde-format +msgid "Unknown command %1. If you did not want this message to " + "be a command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "" + +#: chat/chatwindow.cpp:1610 +#, possible-kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, possible-kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, possible-kde-format +msgid "%1 is typing..." +msgstr "" + +#: chat/chatwindow.cpp:1897 +#, possible-kde-format +msgid "%1 and %2 are typing..." +msgstr "" + +#: chat/chatwindow.cpp:1901 +#, possible-kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "" + +#: chat/chatwindow.cpp:2063 +#, possible-kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "It is currently not possible to send a handwritten message to %" + "1, due to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, possible-kde-format +msgctxt "Tool tip for chat tabs" +msgid "

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +msgid "&Send Email" +msgstr "" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 +msgid "&View Profile" +msgstr "" + +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 +msgid "&Add Contact" +msgstr "" + +#: chat/contactframe.cpp:304 kmessview.cpp:606 +msgid "A&llow Contact" +msgstr "" + +#: chat/contactframe.cpp:305 kmessview.cpp:609 +msgid "&Delete Contact" +msgstr "" + +#: chat/contactframe.cpp:307 kmessview.cpp:607 +msgid "&Block Contact" +msgstr "" + +#: chat/contactframe.cpp:308 kmessview.cpp:608 +msgid "&Unblock Contact" +msgstr "" + +#: chat/contactframe.cpp:310 kmessview.cpp:612 +msgid "&Friendly Name" +msgstr "" + +#: chat/contactframe.cpp:311 kmessview.cpp:613 +msgid "&Personal Message" +msgstr "" + +#: chat/contactframe.cpp:312 kmessview.cpp:614 +msgid "&Email Address" +msgstr "" + +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "" + +#: chat/contactframe.cpp:753 +msgid "Blocked" +msgstr "" + +#: chat/contactframe.cpp:765 +#, possible-kde-format +msgctxt "Tooltip for a contact's status icon, arg %1 is the Live Messenger " + "status, like 'Online'" +msgid "The contact is %1" +msgstr "" + +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "

You have not added any custom emoticons yet.

To add new emoticons, click here!

" +msgstr "" + +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "" + +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "" + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, possible-kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, possible-kde-format +msgid "Windows Live Messenger %1" +msgstr "" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, possible-kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:353 +msgid "Windows Live Messenger compatible" +msgstr "" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "" + +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "" + +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "" + +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 +msgid "Add New Emoticon" +msgstr "" + +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, possible-kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "" #: dialogs/awaymessagedialog.cpp:37 -msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:229 -msgid "Contact Properties for %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "" - -#: dialogs/networkwindow.cpp:50 -msgid "Network Window" -msgstr "" - -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "" - -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "" - -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "" - -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "" - -#: dialogs/networkwindow.cpp:928 -msgid "" -"Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." -msgstr "" - -#: dialogs/networkwindow.cpp:953 -msgid "Cannot close the main connection tab." -msgstr "" - -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 -msgid "Cancelled" -msgstr "" - -#: dialogs/transferentry.cpp:160 -msgid "Failed!" -msgstr "" - -#: dialogs/transferentry.cpp:202 -msgid "Completed" -msgstr "" - -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 -msgid "%1 MB" -msgstr "" - -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 -msgid "%1 kB" -msgstr "" - -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 -msgid "%1 bytes" -msgstr "" - -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" - -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" - -#: dialogs/transferwindow.cpp:74 -msgid "File Transfers" -msgstr "" - -#: emoticontheme.cpp:542 -msgid "" -"Could not save the emoticon theme. Make sure you have permission to write to " -"the theme folder '%1'." -msgstr "" - -#: emoticontheme.cpp:736 -msgid "Smile" -msgstr "" - -#: emoticontheme.cpp:737 -msgid "Wink" -msgstr "" - -#: emoticontheme.cpp:738 -msgid "Tongue out" -msgstr "" - -#: emoticontheme.cpp:739 -msgid "Big smile" -msgstr "" - -#: emoticontheme.cpp:740 -msgid "Sad" -msgstr "" - -#: emoticontheme.cpp:741 -msgid "Crying" -msgstr "" - -#: emoticontheme.cpp:742 -msgid "Angry" -msgstr "" - -#: emoticontheme.cpp:743 -msgid "Confused" -msgstr "" - -#: emoticontheme.cpp:744 -msgid "Embarrassed" -msgstr "" - -#: emoticontheme.cpp:745 -msgid "Disappointed" -msgstr "" - -#: emoticontheme.cpp:746 -msgid "Hot" -msgstr "" - -#: emoticontheme.cpp:747 -msgid "Baring teeth" -msgstr "" - -#: emoticontheme.cpp:748 -msgid "Nerd" -msgstr "" - -#: emoticontheme.cpp:749 -msgid "Sick" -msgstr "" - -#: emoticontheme.cpp:750 -msgid "Surprised" -msgstr "" - -#: emoticontheme.cpp:751 -msgid "Party" -msgstr "" - -#: emoticontheme.cpp:752 -msgid "Sleepy" -msgstr "" - -#: emoticontheme.cpp:753 -msgid "Thinking" -msgstr "" +msgid "Automatic Away Message" +msgstr "" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:245 +#, possible-kde-format +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:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "" + +#: dialogs/chathistorydialog.cpp:567 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "" + +#: dialogs/chathistorydialog.cpp:589 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, possible-kde-format +msgid "%1\n" + "has added you to his or her contact list." +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, possible-kde-format +msgid "%1 (%2)\n" + "has added you to his or her contact list." +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:282 +#, possible-kde-format +msgid "Contact Properties for %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, possible-kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, possible-kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, possible-kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, possible-kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "" + +#: dialogs/listexportdialog.cpp:83 +#, possible-kde-format +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 +#, possible-kde-format +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 "" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 +msgid "Network Window" +msgstr "" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "" + +#: dialogs/networkwindow.cpp:1086 +msgid "No connections are present.\n" + "Cannot open the Network Window." +msgstr "" + +#: dialogs/networkwindow.cpp:1130 +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:1177 +msgid "Cannot close the main connection tab." +msgstr "" + +#: dialogs/networkwindow.cpp:1273 +msgid "Sending commands to the server is a risky operation.
If you do " + "not 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:1303 +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:1379 +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 +#, possible-kde-format +msgid "%1 MB" +msgstr "" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, possible-kde-format +msgid "%1 kB" +msgstr "" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, possible-kde-format +msgid "%1 bytes" +msgstr "" + +#: dialogs/transferentry.cpp:343 +#, possible-kde-format +msgid "%1 of %2 received." +msgstr "" + +#: dialogs/transferentry.cpp:347 +#, possible-kde-format +msgid "%1 of %2 sent." +msgstr "" + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 +msgid "File Transfers" +msgstr "" + +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "" + +#: emoticontheme.cpp:627 +#, possible-kde-format +msgid "Could not save the emoticon theme. Make sure you have permission to " + "write to the theme folder '%1'." +msgstr "" + +#: emoticontheme.cpp:833 +msgid "Smile" +msgstr "" + +#: emoticontheme.cpp:834 +msgid "Wink" +msgstr "" + +#: emoticontheme.cpp:835 +msgid "Tongue out" +msgstr "" + +#: emoticontheme.cpp:836 +msgid "Big smile" +msgstr "" + +#: emoticontheme.cpp:837 +msgid "Sad" +msgstr "" + +#: emoticontheme.cpp:838 +msgid "Crying" +msgstr "" + +#: emoticontheme.cpp:839 +msgid "Angry" +msgstr "" + +#: emoticontheme.cpp:840 +msgid "Confused" +msgstr "" + +#: emoticontheme.cpp:841 +msgid "Embarrassed" +msgstr "" + +#: emoticontheme.cpp:842 +msgid "Disappointed" +msgstr "" + +#: emoticontheme.cpp:843 +msgid "Hot" +msgstr "" + +#: emoticontheme.cpp:844 +msgid "Baring teeth" +msgstr "" + +#: emoticontheme.cpp:845 +msgid "Nerd" +msgstr "" + +#: emoticontheme.cpp:846 +msgid "Sick" +msgstr "" + +#: emoticontheme.cpp:847 +msgid "Surprised" +msgstr "" + +#: emoticontheme.cpp:848 +msgid "Party" +msgstr "" + +#: emoticontheme.cpp:849 +msgid "Sleepy" +msgstr "" + +#: emoticontheme.cpp:850 +msgid "Thinking" +msgstr "" -#: emoticontheme.cpp:754 -msgid "Don't tell anyone" -msgstr "" +#: emoticontheme.cpp:851 +msgid "Don't tell anyone" +msgstr "" -#: emoticontheme.cpp:755 -msgid "Secret telling" -msgstr "" +#: emoticontheme.cpp:852 +msgid "Secret telling" +msgstr "" -#: emoticontheme.cpp:756 -msgid "Eye-rolling" -msgstr "" +#: emoticontheme.cpp:853 +msgid "Eye-rolling" +msgstr "" -#: emoticontheme.cpp:757 -msgid "Sarcastic" -msgstr "" +#: emoticontheme.cpp:854 +msgid "Sarcastic" +msgstr "" -#: emoticontheme.cpp:758 -msgid "I don't know" -msgstr "" +#: emoticontheme.cpp:855 +msgid "I don't know" +msgstr "" -#: emoticontheme.cpp:759 -msgid "Be right back" -msgstr "" +#: emoticontheme.cpp:856 +msgid "Be right back" +msgstr "" -#: emoticontheme.cpp:760 -msgid "Angel" -msgstr "" +#: emoticontheme.cpp:857 +msgid "Angel" +msgstr "" -#: emoticontheme.cpp:761 -msgid "Left hug" -msgstr "" +#: emoticontheme.cpp:858 +msgid "Left hug" +msgstr "" -#: emoticontheme.cpp:762 -msgid "Boy" -msgstr "" +#: emoticontheme.cpp:859 +msgid "Boy" +msgstr "" -#: emoticontheme.cpp:763 -msgid "Red heart" -msgstr "" +#: emoticontheme.cpp:860 +msgid "Red heart" +msgstr "" -#: emoticontheme.cpp:764 -msgid "Red rose" -msgstr "" +#: emoticontheme.cpp:861 +msgid "Red rose" +msgstr "" -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "" +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "" -#: emoticontheme.cpp:766 -msgid "Dog face" -msgstr "" +#: emoticontheme.cpp:863 +msgid "Dog face" +msgstr "" -#: emoticontheme.cpp:767 -msgid "Sun" -msgstr "" +#: emoticontheme.cpp:864 +msgid "Sun" +msgstr "" -#: emoticontheme.cpp:768 -msgid "Devil" -msgstr "" +#: emoticontheme.cpp:865 +msgid "Devil" +msgstr "" -#: emoticontheme.cpp:769 -msgid "Right hug" -msgstr "" +#: emoticontheme.cpp:866 +msgid "Right hug" +msgstr "" -#: emoticontheme.cpp:770 -msgid "Girl" -msgstr "" +#: emoticontheme.cpp:867 +msgid "Girl" +msgstr "" -#: emoticontheme.cpp:771 -msgid "Broken heart" -msgstr "" +#: emoticontheme.cpp:868 +msgid "Broken heart" +msgstr "" -#: emoticontheme.cpp:772 -msgid "Wilted rose" -msgstr "" +#: emoticontheme.cpp:869 +msgid "Wilted rose" +msgstr "" -#: emoticontheme.cpp:773 -msgid "Thumbs down" -msgstr "" +#: emoticontheme.cpp:870 +msgid "Thumbs down" +msgstr "" -#: emoticontheme.cpp:774 -msgid "Cat face" -msgstr "" +#: emoticontheme.cpp:871 +msgid "Cat face" +msgstr "" -#: emoticontheme.cpp:775 -msgid "Sleeping half-moon" -msgstr "" +#: emoticontheme.cpp:872 +msgid "Sleeping half-moon" +msgstr "" -#: emoticontheme.cpp:776 -msgid "Red lips" -msgstr "" +#: emoticontheme.cpp:873 +msgid "Red lips" +msgstr "" -#: emoticontheme.cpp:777 -msgid "Clapping" -msgstr "" +#: emoticontheme.cpp:874 +msgid "Clapping" +msgstr "" -#: emoticontheme.cpp:778 -msgid "Crossed fingers" -msgstr "" +#: emoticontheme.cpp:875 +msgid "Crossed fingers" +msgstr "" -#: emoticontheme.cpp:779 -msgid "Auto" -msgstr "" +#: emoticontheme.cpp:876 +msgid "Auto" +msgstr "" -#: emoticontheme.cpp:780 -msgid "Airplane" -msgstr "" +#: emoticontheme.cpp:877 +msgid "Airplane" +msgstr "" -#: emoticontheme.cpp:781 -msgid "Turtle" -msgstr "" +#: emoticontheme.cpp:878 +msgid "Turtle" +msgstr "" -#: emoticontheme.cpp:782 -msgid "Snail" -msgstr "" +#: emoticontheme.cpp:879 +msgid "Snail" +msgstr "" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "" -#: emoticontheme.cpp:784 -msgid "Goat" -msgstr "" +#: emoticontheme.cpp:881 +msgid "Goat" +msgstr "" -#: emoticontheme.cpp:785 -msgid "Vampire bat" -msgstr "" +#: emoticontheme.cpp:882 +msgid "Vampire bat" +msgstr "" -#: emoticontheme.cpp:786 -msgid "Pizza" -msgstr "" +#: emoticontheme.cpp:883 +msgid "Pizza" +msgstr "" -#: emoticontheme.cpp:787 -msgid "Beer mug" -msgstr "" +#: emoticontheme.cpp:884 +msgid "Beer mug" +msgstr "" -#: emoticontheme.cpp:788 -msgid "Martini glass" -msgstr "" +#: emoticontheme.cpp:885 +msgid "Martini glass" +msgstr "" -#: emoticontheme.cpp:789 -msgid "Coffee cup" -msgstr "" +#: emoticontheme.cpp:886 +msgid "Coffee cup" +msgstr "" -#: emoticontheme.cpp:790 -msgid "Birthday cake" -msgstr "" +#: emoticontheme.cpp:887 +msgid "Birthday cake" +msgstr "" -#: emoticontheme.cpp:791 -msgid "Plate" -msgstr "" +#: emoticontheme.cpp:888 +msgid "Plate" +msgstr "" -#: emoticontheme.cpp:792 -msgid "Bowl" -msgstr "" +#: emoticontheme.cpp:889 +msgid "Bowl" +msgstr "" -#: emoticontheme.cpp:793 -msgid "Star" -msgstr "" - -#: emoticontheme.cpp:794 -msgid "Rainbow" -msgstr "" - -#: emoticontheme.cpp:795 -msgid "Stormy cloud" -msgstr "" - -#: emoticontheme.cpp:796 -msgid "Lightning" -msgstr "" - -#: emoticontheme.cpp:797 -msgid "Umbrella" -msgstr "" - -#: emoticontheme.cpp:798 -msgid "Island with a palm tree" -msgstr "" - -#: emoticontheme.cpp:799 -msgid "Telephone receiver" -msgstr "" - -#: emoticontheme.cpp:800 -msgid "Mobile Phone" -msgstr "" - -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 -msgid "Email" -msgstr "" - -#: emoticontheme.cpp:802 -msgid "Clock" -msgstr "" - -#: emoticontheme.cpp:803 -msgid "Camera" -msgstr "" - -#: emoticontheme.cpp:804 -msgid "Filmstrip" -msgstr "" - -#: emoticontheme.cpp:805 -msgid "Note" -msgstr "" - -#: emoticontheme.cpp:806 -msgid "Handcuffs" -msgstr "" - -#: emoticontheme.cpp:807 -msgid "Money" -msgstr "" - -#: emoticontheme.cpp:808 -msgid "Light bulb" -msgstr "" - -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "" - -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "" - -#: emoticontheme.cpp:811 -msgid "Gift with a bow" -msgstr "" - -#: emoticontheme.cpp:812 -msgid "X-Box" -msgstr "" - -#: emoticontheme.cpp:813 -msgid "Computer" -msgstr "" - -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "" - -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "" - -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "" - -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "" - -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "" - -#: kmess.cpp:715 -msgid "" -"Are you sure you want to remove the contact %1 from your contact " -"list?" -msgstr "" - -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "" - -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "" - -#: kmess.cpp:760 -msgid "" -"Are you sure you want to remove the group %1 from your contact " -"list?" -msgstr "" - -#: kmess.cpp:763 -msgid "Remove group" -msgstr "" - -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "" - -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "" - -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "" - -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "" - -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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 "" - -#: kmess.cpp:1673 -msgid "Error with notifications" -msgstr "" - -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "" - -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "" +#: emoticontheme.cpp:890 +msgid "Star" +msgstr "" + +#: emoticontheme.cpp:891 +msgid "Rainbow" +msgstr "" + +#: emoticontheme.cpp:892 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:893 +msgid "Lightning" +msgstr "" + +#: emoticontheme.cpp:894 +msgid "Umbrella" +msgstr "" + +#: emoticontheme.cpp:895 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:896 +msgid "Telephone receiver" +msgstr "" + +#: emoticontheme.cpp:897 +msgid "Mobile Phone" +msgstr "" + +#: emoticontheme.cpp:898 +msgid "Email" +msgstr "" + +#: emoticontheme.cpp:899 +msgid "Clock" +msgstr "" + +#: emoticontheme.cpp:900 +msgid "Camera" +msgstr "" + +#: emoticontheme.cpp:901 +msgid "Filmstrip" +msgstr "" + +#: emoticontheme.cpp:902 +msgid "Note" +msgstr "" + +#: emoticontheme.cpp:903 +msgid "Handcuffs" +msgstr "" + +#: emoticontheme.cpp:904 +msgid "Money" +msgstr "" + +#: emoticontheme.cpp:905 +msgid "Light bulb" +msgstr "" + +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "" + +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:908 +msgid "Gift with a bow" +msgstr "" + +#: emoticontheme.cpp:909 +msgid "X-Box" +msgstr "" + +#: emoticontheme.cpp:910 +msgid "Computer" +msgstr "" + +#: emoticontheme.cpp:911 +msgid "KMess icon" +msgstr "" + +#: 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:375 +#, possible-kde-format +msgctxt "Status message on login screen" +msgid "Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" + +#: initialview.cpp:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "" + +#: initialview.cpp:401 +#, possible-kde-format +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:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "" + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "" + +#: kmess.cpp:218 +#, possible-kde-format +msgid "The contact %1 is already in your contact list." +msgstr "" + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "" + +#: kmess.cpp:576 +#, possible-kde-format +msgid "Are you sure you want to remove the contact %1 from your " + "contact list?" +msgstr "" + +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "" + +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "" + +#: kmess.cpp:626 +#, possible-kde-format +msgctxt "dialog text" +msgid "The group %1 is not empty! First remove all contacts from it, " + "then try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, possible-kde-format +msgctxt "dialog text" +msgid "Are you sure you want to remove the group %1 from your " + "contact list?" +msgstr "" + +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "" + +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." +msgstr "" + +#: kmess.cpp:676 +msgid "Rename Group" +msgstr "" + +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "" + +#: kmess.cpp:753 +#, possible-kde-format +msgctxt "dialog text" +msgid "

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

" +msgstr "" + +#: kmess.cpp:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "" + +#: kmess.cpp:1039 +msgid "Connection could be down..." +msgstr "" + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "" + +#: kmess.cpp:1448 +#, possible-kde-format +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:1460 +#, possible-kde-format +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:1466 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "" + +#: kmess.cpp:1744 +#, possible-kde-format +msgctxt "Main window caption: switched order to easily distinguish it from " + "chats" +msgid "KMess - %1" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "" + +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "" + +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "" #: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "" +msgid "&Show Search Bar" +msgstr "" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "" + +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "" + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "" + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "" + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" #: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "" +msgid "Show Selection &Menu" +msgstr "" #: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "" +msgid "Do Not Display" +msgstr "" -#: kmessinterface.cpp:220 -msgid "&Connect" -msgstr "" +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "" -#: kmessinterface.cpp:275 -msgid "Show &Allowed Contacts" -msgstr "" +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" -#: kmessinterface.cpp:276 -msgid "Show &Offline Contacts" -msgstr "" +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" -#: kmessinterface.cpp:277 -msgid "Show &Removed Contacts" -msgstr "" +#: kmessinterface.cpp:197 +msgid "Group" +msgstr "" -#: kmessinterface.cpp:278 -msgid "Show &Display Pictures" -msgstr "" +#: kmessinterface.cpp:198 +msgid "Online/Offline" +msgstr "" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "" -#: kmessinterface.cpp:285 -msgid "&Sort Contacts by" -msgstr "" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "" -#: kmessinterface.cpp:286 kmessview.cpp:1190 -msgid "Group" -msgstr "" +#: kmessview.cpp:318 +#, possible-kde-format +msgid "[%1] Logged in with %2" +msgstr "" -#: kmessinterface.cpp:286 -msgid "Online/Offline" -msgstr "" +#: kmessview.cpp:355 +#, possible-kde-format +msgid "[%1] %2 goes online" +msgstr "" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "" +#: kmessview.cpp:360 +#, possible-kde-format +msgid "[%1] %2 goes offline" +msgstr "" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "" +#: kmessview.cpp:599 +msgid "Cha&t" +msgstr "" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:610 +msgid "&Remove From Group" +msgstr "" -#: kmessview.cpp:613 -msgid "Cha&t" -msgstr "" +#: kmessview.cpp:643 +msgid "&Copy to Group" +msgstr "" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "" +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "" +#: kmessview.cpp:695 +msgid "Move Group &Down" +msgstr "" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "" +#: kmessview.cpp:696 +msgid "Move Group &Up" +msgstr "" -#: kmessview.cpp:641 -msgid "&Copy to Group" -msgstr "" +#: kmessview.cpp:697 +msgid "Re&move Group" +msgstr "" -#: kmessview.cpp:674 -msgid "Move Group &Down" -msgstr "" +#: kmessview.cpp:698 +msgid "Re&name Group" +msgstr "" -#: kmessview.cpp:675 -msgid "Move Group &Up" -msgstr "" +#: kmessview.cpp:1136 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "" -#: kmessview.cpp:676 -msgid "Re&move Group" -msgstr "" +#: kmessview.cpp:1145 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "" -#: kmessview.cpp:677 -msgid "Re&name Group" -msgstr "" +#: kmessview.cpp:1152 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "" +#: kmessview.cpp:1168 +msgid "No" +msgstr "" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "" +#: kmessview.cpp:1171 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "" +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "" +#: kmessview.cpp:1206 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "" +#: kmessview.cpp:1216 +#, possible-kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "" +#: kmessview.cpp:1224 +#, possible-kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "" +msgstr[1] "" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "" +#: kmessview.cpp:1231 +#, possible-kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "" +msgstr[1] "" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "" +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "" + +#: kmessview.cpp:1652 +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:1833 +msgid "You have not chatted with this contact yet." +msgstr "" + +#: kmessview.cpp:1834 +msgid "No Chat History found." +msgstr "" + +#: kmessview.cpp:2020 +#, possible-kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, possible-kde-format +msgctxt "Group name in the contact list with online/total contacts of that " + "group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, possible-kde-format +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "" + +#: main.cpp:42 settings/accountpage.cpp:480 settings/accountpage.cpp:541 +msgid "KMess" +msgstr "" #: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "" +msgid "A Live Messenger client for KDE" +msgstr "" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 -msgid "KMess" -msgstr "" +#: main.cpp:46 +msgid "(c) 2002-2009, Mike K. Bennett\n" + "(c) 2005-2009, Diederik van der Boor\n" + "(c) 2007-2009, Valerio Pilo\n" + "(c) 2008-2009, Antonio Nastasi\n" + "(c) 2008-2009, Ruben Vandamme\n" +msgstr "" -#: main.cpp:78 -msgid "" -"German translation, testing, documentation, web master, project management, " -"etc..." -msgstr "" +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" -#: main.cpp:79 -msgid "Web design" -msgstr "" +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 +msgid "German translation, testing, documentation, web master, project " + "management, etc..." +msgstr "" + +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 +msgid "Web design" +msgstr "" + +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:74 +msgid "Cartoon emoticons" +msgstr "" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" #: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "" - -#: main.cpp:81 -msgid "Cartoon emoticons" -msgstr "" +msgid "Translations Maintainer" +msgstr "" #: main.cpp:82 -msgid "Default sound theme" -msgstr "" +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" #: main.cpp:86 -msgid "Arabic translation, internationalization of file saving fix." -msgstr "" +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "" #: main.cpp:87 -msgid "More Arabic translation" -msgstr "" +msgid "Sergio Rafael Lemke" +msgstr "" #: main.cpp:88 -msgid "Brazilian Portuguese translation" -msgstr "" +msgid "Maurício Arozi Moraes" +msgstr "" -#: main.cpp:89 -msgid "Catalan translation" -msgstr "" +#: main.cpp:90 +msgid "Catalan translation" +msgstr "" + +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" #: main.cpp:91 -msgid "Simplified Chinese translation, file send bug fix, proxy connect code" -msgstr "" +msgid "Adrià Arrufat" +msgstr "" -#: main.cpp:92 -msgid "More Simplified Chinese translation" -msgstr "" +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "" #: main.cpp:93 -msgid "Traditional Chinese translation" -msgstr "" +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" + +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "" #: main.cpp:95 -msgid "Danish translation" -msgstr "" +msgid "Cheng Yang" +msgstr "" #: main.cpp:96 -msgid "More Danish translation" -msgstr "" +msgid "Traditional Chinese translation" +msgstr "" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" #: main.cpp:97 -msgid "Dutch translation" -msgstr "" +msgid "More Traditional Chinese translation" +msgstr "" -#: main.cpp:98 -msgid "More Dutch translation" -msgstr "" +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" #: main.cpp:100 -msgid "Estonian translation" -msgstr "" +msgid "More Danish translation" +msgstr "" -#: main.cpp:101 -msgid "Finnish translation" -msgstr "" +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" -#: main.cpp:102 main.cpp:103 -msgid "More Finnish translation" -msgstr "" +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 +msgid "More Dutch translation" +msgstr "" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" #: main.cpp:105 -msgid "French translation" -msgstr "" +msgid "Elve" +msgstr "" #: main.cpp:106 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "" +msgid "Sander Pientka" +msgstr "" -#: main.cpp:107 -msgid "More French translation" -msgstr "" +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "" #: main.cpp:109 -msgid "Hungarian translation" -msgstr "" +msgid "Dimitrios Glentadakis" +msgstr "" -#: main.cpp:110 main.cpp:111 -msgid "More Italian translation" -msgstr "" +#: main.cpp:109 +msgid "More Greek translation" +msgstr "" + +#: main.cpp:111 +msgid "Estonian translation" +msgstr "" + +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" #: main.cpp:112 -msgid "Korean translation" -msgstr "" +msgid "Finnish translation" +msgstr "" + +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" #: main.cpp:113 -msgid "Norsk Bokmål translation" -msgstr "" +msgid "Joonas Niilola" +msgstr "" -#: main.cpp:115 -msgid "Slovenian translation" -msgstr "" +#: main.cpp:113 main.cpp:114 +msgid "More Finnish translation" +msgstr "" + +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" #: main.cpp:116 -msgid "Spanish translation" -msgstr "" +msgid "Choplair" +msgstr "" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 -msgid "More Spanish translation" -msgstr "" +#: main.cpp:116 +msgid "French translation" +msgstr "" -#: main.cpp:121 -msgid "Swedish translation" -msgstr "" +#: main.cpp:117 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 +msgid "More French translation" +msgstr "" + +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 +msgid "Hungarian translation" +msgstr "" + +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" #: main.cpp:123 -msgid "Thai translation" -msgstr "" +msgid "More Hungarian translation" +msgstr "" -#: main.cpp:124 -msgid "Turkish translation" -msgstr "" +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "" +#: main.cpp:124 main.cpp:125 +msgid "More Italian translation" +msgstr "" -#: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "" +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "More Italian translation, Group selection in 'contact added user' " + "dialog" +msgstr "" + +#: main.cpp:127 +msgid "Korean translation" +msgstr "" + +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" #: main.cpp:130 -msgid "P4-Context field support" -msgstr "" +msgid "Serbian translation" +msgstr "" -#: main.cpp:131 -msgid "Xinerama fixes" -msgstr "" +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" #: main.cpp:132 -msgid "Original file receive code" -msgstr "" +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "" #: main.cpp:133 -msgid "Various internationalization fixes." -msgstr "" +msgid "Matjaž Kaše" +msgstr "" -#: main.cpp:134 -msgid "GnomeMeeting developer" -msgstr "" +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "" #: main.cpp:135 -msgid "Guy with a bag over his head" -msgstr "" +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 +msgid "Spanish translation" +msgstr "" + +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 +msgid "More Spanish translation" +msgstr "" + +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" #: main.cpp:138 -msgid "Inspiration and assorted code" -msgstr "" +msgid "Jaume Corbí" +msgstr "" #: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "" +msgid "Christian Kaiser" +msgstr "" #: main.cpp:140 -msgid "Idle timer code" -msgstr "" +msgid "Juan Pablo González Tognarelli" +msgstr "" #: main.cpp:141 -msgid "Close-to-tray icon screenshot code" -msgstr "" +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" #: main.cpp:144 -msgid "Your name here?" -msgstr "" +msgid "Christian Lundgren" +msgstr "" #: main.cpp:144 -msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" -"If you feel your name is missing here, please contact us too!" -msgstr "" - -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 -msgid "The contact cancelled the session." -msgstr "" - -#: network/applications/application.cpp:288 -msgid "The contact rejected the invitation." -msgstr "" - -#: network/applications/application.cpp:360 -msgid "You have cancelled the session." -msgstr "" - -#: network/applications/application.cpp:372 -msgid "You have rejected the invitation." -msgstr "" - -#: network/applications/application.cpp:497 -msgid "Do you want to accept or cancel?" -msgstr "" - -#: network/applications/application.cpp:533 -msgid "Click to cancel." -msgstr "" - -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "" - -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "" - -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "" - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "" - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 -msgid "Transfer accepted." -msgstr "" - -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 -msgid "Negotiating options to connect" -msgstr "" - -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 -msgid "The file transfer invitation was cancelled. Bad data was received." -msgstr "" - -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "" - -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "" - -#: network/applications/filetransferp2p.cpp:586 -msgid "File could not be written" -msgstr "" - -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "" - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "" - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "" - -#: network/applications/gnomemeeting.cpp:55 -msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "" - -#: network/applications/gnomemeeting.cpp:114 -msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "" - -#: network/applications/gnomemeeting.cpp:156 -msgid "Inviting the contact to a meeting." -msgstr "" - -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "" - -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "" - -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "" - -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "" - -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "" - -#: network/applications/mimeapplication.cpp:141 -msgid "The invitation was aborted." -msgstr "" - -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "" - -#: network/applications/msnremotedesktop.cpp:155 -msgid "Starting KRDC. Connecting to %1." -msgstr "" - -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 -msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " -"support it." -msgstr "" - -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "" - -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "" - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "" - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" - -#: network/applications/p2papplication.cpp:2038 -msgid "The invitation was cancelled. Message was not directed to us." -msgstr "" - -#: network/applications/p2papplication.cpp:2584 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" - -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 -msgid "Awaiting connection at %1, port %2" -msgstr "" - -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 -msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "" - -#: network/applications/p2papplication.cpp:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "" - -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "" - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "" - -#: network/applications/p2papplication.cpp:4844 -msgid "Waiting for connection" -msgstr "" - -#: network/applications/p2papplication.cpp:5013 -msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " -"accept." -msgstr "" - -#: network/applications/p2papplication.cpp:5022 -msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " -"succeed or fail." -msgstr "" - -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "" - -#: network/applications/voiceconversation.cpp:77 -msgid "You are invited to start a voice conversation." -msgstr "" - -#: network/applications/voiceconversation.cpp:82 -msgid "" -"You are invited to start a voice conversation but support for this was not " -"installed" -msgstr "" - -#: network/applications/voiceconversation.cpp:174 -msgid "You have cancelled the voice conversation." -msgstr "" - -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "" - -#: network/applications/voiceconversation.cpp:222 -msgid "Start voice conversation. Connecting to %1." -msgstr "" - -#: network/applications/voiceconversation.cpp:228 -msgid "Start voice conversation. Listening on %1." -msgstr "" - -#: network/applications/voiceconversation.cpp:293 -msgid "Inviting the contact to a voice conversation." -msgstr "" - -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -msgid "The contact is inviting you for '%1', but this is not implemented yet." -msgstr "" - -#: network/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "" - -#: network/extra/msnftpconnection.cpp:136 -msgid "Failed" -msgstr "" - -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "" - -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." -msgstr "" - -#: network/extra/msnftpconnection.cpp:468 -msgid "Initiating file transfer" -msgstr "" - -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "" - -#: network/extra/msnftpconnection.cpp:482 -msgid "Unable to make a connection." -msgstr "" - -#: network/extra/msnftpconnection.cpp:586 -msgid "Receiving file %1" -msgstr "" - -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." -msgstr "" - -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "" - -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "" - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "" - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "" - -#: network/msnnotificationconnection.cpp:1339 -msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "" - -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "" - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "" - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 +msgid "Swedish translation" +msgstr "" + +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +msgid "More Swedish translation" +msgstr "" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 +msgid "Thai translation" +msgstr "" + +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 +msgid "Turkish translation" +msgstr "" + +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "" + +#: main.cpp:154 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:155 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 +msgid "Xinerama fixes" +msgstr "" + +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:159 +msgid "KWallet support" +msgstr "" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "Notifications blocking option, winks disabling option, last message " + "date feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 +msgid "Various internationalization fixes." +msgstr "" + +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:169 +msgid "Guy with a bag over his head" +msgstr "" + +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" + +#: main.cpp:174 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +msgid "You are welcome to send bugfixes and patches to the KMess help " + "forum!\n" + "If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:179 +msgid "Your name here?" +msgstr "" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "" + +#: main.cpp:183 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "" + +#: main.cpp:189 +msgid "Do not show the contact list window initially" +msgstr "" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "" + +#: model/contactlist.cpp:1827 +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 +#, possible-kde-format +msgid "Do you want to accept or cancel?" +msgstr "" + +#: network/applications/application.cpp:581 +#, possible-kde-format +msgid "Click to cancel." +msgstr "" + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, possible-kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" + +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, possible-kde-format +msgid "The file "%1" already exists.\n" + "Do you want to overwrite it?" +msgstr "" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, possible-kde-format +msgid "The transfer of the file "%1" failed. Could not save the " + "file." +msgstr "" + +#: network/applications/filetransfer.cpp:295 +#, possible-kde-format +msgid "The transfer of the file "%1" failed. Could not open the " + "destination file." +msgstr "" + +#: network/applications/filetransfer.cpp:319 +msgid "Transfer accepted." +msgstr "" + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, possible-kde-format +msgid "Connecting to %1, port %2" +msgstr "" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, possible-kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, possible-kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, possible-kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, possible-kde-format +msgid "Successfully sent the file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, possible-kde-format +msgid "Successfully received the file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, possible-kde-format +msgid "The transfer of the file "%1" failed. The file does not " + "exist." +msgstr "" + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, possible-kde-format +msgid "The transfer of the file "%1" failed. The file could not " + "be read." +msgstr "" + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, possible-kde-format +msgid "Sending file "%1" (%2)." +msgstr "" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, possible-kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +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 +#, possible-kde-format +msgid "You have accepted the transfer of the 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 +#, possible-kde-format +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 is 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 contact's desktop." +msgstr "" + +#: network/applications/msnremotedesktop.cpp:159 +#, possible-kde-format +msgid "Starting KRDC. Connecting to %1." +msgstr "" + +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by " + "KMess." +msgstr "" + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +msgid "The invitation was cancelled. The contact sent bad data, or KMess " + "does not support it." +msgstr "" + +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "" + +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "" + +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +msgid "The transfer failed. The contact sent bad data, or KMess does not " + "support it." +msgstr "" + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "" + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, possible-kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "" + +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "" + +#: network/applications/p2papplication.cpp:3423 +msgid "The invitation was cancelled. A timeout occurred waiting for the " + "contact to accept." +msgstr "" + +#: network/applications/p2papplication.cpp:3432 +msgid "The invitation was cancelled. A timeout occurred waiting for a " + "connection to succeed or fail." +msgstr "" + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1208 +msgid "The transfer failed. Could not 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 could not be opened." +msgstr "" + +#: network/applications/voiceconversation.cpp:218 +#, possible-kde-format +msgid "Start voice conversation. Connecting to %1." +msgstr "" + +#: network/applications/voiceconversation.cpp:224 +#, possible-kde-format +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 +#, possible-kde-format +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 contact's webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, possible-kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "" + +#: network/extra/msnftpconnection.cpp:126 +#, possible-kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "" + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "" + +#: network/extra/msnftpconnection.cpp:204 +#, possible-kde-format +msgid "Sending file %1" +msgstr "" + +#: network/extra/msnftpconnection.cpp:398 +#, possible-kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "" + +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." +msgstr "" + +#: network/extra/msnftpconnection.cpp:456 +msgid "Initiating file transfer" +msgstr "" + +#: network/extra/msnftpconnection.cpp:469 +#, possible-kde-format +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 +#, possible-kde-format +msgid "Receiving file %1" +msgstr "" + +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "" + +#: network/msnconnection.cpp:384 +msgid "The email address you have tried to add is not a Live Messenger " + "account" +msgstr "" + +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" +msgstr "" + +#: network/msnconnection.cpp:400 +msgid "This account name is invalid, or your Passport account has not been " + "confirmed yet" +msgstr "" + +#: network/msnconnection.cpp:403 +msgid "Your contact list is full" +msgstr "" + +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 +msgid "This contact is already on your list" +msgstr "" + +#: network/msnconnection.cpp:415 +msgid "This contact is not on your list" +msgstr "" + +#: network/msnconnection.cpp:419 +msgid "This contact is not online" +msgstr "" + +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +msgid "The group name is already present in your contact list. Please use a " + "different name" +msgstr "" + +#: network/msnconnection.cpp:436 +msgid "Your contact list has too many groups; you are allowed to only have " + "at most 30" +msgstr "" + +#: network/msnconnection.cpp:440 +msgid "This group cannot be changed" +msgstr "" + +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "" + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "" + +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" + +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "" + +#: network/msnconnection.cpp:458 +#, possible-kde-format +msgid "There was an internal error in KMess: %1" +msgstr "" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 +msgid "Switchboard server failed" +msgstr "" + +#: network/msnconnection.cpp:476 +msgid "Transfer to switchboard server failed" +msgstr "" + +#: network/msnconnection.cpp:480 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "" + +#: network/msnconnection.cpp:492 +msgctxt "MSN error, due to e.g. trying the beta service without an allowed " + "account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:500 +msgid "Your account is banned" +msgstr "" + +#: network/msnconnection.cpp:504 +msgid "Challenge response failed" +msgstr "" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 +msgid "Bad friend name" +msgstr "" + +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" +msgstr "" + +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "" + +#: network/msnconnection.cpp:550 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "" + +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "" + +#: network/msnconnection.cpp:558 +msgid "You have a Kids Passport account, you need parental consent to chat " + "online" +msgstr "" + +#: network/msnconnection.cpp:561 +msgid "Your Passport account needs to be verified first" +msgstr "" + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:584 +msgid "The Live Messenger service is temporarily unavailable. There was an " + "internal server error" +msgstr "" + +#: network/msnconnection.cpp:595 +msgid "The Live Messenger service is temporarily unavailable. The server is " + "too busy" +msgstr "" + +#: network/msnconnection.cpp:599 +msgid "Peer notification server down" +msgstr "" + +#: network/msnconnection.cpp:603 +msgid "The server is going down" +msgstr "" + +#: network/msnconnection.cpp:607 +msgid "The server is going down soon" +msgstr "" + +#: network/msnconnection.cpp:612 +msgid "Write is blocking" +msgstr "" + +#: network/msnconnection.cpp:616 +msgid "Session is overloaded" +msgstr "" + +#: network/msnconnection.cpp:623 +msgid "The server is not available" +msgstr "" + +#: network/msnconnection.cpp:627 +msgid "Authentication failed" +msgstr "" + +#: network/msnconnection.cpp:634 +#, possible-kde-format +msgid "Unknown error code received from the server: %1
Technical " + "details: %2" +msgstr "" + +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "" + +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1940 +#, possible-kde-format +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2100 +#, possible-kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "" +msgstr[1] "" + +#: network/msnnotificationconnection.cpp:2103 +#, possible-kde-format +msgid "Server closes for maintenance in %1!" +msgstr "" + +#: network/msnnotificationconnection.cpp:2108 +#, possible-kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" + #: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "" - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" - -#: network/msnnotificationconnection.cpp:2258 -msgid "Your contact list is full" -msgstr "" - -#: network/msnnotificationconnection.cpp:2264 -msgid "This contact is already on your list" -msgstr "" - -#: network/msnnotificationconnection.cpp:2267 -msgid "This contact is not on your list" -msgstr "" - -#: network/msnnotificationconnection.cpp:2270 -msgid "This contact is not online" -msgstr "" - -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "" - -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "" - -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "" - -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "" - -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "" - -#: network/msnnotificationconnection.cpp:2300 -msgid "Switchboard server failed" -msgstr "" - -#: network/msnnotificationconnection.cpp:2303 -msgid "Transfer to switchboard server failed" -msgstr "" - -#: network/msnnotificationconnection.cpp:2306 -msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "" - -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "" - -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "" - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "" - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "" - -#: network/msnnotificationconnection.cpp:2341 -msgid "Bad friend name" -msgstr "" - -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "" - -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." -msgstr "" - -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr "" - -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "" - -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "" - -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "" - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "" - -#: network/msnnotificationconnection.cpp:2419 -msgid "Peer notification server down" -msgstr "" - -#: network/msnnotificationconnection.cpp:2423 -msgid "The server is going down" -msgstr "" - -#: network/msnnotificationconnection.cpp:2426 -msgid "The server is going down soon" -msgstr "" - -#: network/msnnotificationconnection.cpp:2430 -msgid "Write is blocking" -msgstr "" - -#: network/msnnotificationconnection.cpp:2433 -msgid "Session is overloaded" -msgstr "" - -#: network/msnnotificationconnection.cpp:2438 -msgid "The server is not available" -msgstr "" - -#: network/msnnotificationconnection.cpp:2441 -msgid "Authentication failed" -msgstr "" - -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2596 -msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "" - -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "" - -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "" - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "" - -#. i18n: file ./chat/chatviewinterface.ui line 143 +#, possible-kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2796 +#, possible-kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, possible-kde-format +msgid "
Internal error reason: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" +msgid "

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

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2917 +#, possible-kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location." +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, possible-kde-format +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:2932 +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:2935 +#, possible-kde-format +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:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2956 +#, possible-kde-format +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:2967 +#, possible-kde-format +msgctxt "Connection error (Server-reported user error): passive notification " + "message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2969 +#, possible-kde-format +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2980 +#, possible-kde-format +msgctxt "Connection error (Server-reported server error): passive " + "notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2982 +#, possible-kde-format +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +#, possible-kde-format +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3061 +#, possible-kde-format +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:686 +#, possible-kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "" + +#: network/msnsockethttp.cpp:696 +#, possible-kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)
Response: %3 %4
Redirection target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "" + +#: network/msnsockettcp.cpp:384 +#, possible-kde-format +msgid "%1 pings lost" +msgstr "" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "" + +#: network/soap/addressbookservice.cpp:777 +#, possible-kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" + +#: network/soap/addressbookservice.cpp:787 +#, possible-kde-format +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 +#, possible-kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, possible-kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:523 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, possible-kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, possible-kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, possible-kde-format +msgid "In %1's chat:
%2" +msgstr "" + +#: notification/chatnotification.cpp:176 +#, possible-kde-format +msgid "%1 says:
'%2'" +msgstr "" + +#: notification/chatnotification.cpp:180 +#, possible-kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" + +#: notification/chatnotification.cpp:187 +#, possible-kde-format +msgid "%1's chat requests attention!" +msgstr "" + +#: notification/chatnotification.cpp:192 +#, possible-kde-format +msgid "%1:
%2" +msgstr "" + +#: notification/chatnotification.cpp:199 +#, possible-kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "" + +#: notification/chatnotification.cpp:203 +#, possible-kde-format +msgid "%1 has sent you a nudge!" +msgstr "" + +#: notification/chatnotification.cpp:207 +#, possible-kde-format +msgid "%1 has sent you a wink!" +msgstr "" + +#: notification/chatnotification.cpp:213 +#, possible-kde-format +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +#, possible-kde-format +msgid "%1 is sending you a file!" +msgstr "" + +#: notification/chatnotification.cpp:215 +#, possible-kde-format +msgid "%1 has sent you an invitation!" +msgstr "" + +#: notification/chatnotification.cpp:222 +#, possible-kde-format +msgid "%1 has canceled the webcam session!" +msgstr "" + +#: notification/chatnotification.cpp:223 +#, possible-kde-format +msgid "%1 has canceled the file transfer!" +msgstr "" + +#: notification/chatnotification.cpp:224 +#, possible-kde-format +msgid "%1's activity has been canceled!" +msgstr "" + +#: notification/chatnotification.cpp:231 +#, possible-kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:232 +#, possible-kde-format +msgid "%1 has accepted the file transfer!" +msgstr "" + +#: notification/chatnotification.cpp:233 +#, possible-kde-format +msgid "%1 has accepted your invitation!" +msgstr "" + +#: notification/chatnotification.cpp:240 +#, possible-kde-format +msgid "%1 has ended the webcam session!" +msgstr "" + +#: notification/chatnotification.cpp:241 +#, possible-kde-format +msgid "The file transfer with %1 is done!" +msgstr "" + +#: notification/chatnotification.cpp:242 +#, possible-kde-format +msgid "%1's activity has ended!" +msgstr "" + +#: notification/chatnotification.cpp:249 +#, possible-kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, possible-kde-format +msgid "The file transfer with %1 has failed!" +msgstr "" + +#: notification/chatnotification.cpp:251 +#, possible-kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, possible-kde-format +msgid "%1
is now online" +msgstr "" + +#: notification/contactstatusnotification.cpp:92 +#, possible-kde-format +msgid "%1
has gone away" +msgstr "" + +#: notification/contactstatusnotification.cpp:93 +#, possible-kde-format +msgid "%1
will be right back" +msgstr "" + +#: notification/contactstatusnotification.cpp:94 +#, possible-kde-format +msgid "%1
is now busy" +msgstr "" + +#: notification/contactstatusnotification.cpp:95 +#, possible-kde-format +msgid "%1
has become invisible" +msgstr "" + +#: notification/contactstatusnotification.cpp:96 +#, possible-kde-format +msgid "%1
has gone idle" +msgstr "" + +#: notification/contactstatusnotification.cpp:97 +#, possible-kde-format +msgid "%1
has logged out" +msgstr "" + +#: notification/contactstatusnotification.cpp:98 +#, possible-kde-format +msgid "%1
is on the phone" +msgstr "" + +#: notification/contactstatusnotification.cpp:99 +#, possible-kde-format +msgid "%1
is out for lunch" +msgstr "" + +#: notification/newemailnotification.cpp:90 +#, possible-kde-format +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 +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 +#, possible-kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, possible-kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "" + +#: 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 "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "" + +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "" + +#: settings/accountpage.cpp:539 +msgid "An error occurred while trying to change the display picture.\n" + "Make sure that you have selected an existing image 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 +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 +#, possible-kde-format +msgid "The email address you have entered is not valid, and cannot be used " + "as an account: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:214 +#, possible-kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "" + +#: settings/accountsmanagerpage.cpp:160 +#, possible-kde-format +msgid "Are you sure you want to delete the account '%1' ?
All " + "settings of this account will be lost." +msgstr "" + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "" + +#: settings/chatstylepage.cpp:375 +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 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "" + +#: settings/emoticonspage.cpp:233 +#, possible-kde-format +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: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 web 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, possible-c-format +msgid "The console command you have specified to launch a custom web " + "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 +#, possible-c-format +msgid "The console command you specified to launch a custom email " + "client does not contain the '%u' parameter. Without this, composing " + "emails 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "" + +#: utils/likeback/likeback.cpp:319 +#, possible-kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, possible-kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text, explanation for both the like and dislike " + "buttons" +msgid "Each time you have a great or frustrating experience, please click " + "on the appropriate face below the window title-bar, briefly describe " + "what you like or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "Each time you have a great experience, please click on the smiling " + "face below the window title-bar, briefly describe what you like and " + "click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "Each time you have a frustrating experience, please click on the " + "frowning face below the window title-bar, briefly describe what you " + "dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "If you experience an improper behavior in the application, just " + "click on the broken-object icon in the top-right corner of the " + "window, describe the behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "I dislike the welcome page of this assistant. Too time " + "consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "The application shows an improper behaviour when clicking the " + "Add button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, possible-kde-format +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:146 +#, possible-kde-format +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:159 +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:168 +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:174 +#, possible-kde-format +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 the developers a brief description of your " + "opinions about %1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, possible-kde-format +msgid "The email address you have entered is not valid, and cannot be used: " + "'%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "

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

Please, try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 -#, no-c-format -msgid "S&end" -msgstr "" +msgid "Click this button to switch to the standard text mode." +msgstr "" -#. i18n: file ./chat/chatviewinterface.ui line 168 +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) #: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "" +msgid "Click this button to switch to the handwriting mode, so you can " + "write or paint a handwritten message." +msgstr "" -#. i18n: file ./chat/chatviewinterface.ui line 264 +#. 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 -#, no-c-format -msgid "Sidebar" -msgstr "" +msgid "Click this button to show all default Live Messenger emoticons, so " + "you can easily insert them in your messages." +msgstr "" -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, no-c-format -msgid "The contact is listening to music" -msgstr "" +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "" -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "Click this button to show all custom emoticons, so you can easily " + "insert them in your messages." +msgstr "" -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 +#. 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) #: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" +msgid "S&end" +msgstr "" -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "" +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format -msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -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: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "" +#. i18n: file: chat/contactswidget.ui:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "" +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "Clear area" +msgstr "" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "" +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "Pen color" +msgstr "" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" -msgstr "" +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen size" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "" +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "Erase brush" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "" +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -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: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -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:273 +msgid "Email address:" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -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: file ./initialviewinterface.ui line 1387 +#. 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 +msgid "Search through contacts..." +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) #: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "" +msgid "What would you like to do?" +msgstr "" -#. i18n: file ./kmessviewinterface.ui line 146 +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +msgid "&Add this person to the following groups of your 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, but allow him or her to see your status" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) #: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "" +msgid "&Block this person from contacting you and seeing your status" +msgstr "" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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 ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format -msgid "Accounts" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this contact" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +msgid "Disable notifications for this contact" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format -msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +msgid "&Display Pictures" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format -msgid "" -"Enter the password of your MSN Passport account. You can register a new " -"account at http://register.passport.com/" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format -msgid "C&hange..." -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "You can choose to hide any emoticon received from this " + "contact. Just right-click on a received emoticon and choose \"Hide " + "this Emoticon\". With this page, you can restore the hidden " + "emoticons." +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +msgid "Resto&re" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format -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" -"\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: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 245 +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) #: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "" +msgid "Invite a person not on your contact list:" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +msgid "Enter the email address of a person to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) #: rc.cpp:186 -#, no-c-format -msgid "If enabled, KMess automatically logs in with this account." -msgstr "" +msgid "Invited Contacts" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "" +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format -msgid "" -"You can't change your friendly name because your passport e-mail address is " -"not verified." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) #: rc.cpp:198 -#, no-c-format -msgid "Request verification email" -msgstr "" +msgid "Format" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) #: rc.cpp:201 -#, no-c-format -msgid "https://accountservices.passport.net/" -msgstr "" +msgid "CSV" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) #: rc.cpp:204 -#, no-c-format -msgid "Go to accountservices.passport.net" -msgstr "" +msgid "XML" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) #: rc.cpp:207 -#, no-c-format -msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " -"address as Passport account." -msgstr "" +msgid "Contacts:" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 459 +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) #: rc.cpp:213 -#, no-c-format -msgid "Register new account" -msgstr "" +msgid "Deselect All" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) #: rc.cpp:216 -#, no-c-format -msgid "http://register.passport.com/" -msgstr "" +msgid "Export..." +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) #: rc.cpp:219 -#, no-c-format -msgid "Go to register.passport.com" -msgstr "" +msgid "Close" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 35 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) #: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "" +msgid "Command to Current Tab" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 46 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) #: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "" +msgid "Command:" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 54 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) #: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "" +msgid "Type:" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 63 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) #: rc.cpp:237 -#, no-c-format -msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "" +msgid "MIME" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 71 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) #: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "" +msgid "Send" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "" +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "" +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "Do not translate: undeletable default name, will be overwritten in " + "the code" +msgid "KSqueezedTextLabel" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 94 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) #: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" +msgid "Cancel" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 102 +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) #: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "" +msgid "&Download" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 108 +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) #: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" +msgid "C&lean Up" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) #: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "" +msgid "&Close" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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 ./settings/alertswidget.ui line 147 +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) #: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "" +msgid "Enter here the email address of your registered Passport or Live " + "account" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 189 +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) #: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "" +msgid "Status at login:" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 195 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) #: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 208 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) #: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "" +msgid "If enabled, KMess will save your account" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 254 +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) #: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" +msgid "Remem&ber account" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 261 +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) #: rc.cpp:300 -#, no-c-format -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 "" +msgid "If you choose to remember an account within KMess, you can also save " + "its password" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "" +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +msgid "R&emember password" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "Click this button to start using KMess, or to cancel a connection " + "attempt" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "" +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:321 +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 ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "" +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "" +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +msgid "Click here to go to the Live web site, to reset your account's " + "password" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "" +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "" +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "" +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "" +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "" +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "" +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +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/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "" +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 +msgid "Enter the password of your MSN Passport account. You can register a " + "new account at http://register.passport.com/" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 126 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) #: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "" +msgid "C&hange..." +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "" +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +msgid "The option \"Remember account\" was left unchecked while " + "logging in, so your settings will not be saved by default. Enable " + "this option if you want to save your account settings permanently on " + "this system.\n" + "\n" + "It is recommended to enable this option, unless you are using KMess " + "as guest or you are using a public system (e.g. Internet cafe)." +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 308 +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) #: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" +msgid "If enabled, KMess automatically logs in with this account." +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 419 +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) #: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "" +msgid "Log in &with this account automatically" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 425 +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) #: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" +msgid "Login &as" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 433 +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) #: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" +msgid "You need to connect to the Passport site to confirm that your email " + "address exists." +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 439 +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +msgid "You cannot change your friendly name because your Passport email " + "address is not verified." +msgstr "" + +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) #: rc.cpp:416 -#, no-c-format -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 "" +msgid "Request verification email" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 447 +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) #: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "" +msgid "https://accountservices.passport.net/" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 453 +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 +msgid "Go to accountservices.passport.net" +msgstr "" + +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) #: rc.cpp:425 -#, no-c-format -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 "" +msgid "You need a Passport account to connect to the Live Messenger " + "network. You can register your current email address at register." + "passport.com or use a Live Mail account to connect." +msgstr "" -#. i18n: file ./settings/emailwidget.ui line 46 +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "To connect to the Live Messenger service, you will need to register " + "an email address as Passport account." +msgstr "" + +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) #: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "" +msgid "Register new account" +msgstr "" -#. i18n: file ./settings/emailwidget.ui line 52 +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) #: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" +msgid "http://register.passport.com/" +msgstr "" -#. i18n: file ./settings/emailwidget.ui line 63 +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) #: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "" +msgid "Go to register.passport.com" +msgstr "" -#. i18n: file ./settings/emailwidget.ui line 71 +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "" +msgid "&Status Options" +msgstr "" -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +msgid "If enabled, your status will be changed automatically to \"Idle" + "\" when you are 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/emailwidget.ui line 138 +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) #: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "" +msgid "Change status to \"&Idle\" when inactive" +msgstr "" -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "" +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +msgid "Controls the number of minutes before KMess changes the status to " + "\"Idle\"." +msgstr "" -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "" - -#. i18n: file ./settings/emailwidget.ui line 152 +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) #: rc.cpp:455 -#, no-c-format -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 "" +msgid "Become idle after" +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format -msgid "&Emoticon Themes" -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) #: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "" +msgid "minutes" +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) #: rc.cpp:467 -#, no-c-format -msgid "&Custom Emoticons" -msgstr "" +msgid "This happens because KMess was built without support for the " + "\"XScreenSaver\" Xorg extension, which is used to detect user " + "activity. Refer to your package manager for more details." +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) #: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "" +msgid "Cannot enable auto idle: KMess was built without inactivity " + "detection." +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) #: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "" +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +msgid "Click here to create a new KMess account for an email already " + "associated to a Live account" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) #: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" +msgid "&Add Account..." +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format -msgid "Re&name" -msgstr "" +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "" +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) #: rc.cpp:497 +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:500 +msgid "&Remove" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "

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

\n" + "

The chat logs 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!

\n" + " " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +msgid "If enabled, KMess additionaly saves your chat logs as HTML or plain " + "text files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +msgid "Additionally save chat logs to file" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +msgid "Save chat logs as:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "\n" + "

The file format you choose here is important.

\n" + "

Chat logs saved in the HTML format can be easily read in any web " + "browser, but if they are opened on another computer, display " + "pictures and emoticons cannot not be displayed.

\n" + "

Chat logs saved as plain text, on the other side, can be " + "perfectly read everywhere, but they will not contain any text " + "formatting, display pictures, or emoticons.

\n" + "" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "These options allow you to choose how KMess will organize your chat " + "logs within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" + " " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +msgid "Separate logged chats by:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "This option tells KMess to divide your chat logs 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 chat logs " + "directory as:\n" + "/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "This option tells KMess to divide your chat logs 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 chat logs " + "directory as:\n" + "/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "This option tells KMess to divide your chat logs by year, then " + "by month,\n" + " 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 chat logs " + "directory as:\n" + "/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "This option tells KMess to save all your chat logs in the same " + "folder, without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +msgid "Save chat logs in the following directory:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +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:636 +msgid "&Show emoticons" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +msgid "Show &winks" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +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:648 +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:654 +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:657 +msgid "S&how timestamp" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +msgid "Show &date" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +msgid "Show s&econds" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +msgid "This option allows you to override the font style and color of your " + "contacts' messages with the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +msgid "&Force messages from your contacts to use this font:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +msgid "Chat Window Formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "

When contacts would like to have your attention they can send " + "you 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" + "

Even if 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:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +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:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +msgid "Display Options" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +msgid "If enabled, a notification is shown when an email message is " + "received in your inbox. The number of unread email messages is shown " + "above the contact list. This option is only available for Live Mail " + "accounts." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +msgid "If enabled, your contacts can see which song you are listening " + "to. This information is retrieved from the currently active media " + "player." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "If enabled, the KMess logo will be displayed in the background of " + "the contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +msgid "&Emoticon Themes" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +msgid "Available emoticon themes:" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +msgid "&Custom Emoticons" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +msgid "Available custom emoticons:" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +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:781 +msgid "Add Ne&w..." +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +msgid "Re&name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +msgid "Remo&ve" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +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:811 +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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 +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:827 rc.cpp:862 #, no-c-format -msgid "Remo&ve" -msgstr "" +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/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 #, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "" +msgid "Use '%u' to insert the URL in the command line." +msgstr "" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +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:843 +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:846 +msgid "Use the &KDE default email client" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 #, no-c-format -msgid "says:" -msgstr "" +msgid "Use '%u' to insert the email address in the command line." +msgstr "" -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +msgid "&Save all received files in one directory:" +msgstr "" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "" -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "" -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "" +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "" +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "Click on one of these icons to send your feedback to the " + "developers of this application. You can disable the icons with the " + "\"Show Feedback Icons\" checkbox in the Help menu.\n" + " " +msgstr "" -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "" +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "" +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "" +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "Click here to tell the developers about new features you would like " + "to have in this application" +msgstr "" -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "" -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +msgid "Your comment is about:" +msgstr "" -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "" +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "Specifying an email address will allow the developers to ask " + "you for more information on your report, or to tell you when your " + "feature will be implemented.
\n" + " Your email address will not be used for anything " + "else but this report." +msgstr "" diff --git a/po/kmess.pot.ignore b/po/kmess.pot.ignore new file mode 100644 index 0000000..a95b039 --- /dev/null +++ b/po/kmess.pot.ignore @@ -0,0 +1,99 @@ +# Ignore file for xgettext +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2008-04-06 22:13+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "..." +msgstr "" + +msgid "Alt+A" +msgstr "" + +msgid "Alt+B" +msgstr "" + +msgid "Alt+C" +msgstr "" + +msgid "Alt+D" +msgstr "" + +msgid "Alt+E" +msgstr "" + +msgid "Alt+F" +msgstr "" + +msgid "Alt+G" +msgstr "" + +msgid "Alt+H" +msgstr "" + +msgid "Alt+I" +msgstr "" + +msgid "Alt+J" +msgstr "" + +msgid "Alt+K" +msgstr "" + +msgid "Alt+L" +msgstr "" + +msgid "Alt+M" +msgstr "" + +msgid "Alt+N" +msgstr "" + +msgid "Alt+O" +msgstr "" + +msgid "Alt+P" +msgstr "" + +msgid "Alt+Q" +msgstr "" + +msgid "Alt+R" +msgstr "" + +msgid "Alt+S" +msgstr "" + +msgid "Alt+T" +msgstr "" + +msgid "Alt+U" +msgstr "" + +msgid "Alt+V" +msgstr "" + +msgid "Alt+W" +msgstr "" + +msgid "Alt+X" +msgstr "" + +msgid "Alt+Y" +msgstr "" + +msgid "Alt+Z" +msgstr "" + diff --git a/po/ko.po b/po/ko.po index fc103ae..cc71a05 100644 --- a/po/ko.po +++ b/po/ko.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: KMess 1.3\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" "PO-Revision-Date: 2003-10-18 16:22+0900\n" "Last-Translator: DongCheon Park \n" "Language-Team: Korean \n" @@ -15,3021 +15,6627 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "DongCheon Park (동쪽하늘)" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "dcpark@kaist.ac.kr" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "컴퓨터 자리를 비운 상태입니다." -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "대화명" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "로그인하는 중..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "컴퓨터 자리를 비운 상태입니다." -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." msgstr "" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 #, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "대화 상대 삭제(&R)" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "%1님이 대화를 떠났습니다." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1님이 대화를 떠났습니다." + +#: chat/chat.cpp:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 등등." + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr " (이 메시지는 자동응답으로 보내진 것입니다.)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1291 +#, kde-format +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." +msgstr "" + +#: chat/chat.cpp:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" + +#: chat/chat.cpp:1312 +#, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" + +#: chat/chat.cpp:1333 +#, kde-format +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:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "메시지 \"%1\"의 전달을 실패했습니다." + +#: chat/chat.cpp:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "보내는 파일 %1" + +#: chat/chatmessagestyle.cpp:382 +#, fuzzy, kde-format msgid "%1 says:" msgstr "님의 말: " -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "로그인" + +#: chat/chatview.cpp:300 +#, kde-format 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:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, kde-format msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 #, fuzzy msgid "Add this &Emoticon..." msgstr "이모티콘 표시(&E)" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "이모티콘 표시(&E)" + +#: chat/chatview.cpp:834 #, fuzzy msgid "Send &Email" msgstr "편지 보내기(&S)" -#: chat/chatview.cpp:926 +#: chat/chatview.cpp:838 #, fuzzy -msgid "Copy E&mail" -msgstr "이메일" +msgid "Add &Contact" +msgstr "대화 상대 추가(&A)" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "이메일 주소:" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:948 +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "대화(&C)" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." msgstr "파일 보내기(&F)" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "대화" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" - -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1님이 대화에 참가했습니다." - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "%1님이 대화를 떠났습니다." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1님이 대화를 떠났습니다." - -#: chat/chatwindow.cpp:575 -#, fuzzy -msgid "%1 - Chat" -msgstr "대화" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 #, fuzzy msgid "Contacts" msgstr "대화 상대 추가(&A)" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "이모티콘 표시(&E)" -#: chat/chatwindow.cpp:799 +#: chat/chatwindow.cpp:128 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "이모티콘 표시(&E)" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (이 메시지는 자동응답으로 보내진 것입니다.)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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:1502 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:1791 +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "" + +#: chat/chatwindow.cpp:451 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "메시지 \"%1\"의 전달을 실패했습니다." +msgid "&Invite..." +msgstr "초대하기(&I)" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1님이 메시지를 입력하고 있습니다." - -#: chat/chatwindow.cpp:1985 +#: chat/chatwindow.cpp:452 #, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1님이 메시지를 입력하고 있습니다." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +msgid "Send a &File..." msgstr "파일 보내기(&F)" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "화상회의 시작(&M)" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 #, fuzzy msgid "Send a &Nudge!" msgstr "파일 보내기(&F)" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." msgstr "" -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" msgstr "" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "초대하기(&I)" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "대화(&C)" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "글꼴 바꾸기(&F)" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "글자색 바꾸기(&C)" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "이모티콘 삽입" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "이모티콘 표시(&E)" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "대화 상대 도구함(&C)" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "메시지에 이모티콘 표시" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "대화 상대 도구함" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:484 +#, fuzzy +msgid "Meeting" +msgstr "환경 설정" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "파일 보내기(&F)" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "대화 상대 찾기(&E)" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "대화 상대 추가(&A)" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "대화 상대 찾기(&E)" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "이모티콘 표시(&E)" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "대화 상대 찾기(&E)" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "이모티콘 표시(&E)" + +#: chat/chatwindow.cpp:533 +#, fuzzy +msgid "&Font" +msgstr "로그인(&C)" + +#: chat/chatwindow.cpp:534 +#, fuzzy +msgid "Font &Color" +msgstr "글자색 바꾸기(&C)" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "대화(&C)" + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "대화" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "대화" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "화상회의 시작(&M)" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" msgstr "편지 보내기(&S)" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/contactframe.cpp:299 kmessview.cpp:601 #, fuzzy msgid "&View Profile" msgstr "프로필 보기(&S)" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "속성(&P)" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "대화 상대 추가(&A)" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 #, fuzzy msgid "A&llow Contact" msgstr "대화 상대 허용(&A)" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 #, fuzzy msgid "&Delete Contact" msgstr "대화 상대 삭제(&R)" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "차단(&B)" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "차단 해제(&U)" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 #, fuzzy msgid "&Friendly Name" msgstr "대화명:" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 #, fuzzy msgid "&Email Address" msgstr "이메일 주소:" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +#, fuzzy +msgid "Song &Name" +msgstr "대화명" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +#, fuzzy +msgid "&Information" +msgstr "이메일 정보 표시" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "그림파일:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" msgstr "" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "이모티콘 표시(&E)" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "(차단됨)" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "자리 비움" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "곧 돌아오겠음" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "다른 용무 중" +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "대화 상대 추가" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "오프라인" +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "계정" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "자리 비움 -시간초과" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "식사 중" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +#, fuzzy +msgid "Remove" +msgstr "삭제된 대화 상대" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +#, fuzzy +msgid "Web Messenger" +msgstr "웹 디자인" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "웹 디자인" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, fuzzy, kde-format +msgid "Windows Live Messenger %1" +msgstr "웹 디자인" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "웹 디자인" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "온라인" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "다른 용무 중" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "자리 비움" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "자리 비움 -자동응답" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "곧 돌아오겠음" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "통화 중" -#: chat/contactframe.cpp:558 -msgid "The contact is %1" -msgstr "" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "식사 중" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "오프라인으로 표시" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "오프라인" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "내 상태(&M)" + +#: contact/msnstatus.cpp:218 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "로그아웃(&D)" + +#: dialogs/addcontactdialog.cpp:49 +#, fuzzy +msgid "Add a Contact" msgstr "대화 상대 추가" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "추가할 대화 상대의 이메일 주소 입력:" - -#: dialogs/addcontactdialog.cpp:88 -#, fuzzy -msgid "The e-mail address given was invalid!" -msgstr "사용자명을 잘못 입력하였습니다" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 #, fuzzy msgid "Add New Emoticon" msgstr "이모티콘 표시(&E)" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "이모티콘 표시(&E)" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "자리 비움 메시지 지정" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "" #: dialogs/awaymessagedialog.cpp:37 -msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" -msgstr "" -"대화를 요청하는 사람에게\n" -"자동으로 보낼 메시지 입력:" - -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "이 대화 상대의 대화명 대신에 별칭 사용" - -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "이 대화 상대가 로그인 또는 로그아웃할 때 팝업 풍선 표시" - -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "그림파일:" - -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "소리파일:" - -#: dialogs/contactpropertiesdialog.cpp:229 #, fuzzy +msgid "Automatic Away Message" +msgstr "자리 비움 메시지 지정" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "실패. 파일을 열 수 없습니다" + +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "로그인하는 중..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "모든 대화를 기록" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "님이 당신을 대화 상대 목록에 추가하였습니다. 어떻게 할까요?:" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "님이 당신을 대화 상대 목록에 추가하였습니다. 어떻게 할까요?:" + +#: dialogs/contactpropertiesdialog.cpp:282 +#, fuzzy, kde-format msgid "Contact Properties for %1" msgstr "대화 상대의 속성: " -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "로그인되어 있음" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +#, fuzzy +msgid "No messages yet" +msgstr "메시지에 이모티콘 표시" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "내 메시지의 글꼴:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "내 메시지의 글꼴:" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "이메일 주소:" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "현재 대화명: " +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "메일 클라이언트" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "이 계정을 정말로 삭제하시겠습니까?" + +#: dialogs/contactpropertiesdialog.cpp:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "대화 상대 추가(&A)" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "대화 상대 추가(&A)" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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 +#, kde-format +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)" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" msgstr "" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "대화(&C)" + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "" - -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "로그인되어 있음" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 #, fuzzy msgid "File Transfers" msgstr "파일 전송을 완료했습니다." -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "(차단됨)" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "대화 상대 삭제(&R)" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "그림파일:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "이 계정을 정말로 삭제하시겠습니까?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "그림파일:" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 #, fuzzy msgid "Smile" msgstr "이메일" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 #, fuzzy msgid "Sad" msgstr "그리고" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 #, fuzzy msgid "Disappointed" msgstr "로그인되어 있지 않음" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 #, fuzzy msgid "Party" msgstr "프록시" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 #, fuzzy msgid "Secret telling" msgstr "환경 설정" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 #, fuzzy msgid "Be right back" msgstr "곧 돌아오겠음" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 #, fuzzy msgid "Sun" msgstr "소리파일:" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 #, fuzzy msgid "Clapping" msgstr "대화" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 #, fuzzy msgid "Snail" msgstr "편지 보내기(&S)" -#: emoticontheme.cpp:783 -msgid "Black sheep" +#: emoticontheme.cpp:880 +msgid "Sheep" msgstr "" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 #, fuzzy msgid "Star" msgstr "동쪽하늘" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "이메일" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 #, fuzzy msgid "Clock" msgstr "(차단됨)" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 #, fuzzy msgid "Camera" msgstr "대화명" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 #, fuzzy msgid "Money" msgstr "월 별" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:911 #, fuzzy -msgid "KMess Icon" +msgid "KMess icon" msgstr "KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" msgstr "" -#: kmess.cpp:288 kmess.cpp:292 +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "서버로부터 연결이 끊어졌습니다." + +#: initialview.cpp:380 #, fuzzy -msgid "Add a group" +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "서버로부터 연결이 끊어졌습니다." + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "로그인(&C)" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "이메일 주소:" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "이메일 주소:" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "이메일 정보 표시" + +#: kmess.cpp:248 +#, fuzzy +msgid "New Group" +msgstr "그룹 추가(&G)" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "그룹 추가(&A)" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "새 그룹의 이름 입력:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "자리 비움 -자동응답" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "" - -#: kmess.cpp:715 -#, fuzzy +#: kmess.cpp:576 +#, fuzzy, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "이 그룹을 정말로 삭제하시겠습니까?" -#: kmess.cpp:718 +#: kmess.cpp:578 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "대화 상대 삭제(&R)" -#: kmess.cpp:720 +#: kmess.cpp:580 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "삭제된 대화 상대" -#: kmess.cpp:760 -#, fuzzy +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" msgstr "이 그룹을 정말로 삭제하시겠습니까?" -#: kmess.cpp:763 +#: kmess.cpp:636 #, fuzzy -msgid "Remove group" -msgstr "그룹 삭제(&M)" +msgctxt "dialog button" +msgid "Remove" +msgstr "삭제된 대화 상대" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "이 그룹은 기본 그룹이므로 수정할 수 없습니다." -#: kmess.cpp:805 kmess.cpp:809 +#: kmess.cpp:676 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "그룹 이름 바꾸기(&N)" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "로그인되어 있음" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "새 그룹의 이름 입력:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "인증을 실패했습니다" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "연결상태 좋음" + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "로그인되어 있지 않음" -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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:1448 +#, kde-format +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:1673 +#: kmess.cpp:1460 +#, kde-format +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:1466 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "이메일 알림" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "계정 추가(&A)" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "대화 상대 추가(&C)" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "그룹 추가(&G)" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "대화 상대 찾기(&E)" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "관심분야로 검색(&I)" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "계정 설정(&S)" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "동작(&A)" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "로그인(&N)" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "로그아웃(&D)" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "내 프로필 보기(&P)" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "내 상태(&M)" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "로그인(&C)" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "로그아웃(&D)" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "내 프로필 보기(&P)" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "허용된 대화 상대(&A)" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "오프라인 대화 상대(&A)" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "삭제된 대화 상대(&R)" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "그림파일:" - -#: kmessinterface.cpp:281 -msgid "Show &Network Window" +#: kmessinterface.cpp:170 +msgid "Show &History Box" msgstr "" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "대화 상대 도구함(&C)" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "이모티콘 표시(&E)" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" +msgstr "그림파일:" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "대화 상대 정렬(&S)" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "대화 상대 추가(&C)" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "그룹 추가(&G)" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "대화 상대 찾기(&E)" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "계정 추가(&A)" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "계정 추가(&A)" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "이메일" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "그룹" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "온라인/오프라인" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:199 +msgid "Mixed" msgstr "" -#: kmessview.cpp:113 -msgid "Now listening to %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." msgstr "" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" msgstr "" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, fuzzy, kde-format +msgid "[%1] %2 goes online" +msgstr "%1님이 로그아웃했습니다." + +#: kmessview.cpp:360 +#, fuzzy, kde-format +msgid "[%1] %2 goes offline" +msgstr "%1님이 로그아웃했습니다." + +#: kmessview.cpp:599 #, fuzzy msgid "Cha&t" msgstr "대화" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "속성(&P)" - -#: kmessview.cpp:623 +#: kmessview.cpp:610 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "그룹 삭제(&M)" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "그룹으로 이동(&M)" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 #, fuzzy msgid "&Copy to Group" msgstr "그룹으로 이동(&M)" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "그룹으로 이동(&M)" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "그룹을 아래로 이동(&D)" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "그룹을 위로 이동(&U)" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "그룹 삭제(&M)" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "그룹 이름 바꾸기(&N)" -#: kmessview.cpp:1723 +#: kmessview.cpp:1136 #, fuzzy -msgid "You have 1 new e-mail in your inbox." -msgstr "개의 새로운 편지가 있습니다." +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: kmessview.cpp:1727 +#: kmessview.cpp:1145 #, fuzzy -msgid "You have %1 new emails in your inbox." -msgstr "개의 새로운 편지가 있습니다." +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "이메일 주소:" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(자리 비움)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "메일 클라이언트" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(곧 돌아오겠음)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(다른 용무 중)" +#: kmessview.cpp:1168 +msgid "No" +msgstr "" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(오프라인으로 표시)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "(차단됨)" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(자리 비움 -시간초과)" +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "내 메시지의 글꼴:" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(식사 중)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "내 메시지의 글꼴:" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(통화 중)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "이 이메일 주소로 자동 로그인" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "대화 상대 추가(&A)" +msgstr[1] "대화 상대 추가(&A)" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "대화 상대 추가(&A)" +msgstr[1] "대화 상대 추가(&A)" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "이 계정으로 hotmail에 로그인할 수 없습니다." + +#: kmessview.cpp:1834 +msgid "No Chat History found." +msgstr "" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy, kde-format +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: main.cpp:42 settings/accountpage.cpp:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +#, fuzzy +msgid "Current developer" +msgstr "그놈미팅 개발자" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "독일어 번역, 테스트, 문서화, 웹마스터, 프로젝트 관리 및 그 외" -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "웹 디자인" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "기본 이모티콘과 노랑/파랑/보라 이모티콘 세트 및 이탈리아어 번역" -#: main.cpp:81 +#: main.cpp:74 msgid "Cartoon emoticons" msgstr "카툰 이모티콘" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "기본 효과음" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "아랍어 번역, 파일 저장의 국제화 문제 고침" -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 #, fuzzy msgid "More Arabic translation" msgstr "터키어 추가 번역" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "브라질어 포르투갈어 번역" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "브라질어 포르투갈어 번역" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 #, fuzzy msgid "Catalan translation" msgstr "카탈로니아어 번역" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "한국어 번역" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "중국어 간체 번역, 파일 전송 버그 고침" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 #, fuzzy msgid "More Simplified Chinese translation" msgstr "중국어 간체 번역, 파일 전송 버그 고침" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 #, fuzzy msgid "Traditional Chinese translation" msgstr "카탈로니아어 번역" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "카탈로니아어 번역" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 #, fuzzy msgid "Danish translation" msgstr "덴마크어 번역" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 #, fuzzy msgid "More Danish translation" msgstr "덴마크어 번역" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "네덜란드어 번역" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 #, fuzzy msgid "More Dutch translation" msgstr "네덜란드어 번역" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "터키어 추가 번역" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "프랑스어 번역" + +#: main.cpp:111 #, fuzzy msgid "Estonian translation" msgstr "에스토니아어 번역" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 #, fuzzy msgid "Finnish translation" msgstr "덴마크어 번역" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 #, fuzzy msgid "More Finnish translation" msgstr "덴마크어 번역" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "프랑스어 번역" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" msgstr "프랑스어 추가 번역, MSN6 이모티콘 정의" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 #, fuzzy msgid "More French translation" msgstr "프랑스어 번역" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 #, fuzzy msgid "Hungarian translation" msgstr "에스토니아어 번역" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "에스토니아어 번역" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 #, fuzzy msgid "More Italian translation" msgstr "한국어 번역" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "한국어 번역" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 #, fuzzy msgid "Norsk Bokmål translation" msgstr "북 노르웨이어 번역" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "한국어 번역" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "한국어 번역" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 #, fuzzy msgid "Slovenian translation" msgstr "한국어 번역" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 msgid "Spanish translation" msgstr "스페인어 번역" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 #, fuzzy msgid "More Spanish translation" msgstr "스페인어 추가 번역" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 #, fuzzy msgid "Swedish translation" msgstr "스페인어 번역" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "스페인어 번역" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 #, fuzzy msgid "Thai translation" msgstr "타이어 번역" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 msgid "Turkish translation" msgstr "터키어 번역" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "터키어 추가 번역" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "온라인" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "파일 전송을 완료했습니다." + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Xinerama 고침" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "원본 파일 전송 코드" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "여러가지 국제화 문제 고침" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "여러가지 국제화 문제 고침" -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "그놈미팅 개발자" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "많은 아이디어 제공" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "착상 및 코드의 구성" -#: main.cpp:139 +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 #, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "팝업 풍선 코드" -#: main.cpp:140 +#: main.cpp:174 msgid "Idle timer code" msgstr "자리 비움 타이머 코드" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:179 #, fuzzy msgid "Your name here?" msgstr "대화명" -#: main.cpp:144 -msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" -"If you feel your name is missing here, please contact us too!" +#: main.cpp:182 +#, fuzzy +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "대화명" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "이메일 주소:" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "대화 상대 찾기(&E)" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "이 이메일 주소로 자동 로그인" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" msgstr "" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "허용된 대화 상대" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "삭제된 대화 상대" + +#: network/applications/application.cpp:294 #, fuzzy msgid "The contact cancelled the session." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 #, fuzzy msgid "The contact rejected the invitation." msgstr "대화 상대가 초대를 거절했습니다." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 #, fuzzy msgid "You have cancelled the session." msgstr "초대를 취소하였습니다." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "초대를 거절하였습니다." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, fuzzy, kde-format msgid "Do you want to
accept or cancel?" msgstr "수락하거나 취소할 수 있습니다." -#: network/applications/application.cpp:533 -#, fuzzy +#: network/applications/application.cpp:581 +#, fuzzy, kde-format msgid "Click to cancel." msgstr "클릭하여 취소할 수 있습니다." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, 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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" msgstr "실패. 파일을 열 수 없습니다" -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -#, fuzzy +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "실패. 파일을 열 수 없습니다" + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "실패. 파일을 열 수 없습니다" + +#: network/applications/filetransfer.cpp:319 +msgid "Transfer accepted." +msgstr "전송을 수락했습니다." + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, fuzzy, kde-format msgid "Connecting to %1, port %2" msgstr "연결 시간 초과" -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -#, fuzzy -msgid "The transfer was cancelled" -msgstr "전송을 수락했습니다." +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/filetransfer.cpp:370 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "초대를 취소하였습니다." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "초대를 취소하였습니다." + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "연결 시간 초과" -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." msgstr "성공적으로 전송된 파일: %1" -#: network/applications/filetransfer.cpp:600 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "성공적으로 전송된 파일: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." msgstr "실패. 파일이 존재하지 않습니다" -#: network/applications/filetransfer.cpp:604 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." msgstr "실패. 연결할 수 없습니다" -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." msgstr "보내는 파일 %1" -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 -msgid "Transfer accepted." -msgstr "전송을 수락했습니다." +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "대화 상대가 초대를 취소했습니다." -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "실패. 파일을 열 수 없습니다" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "초대를 취소하였습니다." -#: network/applications/filetransferp2p.cpp:531 -#, fuzzy -msgid "The contact cancelled the transfer." -msgstr "대화 상대가 초대를 취소했습니다." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "실패. 파일이 존재하지 않습니다" - -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "실패. 연결할 수 없습니다" - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "보내는 파일 %1" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "화상회의에 초대를 받았습니다. (GnomeMeeting 사용)" -#: network/applications/gnomemeeting.cpp:114 -#, fuzzy +#: network/applications/gnomemeeting.cpp:118 +#, fuzzy, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "GnomeMeeting을 시작합니다. %1에 연결하는 중..." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "대화 상대를 화상회의에 초대합니다." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "" - -#: network/applications/mimeapplication.cpp:119 +#: network/applications/mimeapplication.cpp:154 #, fuzzy -msgid "The invitation was aborted. An internal error occured." -msgstr "대화 상대가 초대를 거절했습니다." - -#: network/applications/mimeapplication.cpp:125 -#, fuzzy -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "실패. 소켓을 생성할 수 없습니다" - -#: network/applications/mimeapplication.cpp:130 -#, fuzzy -msgid "The invitation was aborted. Timeout while waiting for file data." +msgid "The invitation was rejected. It is not supported by the other client." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "" +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "대화 상대가 초대를 거절했습니다." -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "실패. 소켓을 생성할 수 없습니다" + +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "대화 상대가 초대를 취소했습니다." + +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "실패. 소켓을 생성할 수 없습니다" + +#: network/applications/mimeapplication.cpp:186 #, fuzzy msgid "The invitation was aborted." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "이 대화 상대의 데스크탑을 공유하도록 초대받았습니다." -#: network/applications/msnremotedesktop.cpp:155 -#, fuzzy +#: network/applications/msnremotedesktop.cpp:159 +#, fuzzy, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "KRDC를 시작합니다. %1에 연결하는 중... " -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." msgstr "" +"상대방이 %1 응용프로그램으로 당신을 초대합니다. 하지만 이 기능은 아직 구현되" +"지 않았습니다." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." -msgstr "" - -#: network/applications/p2papplication.cpp:1501 -#, fuzzy -msgid "The transfer failed. Data preparation failed." -msgstr "대화 상대가 초대를 취소했습니다." - -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "대화 상대가 초대를 거절했습니다." - -#: network/applications/p2papplication.cpp:1624 -#, fuzzy -msgid "The transfer failed." -msgstr "%1 파일의 전송 " - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -#, fuzzy -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "실패. 파일이 존재하지 않습니다" -#: network/applications/p2papplication.cpp:2038 +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "대화 상대가 초대를 취소했습니다." + +#: network/applications/p2papplication.cpp:1192 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/p2papplication.cpp:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 #, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "실패. 파일이 존재하지 않습니다" -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "대화 상대가 초대를 거절했습니다." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3274 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "실패. 소켓을 생성할 수 없습니다" - -#: network/applications/p2papplication.cpp:3293 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "대화 상대가 초대를 거절했습니다." - -#: network/applications/p2papplication.cpp:3670 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "실패. 소켓을 생성할 수 없습니다" - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "실패. 소켓을 생성할 수 없습니다" -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "실패. 소켓을 생성할 수 없습니다" -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "" +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "실패. 소켓을 생성할 수 없습니다" -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "대화 상대가 초대를 거절했습니다." + +#: network/applications/p2papplicationbase.cpp:627 +#, fuzzy +msgid "The transfer failed." +msgstr "%1 파일의 전송 " + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "실패. 소켓을 생성할 수 없습니다" + +#: network/applications/p2papplicationbase.cpp:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "대화 상대가 초대를 거절했습니다." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not open data source." +msgstr "실패. 소켓을 생성할 수 없습니다" + +#: network/applications/voiceconversation.cpp:71 #, fuzzy msgid "You are invited to start a voice conversation." msgstr "이 대화 상대의 데스크탑을 공유하도록 초대받았습니다." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 #, fuzzy msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "화상회의에 초대를 받았습니다. (GnomeMeeting 사용)" -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 #, fuzzy msgid "You have cancelled the voice conversation." msgstr "초대를 취소하였습니다." -#: network/applications/voiceconversation.cpp:211 +#: network/applications/voiceconversation.cpp:205 #, fuzzy -msgid "The invitation was cancelled. The audio device couldn't be opened." +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/voiceconversation.cpp:222 -#, fuzzy +#: network/applications/voiceconversation.cpp:218 +#, fuzzy, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "GnomeMeeting을 시작합니다. %1에 연결하는 중..." -#: network/applications/voiceconversation.cpp:228 -#, fuzzy +#: network/applications/voiceconversation.cpp:224 +#, fuzzy, kde-format msgid "Start voice conversation. Listening on %1." msgstr "GnomeMeeting을 시작합니다. %1에 연결하는 중..." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 #, fuzzy msgid "Inviting the contact to a voice conversation." msgstr "대화 상대를 화상회의에 초대합니다." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -#, fuzzy +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, fuzzy, kde-format msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" "상대방이 %1 응용프로그램으로 당신을 초대합니다. 하지만 이 기능은 아직 구현되" "지 않았습니다." -#: network/extra/msnftpconnection.cpp:122 +#: network/applications/webcamtransferp2p.cpp:113 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "%1 파일의 전송 " +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "대화 상대가 초대를 취소했습니다." -#: network/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "이 대화 상대의 데스크탑을 공유하도록 초대받았습니다." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "초대를 취소하였습니다." + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "대화 상대가 초대를 취소했습니다." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:410 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "보내는 파일 %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "실패. 파일을 열 수 없습니다" -#: network/extra/msnftpconnection.cpp:411 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy -msgid "Couldn't open a local port." +msgid "Could not open a local port." msgstr "실패. 파일을 열 수 없습니다" -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:481 -#, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. A connection could not be made." msgstr "실패. 연결할 수 없습니다" -#: network/extra/msnftpconnection.cpp:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:586 -#, fuzzy +#: network/extra/msnftpconnection.cpp:574 +#, fuzzy, kde-format msgid "Receiving file %1" msgstr "받는 파일 " -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" msgstr "" -#: network/msnconnection.cpp:733 +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "" + +#: network/msnconnection.cpp:384 #, fuzzy -msgid "1 ping lost" -msgstr "개의 핑이 손실됨" +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "추가할 대화 상대의 이메일 주소 입력:" -#: network/msnconnection.cpp:737 +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:396 #, fuzzy -msgid "%1 pings lost" -msgstr "개의 핑이 손실됨" - -#: network/msnconnection.cpp:752 -#, fuzzy -msgid "The connection to the server was lost." -msgstr "서버로부터 연결이 끊어졌습니다." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "허용된 대화 상대" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "삭제된 대화 상대" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:740 -#, fuzzy -msgid "Show MSN Messenger Service status?" -msgstr ".NET 서비스 상태를 보시겠습니까?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "서버 에러" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy -msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "" -"다른 MSN 메신저 클라이언트나 다른 곳에서 \n" -"로그인했으므로 접속이 끊어졌습니다." - -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "동기화 완료" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "인증 처리중" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "사용자 확인 받음" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "알림 서버로 보냄" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "" - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "연결하는 중..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -#, fuzzy -msgid "There was an internal error in KMess: %1" -msgstr "내부적인 서버 에러가 발생했습니다" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" - -#: network/msnnotificationconnection.cpp:2252 -#, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "사용자명을 잘못 입력하였습니다" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:400 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "대화 상대 목록이 꽉 찼습니다" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 #, fuzzy msgid "This contact is already on your list" msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 #, fuzzy msgid "This contact is not on your list" msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2279 +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" + +#: network/msnconnection.cpp:436 #, 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:2282 +#: network/msnconnection.cpp:440 #, fuzzy -msgid "This group can't be changed" +msgid "This group cannot be changed" msgstr "이 그룹은 기본 그룹이므로 수정할 수 없습니다." -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "대화 상대 목록이 꽉 찼습니다" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" msgstr "" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, fuzzy, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "내부적인 서버 에러가 발생했습니다" + +#: network/msnconnection.cpp:462 +#, fuzzy +msgid "Invalid Group" +msgstr "그룹 이름 바꾸기(&N)" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "알림 서버로 보냄" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" +#: network/msnconnection.cpp:484 +msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" msgstr "" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" +#: network/msnconnection.cpp:497 +msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "대화명" + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "%1 파일의 전송 " + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "" + +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" +msgstr "초대를 취소하였습니다." + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 #, fuzzy msgid "Bad friend name" msgstr "대화명:" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" +msgstr "" + +#: network/msnconnection.cpp:547 +#, fuzzy +msgid "Authentication ticket was incorrect" +msgstr "인증을 실패했습니다" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" msgstr "'오프라인으로 표시' 상태에서는 다른 사람과 대화할 수 없습니다." -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." +#: network/msnconnection.cpp:558 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" msgstr "" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" +#: network/msnconnection.cpp:561 +msgid "Your Passport account needs to be verified first" msgstr "" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" msgstr "내부적인 서버 에러가 발생했습니다" -#: network/msnnotificationconnection.cpp:2411 +#: network/msnconnection.cpp:595 #, fuzzy -msgid "The server is too busy" -msgstr "서버가 폭주 상태입니다" +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "내부적인 서버 에러가 발생했습니다" -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "서버가 사용 불가 상태입니다" - -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "대화 상대 알림 서버가 다운되었습니다" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 #, fuzzy msgid "The server is going down" msgstr "서버가 곧 다운됩니다" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" msgstr "서버가 곧 다운됩니다" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 #, fuzzy msgid "The server is not available" msgstr "서버가 사용 불가 상태입니다" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "인증을 실패했습니다" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "이 대화 상대는 오프라인이거나 오프라인으로 표시 상태입니다." - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1648 +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "메시지 \"%1\"의 전달을 실패했습니다." +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "서버 에러" -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 +#: network/msnnotificationconnection.cpp:1337 #, fuzzy -msgid "Connection timeout" +msgid "Authenticating..." +msgstr "인증 처리중" + +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "인증을 실패했습니다" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "연결하는 중..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "분" +msgstr[1] "분" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "" + +#: network/msnnotificationconnection.cpp:2108 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "인증을 실패했습니다" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "내부적인 서버 에러가 발생했습니다" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" +msgid "" +"

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

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:2932 +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:2935 +#, kde-format +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:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2956 +#, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "서버로부터 연결이 끊어졌습니다." + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "내부적인 서버 에러가 발생했습니다" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +#, fuzzy +msgid "Connection time limit exceeded" msgstr "연결 시간 초과" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 +#: network/msnsockettcp.cpp:380 #, fuzzy -msgid "%1 has sent you a nudge!" +msgid "1 ping lost" +msgstr "개의 핑이 손실됨" + +#: network/msnsockettcp.cpp:384 +#, fuzzy, kde-format +msgid "%1 pings lost" +msgstr "개의 핑이 손실됨" + +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "서버로부터 연결이 끊어졌습니다." + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +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 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "서버가 사용 불가 상태입니다" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "서버가 사용 불가 상태입니다" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" msgstr "%1님이 로그인했습니다." -#: notification/notificationchat.cpp:196 -#, fuzzy -msgid "%1 has sent you a wink!" +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" msgstr "%1님이 로그인했습니다." -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1님이 로그인했습니다." + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" msgstr "" -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" msgstr "%1님이 로그인했습니다." -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" +#: notification/chatnotification.cpp:199 +#, fuzzy, kde-format +msgid "%1 has sent you a handwritten message!" msgstr "%1님이 로그인했습니다." -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" +#: notification/chatnotification.cpp:203 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1님이 로그인했습니다." + +#: notification/chatnotification.cpp:207 +#, fuzzy, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1님이 로그인했습니다." + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +#, fuzzy, kde-format +msgid "%1 is sending you a file!" +msgstr "%1님이 로그인했습니다." + +#: notification/chatnotification.cpp:215 +#, fuzzy, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1님이 로그인했습니다." + +#: notification/chatnotification.cpp:222 +#, fuzzy, kde-format +msgid "%1 has canceled the webcam session!" msgstr "초대를 취소하였습니다." -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" +#: notification/chatnotification.cpp:223 +#, fuzzy, kde-format +msgid "%1 has canceled the file transfer!" msgstr "대화 상대가 초대를 취소했습니다." -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" msgstr "" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "" +#: notification/chatnotification.cpp:231 +#, fuzzy, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "초대를 취소하였습니다." -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" +#: notification/chatnotification.cpp:232 +#, fuzzy, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "대화 상대가 초대를 취소했습니다." -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "" +#: notification/chatnotification.cpp:233 +#, fuzzy, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1님이 로그인했습니다." -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" +#: notification/chatnotification.cpp:240 +#, fuzzy, kde-format +msgid "%1 has ended the webcam session!" +msgstr "초대를 취소하였습니다." -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" msgstr "%1 파일의 전송 " -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" msgstr "" -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, fuzzy, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "%1 파일의 전송 " + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" msgstr "%1님이 로그인했습니다." -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" msgstr "%1님이 로그인했습니다." -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" msgstr "%1님이 로그인했습니다." -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" msgstr "%1님이 로그인했습니다." -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" msgstr "%1님이 로그인했습니다." -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" msgstr "%1님이 로그인했습니다." -#: notification/notificationcontactstatus.cpp:74 -#, fuzzy -msgid "%1 is now online" +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" msgstr "%1님이 로그인했습니다." -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr "%1님이 로그인했습니다." + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "%1님이 로그인했습니다." + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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 "" -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "보내기" +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "편지 보내기(&S)" -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "새 줄" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "대화 상대 추가" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, fuzzy, no-c-format +#: notification/systemtraywidget.cpp:78 msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "님이 당신을 대화 상대 목록에 추가하였습니다. 어떻게 할까요?:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, fuzzy, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, fuzzy, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "목록에 추가하지 않지만, 내 온라인 상태는 볼 수 있게 합니다." - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, fuzzy, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "내 상태를 보거나 나와 대화할 수 없도록 차단합니다." - -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, fuzzy, no-c-format -msgid "Enter your login information:" -msgstr "직접 로그인 정보 입력:" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "이메일 주소:" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "암호:" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" msgstr "" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "이 프로필 저장" - -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "로그인" - -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" msgstr "" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, fuzzy, no-c-format -msgid "Listening to %1" -msgstr "보내는 파일 %1" +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1님이 메시지를 입력하고 있습니다." -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, fuzzy, no-c-format -msgid "KMess Notification" -msgstr "이메일 알림" +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "" + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +#, fuzzy +msgid "Display Picture" +msgstr "그림파일:" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "프록시 사용" + +#: settings/accountpage.cpp:539 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "환경 설정" + +#: settings/accountsettingsdialog.cpp:78 +#, fuzzy +msgid "Account" +msgstr "계정" + +#: settings/accountsettingsdialog.cpp:79 +#, fuzzy +msgid "My Account" +msgstr "계정" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "대화 상대 추가(&A)" + +#: 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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "이 계정을 정말로 삭제하시겠습니까?" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "이 계정을 정말로 삭제하시겠습니까?" + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "동쪽하늘" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "" + +#: settings/chatstylepage.cpp:375 +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 "이모티콘 표시(&E)" + +#: settings/emoticonspage.cpp:233 +#, fuzzy, kde-format +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:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "계정" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, fuzzy, no-c-format -msgid "Your friendly name:" -msgstr "대화명:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "이메일 알림" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" +#: 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "이모티콘 표시(&E)" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "대화 상대 추가(&A)" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +#, fuzzy +msgid "S&end" +msgstr "보내기" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "대화(&C)" + +#. 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: file: chat/contactswidget.ui:107 +#. 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 +#, 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: 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:273 +#, fuzzy +msgid "Email address:" msgstr "이메일 주소:" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format -msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +#. 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 "새 그룹의 이름 입력:" + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" +#. 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." +msgstr "" +"대화를 요청하는 사람에게\n" +"자동으로 보낼 메시지 입력:" + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +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 "대화 상대 찾기(&E)" + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "대화 기록" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +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 the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "내 상태를 보거나 나와 대화할 수 없도록 차단합니다." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "삭제된 대화 상대" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "그룹" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "이 대화 상대의 대화명 대신에 별칭 사용" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "대화 상대가 로그아웃하면 알림" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "소리파일:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "그림파일:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "그림파일:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +#, fuzzy +msgid "&Clear Cache" +msgstr "대화(&C)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "삭제된 대화 상대" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "대화 상대 허용(&A)" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "추가할 대화 상대의 이메일 주소 입력:" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "대화 상대 추가(&A)" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, fuzzy +msgid "Items to export:" +msgstr "연결 시간 초과" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "대화 상대 추가(&A)" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "(차단됨)" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "형식:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +#, fuzzy +msgid "Standard" +msgstr "동쪽하늘" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +#, fuzzy +msgid "Send" +msgstr "보내기" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "대화(&C)" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "(차단됨)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +#, fuzzy +msgid "Password:" msgstr "암호:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "이 프로필 저장" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +#, fuzzy +msgid "R&emember password" +msgstr "암호:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "계정 추가(&A)" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "로그인(&C)" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "동작(&A)" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "계정" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +#, fuzzy +msgid "Your Account Information" +msgstr "계정 설정(&S)" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +#, fuzzy +msgid "&Friendly name:" +msgstr "대화명:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +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:363 +#, fuzzy +msgid "&Email address:" +msgstr "이메일 주소:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, fuzzy, no-c-format -msgid "Display picture:" -msgstr "그림파일:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +#, fuzzy +msgid "&Password:" +msgstr "암호:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "암호:" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +#, fuzzy msgid "C&hange..." +msgstr "초대하기(&I)" + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, fuzzy, no-c-format -msgid "Don't show a displa&y picture" -msgstr "프록시 사용" - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "시작할 때 이 계정으로 자동 로그인" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +#, fuzzy +msgid "Re&member the settings of this account" +msgstr "이 프로필 저장" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "시작할 때 이 계정으로 자동 로그인" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +#, fuzzy +msgid "Login &as" +msgstr "모든 대화를 기록" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You cannot change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "이 프로필 저장" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "알림" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "이메일 알림" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "입력이 없을 때 \"자리 비움-시간초과\" 상태로 전환" + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "대기할 시간" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "분" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" msgstr "대화 상대가 로그아웃하면 알림" -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "온라인" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +#, fuzzy +msgid "Saved accounts:" +msgstr "계정" -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "계정" + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +#, fuzzy +msgid "&Remove" +msgstr "삭제된 대화 상대" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " msgstr "" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "자리 비움 메시지 지정" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "대화 기록" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "파일 보내기(&F)" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "파일 보내기(&F)" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "오프라인" +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "\"다른 편지함\"에 이메일이 도착하면 알림" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "표시할 시간" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "초" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 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. " +"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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "대화를 저장할 폴더 지정:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "년도 별" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "모든 대화를 한 폴더에 저장" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "모든 대화를 한 폴더에 저장" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "대화를 저장할 폴더 지정:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +#, fuzzy +msgid "Chat Settings" +msgstr "환경 설정" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +#, fuzzy +msgid "&Show emoticons" +msgstr "이모티콘 표시(&E)" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "이모티콘 표시(&E)" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +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:648 +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:654 +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:657 +#, fuzzy +msgid "S&how timestamp" +msgstr "메시지에 이모티콘 표시" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +#, fuzzy +msgid "Show &date" +msgstr "대화 상대 추가(&A)" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "이모티콘 표시(&E)" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +#, fuzzy +msgid "Your &message font:" +msgstr "내 메시지의 글꼴:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "상대방 메시지의 글꼴 지정:" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "대화(&C)" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "메시지에 글꼴 효과 사용 (*굵게*, /기울임/, _밑줄_)" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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/alertswidget.ui line 300 -#: rc.cpp:313 -#, fuzzy, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "입력이 없을 때 \"자리 비움-시간초과\" 상태로 전환" +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "대화 상대 목록이 꽉 찼습니다" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +#, fuzzy +msgid "Always" +msgstr "자리 비움" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +#, fuzzy +msgid "For contacts in the same group" +msgstr "대화 상대 목록이 꽉 찼습니다" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +#, fuzzy +msgid "Never" +msgstr "서버:" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "그림파일:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "대기할 시간" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "분" - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "대화 기록" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, fuzzy, no-c-format -msgid "Log &all chats" -msgstr "모든 대화를 기록" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "대화를 저장할 폴더 지정:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "대화를 기록할 폴더의 구성:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "년도 별" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, fuzzy, no-c-format -msgid "Month" -msgstr "월 별" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "날짜 별" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "모든 대화를 한 폴더에 저장" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "내 메시지의 글꼴:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "상대방 메시지의 글꼴 지정:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, fuzzy, no-c-format -msgid "&Show graphics in chat messages" -msgstr "메시지에 이모티콘 표시" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, fuzzy, no-c-format -msgid "S&how time in chat messages" -msgstr "메시지에 이모티콘 표시" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, fuzzy, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "메시지에 글꼴 효과 사용 (*굵게*, /기울임/, _밑줄_)" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "메일 클라이언트" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Hotmail 사용" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "지정한 명령 사용" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "이메일 알림" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "이메일 정보 표시" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "" - -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "\"다른 편지함\"에 이메일이 도착하면 알림" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +#, fuzzy msgid "&Emoticon Themes" msgstr "이모티콘 표시(&E)" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "이모티콘 표시(&E)" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +#, fuzzy msgid "&Custom Emoticons" msgstr "카툰 이모티콘" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "이모티콘 표시(&E)" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, fuzzy +msgid "Add Ne&w..." +msgstr "계정" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "(차단됨)" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +#, fuzzy msgid "Re&name" msgstr "대화명" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +#, fuzzy msgid "Remo&ve" msgstr "삭제된 대화 상대" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" msgstr "" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "님의 말:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#: settings/accountswidget.cpp:421 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 #, fuzzy -msgid "Display Picture" -msgstr "그림파일:" +msgid "&Specify a custom command:" +msgstr "자리 비움 메시지 지정" -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "" - -#: settings/accountswidget.cpp:486 +#. 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:827 rc.cpp:862 +#, no-c-format msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." msgstr "" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "환경 설정" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "" -#: settings/settingsdialog.cpp:93 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 #, fuzzy -msgid "Account" -msgstr "계정" +msgid "Email Client" +msgstr "메일 클라이언트" -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "대화" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "이 계정을 정말로 삭제하시겠습니까?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "동쪽하늘" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" - -#: systemtraywidget.cpp:91 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +msgid "Use &Live Mail if the account supports it" msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +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:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "그리고" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "파일 전송을 완료했습니다." + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "대화명" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "대화명" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "메시지에 이모티콘 표시" + +#, fuzzy +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "이 대화 상대가 로그인 또는 로그아웃할 때 팝업 풍선 표시" + +#, fuzzy +#~ msgid "Custom emoticons for this account:" +#~ msgstr "이 프로필 저장" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "이모티콘 표시(&E)" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "그림파일:" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "대화 상대 찾기(&E)" + +#~ msgid "Search by &Interest" +#~ msgstr "관심분야로 검색(&I)" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "이메일 주소:" + +#, fuzzy +#~ msgid "" +#~ "The transfer failed. The contact sent bad data, or KMess doesn't support " +#~ "it." +#~ 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 "&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 "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 "그림파일:" + +#, fuzzy +#~ msgid "Speed:" +#~ msgstr "서버:" + +#~ msgid "Use a specified command:" +#~ msgstr "지정한 명령 사용" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "이메일" + +#, fuzzy +#~ msgid "Remove group" +#~ msgstr "그룹 삭제(&M)" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "그림파일:" + +#, fuzzy +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "개의 새로운 편지가 있습니다." + +#, fuzzy +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "개의 새로운 편지가 있습니다." + +#, fuzzy +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "실패. 파일을 열 수 없습니다" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "대화 상대 도구함(&C)" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "대화 상대 추가(&C)" + +#, fuzzy +#~ msgid "Enter your login information:" +#~ msgstr "직접 로그인 정보 입력:" + +#, fuzzy +#~ msgid "Your friendly name:" +#~ msgstr "대화명:" + +#~ msgid "Your password:" +#~ msgstr "암호:" + +#, fuzzy +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "\"다른 편지함\"에 이메일이 도착하면 알림" + +#~ msgid "Organize chat folders by:" +#~ msgstr "대화를 기록할 폴더의 구성:" + +#, fuzzy +#~ msgid "&Show graphics in chat messages" +#~ msgstr "메시지에 이모티콘 표시" + +#~ msgid "Use Hotmail" +#~ msgstr "Hotmail 사용" + +#~ msgid "says:" +#~ msgstr "님의 말:" + +#~ msgid "Current name: " +#~ msgstr "현재 대화명: " + +#, fuzzy +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr ".NET 서비스 상태를 보시겠습니까?" + +#~ msgid "Received user confirmation" +#~ msgstr "사용자 확인 받음" + +#~ msgid "Transfer to notification server" +#~ msgstr "알림 서버로 보냄" + +#, fuzzy +#~ msgid "The server is too busy" +#~ msgstr "서버가 폭주 상태입니다" + +#~ msgid "The server is unavailable" +#~ msgstr "서버가 사용 불가 상태입니다" + +#~ msgid "Add contact" +#~ msgstr "대화 상대 추가" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "이메일 알림" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "DongCheon Park (동쪽하늘)" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "dcpark@kaist.ac.kr" + +#~ msgid "Away - Idle" +#~ msgstr "자리 비움 -시간초과" + +#, fuzzy +#~ 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 "(통화 중)" + #, fuzzy #~ msgid "File transfer dialog message" #~ msgstr "파일 전송을 완료했습니다." @@ -3060,12 +6666,6 @@ msgstr "" #~ msgid "Notification message" #~ msgstr "응용프로그램 메시지" -#~ msgid "You can't login to hotmail with this account." -#~ msgstr "이 계정으로 hotmail에 로그인할 수 없습니다." - -#~ msgid "The connection to the server failed." -#~ msgstr "서버로부터 연결이 끊어졌습니다." - #~ msgid "You may not be connected to the internet." #~ msgstr "인터넷에 연결되지 않은 것 같습니다." @@ -3105,9 +6705,6 @@ msgstr "" #~ msgid "Port:" #~ msgstr "포트:" -#~ msgid "Type:" -#~ msgstr "형식:" - #~ msgid "User ID:" #~ msgstr "사용자 ID:" @@ -3121,9 +6718,6 @@ msgstr "" #~ msgid "SOCKS5 Proxy" #~ msgstr "SOCKS5 프록시" -#~ msgid "Server:" -#~ msgstr "서버:" - #~ msgid "Proxy" #~ msgstr "프록시" @@ -3138,9 +6732,6 @@ msgstr "" #~ msgid "I'll be /really/ upset" #~ msgstr "잘린 목이 들어 있으면, /대략/ 정신이 멍 해질거야." -#~ msgid "Connection good" -#~ msgstr "연결상태 좋음" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "서버가 폭주 상태입니다" @@ -3155,9 +6746,6 @@ msgstr "" #~ msgid "The following people are offline" #~ msgstr "다음 대화 상대가 로그아웃했습니다." -#~ msgid "%1 is offline" -#~ msgstr "%1님이 로그아웃했습니다." - #~ msgid "The following people are online" #~ msgstr "다음 대화 상대가 로그인했습니다." @@ -3171,16 +6759,6 @@ msgstr "" #~ "in your inbox" #~ msgstr "있습니다." -#, fuzzy -#~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in another folder" -#~ msgstr "다른 편지함 포함" - -#~ msgid "and" -#~ msgstr "그리고" - #~ msgid "says: " #~ msgstr "님의 말: " @@ -3194,13 +6772,6 @@ msgstr "" #~ msgid "time" #~ msgstr "시각" -#~ msgid "System Message" -#~ msgstr "시스템 메시지" - -#, fuzzy -#~ msgid "Show incoming server messages" -#~ msgstr "메시지에 이모티콘 표시" - #, fuzzy #~ msgid "Show outgoing server messages" #~ msgstr "메시지에 이모티콘 표시" @@ -3209,10 +6780,6 @@ msgstr "" #~ msgid "Chat - %1" #~ msgstr "대화" -#, fuzzy -#~ msgid "Chat - %1 et al." -#~ msgstr "%1 등등." - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't create a socket." #~ msgstr "실패. 소켓을 생성할 수 없습니다" @@ -3233,14 +6800,6 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "이모티콘/효과음 받기(&T)" -#, fuzzy -#~ msgid "Chat message layout:" -#~ msgstr "내 메시지의 글꼴:" - -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "대화명" - #~ msgid "Update preview" #~ msgstr "미리보기 갱신" diff --git a/po/maketrans b/po/maketrans index 9531207..2cd49b3 100755 --- a/po/maketrans +++ b/po/maketrans @@ -1,27 +1,59 @@ #!/bin/sh +# +# Extract all messages from the source code. +# The messages are saved into kmess.pot +# +# Script based on: +# http://techbase.kde.org/index.php?title=Development/Tutorials/Localization/i18n_Build_Systems#Theory:_The_xgettext_toolchain +# -# Make the kmess.pot file. -make -C .. -f admin/Makefile.common package-messages -echo -echo 'Consider updating kmess.pot before running mergetrans' -echo 'Remove the following entries:' -echo '- "..."' -echo '- key combinations, search for "+"' -echo '- widget names, search for "[a-z][A-Z]"' -echo +BASEDIR="../src/" # root of translatable sources +PROJECT="kmess" # project name +BUGADDR="http://www.kmess.org/board/" +WDIR=`pwd` + + +EXTRACTRC=/usr/bin/extractrc # needs KDE 4 version! +RC_LIST=$WDIR/rcfiles.list +IN_LIST=$WDIR/infiles.list +RC_CPP=$WDIR/rc.cpp + +# Additional string for KAboutData +echo 'i18nc("NAME OF TRANSLATORS","Your names");' > $RC_CPP +echo 'i18nc("EMAIL OF TRANSLATORS","Your emails");' >> $RC_CPP + +# Parse .ui files +echo "extracting translations from *.ui files.." +cd $BASEDIR +find . -name '*.ui' -o -name '*.rc' -o -name '*.kcfg' | sort >> $RC_LIST +xargs --arg-file=$RC_LIST ${EXTRACTRC} > $RC_CPP + +# Parse .xsl files +echo "extracting translations from *.xsl files.." +sh ../data/chatstyles/extract-xsl-messages >> $RC_CPP + +# Parse .cpp files +echo "extracting translations from *.cpp files.." +echo "rc.cpp" > $IN_LIST +find . -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort >> $IN_LIST + +cd $WDIR +xgettext --from-code=UTF-8 --language=C++ --kde \ + --sort-by-file --indent \ + -ci18n \ + -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \ + -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \ + -kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale \ + --debug \ + --msgid-bugs-address="$BUGADDR" \ + --exclude-file=kmess.pot.ignore \ + --files-from=$IN_LIST -D $BASEDIR -D $WDIR \ + -o $PROJECT.pot || { echo "error while calling xgettext. aborting."; exit 1; } + +# Cleanup +rm $IN_LIST +rm $RC_LIST +rm $RC_CPP +echo "Done" -# xgettext -C -ki18n -kI18N_NOOP -ktranslate -kaliasLocale \ -# -o messages.po -# -x "`kde-config --prefix`/include/kde.pot" \ -# ../kmess/*.cpp \ -# ../kmess/chat/*.cpp \ -# ../kmess/contact/*.cpp \ -# ../kmess/dialogs/*.cpp \ -# ../kmess/network/applications/*.cpp \ -# ../kmess/network/*.cpp \ -# ../kmess/notification/*.cpp \ -# ../kmess/settings/*.cpp -# -# rm -rf kmess.pot -# mv messages.po kmess.pot 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 4cd27fe..499079a 100644 --- a/po/nb.po +++ b/po/nb.po @@ -3,3041 +3,6656 @@ # 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: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2003-04-28 20:18+0200\n" -"Last-Translator: Oyvind Sather \n" -"Language-Team: Norsk bokmål \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\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" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Øyvind Sæther" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "oyvind@sather.tk" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "Jeg er borte fra datamaskinen" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Ditt navn" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "deg@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Logger på..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Jeg er borte fra datamaskinen" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." msgstr "" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 #, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Fjern K&ontakt" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "er med på praten." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr " forlot praten." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr " forlot praten." + +#: chat/chat.cpp:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr " skriver." + +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr " et al." + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr " (This message was sent automatically)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1291 +#, kde-format +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." +msgstr "" + +#: chat/chat.cpp:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" + +#: chat/chat.cpp:1312 +#, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" + +#: chat/chat.cpp:1333 +#, kde-format +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:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "er med på praten." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "er med på praten." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "er med på praten." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "ble ikke mottatt." + +#: chat/chat.cpp:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "Sender fil " + +#: chat/chatmessagestyle.cpp:382 +#, fuzzy, kde-format msgid "%1 says:" msgstr " sier: " -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Koble til" + +#: chat/chatview.cpp:300 +#, kde-format 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:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, kde-format msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 #, fuzzy msgid "Add this &Emoticon..." msgstr "Vis &Humørikoner" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Vis &Humørikoner" + +#: chat/chatview.cpp:834 #, fuzzy msgid "Send &Email" msgstr "&Send epost" -#: chat/chatview.cpp:926 +#: chat/chatview.cpp:838 #, fuzzy -msgid "Copy E&mail" -msgstr "EPost" +msgid "Add &Contact" +msgstr "&Legg til Kontakt" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-postadresse:" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:948 +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "&Prat " + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Send en &Fil" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Prat" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" - -#: chat/chatwindow.cpp:260 -#, fuzzy -msgid "%1 has joined the chat." -msgstr "er med på praten." - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr " forlot praten." - -#: chat/chatwindow.cpp:315 -#, fuzzy -msgid "%1 has left the chat." -msgstr " forlot praten." - -#: chat/chatwindow.cpp:575 -#, fuzzy -msgid "%1 - Chat" -msgstr "Prat" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 #, fuzzy msgid "Contacts" msgstr "&Legg til Kontakt" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "Vis &Humørikoner" -#: chat/chatwindow.cpp:799 +#: chat/chatwindow.cpp:128 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "Vis &Humørikoner" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (This message was sent automatically)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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:1502 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:1791 +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "" + +#: chat/chatwindow.cpp:451 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "ble ikke mottatt." +msgid "&Invite..." +msgstr "&Inviter " -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "" - -#: chat/chatwindow.cpp:1976 +#: chat/chatwindow.cpp:452 #, fuzzy -msgid "%1 is typing." -msgstr " skriver." - -#: chat/chatwindow.cpp:1985 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr " skriver." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +msgid "Send a &File..." msgstr "Send en &Fil" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "Start et &Møte" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 #, fuzzy msgid "Send a &Nudge!" msgstr "Send en &Fil" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." msgstr "" -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" msgstr "" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "&Inviter " - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Prat " - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "Endre &Skriftype" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "Endre Skrift&Farge" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Sett inn humørikon" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "Vis &Humørikoner" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Vis/skjul &Kontaktpanel" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Vis tidspunkt for beskjeder" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Viser eller skjuler kontaktpanelet" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:484 +#, fuzzy +msgid "Meeting" +msgstr "Innstillinger" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Send en &Fil" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Søk etter &Kontakt" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "&Legg til Kontakt" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Søk etter &Kontakt" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Vis &Humørikoner" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Søk etter &Kontakt" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Vis &Humørikoner" + +#: chat/chatwindow.cpp:533 +#, fuzzy +msgid "&Font" +msgstr "Kobl &til" + +#: chat/chatwindow.cpp:534 +#, fuzzy +msgid "Font &Color" +msgstr "Endre Skrift&Farge" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "&Prat " + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Prat" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "Prat" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr " skriver." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr " skriver." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr " skriver." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Start et &Møte" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" msgstr "&Send epost" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/contactframe.cpp:299 kmessview.cpp:601 #, fuzzy msgid "&View Profile" msgstr "&Vis profil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Egenskaper" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "&Legg til Kontakt" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 #, fuzzy msgid "A&llow Contact" msgstr "&Tillat Kontakt" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 #, fuzzy msgid "&Delete Contact" msgstr "Fjern K&ontakt" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "&Blokker Kontakt" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "&Fjern blokkering av Kontakt" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 #, fuzzy msgid "&Friendly Name" msgstr "Ditt vennskapsnavn:" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 #, fuzzy msgid "&Email Address" msgstr "E-postadresse:" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +#, fuzzy +msgid "Song &Name" +msgstr "Ditt navn" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Informasjon" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Bilde:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" msgstr "" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "Vis &Humørikoner" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Blokkert" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Borte" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Legg denne kontakten til din \"Friends\"-liste" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Snart tilbake" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Opptatt" +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "Legg til kontakt" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Frakoblet" +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Kontoer " -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Borte - Inaktiv" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Ut til lunsj" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +#, fuzzy +msgid "Remove" +msgstr "Fjernet" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +#, fuzzy +msgid "Web Messenger" +msgstr "Web design" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "Web design" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, fuzzy, kde-format +msgid "Windows Live Messenger %1" +msgstr "Web design" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Web design" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Tilgjengelig" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Opptatt" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Borte" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Borte med auto-svar" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Snart tilbake" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Prater i telefonen" -#: chat/contactframe.cpp:558 -msgid "The contact is %1" -msgstr "" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Ut til lunsj" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Usynlig" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Frakoblet" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Min Status" + +#: contact/msnstatus.cpp:218 +#, 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:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Skriv inn epostadressen til den du vil legge til:" - -#: dialogs/addcontactdialog.cpp:88 -#, fuzzy -msgid "The e-mail address given was invalid!" -msgstr "Det brukernavnet er ugyldig" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 #, fuzzy msgid "Add New Emoticon" msgstr "Vis &Humørikoner" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "Vis &Humørikoner" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Skriv inn Borte-beskjed" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "" #: dialogs/awaymessagedialog.cpp:37 -msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" -msgstr "" -"Skriv inn beskjed som automatisk blir\n" -"hvis noen prøver å gi deg en beskjed:" - -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Bruk kallenavn for denne personen" - -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Vis en oppsprettsballong når personen koblers til/fra" - -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Bilde:" - -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Lyd:" - -#: dialogs/contactpropertiesdialog.cpp:229 #, fuzzy +msgid "Automatic Away Message" +msgstr "Skriv inn Borte-beskjed" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "feilet. Kunne ikke åpne fil" + +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Logger på..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Logg all prat" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "har lagt deg til på hans/hennes kontaktliste. Ønsker du å:" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%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:282 +#, fuzzy, kde-format msgid "Contact Properties for %1" msgstr "Kontaktegenskaper for " -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Tilkoblet" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +#, fuzzy +msgid "No messages yet" +msgstr "Vis tidspunkt for beskjeder" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Din meldingsskrifttype:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Din meldingsskrifttype:" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "E-postadresse: " -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Nåværende navn: " +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Epost program" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "&Legg til Kontakt" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "&Legg til Kontakt" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" msgstr "" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "&Prat " + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "" - -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Tilkoblet" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 #, fuzzy msgid "File Transfers" msgstr "Filoverføring fullført." -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Blokkert" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "Fjern K&ontakt" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Bilde:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Er du sikker på at du vil slette denne profilen?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Bilde:" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 #, fuzzy msgid "Smile" msgstr "EPost" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 #, fuzzy msgid "Sad" msgstr "og" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 #, fuzzy msgid "Disappointed" msgstr "Frakoblet" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 #, fuzzy msgid "Secret telling" msgstr "Innstillinger" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 #, fuzzy msgid "Be right back" msgstr "Snart tilbake" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 #, fuzzy msgid "Sun" msgstr "Lyd:" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 #, fuzzy msgid "Clapping" msgstr "Prat" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 #, fuzzy msgid "Snail" msgstr "&Send epost" -#: emoticontheme.cpp:783 -msgid "Black sheep" +#: emoticontheme.cpp:880 +msgid "Sheep" msgstr "" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "EPost" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 #, fuzzy msgid "Clock" msgstr "Blokkert" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 #, fuzzy msgid "Camera" msgstr "Ditt navn" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 #, fuzzy msgid "Money" msgstr "Måned" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:911 #, fuzzy -msgid "KMess Icon" +msgid "KMess icon" msgstr "KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" msgstr "" -#: kmess.cpp:288 kmess.cpp:292 +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Kunne ikke koble til tjener." + +#: initialview.cpp:380 #, fuzzy -msgid "Add a group" +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Kunne ikke koble til tjener." + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "Kobl &til" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "E-postadresse:" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "E-postadresse:" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Legg denne kontakten til din \"Friends\"-liste" + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "Vis epost informasjon i kontaktlisten" + +#: kmess.cpp:248 +#, fuzzy +msgid "New Group" +msgstr "Ny &Gruppe" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "&Legg til Gruppe" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Skriv inn nytt navn på gruppen:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Borte med auto-svar" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "" - -#: kmess.cpp:715 -#, fuzzy +#: kmess.cpp:576 +#, fuzzy, kde-format 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:718 +#: kmess.cpp:578 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "Fjern K&ontakt" -#: kmess.cpp:720 +#: kmess.cpp:580 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "Fjernet" -#: kmess.cpp:760 -#, fuzzy +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "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:763 +#: kmess.cpp:636 #, fuzzy -msgid "Remove group" -msgstr "&Fjern Gruppe" +msgctxt "dialog button" +msgid "Remove" +msgstr "Fjernet" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "Dette er en spesiell gruppe som ikke kan endres." -#: kmess.cpp:805 kmess.cpp:809 +#: kmess.cpp:676 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "E&ndre navn på gruppe" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Tilkoblet" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Skriv inn nytt navn på gruppen:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Autentisering feilet" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Tidsavbrudd på forbindelse" + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Frakoblet" -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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:1448 +#, kde-format +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:1673 +#: kmess.cpp:1460 +#, kde-format +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:1466 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "E-Post varsling" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Ny &Brukerkonto" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "&Ny Kontakt" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Ny &Gruppe" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "Søk etter &Kontakt" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Søk etter &Interesser" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Brukerkonto I&nnstillinger" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Handlinger" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "&Tilkoble" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "Kobl &fra" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Vis min &Profil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Min Status" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "Kobl &til" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Kobl &fra" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Vis min &Profil" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "Vis &Tillate Kontakter" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "Vis &Frakoblede Kontakter" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "Vis &Fjernede Kontakter" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Bilde:" - -#: kmessinterface.cpp:281 -msgid "Show &Network Window" +#: kmessinterface.cpp:170 +msgid "Show &History Box" msgstr "" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Vis/skjul &Kontaktpanel" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "Vis &Humørikoner" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" +msgstr "Bilde:" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "&Sorter Kontakter etter" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "&Ny Kontakt" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "Ny &Gruppe" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Søk etter &Kontakt" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "Ny &Brukerkonto" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Ny &Brukerkonto" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "EPost" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Grupper" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Tilkoblet/Frakoblet" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:199 +msgid "Mixed" msgstr "" -#: kmessview.cpp:113 -msgid "Now listening to %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." msgstr "" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" msgstr "" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, fuzzy, kde-format +msgid "[%1] %2 goes online" +msgstr "er frakoblet" + +#: kmessview.cpp:360 +#, fuzzy, kde-format +msgid "[%1] %2 goes offline" +msgstr "er frakoblet" + +#: kmessview.cpp:599 #, fuzzy msgid "Cha&t" msgstr "Prat" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Egenskaper" - -#: kmessview.cpp:623 +#: kmessview.cpp:610 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "&Fjern Gruppe" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Fytt til gruppe" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 #, fuzzy msgid "&Copy to Group" msgstr "&Fytt til gruppe" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "&Fytt til gruppe" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "Flytt gryppe &Ned" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "Flytt gryppe &Opp" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "&Fjern Gruppe" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "E&ndre navn på gruppe" -#: kmessview.cpp:1723 +#: kmessview.cpp:1136 #, fuzzy -msgid "You have 1 new e-mail in your inbox." -msgstr "ny epost i innboksen." +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "&Legg denne kontakten til på min kontaktliste" -#: kmessview.cpp:1727 +#: kmessview.cpp:1145 #, fuzzy -msgid "You have %1 new emails in your inbox." -msgstr "nye epost i innboksen." +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-postadresse:" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Borte)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Epost program" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Snart tilbake)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Opptatt)" +#: kmessview.cpp:1168 +msgid "No" +msgstr "" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Usynlig)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokkert" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Borte - Inaktiv)" +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Din meldingsskrifttype:" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Ute til lunsj) " +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Din meldingsskrifttype:" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(I telefonen)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Tilknytt automatisk med gitt epostadresse" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "&Legg til Kontakt" +msgstr[1] "&Legg til Kontakt" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +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:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Dette er ikke en gyldig hotmail-konto." + +#: kmessview.cpp:1834 +msgid "No Chat History found." +msgstr "" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy, kde-format +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr " skriver." + +#: main.cpp:42 settings/accountpage.cpp:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +#, fuzzy +msgid "Current developer" +msgstr "GnomeMetting utvikler" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Tysk oversettelse, testing, dokumentajson og webside" -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "Web design" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +#, 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:74 msgid "Cartoon emoticons" msgstr "Tegneserie humørikoner" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Standard lyd-tema" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabisk oversettelse, Fiks for internasjonalisering av fillagring." -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 #, fuzzy msgid "More Arabic translation" msgstr "Mer Tyrkisk oversettelse" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Brasiliansk Portugisisk oversettelse" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Brasiliansk Portugisisk oversettelse" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 #, fuzzy msgid "Catalan translation" msgstr "Catalan oversettelse" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Koreansk oversettelse" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Enkel Kinesisk oversettelse, fiks for filoverføringsfeil" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 #, fuzzy msgid "More Simplified Chinese translation" msgstr "Enkel Kinesisk oversettelse, fiks for filoverføringsfeil" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 #, fuzzy msgid "Traditional Chinese translation" msgstr "Catalan oversettelse" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Catalan oversettelse" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 #, fuzzy msgid "Danish translation" msgstr "Dansk oversettelse" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 #, fuzzy msgid "More Danish translation" msgstr "Dansk oversettelse" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "Nederlandsk oversettelse" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 #, fuzzy msgid "More Dutch translation" msgstr "Nederlandsk oversettelse" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Mer Tyrkisk oversettelse" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "Fransk oversettelse" + +#: main.cpp:111 #, fuzzy msgid "Estonian translation" msgstr "Oversettelse for Estonia" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 #, fuzzy msgid "Finnish translation" msgstr "Dansk oversettelse" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 #, fuzzy msgid "More Finnish translation" msgstr "Dansk oversettelse" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "Fransk oversettelse" -#: main.cpp:106 +#: main.cpp:117 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "Fransk oversettelse" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 #, fuzzy msgid "More French translation" msgstr "Fransk oversettelse" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 #, fuzzy msgid "Hungarian translation" msgstr "Oversettelse for Estonia" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Oversettelse for Estonia" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 #, fuzzy msgid "More Italian translation" msgstr "Koreansk oversettelse" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "Koreansk oversettelse" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Norsk (bokmål) oversettelse" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "Koreansk oversettelse" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "Koreansk oversettelse" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 #, fuzzy msgid "Slovenian translation" msgstr "Koreansk oversettelse" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 msgid "Spanish translation" msgstr "Spansk oversettelse" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 #, fuzzy msgid "More Spanish translation" msgstr "Mer Spansk oversettelse" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 #, fuzzy msgid "Swedish translation" msgstr "Spansk oversettelse" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "Spansk oversettelse" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 #, fuzzy msgid "Thai translation" msgstr "Thailands oversettelse" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 msgid "Turkish translation" msgstr "Tyrkisk oversettelse" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "Mer Tyrkisk oversettelse" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "Tilgjengelig" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Filoverføring fullført." + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Xinerama fikser" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Original fil mottatt kode " -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "Varierende internasjonaliseringsfikser." + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "Varierende internasjonaliseringsfikser." -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "GnomeMetting utvikler" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Person med en pose over hodet hans" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspirasjon og diverse kode" -#: main.cpp:139 +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 #, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "Oppspretts Ballong kode" -#: main.cpp:140 +#: main.cpp:174 msgid "Idle timer code" msgstr "Inaktiv tid kode" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:179 #, fuzzy msgid "Your name here?" msgstr "Ditt navn" -#: main.cpp:144 -msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" -"If you feel your name is missing here, please contact us too!" +#: main.cpp:182 +#, fuzzy +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Ditt navn" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "E-postadresse: " + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Søk etter &Kontakt" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Tilknytt automatisk med gitt epostadresse" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" msgstr "" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Tillatt" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Fjernet" + +#: network/applications/application.cpp:294 #, fuzzy msgid "The contact cancelled the session." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 #, fuzzy msgid "The contact rejected the invitation." msgstr "Kontakten har nektet invitasjonen" -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 #, fuzzy msgid "You have cancelled the session." msgstr "Du har kansellert invitasjonen." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Du har nektet å godta invitasjonen." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to
accept or cancel?" msgstr "" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." msgstr "" -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, 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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" msgstr "feilet. Kunne ikke åpne fil" -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -#, fuzzy +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "feilet. Kunne ikke åpne fil" + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not 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:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, fuzzy, kde-format msgid "Connecting to %1, port %2" msgstr "Tidsavbrudd på forbindelse" -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -#, fuzzy -msgid "The transfer was cancelled" -msgstr "Overføring akseptert." +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/filetransfer.cpp:370 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Du har kansellert invitasjonen." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Du har kansellert invitasjonen." + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "Tidsavbrudd på forbindelse" -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -#, fuzzy -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." msgstr "Korrekt fullført overføring av filen: " -#: network/applications/filetransfer.cpp:600 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Korrekt fullført overføring av filen: " + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." msgstr "feilet. Filen finnes ikke" -#: network/applications/filetransfer.cpp:604 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." msgstr "feilet. Kunne ikke opprette forbindelse" -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -#, fuzzy -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." msgstr "Sender fil " -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 -msgid "Transfer accepted." -msgstr "Overføring akseptert." +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "Kontakten har kansellert invitasjonen" -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "feilet. Kunne ikke åpne fil" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Du har kansellert invitasjonen." -#: network/applications/filetransferp2p.cpp:531 -#, fuzzy -msgid "The contact cancelled the transfer." -msgstr "Kontakten har kansellert invitasjonen" - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "feilet. Filen finnes ikke" - -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "feilet. Kunne ikke opprette forbindelse" - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "Sender fil " - -#: network/applications/gnomemeeting.cpp:55 +#: 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)." -#: network/applications/gnomemeeting.cpp:114 -#, fuzzy +#: network/applications/gnomemeeting.cpp:118 +#, fuzzy, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Starter GnomeMetting. Tilknytter " -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Inviterer kontakten til et møte." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "" - -#: network/applications/mimeapplication.cpp:119 +#: network/applications/mimeapplication.cpp:154 #, fuzzy -msgid "The invitation was aborted. An internal error occured." -msgstr "Kontakten har nektet invitasjonen" - -#: network/applications/mimeapplication.cpp:125 -#, fuzzy -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "feilet. Kunne ikke opprette støpsel" - -#: network/applications/mimeapplication.cpp:130 -#, fuzzy -msgid "The invitation was aborted. Timeout while waiting for file data." +msgid "The invitation was rejected. It is not supported by the other client." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "" +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "Kontakten har nektet invitasjonen" -#: network/applications/mimeapplication.cpp:141 +#: 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:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "Kontakten har kansellert invitasjonen" + +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "feilet. Kunne ikke opprette støpsel" + +#: network/applications/mimeapplication.cpp:186 #, fuzzy msgid "The invitation was aborted." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Du er invitert til å dele denne personens skrivebord." -#: network/applications/msnremotedesktop.cpp:155 -#, fuzzy +#: network/applications/msnremotedesktop.cpp:159 +#, fuzzy, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Starter KRDC. Tilknytter " -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Kontakten inviterer deg til å begynne " -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." -msgstr "" - -#: network/applications/p2papplication.cpp:1501 -#, fuzzy -msgid "The transfer failed. Data preparation failed." -msgstr "Kontakten har kansellert invitasjonen" - -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakten har nektet invitasjonen" - -#: network/applications/p2papplication.cpp:1624 -#, fuzzy -msgid "The transfer failed." -msgstr "Oversetteren av " - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -#, 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:2038 +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "Kontakten har kansellert invitasjonen" + +#: network/applications/p2papplication.cpp:1192 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/p2papplication.cpp:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 #, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "feilet. Filen finnes ikke" -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Kontakten har nektet invitasjonen" + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3274 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "feilet. Kunne ikke opprette støpsel" - -#: network/applications/p2papplication.cpp:3293 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "Kontakten har nektet invitasjonen" - -#: network/applications/p2papplication.cpp:3670 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "feilet. Kunne ikke opprette støpsel" - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "feilet. Kunne ikke opprette støpsel" -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "feilet. Kunne ikke opprette støpsel" -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "" +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "feilet. Kunne ikke opprette støpsel" -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakten har nektet invitasjonen" + +#: network/applications/p2papplicationbase.cpp:627 +#, fuzzy +msgid "The transfer failed." +msgstr "Oversetteren av " + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "feilet. Kunne ikke opprette støpsel" + +#: network/applications/p2papplicationbase.cpp:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Kontakten har nektet invitasjonen" + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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." msgstr "Du er invitert til å dele denne personens skrivebord." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 #, fuzzy msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "Du er invitert til et møte (bruker GnomeMeeting)." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 #, fuzzy msgid "You have cancelled the voice conversation." msgstr "Du har kansellert invitasjonen." -#: network/applications/voiceconversation.cpp:211 +#: network/applications/voiceconversation.cpp:205 #, fuzzy -msgid "The invitation was cancelled. The audio device couldn't be opened." +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/voiceconversation.cpp:222 -#, fuzzy +#: network/applications/voiceconversation.cpp:218 +#, fuzzy, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Starter GnomeMetting. Tilknytter " -#: network/applications/voiceconversation.cpp:228 -#, fuzzy +#: network/applications/voiceconversation.cpp:224 +#, fuzzy, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Starter GnomeMetting. Tilknytter " -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 #, fuzzy msgid "Inviting the contact to a voice conversation." msgstr "Inviterer kontakten til et møte." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -#, fuzzy +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, fuzzy, kde-format msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "Kontakten inviterer deg til å begynne " -#: network/extra/msnftpconnection.cpp:122 +#: network/applications/webcamtransferp2p.cpp:113 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "Oversetteren av " +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Kontakten har kansellert invitasjonen" -#: network/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "Du er invitert til å dele denne personens skrivebord." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Du har kansellert invitasjonen." + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakten har kansellert invitasjonen" + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:410 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, fuzzy, kde-format +msgid "Sending file %1" +msgstr "Sender fil " + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "feilet. Kunne ikke åpne fil" -#: network/extra/msnftpconnection.cpp:411 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy -msgid "Couldn't open a local port." +msgid "Could not open a local port." msgstr "feilet. Kunne ikke åpne fil" -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:481 -#, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. A connection could not be made." msgstr "feilet. Kunne ikke opprette forbindelse" -#: network/extra/msnftpconnection.cpp:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:586 -#, fuzzy +#: network/extra/msnftpconnection.cpp:574 +#, fuzzy, kde-format msgid "Receiving file %1" msgstr "Mottar fil " -#: network/msnconnection.cpp:140 +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "" + +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "Skriv inn epostadressen til den du vil legge til:" + +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:396 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Det brukernavnet er ugyldig" + +#: network/msnconnection.cpp:400 msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnconnection.cpp:733 -#, fuzzy -msgid "1 ping lost" -msgstr "Henter lister" +#: network/msnconnection.cpp:403 +msgid "Your contact list is full" +msgstr "Din kontaktliste er full." -#: network/msnconnection.cpp:737 -#, fuzzy -msgid "%1 pings lost" -msgstr "Henter lister" - -#: network/msnconnection.cpp:752 -#, fuzzy -msgid "The connection to the server was lost." -msgstr "Kunne ikke koble til tjener." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Tillatt" +#: network/msnconnection.cpp:411 +#, fuzzy +msgid "This contact is already on your list" +msgstr "Legg denne kontakten til din \"Friends\"-liste" -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Fjernet" +#: network/msnconnection.cpp:415 +#, fuzzy +msgid "This contact is not on your list" +msgstr "Legg denne kontakten til din \"Friends\"-liste" -#: network/msnnotificationconnection.cpp:545 +#: network/msnconnection.cpp:419 +msgid "This contact is not online" +msgstr "" + +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +"The group name is already present in your contact list. Please use a " +"different name" msgstr "" -#: network/msnnotificationconnection.cpp:740 +#: network/msnconnection.cpp:436 #, fuzzy -msgid "Show MSN Messenger Service status?" -msgstr "Vis .net tjenestestatus?" +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:741 -msgid "Server Error" +#: network/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Dette er en spesiell gruppe som ikke kan endres." + +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "Din kontaktliste er full." + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "" + +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" + +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "" + +#: network/msnconnection.cpp:458 +#, fuzzy, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Intern tjenerfeil" + +#: network/msnconnection.cpp:462 +#, fuzzy +msgid "Invalid Group" +msgstr "E&ndre navn på gruppe" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 +msgid "Switchboard server failed" +msgstr "" + +#: network/msnconnection.cpp:476 +#, fuzzy +msgid "Transfer to switchboard server failed" +msgstr "Overfør til meldingstjener" + +#: network/msnconnection.cpp:480 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "" + +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "Ditt navn" + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Oversetteren av " + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "" + +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" +msgstr "Du har kansellert invitasjonen." + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 +#, fuzzy +msgid "Bad friend name" +msgstr "Ditt vennskapsnavn:" + +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" +msgstr "" + +#: network/msnconnection.cpp:547 +#, fuzzy +msgid "Authentication ticket was incorrect" +msgstr "Autentisering feilet" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Du kan ikke starte en prat med noen med egen status Usynelig." + +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "" + +#: network/msnconnection.cpp:558 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" + +#: network/msnconnection.cpp:561 +msgid "Your Passport account needs to be verified first" +msgstr "" + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "Intern tjenerfeil" + +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "Intern tjenerfeil" + +#: network/msnconnection.cpp:599 +msgid "Peer notification server down" +msgstr "Brukers kunngjøringstjener er nede" + +#: network/msnconnection.cpp:603 +#, fuzzy +msgid "The server is going down" +msgstr "Tjeneren kobles snart ned." + +#: network/msnconnection.cpp:607 +msgid "The server is going down soon" +msgstr "Tjeneren kobles snart ned." + +#: network/msnconnection.cpp:612 +msgid "Write is blocking" +msgstr "" + +#: network/msnconnection.cpp:616 +msgid "Session is overloaded" +msgstr "" + +#: network/msnconnection.cpp:623 +#, fuzzy +msgid "The server is not available" +msgstr "Tjeneren er utilgjengelig" + +#: network/msnconnection.cpp:627 +msgid "Authentication failed" +msgstr "Autentisering feilet" + +#: network/msnconnection.cpp:634 +#, kde-format +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "" + +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" msgstr "Tjener Feil" -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1337 #, fuzzy +msgid "Authenticating..." +msgstr "Autentisering feilet" + +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "Autentisering feilet" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 +#, fuzzy +msgid "Connecting..." +msgstr "Koble til" + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "minutter " +msgstr[1] "minutter " + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "" + +#: network/msnnotificationconnection.cpp:2108 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "Autentisering feilet" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "Intern tjenerfeil" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." +"

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

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:1553 -msgid "Got synchronization" -msgstr "Synkronisert" - -#: network/msnnotificationconnection.cpp:1690 -#, fuzzy -msgid "Authenticating" -msgstr "Autentisering feilet" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Mottok bekreftelse fra bruker" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." +#: network/msnnotificationconnection.cpp:2932 +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:1811 -msgid "Transfer to notification server" -msgstr "Overfør til meldingstjener" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" +#: network/msnnotificationconnection.cpp:2935 +#, kde-format +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:2034 -#, fuzzy -msgid "Connecting..." -msgstr "Koble til" - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" +#: network/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" msgstr "" -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 +#: network/msnnotificationconnection.cpp:2956 +#, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3005 #, fuzzy -msgid "There was an internal error in KMess: %1" +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "Kunne ikke koble til tjener." + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" msgstr "Intern tjenerfeil" -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" - -#: network/msnnotificationconnection.cpp:2252 -#, fuzzy -msgid "The account name given is invalid" -msgstr "Det brukernavnet er ugyldig" - -#: network/msnnotificationconnection.cpp:2255 +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" msgstr "" -#: network/msnnotificationconnection.cpp:2258 -msgid "Your contact list is full" -msgstr "Din kontaktliste er full." - -#: network/msnnotificationconnection.cpp:2264 +#: network/msnsockettcp.cpp:364 #, fuzzy -msgid "This contact is already on your list" -msgstr "Legg denne kontakten til din \"Friends\"-liste" - -#: network/msnnotificationconnection.cpp:2267 -#, fuzzy -msgid "This contact is not on your list" -msgstr "Legg denne kontakten til din \"Friends\"-liste" - -#: network/msnnotificationconnection.cpp:2270 -msgid "This contact is not online" -msgstr "" - -#: network/msnnotificationconnection.cpp:2279 -#, fuzzy -msgid "Your contact list has too many groups" -msgstr "Din kontaktliste er full." - -#: network/msnnotificationconnection.cpp:2282 -#, fuzzy -msgid "This group can't be changed" -msgstr "Dette er en spesiell gruppe som ikke kan endres." - -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "" - -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "" - -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "" - -#: network/msnnotificationconnection.cpp:2300 -msgid "Switchboard server failed" -msgstr "" - -#: network/msnnotificationconnection.cpp:2303 -#, fuzzy -msgid "Transfer to switchboard server failed" -msgstr "Overfør til meldingstjener" - -#: network/msnnotificationconnection.cpp:2306 -msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "" - -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "" - -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "" - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "" - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "" - -#: network/msnnotificationconnection.cpp:2341 -#, fuzzy -msgid "Bad friend name" -msgstr "Ditt vennskapsnavn:" - -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "" - -#: network/msnnotificationconnection.cpp:2359 -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:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr "" - -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "" - -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Intern tjenerfeil" - -#: network/msnnotificationconnection.cpp:2411 -#, fuzzy -msgid "The server is too busy" -msgstr "Tjeneren er opptatt" - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Tjeneren er utilgjengelig" - -#: network/msnnotificationconnection.cpp:2419 -msgid "Peer notification server down" -msgstr "Brukers kunngjøringstjener er nede" - -#: network/msnnotificationconnection.cpp:2423 -#, fuzzy -msgid "The server is going down" -msgstr "Tjeneren kobles snart ned." - -#: network/msnnotificationconnection.cpp:2426 -msgid "The server is going down soon" -msgstr "Tjeneren kobles snart ned." - -#: network/msnnotificationconnection.cpp:2430 -msgid "Write is blocking" -msgstr "" - -#: network/msnnotificationconnection.cpp:2433 -msgid "Session is overloaded" -msgstr "" - -#: network/msnnotificationconnection.cpp:2438 -#, fuzzy -msgid "The server is not available" -msgstr "Tjeneren er utilgjengelig" - -#: network/msnnotificationconnection.cpp:2441 -msgid "Authentication failed" -msgstr "Autentisering feilet" - -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2596 -msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "" - -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Personen er frakoblet eller usynlig" - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1648 -#, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "ble ikke mottatt." - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 -#, fuzzy -msgid "Connection timeout" +msgid "Connection time limit exceeded" msgstr "Tidsavbrudd på forbindelse" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 +#: network/msnsockettcp.cpp:380 #, fuzzy -msgid "%1 has sent you a nudge!" +msgid "1 ping lost" +msgstr "Henter lister" + +#: network/msnsockettcp.cpp:384 +#, fuzzy, kde-format +msgid "%1 pings lost" +msgstr "Henter lister" + +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "Kunne ikke koble til tjener." + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +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 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Tjeneren er utilgjengelig" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Tjeneren er utilgjengelig" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" msgstr "er tilgjengelig" -#: notification/notificationchat.cpp:196 -#, fuzzy -msgid "%1 has sent you a wink!" +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" msgstr "er tilgjengelig" -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "er tilgjengelig" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" msgstr "" -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" msgstr "er tilgjengelig" -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" +#: notification/chatnotification.cpp:199 +#, fuzzy, kde-format +msgid "%1 has sent you a handwritten message!" msgstr "er tilgjengelig" -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" +#: notification/chatnotification.cpp:203 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "er tilgjengelig" + +#: notification/chatnotification.cpp:207 +#, fuzzy, kde-format +msgid "%1 has sent you a wink!" +msgstr "er tilgjengelig" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +#, fuzzy, kde-format +msgid "%1 is sending you a file!" +msgstr "er tilgjengelig" + +#: notification/chatnotification.cpp:215 +#, fuzzy, kde-format +msgid "%1 has sent you an invitation!" +msgstr "er tilgjengelig" + +#: notification/chatnotification.cpp:222 +#, fuzzy, kde-format +msgid "%1 has canceled the webcam session!" msgstr "Du har kansellert invitasjonen." -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" +#: notification/chatnotification.cpp:223 +#, fuzzy, kde-format +msgid "%1 has canceled the file transfer!" msgstr "Kontakten har kansellert invitasjonen" -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" msgstr "" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "" +#: notification/chatnotification.cpp:231 +#, fuzzy, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "Du har kansellert invitasjonen." -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" +#: notification/chatnotification.cpp:232 +#, fuzzy, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "Kontakten har kansellert invitasjonen" -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "" +#: notification/chatnotification.cpp:233 +#, fuzzy, kde-format +msgid "%1 has accepted your invitation!" +msgstr "er tilgjengelig" -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" +#: notification/chatnotification.cpp:240 +#, fuzzy, kde-format +msgid "%1 has ended the webcam session!" +msgstr "Du har kansellert invitasjonen." -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" msgstr "Oversetteren av " -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" msgstr "" -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, fuzzy, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Oversetteren av " + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" msgstr "er tilgjengelig" -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" msgstr "er tilgjengelig" -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" msgstr "er tilgjengelig" -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" msgstr "er tilgjengelig" -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" msgstr "er tilgjengelig" -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" msgstr "er tilgjengelig" -#: notification/notificationcontactstatus.cpp:74 -#, fuzzy -msgid "%1 is now online" +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" msgstr "er tilgjengelig" -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr "er tilgjengelig" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "er tilgjengelig" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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 "" -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "Send" +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&Send epost" -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "Ny Linje" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Legg denne kontakten til din \"Friends\"-liste" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Legg til kontakt" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, fuzzy, no-c-format +#: notification/systemtraywidget.cpp:78 msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "har lagt deg til på hans/hennes kontaktliste. Ønsker du å:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, fuzzy, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Legg denne kontakten til din \"Friends\"-liste" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, fuzzy, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "Ikke legg til denne kontakten, men la dem se din status" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, fuzzy, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "Nekt denne personen å kontakte deg eller se din status." - -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, fuzzy, no-c-format -msgid "Enter your login information:" -msgstr "Eller skriv inn din pålogginsinformasjon:" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "E-postadresse:" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "Passord:" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" msgstr "" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "Husk denne profilen " - -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Koble til" - -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" msgstr "" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, fuzzy, no-c-format -msgid "Listening to %1" -msgstr "Sender fil " +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " skriver." -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, fuzzy, no-c-format -msgid "KMess Notification" -msgstr "E-Post varsling" +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "" + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +#, fuzzy +msgid "Display Picture" +msgstr "Bilde:" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "Bilde:" + +#: settings/accountpage.cpp:539 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Innstillinger" + +#: settings/accountsettingsdialog.cpp:78 +#, fuzzy +msgid "Account" +msgstr "Kontoer " + +#: settings/accountsettingsdialog.cpp:79 +#, fuzzy +msgid "My Account" +msgstr "Kontoer " + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "&Legg til Kontakt" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Prat" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Loggføring" + +#: 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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "" + +#: 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:160 +#, fuzzy, kde-format +msgid "" +"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:371 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "" + +#: settings/chatstylepage.cpp:375 +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 "Vis &Humørikoner" + +#: settings/emoticonspage.cpp:233 +#, fuzzy, kde-format +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:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Kontoer " -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, fuzzy, no-c-format -msgid "Your friendly name:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "E-Post varsling" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +msgid "Select Files Directory" +msgstr "Lagre logger i denne mappen:" + +#: 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "Vis &Humørikoner" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "&Legg til Kontakt" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Tegneserie humø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 the 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 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Tegneserie humø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 Live Messenger 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 "Tegneserie humørikoner" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"Click this button to show all custom emoticons, 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 "" +"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:107 +#. 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 +#, fuzzy +msgid "Clear area" +msgstr "&Tøm område" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "Pen color" +msgstr "Skrift&farge" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +#, fuzzy +msgid "Pen size" +msgstr "Skriftstørrelse" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +#, fuzzy +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 personen som du du vil legge til på " +"kontaktlisten:" + +#. 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:273 +#, fuzzy +msgid "Email address:" +msgstr "E-postadresse: " + +#. 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: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Velg en bildefil:" + +#. 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." +msgstr "" +"Skriv inn beskjed som automatisk blir\n" +"hvis noen prøver å gi deg en 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: 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Loggføring" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Filtrer etter &dato" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "Filtrer etter &dato" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "fra" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +msgstr "til" + +#. 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 the following groups of your 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, but allow him or her to see your status" +msgstr "" +"&Ikke legg til denne kontakten på min kontaktliste, men la dem se din status" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" +msgstr "&Nekt denne personen å kontakte deg eller se din status." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Gjenopprett" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grupper:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Bruk ett &alternativt navn på denne personen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Gi beskjed når kontakter logger av" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Lyd:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Bilde:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Bilde:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +#, fuzzy +msgid "&Clear Cache" +msgstr "&Prat " + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "" +"Klikk denne knappen for å gjenopprette profilbildet til denne kontakten" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "&Gjenopprett" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "&Tillat Kontakt" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "Legg denne kontakten til din \"Friends\"-liste" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "" +"Skriv inn epostadressen til den personen som du du vil legge til på " +"kontaktlisten:" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "&Legg til Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, fuzzy +msgid "Items to export:" +msgstr "Tidsavbrudd på forbindelse" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "&Legg til Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "Blokkert" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +#, fuzzy +msgid "Send" +msgstr "Send" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "&Prat " + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "Blokkert" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +#, fuzzy +msgid "Password:" +msgstr "Passord:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "Husk denne profilen " + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +#, fuzzy +msgid "R&emember password" +msgstr "Passord:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "Ny &Brukerkonto" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "Kobl &til" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Handlinger" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Kontoer " + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +#, fuzzy +msgid "Your Account Information" +msgstr "Brukerkonto I&nnstillinger" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +#, fuzzy +msgid "&Friendly name:" msgstr "Ditt vennskapsnavn:" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Din E-postadresse:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 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: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Ditt Passord:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +#, fuzzy +msgid "&Email address:" +msgstr "E-postadresse: " -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, fuzzy, no-c-format -msgid "Display picture:" -msgstr "Bilde:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +#, fuzzy +msgid "&Password:" +msgstr "Passord:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "Passord:" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +#, fuzzy msgid "C&hange..." +msgstr "&Inviter " + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, fuzzy, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Bilde:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Tilknytt automatisk med denne kontoen ved oppstart" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +#, fuzzy +msgid "Re&member the settings of this account" +msgstr "Husk denne profilen " -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Tilknytt automatisk med denne kontoen ved oppstart" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +#, fuzzy +msgid "Login &as" +msgstr "Logg all prat" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You cannot change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "Husk denne profilen " -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Varsler" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "E-Post varsling" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Endre status til \"Borte - Inaktiv\" når inaktiv" + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Bli inaktiv etter " + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "minutter " + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" msgstr "Gi beskjed når kontakter logger av" -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "Tilgjengelig" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +#, fuzzy +msgid "Saved accounts:" +msgstr "Kontoer " -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "Kontoer " + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +#, fuzzy +msgid "&Remove" +msgstr "Fjernet" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " msgstr "" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "Skriv inn Borte-beskjed" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "Loggføring" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Send en &Fil" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Send en &Fil" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "Frakoblet" +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Vis en beskjed når epost mottas i \"andre mapper\"" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Skjul oppspretter etter" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "sekunder" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 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. " +"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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Lagre logger i denne mappen:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "År" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Lagre alle logger i samme mappe" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Lagre alle logger i samme mappe" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "Lagre logger i denne mappen:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +#, fuzzy +msgid "Chat Settings" +msgstr "Innstillinger" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +#, fuzzy +msgid "&Show emoticons" +msgstr "Vis &Humørikoner" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "Vis &Humørikoner" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +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:648 +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:654 +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:657 +#, 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:663 +#, fuzzy +msgid "Show &date" +msgstr "&Legg til Kontakt" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "Vis &Humørikoner" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +#, fuzzy +msgid "Your &message font:" +msgstr "Din meldingsskrifttype:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "Tving kontakters beskjeder til å bruke skrifttypen" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "&Prat " + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "Bruk skrifttypeeffekter som *fet* og _understreket_ i beskjeder" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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/alertswidget.ui line 300 -#: rc.cpp:313 -#, fuzzy, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Endre status til \"Borte - Inaktiv\" når inaktiv" +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Din kontaktliste er full." + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +#, fuzzy +msgid "Always" +msgstr "Borte" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Din kontaktliste er full." + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +#, fuzzy +msgid "Never" +msgstr "Tjener Feil" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Bilde:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Bli inaktiv etter " +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "minutter " - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Loggføring" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, fuzzy, no-c-format -msgid "Log &all chats" -msgstr "Logg all prat" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Lagre logger i denne mappen:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organizer logger i mapper etter" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "År" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, fuzzy, no-c-format -msgid "Month" -msgstr "Måned" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Dag" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Lagre alle logger i samme mappe" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Din meldingsskrifttype:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Tving kontakters beskjeder til å bruke skrifttypen" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, fuzzy, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Vis tidspunkt for beskjeder" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, fuzzy, no-c-format -msgid "S&how time in chat messages" -msgstr "Vis tidspunkt for beskjeder" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, fuzzy, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "Bruk skrifttypeeffekter som *fet* og _understreket_ i beskjeder" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Epost program" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Bruk Hotmail" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Bruk egendefinert kommando:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "E-Post varsling" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, fuzzy, no-c-format -msgid "Show email information" -msgstr "Vis epost informasjon i kontaktlisten" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "" - -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Vis en beskjed når epost mottas i \"andre mapper\"" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +#, fuzzy msgid "&Emoticon Themes" msgstr "Vis &Humørikoner" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Vis &Humørikoner" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +#, fuzzy msgid "&Custom Emoticons" msgstr "Tegneserie humørikoner" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Vis &Humørikoner" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Kontoer " + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "Blokkert" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +#, fuzzy msgid "Re&name" msgstr "Ditt navn" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +#, fuzzy msgid "Remo&ve" msgstr "Fjernet" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" msgstr "" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "sier:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#: settings/accountswidget.cpp:421 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 #, fuzzy -msgid "Display Picture" -msgstr "Bilde:" +msgid "&Specify a custom command:" +msgstr "Skriv inn Borte-beskjed" -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "" - -#: settings/accountswidget.cpp:486 +#. 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:827 rc.cpp:862 +#, no-c-format msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." msgstr "" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Innstillinger" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "" -#: settings/settingsdialog.cpp:93 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 #, fuzzy -msgid "Account" -msgstr "Kontoer " +msgid "Email Client" +msgstr "Epost program" -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Prat" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Er du sikker på at du vil slette denne profilen?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" - -#: systemtraywidget.cpp:91 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +msgid "Use &Live Mail if the account supports it" msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +msgid "&Save all received files in one directory:" +msgstr "Lagre logger i denne mappen:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "og" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "Filoverføring fullført." + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "Ditt navn" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "Ditt navn" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Vis tidspunkt for beskjeder" + +#, fuzzy +#~ msgid "&Do not filter" +#~ msgstr "&Ikke filtrer" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Vis ett o&ppsprettsbindu når denne kontakten logger seg av/på" + +#, fuzzy +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Husk denne profilen " + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Vis &Humørikoner" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Bilde:" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "Søk etter &Kontakt" + +#~ msgid "Search by &Interest" +#~ msgstr "Søk etter &Interesser" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Din E-postadresse:" + +#, fuzzy +#~ msgid "" +#~ "The transfer failed. The contact sent bad data, or KMess doesn't support " +#~ "it." +#~ msgstr "feilet. Filen finnes ikke" + +#~ 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 "&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 "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:" + +#, fuzzy +#~ msgid "Speed:" +#~ msgstr "Tjener Feil" + +#~ msgid "Use a specified command:" +#~ msgstr "Bruk egendefinert kommando:" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "EPost" + +#, fuzzy +#~ msgid "Remove group" +#~ msgstr "&Fjern Gruppe" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Bilde:" + +#, fuzzy +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "ny epost i innboksen." + +#, fuzzy +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "nye epost i innboksen." + +#, fuzzy +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "feilet. Kunne ikke åpne fil" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Vis/skjul &Kontaktpanel" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "&Ny Kontakt" + +#, fuzzy +#~ msgid "Enter your login information:" +#~ msgstr "Eller skriv inn din pålogginsinformasjon:" + +#, fuzzy +#~ msgid "Your friendly name:" +#~ msgstr "Ditt vennskapsnavn:" + +#~ msgid "Your password:" +#~ msgstr "Ditt Passord:" + +#, fuzzy +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Vis en beskjed når epost mottas i \"andre mapper\"" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Organizer logger i mapper etter" + +#, fuzzy +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Vis tidspunkt for beskjeder" + +#~ msgid "Use Hotmail" +#~ msgstr "Bruk Hotmail" + +#~ msgid "says:" +#~ msgstr "sier:" + +#~ msgid "Current name: " +#~ msgstr "Nåværende navn: " + +#, fuzzy +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Vis .net tjenestestatus?" + +#~ msgid "Received user confirmation" +#~ msgstr "Mottok bekreftelse fra bruker" + +#~ msgid "Transfer to notification server" +#~ msgstr "Overfør til meldingstjener" + +#, fuzzy +#~ msgid "The server is too busy" +#~ msgstr "Tjeneren er opptatt" + +#~ msgid "The server is unavailable" +#~ msgstr "Tjeneren er utilgjengelig" + +#~ msgid "Add contact" +#~ msgstr "Legg til kontakt" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "E-Post varsling" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Øyvind Sæther" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "oyvind@sather.tk" + +#~ msgid "Away - Idle" +#~ msgstr "Borte - Inaktiv" + +#, fuzzy +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "Det brukernavnet er ugyldig" + +#~ msgid "(Away)" +#~ msgstr "(Borte)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Snart tilbake)" + +#~ msgid "(Busy)" +#~ msgstr "(Opptatt)" + +#~ msgid "(Invisible)" +#~ msgstr "(Usynlig)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Borte - Inaktiv)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Ute til lunsj) " + +#~ msgid "(On the Phone)" +#~ msgstr "(I telefonen)" + #, fuzzy #~ msgid "File transfer dialog message" #~ msgstr "Filoverføring fullført." @@ -3069,12 +6684,6 @@ msgstr "" #~ msgid "Notification message" #~ msgstr "Programbeskjed" -#~ msgid "You can't login to hotmail with this account." -#~ msgstr "Dette er ikke en gyldig hotmail-konto." - -#~ msgid "The connection to the server failed." -#~ msgstr "Kunne ikke koble til tjener." - #~ msgid "You may not be connected to the internet." #~ msgstr "Kanskje du ikke er tilkoblet internett?" @@ -3102,14 +6711,6 @@ msgstr "" #~ msgid "Show popup notifications for program events" #~ msgstr "Vis oppsprettsbeskjeder for programhendelser" -#, fuzzy -#~ msgid "Server:" -#~ msgstr "Tjener Feil" - -#, fuzzy -#~ msgid "Connection good" -#~ msgstr "Tidsavbrudd på forbindelse" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "Tjeneren er opptatt" @@ -3122,10 +6723,6 @@ msgstr "" #~ msgid "New chat notification:" #~ msgstr "E-Post varsling" -#, fuzzy -#~ msgid "%1 is offline" -#~ msgstr "er frakoblet" - #, fuzzy #~ msgid "You have new mail:" #~ msgstr "Du har ny epost." @@ -3137,16 +6734,6 @@ msgstr "" #~ "in your inbox" #~ msgstr "i din innboks" -#, fuzzy -#~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in another folder" -#~ msgstr "i en annen mappe" - -#~ msgid "and" -#~ msgstr "og" - #~ msgid "says: " #~ msgstr " sier: " @@ -3157,13 +6744,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" @@ -3172,10 +6752,6 @@ msgstr "" #~ msgid "Chat - %1" #~ msgstr "Prat" -#, fuzzy -#~ msgid "Chat - %1 et al." -#~ msgstr " et al." - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't create a socket." #~ msgstr "feilet. Kunne ikke opprette støpsel" @@ -3188,11 +6764,3 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Hent nye Humørikoner eller lyd &Temaer" - -#, fuzzy -#~ msgid "Chat message layout:" -#~ msgstr "Din meldingsskrifttype:" - -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "Ditt navn" diff --git a/po/nl.po b/po/nl.po index ab7b0ed..be63e42 100644 --- a/po/nl.po +++ b/po/nl.po @@ -1,3139 +1,6411 @@ -# 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. +# Heimen , 2009. msgid "" msgstr "" -"Project-Id-Version: kmess\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2007-11-04 16:17+0100\n" -"Last-Translator: Jaap Woldringh \n" -"Language-Team: Nederlands \n" +"Project-Id-Version: nl\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-05-05 23:40+0200\n" +"PO-Revision-Date: 2009-05-05 21:38+0200\n" +"Last-Translator: Heimen \n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" "X-Generator: KBabel 1.11.4\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Arend van Beelen jr., Diederik van der Boor, Jaap Woldringh" +#: account.cpp:45 account.cpp:744 +msgid "I am away from my computer" +msgstr "Ik ben weg van mijn computer" -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "" -"arend op auton.nl, vdboor op codingdomain punt com, jjh punt woldringh op " -"planet punt nl" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" -msgstr "Ik ben even weg van mijn computer" - -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Uw naam" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:217 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" -msgstr "uw_naam@hotmail.com" +msgstr "u@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Bezig met aanmelden..." +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" +"Er zijn onveilig bewaarde accountwachtwoorden gevonden.
Wilt u " +"deze wachtwoorden toevoegen aan de KDE-wachtwoordportefeuille genaamd '%1', " +"de onveilig bewaarde wachtwoorden bewaren, of ze permanent vernietigen?

Opmerking: het is niet aangeraden om onveilig bewaarde " +"wachtwoorden te bewaren terwijl de KDE Wallet beschikbaar is, omdat uw " +"wachtwoorden anders makkelijk leesbaar zijn in de configuratiebestanden van " +"KMess." -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "%1 stuurt een wink: %2" +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Veilige wachtwoordopslag" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importeren" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Verwijderen" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Behouden" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"U kunt geen uitnodigingen verzenden wanneer er meerdere mensen aanwezig zijn " +"in een chat. Start een aparte chat met de contactpersoon waarnaar u een " +"uitnodiging wilt verzenden." + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 is de chat binnengekomen." + +#: chat/chat.cpp:191 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "Het gesprek werd inactief, %1 heeft de chat verlaten." + +#: chat/chat.cpp:197 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 heeft de chat verlaten." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 en %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 en anderen" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Dit bericht is automatisch verzonden)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" +"KMess kon het logboek van dit chatgesprek niet opslaan.
De " +"logboeklocatie, "%1", bestaat niet." + +#: chat/chat.cpp:949 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "U heeft een wink verzonden." + +#: chat/chat.cpp:954 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "U heeft de wink "%1" verzonden." + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" +"Het chatgesprek is uitgeschakeld, omdat u niet langer verbonden bent met de " +"Live Messenger-server." + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Er is een verbindingsprobleem opgetreden." + +#: chat/chat.cpp:1154 +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 "" +"Er waren teveel verschillende emoticons in uw laatste bericht. Alleen " +"de eerste 7 zullen verzonden worden." + +#: chat/chat.cpp:1167 +#, kde-format +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." +msgstr "" +"%1 heeft u een voiceclip verstuurd, maar KMess ondersteunt nog geen " +"voiceclips." + +#: chat/chat.cpp:1181 +#, kde-format +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 verstuurd, maar KMess ondersteunt nog geen " +"actieberichten." + +#: chat/chat.cpp:1196 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "" +"%1 heeft u een Live Messenger-mogelijkheid verstuurd die KMess nog " +"niet ondersteunt." + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"U heeft een wink ontvangen van %1, maar winks weergeven is uitgeschakeld. U " +"kunt het weer inschakelen in de accountinstellingen." + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"U heeft de wink "%2" ontvangen van %1, maar winks weergeven is " +"uitgeschakeld. U kunt het weer inschakelen in de accountinstellingen." + +#: chat/chat.cpp:1262 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 heeft u een wink verstuurd!" + +#: chat/chat.cpp:1269 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 heeft u een wink verstuurd: "%2"!" + +#: chat/chat.cpp:1291 +#, kde-format +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." +msgstr "" +"U heeft een wink van %1 ontvangen, maar deze kan niet weergegeven " +"worden. Zorg ervoor dat "cabextract" geïnstalleerd is." + +#: chat/chat.cpp:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"U heeft de wink "%2" ontvangen van %1, maar deze kan niet " +"weergegeven worden. Zorg ervoor dat "cabextract" geïnstalleerd is." +"" + +#: chat/chat.cpp:1312 +#, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"U heeft een wink ontvangen van %1, maar deze kan niet worden " +"weergegeven. De wink uitpakken met "cabextract" is mislukt." + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"U heeft de wink "%2" ontvangen van %1, maar deze kan niet " +"worden weergegeven. De wink uitpakken met "cabextract" is mislukt." +"" + +#: chat/chat.cpp:1333 +#, kde-format +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 heeft een wink ontvangen van %1, maar deze kan niet worden " +"weergegeven. De data kon niet gelezen worden." + +#: chat/chat.cpp:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" +"U heeft de wink "%2" ontvangen van %1, maar deze kan niet " +"worden weergegeven. De data kon niet gelezen worden." + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" +"%1 heeft uitgelogd. Berichten die u nu verzendt, zullen de volgende " +"keer dat hij of zij weer inlogt bezorgd worden." + +#: chat/chat.cpp:1389 +#, kde-format +msgid "%1 has gone offline." +msgstr "%1 heeft uitgelogd." + +#: chat/chat.cpp:1399 +#, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 heeft zijn of haar status veranderd in "%2"" + +#: chat/chat.cpp:1430 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 heeft u een buzzer verstuurd!" + +#: chat/chat.cpp:1463 +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:1476 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Het verzenden van de buzzer naar %1 is mislukt." + +#: chat/chat.cpp:1481 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "Het verzenden van de wink naar %1 is mislukt." + +#: chat/chat.cpp:1491 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "" +"Het verzenden van het handgeschreven bericht naar %1 is mislukt." + +#: chat/chat.cpp:1506 +#, kde-format +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 "Het verzenden van het bericht naar %2 is mislukt:
%1" + +#: chat/chat.cpp:1589 +#, kde-format +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:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "U heeft %1 een buzzer verstuurd!" + +#: chat/chat.cpp:1632 +msgid "You have sent a nudge!" +msgstr "U heeft een buzzer verstuurd!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" +"%1 is momenteel niet ingelogd. Berichten die u nu verzendt, zullen de " +"volgende keer dat hij of zij weer inlogt bezorgd worden." + +#: chat/chatmaster.cpp:1387 +#, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 verstuurt een wink: "%2"" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 zegt:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "KMess gesprekken met %1 opgeslagen" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:657 +#, kde-format msgid "Add this emoticon: %1" -msgstr "Voeg deze emoticon toe: %1" +msgstr "Deze emoticon toevoegen: %1" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Opnieuw verbinden" + +#: chat/chatview.cpp:306 +#, kde-format 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 heeft om in deze map te schrijven." -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:445 +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:464 +#, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:465 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Bestand overschrijven" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:466 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "&Overschrijven" +msgstr "Over&schrijven" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:831 msgid "Add this &Emoticon..." -msgstr "Deze &Emoticon toevoegen..." +msgstr "Deze &emoticon toevoegen" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:834 +msgid "Hide this &Emoticon" +msgstr "Deze &emoticon verbergen" + +#: chat/chatview.cpp:840 msgid "Send &Email" -msgstr "&Email sturen" +msgstr "&E-mail verzenden" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "E&mail kopiëren" +#: chat/chatview.cpp:844 +msgid "Add &Contact" +msgstr "&Contact toevoegen" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:848 +msgid "Copy E&mail Address" +msgstr "E-&mailadres kopiëren" + +#: chat/chatview.cpp:854 msgid "Visit &Link" -msgstr "Koppe&ling bezoeken" +msgstr "Koppeling openen" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:858 msgid "Copy &Address" msgstr "&Adres kopiëren" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:874 +msgid "&Copy Text" msgstr "Tekst &kopiëren" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:875 msgid "Select &All" msgstr "&Alles selecteren" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "Chat in &bestand opslaan" +#: chat/chatview.cpp:876 +msgid "Find &Text..." +msgstr "&Tekst zoeken..." -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Chat" +#: chat/chatview.cpp:877 chat/chatwindow.cpp:503 +msgid "C&lear Chat" +msgstr "Chatgesprek &legen" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" -"U kunt deze uitnodiging niet sturen omdat er meerdere personen actief zijn " -"in deze chat." +#: chat/chatview.cpp:878 +msgid "Save Chat to &File..." +msgstr "Chatgesprek opslaan in &bestand" -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 neemt nu ook deel aan deze chat." - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "Het gesprek valt stil, %1 heeft de chat verlaten." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 heeft de chat verlaten." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Chat" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 en %2 - Chat" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 en anderen - Chat" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Contactpersonen" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticons" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" msgstr "Mijn emoticons" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Dit bericht werd automatisch verzonden)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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 "" -"De wink kon niet worden getoond. Controleer of het programma 'cabextract' is " -"geïnstalleerd." +"Er zijn meerdere tabbladen geopend in dit chatvenster. Wilt u alleen " +"het huidige tabblad sluiten, of alle tabbladen?

Tip: u kunt " +"alle tabbladen óók sluiten met de sneltoets Alt+F4." -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" -"De wink kon niet worden getoond. De gegevens konden niet worden gelezen." +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Een tabblad sluiten" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "U heeft een wink ontvangen van %1" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "Alle tabbladen sluiten" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "Het bericht '%1' kon niet worden verstuurd." +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Het huidige tabblad sluiten" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "U heeft een buzzer ontvangen van %1!" +#: chat/chatwindow.cpp:418 +msgid "&Invite..." +msgstr "&Uitnodigen..." -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "U heeft een buzzer verstuurd naar %1!" +#: chat/chatwindow.cpp:419 +msgid "Send a &File..." +msgstr "Een &bestand verzenden..." -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "U heeft een buzzer verstuurd!" +#: chat/chatwindow.cpp:420 +msgid "Webcam Chat" +msgstr "Webcamchat" -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 typt een bericht." - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 en %2 typen een bericht." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 en nog %3 anderen typen een bericht." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Stuur een &bestand" - -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:421 msgid "Start a &Meeting" msgstr "Een &vergadering starten" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:422 msgid "Send a &Nudge!" -msgstr "Stuur een &buzzer!" +msgstr "Een &buzzer verzenden!" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Start of stop een &conversatie" +#: chat/chatwindow.cpp:423 +msgid "Save Chat..." +msgstr "Chat opslaan..." -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Chat bewaren" +#: chat/chatwindow.cpp:424 +msgid "Close &All Tabs" +msgstr "&Alle tabbladen sluiten" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "U&itnodigen" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Chat" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:429 msgid "Change &Font" -msgstr "Le&ttertype veranderen" +msgstr "&Lettertype wijzigen" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:430 msgid "Change Font &Color" -msgstr "&Kleur van de letters veranderen" +msgstr "Letter&kleur wijzigen" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Emoticon invoegen" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:437 msgid "Show &Emoticons" msgstr "&Emoticons weergeven" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Zijbalk &Contactpersonen weergeven/verbergen" +#: chat/chatwindow.cpp:438 +msgid "Show S&tatus Messages" +msgstr "Statusberichten w&eergeven" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Weergeven of verbergen van de zijbalk met contactpersonen" +#: chat/chatwindow.cpp:444 +msgid "&Panels" +msgstr "&Panelen" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "Een email &sturen" +#: chat/chatwindow.cpp:447 +msgid "Use &Spell Checking" +msgstr "&Spellingscontrole gebruiken" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:451 +msgid "Meeting" +msgstr "Vergadering" + +#: chat/chatwindow.cpp:452 +msgid "Nudge" +msgstr "Buzzer" + +#: chat/chatwindow.cpp:453 +msgid "Send a &File" +msgstr "Een &bestand verzenden" + +#: chat/chatwindow.cpp:456 chat/chatwindow.cpp:457 +msgid "P&revious Tab" +msgstr "&Vorig tabblad" + +#: chat/chatwindow.cpp:458 chat/chatwindow.cpp:459 +msgid "Ne&xt Tab" +msgstr "Volgen&d tabblad" + +#: chat/chatwindow.cpp:474 +msgid "Enable or disable the contacts panel" +msgstr "Het contactenpaneel inschakelen of uitschakelen" + +#: chat/chatwindow.cpp:475 chat/chatwindow.cpp:476 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contactpersonen" + +#: chat/chatwindow.cpp:480 +msgid "Enable or disable the standard emoticons panel" +msgstr "Het paneel met standaardemoticons inschakelen of uitschakelen" + +#: chat/chatwindow.cpp:481 chat/chatwindow.cpp:482 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticons" + +#: chat/chatwindow.cpp:486 +msgid "Enable or disable the custom emoticons panel" +msgstr "Het paneel met eigen emoticons in- of uitschakelen" + +#: chat/chatwindow.cpp:487 chat/chatwindow.cpp:488 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mijn emoticons" + +#: chat/chatwindow.cpp:500 +msgid "&Font" +msgstr "&Lettertype" + +#: chat/chatwindow.cpp:501 +msgid "Font &Color" +msgstr "Letter&kleur" + +#: chat/chatwindow.cpp:502 +msgid "C&lear Chat Window" +msgstr "Chatgesprek &legen" + +#: chat/chatwindow.cpp:570 +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:993 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +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:996 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Incorrecte syntaxis van /status" + +#: chat/chatwindow.cpp:1059 +msgid "You cannot use the /block command in a group chat." +msgstr "" +"In een groepsgesprek kunt u het /block commando niet gebruiken." + +#: chat/chatwindow.cpp:1061 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "Kan het /block commando niet gebruiken!" + +#: chat/chatwindow.cpp:1072 +msgid "You cannot use the /unblock command in a group chat." +msgstr "U kunt het /unblock niet gebruiken in een groepsgesprek." + +#: chat/chatwindow.cpp:1074 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "Kan het /unblock commando niet gebruiken!" + +#: chat/chatwindow.cpp:1104 +#, kde-format +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:1107 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Onbekend commando" + +#: chat/chatwindow.cpp:1574 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Chatgesprek" + +#: chat/chatwindow.cpp:1578 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Chat" + +#: chat/chatwindow.cpp:1598 kmessinterface.cpp:674 +#, kde-format +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/chatwindow.cpp:1602 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Het menu verbergen" + +#: chat/chatwindow.cpp:1855 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 is aan het typen..." + +#: chat/chatwindow.cpp:1865 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 en %2 zijn aan het typen..." + +#: chat/chatwindow.cpp:1869 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 en %3 anderen zijn aan het typen..." + +#: chat/chatwindow.cpp:2320 +#, kde-format +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
Verbonden met " +"account:
%3
" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: chat/chatwindow.cpp:2486 rc.cpp:9 +msgid "Handwriting mode" +msgstr "Tekenmodus" + +#: chat/chatwindow.cpp:2495 +msgctxt "Label text" +msgid "" +"Handwriting is disabled: KMess cannot send drawings to some of the contacts." +msgstr "" +"Handgescreven berichten verzenden is uitgeschakeld. KMess kan deze niet " +"verzenden naar sommige contacten." + +#: chat/chatwindow.cpp:2501 +msgctxt "Label text" +msgid "Handwriting is disabled: KMess cannot send drawings to this contact." +msgstr "" +"Handgescreven berichten verzenden is uitgeschakeld. KMess kan deze niet " +"verzenden naar dit contact." + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: chat/chatwindow.cpp:2509 rc.cpp:27 +msgid "Winks" +msgstr "Winks" + +#: chat/chatwindow.cpp:2518 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to some of the contacts." +msgstr "" +"Winks zijn uitgeschakeld. KMess kan geen winks verzenden naar sommige " +"contacten." + +#: chat/chatwindow.cpp:2524 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to this contact" +msgstr "" +"Winks zijn uitgeschakeld. KMess kan geen winks verzenden naar dit contact." + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "Een privégesprek &starten" + +#: chat/contactframe.cpp:298 kmessview.cpp:609 +msgid "&Send Email" +msgstr "&E-mail verzenden" + +#: chat/contactframe.cpp:299 kmessview.cpp:610 msgid "&View Profile" -msgstr "&Profiel tonen" +msgstr "Profiel &weergeven" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:612 +msgid "&Properties" +msgstr "&Eigenschappen" + +#: chat/contactframe.cpp:303 kmessview.cpp:614 msgid "&Add Contact" -msgstr "&Contactpersoon toevoegen" +msgstr "Contactpersoon &toevoegen" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:615 msgid "A&llow Contact" -msgstr "Cont&actpersoon toestaan" +msgstr "Contactpersoon &toestaan" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:618 msgid "&Delete Contact" -msgstr "Contactpersoon verwij&deren" +msgstr "Contactpersoon &verwijderen" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:616 msgid "&Block Contact" msgstr "Contactpersoon &blokkeren" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:617 msgid "&Unblock Contact" -msgstr "Blokkering &opheffen" +msgstr "Contactpersoon &deblokkeren" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:621 msgid "&Friendly Name" -msgstr "&Uw roepnaam" +msgstr "&Schermnaam" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:622 msgid "&Personal Message" msgstr "&Persoonlijk bericht" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:623 msgid "&Email Address" -msgstr "&Emailadres" +msgstr "&E-mailadres" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "&Kopiëren..." +#: chat/contactframe.cpp:313 kmessview.cpp:624 +msgid "Song &Name" +msgstr "&Nummer" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:124 +msgid "&Information" +msgstr "&Informatie" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "Schermafbeeldingen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:157 +msgid "&Notes" +msgstr "&Aantekeningen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:160 +msgid "&Emoticons" +msgstr "&Emoticons" + +#: chat/contactframe.cpp:347 kmessview.cpp:659 +msgid "&Copy" +msgstr "&Kopiëren" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Geblokkeerd" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Afwezig" +#: chat/contactframe.cpp:765 +#, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Het contact is %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Ben zo terug" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" +"

U heeft nog geen eigen emoticons toegevoegd.

klik hier om nieuwe emoticons toe te voegen!

" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Bezig" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Aan chatgesprek toevoegen" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Offline" +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Nieuwe toevoegen..." -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Afwezig - Niet actief" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Bewerken" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Aan het lunchen" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Verwijderen" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

U heeft nog geen winks.

Ontvangen winks worden " +"automatisch toegevoegd.

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger-bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1-compatibel" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1-compatibel" + +#: contact/contactbase.cpp:354 +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger-compatibel" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Bezig" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Afwezig" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Afwezig met auto-beantwoorden" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inactief" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Ben zo terug" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Aan de telefoon" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "Deze contactpersoon is niet online" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Aan het lunchen" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "Chat-tekststijl" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Onzichtbaar" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Deze account heeft geen inbox voor Hotmail!" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Offline" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "Contactpersoon toevoegen" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Mijn status" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Geef het emailadres van de persoon die u wilt toevoegen:" +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Verbinding verbreken" -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "Het opgegeven emailadres is ongeldig!" +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Een contactpersoon toevoegen" -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" -msgstr "Emoticon toevoegen" +msgstr "Nieuwe emoticon toevoegen" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -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:130 +msgid "Edit Emoticon" +msgstr "Emoticon bewerken" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Stel een Afwezig-bericht op" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +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:37 +msgid "Automatic Away Message" +msgstr "'Automatisch afwezig'-bericht" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Chatgeschiedenis" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Stel het bericht op dat automatisch wordt verzonden\n" -"aan mensen die u een bericht proberen te sturen:" +"Er is een probleem opgetreden tijdens het openen van uw logs. Dit is meestal " +"een rechtenprobleem. Controleer of u lees/schrijftoegang heeft tot de map " +""%1". Als de rechten goed zijn, kunnen uw logbestanden " +"kunnen ook beschadigd zijn." -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Gebruik een alternatieve naam voor deze persoon" +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Kon chatgeschiedenis niet openen" -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Toon aankondiging wanneer deze persoon online of offline gaat" +#: dialogs/chathistorydialog.cpp:572 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Laden..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Afbeelding:" +#: dialogs/chathistorydialog.cpp:594 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Geen gelogde chats" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Geluid:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "U bent door iemand toegevoegd" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"heeft u aan zijn of haar contactenlijst toegevoegd." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +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:282 +#, kde-format msgid "Contact Properties for %1" -msgstr "Eigenschappen van contactpersoon %1" +msgstr "Contactinstellingen voor %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Emailadres: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:814 kmessview.cpp:1189 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Verbonden" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Huidige naam: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1193 +msgid "Not seen yet" +msgstr "Nog niet gezien" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1208 +msgid "No messages yet" +msgstr "Nog geen berichten" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Laatst gezien: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Laatste bericht: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-mailadres: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Chatprogramma: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" +"Weet u zeker dat u de schermafbeelding van deze contactpersoon wilt " +"gebruiken?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "Kopiëer schermafbeelding" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "Het geselecteerde bestandstype wordt niet ondersteund door Phonon." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "Bestandstype niet ondersteund" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Contactpersonen uitnodigen" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:220 msgid "Network Window" msgstr "Netwerkvenster" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Tabblad bewaren" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "Tabblad &opslaan" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Tabblad wissen" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "Tabblad &legen" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Tabblad afsluiten" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "&Alle tabbladen sluiten" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Er zijn geen verbindingen. Kan het netwerkvenster niet openen." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Er zijn geen verbindingen aanwezig.\n" +"Kan het Netwerkvenster niet openen." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"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 " +"heeft om in de map te schrijven waarin het bewaard wordt." -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." -msgstr "Kan het tabblad niet sluiten voor de voornaamste verbinding." +msgstr "Kan de hoofdconnectie niet sluiten." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"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:1303 +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:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Kan geen commando's verzenden via deze soort verbinding!" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:766 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" -msgstr "" +msgstr "Afgebroken" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Mislukt!" -#: dialogs/transferentry.cpp:202 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Computer" +msgstr "Voltooid" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:741 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:746 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:750 +#, kde-format msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 van %2 ontvangen." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 van %2 verzonden" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "oneindig" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:883 msgid "File Transfers" msgstr "Bestandsoverdrachten" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Gebruiken" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Verwijderen" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "Kies of verwijder uw schermafbeelding" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "Weet u zeker dat u deze schermafbeelding wilt verwijderen?" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Schermafbeelding verwijderen" + +#: emoticontheme.cpp:627 +#, kde-format 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 heeft om te " "schrijven in de themamap '%1'." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Lach" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" -msgstr "Wink" +msgstr "Knipoog" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Tong uitsteken" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" -msgstr "Grote grijns" +msgstr "Grote lach" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Verdrietig" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Huilen" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" -msgstr "Kwaad" +msgstr "Boos" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Verward" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" -msgstr "Beschaamd" +msgstr "Schamen" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Teleurgesteld" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" -msgstr "Heet" +msgstr "Cool" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" -msgstr "Woest" +msgstr "Grommende tanden" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" -msgstr "Watje" +msgstr "Studiebol" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Ziek" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Verrast" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Feest" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" -msgstr "Slaperig" +msgstr "Moe" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" -msgstr "Denk na" +msgstr "Denkend" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" -msgstr "Niet doorvertellen" +msgstr "Mond op slot" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" -msgstr "Stiekem vertellen" +msgstr "Fluisteren" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" -msgstr "Nou moe" +msgstr "Rollende ogen" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Sarcastisch" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" -msgstr "Ik weet het niet" +msgstr "Weet niet" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Ben zo terug" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Engel" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" -msgstr "Knuffel links" +msgstr "Linkeromhelzing" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Jongen" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Rood hartje" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Rode roos" -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "Duim omhoog" +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "Positief" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" -msgstr "Hondekop" +msgstr "Hond" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Zon" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Duivel" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" -msgstr "Knuffel rechts" +msgstr "Rechteromhelzing" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Meisje" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Gebroken hart" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" -msgstr "Verlepte roos" +msgstr "Verwelkte roos" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" -msgstr "Duim omlaag" +msgstr "Negatief" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" -msgstr "Kattekop" +msgstr "Kat" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" -msgstr "Maansikkel" +msgstr "Slapende maan" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Rode lippen" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" -msgstr "Klappen" +msgstr "Applaudiseren" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" -msgstr "Duimen" +msgstr "Gekruiste vingers" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Vliegtuig" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Schildpad" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Slak" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Zwart schaap" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Schaap" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Geit" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" -msgstr "Vampier" +msgstr "Vleermuis" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" -msgstr "Bier" +msgstr "Biermok" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" -msgstr "Wijnglas" +msgstr "Martini-glas" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" -msgstr "Koffie" +msgstr "Koffiekopje" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" -msgstr "Taart" +msgstr "Verjaardagstaart" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Bord" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" -msgstr "Schaal" +msgstr "Kom" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Ster" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Regenboog" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" +msgstr "Regenbui" + +#: emoticontheme.cpp:893 +msgid "Lightning" msgstr "Onweer" -#: emoticontheme.cpp:796 -msgid "Lightning" -msgstr "Bliksem" - -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Paraplu" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Tropisch eiland" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "Telefoon" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Mobieltje" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" -msgstr "Email" +msgstr "E-mail" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Klok" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" -msgstr "Camera" +msgstr "Fototoestel" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" -msgstr "Filmstrook" +msgstr "Filmrol" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" -msgstr "Notitie" +msgstr "Noot" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Handboeien" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Geld" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" -msgstr "Lampje" +msgstr "Gloeilamp" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +msgid "Cigarette" msgstr "Sigaret" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "Voetbal" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" -msgstr "Cadeautje" +msgstr "Pakje" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "Pictogram KMess" +#: emoticontheme.cpp:911 +msgid "KMess icon" +msgstr "KMess-pictogram " -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "Het adres dat u opgaf voor de contactpersoon, is ongeldig: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Kan niet opnieuw verbinden: account niet gevonden" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "Groep toevoegen" +#: 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." -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Geef de naam voor deze groep:" +#: initialview.cpp:280 initialview.cpp:375 +#, kde-format +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!" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Afwezig met auto-antwoord" +#: initialview.cpp:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Geen internetverbinding beschikbaar" -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Niets te doen" +#: initialview.cpp:401 +#, kde-format +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!" -#: kmess.cpp:715 +#: initialview.cpp:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Verbinden" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Annuleren" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Gelieve zowel uw e-mailadres als uw wachtwoord in te vullen." + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Gelieve een een geldig e-mailadres in te voeren." + +#: kmess.cpp:218 +#, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "" +"De contactpersoon %1 staat al in uw contactenlijst." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Contactinformatie" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Nieuwe groep" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Een groep toevoegen" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Voer de naam in voor de nieuwe groep:" + +#: kmess.cpp:576 +#, kde-format 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 de contactpersoon %1 uit uw contactenlijst " +"wilt verwijderen?" -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "Contactpersoon verwijderen" +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "Contact verwijderen" -#: kmess.cpp:720 -msgid "Remove and block" +#: kmess.cpp:580 +msgid "Remove and Block" msgstr "Verwijderen en blokkeren" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Groep verwijderen" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" msgid "" "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:763 -msgid "Remove group" -msgstr "Groep verwijderen" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Verwijderen" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "Dit is een speciale groep die niet kan worden gewijzigd." +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." +msgstr "Dit is een speciale groep, die niet gewijzigd kan worden." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" +#: kmess.cpp:676 +msgid "Rename Group" msgstr "Groep hernoemen" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Verbonden" +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "Voer de nieuwe naam in voor deze groep:" -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "Niet verbonden" - -#: kmess.cpp:1669 +#: kmess.cpp:754 +#, kde-format +msgctxt "dialog text" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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.

" +"

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

" 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.

" +"

Kan niet automatisch inloggen met account %1:
u moet eerst het " +"accountwachtwoord opslaan.

" -#: kmess.cpp:1673 -msgid "Error with notifications" -msgstr "Fout met meldingen" +#: kmess.cpp:757 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatisch inloggen mislukt" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nieuwe &account" +#: kmess.cpp:1041 +msgid "Connection could be down..." +msgstr "Verbinding is mogelijk verbroken..." -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "&Nieuwe contactpersoon" +#: kmess.cpp:1111 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Verbinding verbroken" -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Nieuwe &groep" +#: kmess.cpp:1450 +#, kde-format +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

" -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "Zoeken naar &contactpersoon" +#: kmess.cpp:1462 +#, kde-format +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 kan geen geluiden afspelen, of meldingen weergeven.

" +"Het vereiste bestand 'kmess.notifyrc' kon niet gevonden worden in de " +"programmamap.

%1

Controleer uw installatie.

" -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Zoeken volgens &interesse" +#: kmess.cpp:1468 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Probleem met meldingen" -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Accounti&nstellingen" +#: kmess.cpp:1746 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Acties" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "&Verbinden" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "Verbin&ding verbreken" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Mijn &profiel tonen" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Mijn status" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:306 msgid "&Connect" msgstr "&Verbinden" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Verbinding &verbreken" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Mijn &profiel weergeven" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" -msgstr "Toon toegest&ane contactpersonen" +msgstr "&Toegestane contacten weergeven" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" -msgstr "Toon &offline contactpersonen" +msgstr "&Offline contacten weergeven" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" -msgstr "Toon verwijde&rde contactpersonen" +msgstr "&Verwijderde contacten weergeven" -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "Afbeelding tonen" +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Gesc&hiedenispaneel weergeven" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Toon &netwerkvenster" +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "&Zoekbalk weergeven" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "&Lege groepen weergeven" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "&Afbeeldingsgrootte weergeven" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" -msgstr "&Contactpersonen sorteren op" +msgstr "&Contacten sorteren op" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Bes&tandsoverdrachten weergeven..." + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Nieuw &contactpersoon..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Nieuwe &groep..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "Contactenlijst &exporteren..." + +#: kmessinterface.cpp:183 kmessview.cpp:611 +msgid "Show Chat &History..." +msgstr "Chatgesc&hiedenis weergeven..." + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Nieuw &account..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Account instellen..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "&KMess instellen..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Keuze&menu tonen" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Niet tonen" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Klein" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Gemiddeld" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Groot" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Groep" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Venster voor &bestandsoverdrachten" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Gemengd" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Luistert nu naar %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "&Netwerkvenster weergeven..." -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:327 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] ingelogd met %2" -#: kmessview.cpp:613 +#: kmessview.cpp:364 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 gaat online" + +#: kmessview.cpp:369 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 gaat offline" + +#: kmessview.cpp:608 msgid "Cha&t" -msgstr "Cha&t" +msgstr "Cha&tten" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Eigenschappen" +#: kmessview.cpp:619 +msgid "&Remove From Group" +msgstr "Uit groep &verwijderen" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "Verwij&deren uit groep" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "Naar &groep verplaatsen" - -#: kmessview.cpp:641 +#: kmessview.cpp:652 msgid "&Copy to Group" -msgstr "Naar &groep kopiëren" +msgstr "Naar groep &kopiëren" -#: kmessview.cpp:674 +#: kmessview.cpp:653 +msgid "&Move to Group" +msgstr "Naar groep &verplaatsen" + +#: kmessview.cpp:704 msgid "Move Group &Down" -msgstr "Groep om&laag verplaatsen" +msgstr "Groep naar &beneden verplaatsen" -#: kmessview.cpp:675 +#: kmessview.cpp:705 msgid "Move Group &Up" -msgstr "Groep &omhoog verplaatsen" +msgstr "Groep naar b&oven verplaatsen" -#: kmessview.cpp:676 +#: kmessview.cpp:706 msgid "Re&move Group" -msgstr "Groep verwij&deren" +msgstr "Groep &verwijderen" -#: kmessview.cpp:677 +#: kmessview.cpp:707 msgid "Re&name Group" msgstr "Groep &hernoemen" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "U heeft 1 nieuwe email in uw postvak in." +#: kmessview.cpp:1145 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Deze contactpersoon heeft u niet in zijn of haar contactenlijst staan." -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "U heeft %1 nieuwe emails in uw postvak in." +#: kmessview.cpp:1154 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-mailadres" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Afwezig)" +#: kmessview.cpp:1161 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Chatprogramma" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Ben zo terug)" +#: kmessview.cpp:1173 +msgid "Yes" +msgstr "Ja" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Bezig)" +#: kmessview.cpp:1177 +msgid "No" +msgstr "Nee" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Onzichtbaar)" +#: kmessview.cpp:1180 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Geblokkeerd" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Afwezig - Niet actief)" +#: kmessview.cpp:1200 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Laatst gezien" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Aan het lunchen)" +#: kmessview.cpp:1215 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Laatste bericht" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Aan de telefoon)" +#: kmessview.cpp:1225 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Groep %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Automatisch inloggen met opgegeven emailadres" +#: kmessview.cpp:1233 +#, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contactpersoon, %2 online" +msgstr[1] "%1 contactpersonen, %2 online" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1240 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contactpersoon" +msgstr[1] "%1 contactpersonen" + +#: kmessview.cpp:1660 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Voer hier uw persoonlijk bericht in>" + +#: kmessview.cpp:1661 +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 weergegeven." + +#: kmessview.cpp:1844 +msgid "No chat logs could be found for this contact." +msgstr "Geen chatlogs gevonden voor dit contact." + +#: kmessview.cpp:1845 kmessview.cpp:1851 +msgid "No chat history found" +msgstr "Geen chatgeschiedenis gevonden" + +#: kmessview.cpp:1850 +msgid "" +"No chats logs could be found for this contact. Note that new chats are not " +"logged; if you want your chats to be logged, you can enable it in your " +"account settings." +msgstr "" +"Er konden geen chatlogs worden gevonden voor deze contactpersoon. Houdt in " +"gedachten dat nieuwe chats niet gelogd worden. Als u wil dat uw chats " +"gelogged worden, kunt dit inschakelen in de accountinstellingen." + +#: kmessview.cpp:2038 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 nieuwe e-mail" +msgstr[1] "%1 nieuwe e-mails" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:488 settings/accountpage.cpp:549 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "Een MSN-programma voor KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Ontwikkelaar en projectstichter" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Ontwikkelaar" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Projectondersteuning" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Huidige ontwikkelaar" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:125 +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:67 main.cpp:162 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:161 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 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:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 msgid "Web design" -msgstr "Webdesign" +msgstr "Webontwerp" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:73 +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:74 msgid "Cartoon emoticons" -msgstr "Cartoonemoticons" +msgstr "Cartoonachtige emoticons" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Standaard geluidsthema" -#: main.cpp:86 -msgid "Arabic translation, internationalization of file saving fix." -msgstr "" -"Arabische vertaling, internationalisatie van verbetering opslaan bestanden." +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "KMess-pictogram in de Oxygenstijl" -#: main.cpp:87 +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:109 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "Vertalingsonderhouder" + +#: main.cpp:82 +msgid "Arabic translation, internationalization of file saving fix." +msgstr "Arabische vertaling, internationalisatie van patch voor bestandsopslag" + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "Verdere Arabische vertaling" -#: main.cpp:88 -msgid "Brazilian Portuguese translation" -msgstr "Braziliaans-Portugese vertaling" +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" -#: main.cpp:89 +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "Braziliaanse/Portugese vertaling" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Verdere Braziliaanse/Portugese vertaling" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "Sergio Rafael Lemke" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "Maurício Arozi Moraes" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Catalaanse vertaling" -#: main.cpp:91 -msgid "Simplified Chinese translation, file send bug fix, proxy connect code" -msgstr "" -"Eenvoudig-Chinese vertaling, verbetering fout bestandsoverdracht, " -"programmacode voor verbinden met proxy" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" -#: main.cpp:92 -msgid "More Simplified Chinese translation" -msgstr "Verdere Eenvoudig-Chinese vertaling" +#: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "Adrià Arrufat" + +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "Verdere Catalaanse vertaling" #: main.cpp:93 -msgid "Traditional Chinese translation" -msgstr "Traditioneel-Chinese vertaling" +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" +"Vereenvoudigde Chinese vertaling, bugfix voor bestand verzenden, code voor " +"proxy verbinden" + +#: main.cpp:94 main.cpp:157 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "Verdere Vereenvoudigde Chinese vertaling" #: main.cpp:95 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:96 +msgid "Traditional Chinese translation" +msgstr "Traditionele Chinese vertaling" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "Verdere Traditionele Chinese vertaling" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinees" + +#: main.cpp:99 msgid "Danish translation" msgstr "Deense vertaling" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:100 msgid "More Danish translation" msgstr "Verdere Deense vertaling" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 msgid "Dutch translation" msgstr "Nederlandse vertaling" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 main.cpp:107 msgid "More Dutch translation" msgstr "Verdere Nederlandse vertaling" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:107 +msgid "Heimen Stoffels" +msgstr "Heimen Stoffels" + +#: main.cpp:109 +msgid "More German translation, Greek translation" +msgstr "Verdere Duitse vertaling, Griekse vertaling" + +#: main.cpp:110 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:110 +msgid "More Greek translation" +msgstr "Verdere Griekse vertaling" + +#: main.cpp:112 msgid "Estonian translation" msgstr "Estse vertaling" -#: main.cpp:101 +#: main.cpp:112 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:113 msgid "Finnish translation" msgstr "Finse vertaling" -#: main.cpp:102 main.cpp:103 +#: main.cpp:113 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:114 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:114 main.cpp:115 msgid "More Finnish translation" msgstr "Verdere Finse vertaling" -#: main.cpp:105 +#: main.cpp:115 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:117 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:117 msgid "French translation" msgstr "Franse vertaling" -#: main.cpp:106 +#: main.cpp:118 msgid "More French translation, MSN6 emoticon definitions" -msgstr "Verdere Franse vertaling, definities MSN6-emoticons" +msgstr "Verdere Franse vertaling, emoticondefenities van MSN 6" -#: main.cpp:107 +#: main.cpp:118 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:119 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:119 main.cpp:120 main.cpp:121 msgid "More French translation" msgstr "Verdere Franse vertaling" -#: main.cpp:109 +#: main.cpp:120 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:121 +msgid "Scias" +msgstr "Scias" + +#: main.cpp:123 msgid "Hungarian translation" msgstr "Hongaarse vertaling" -#: main.cpp:110 main.cpp:111 +#: main.cpp:123 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:124 +msgid "More Hungarian translation" +msgstr "Verdere Hongaarse vertaling" + +#: main.cpp:124 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:125 main.cpp:126 msgid "More Italian translation" msgstr "Verdere Italiaanse vertaling" -#: main.cpp:112 +#: main.cpp:126 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:127 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:127 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" +"Verdere Italiaanse vertaling, groepselectie in dialoogvenster 'toegevoegde " +"gebruiker contacteren'" + +#: main.cpp:128 msgid "Korean translation" msgstr "Koreaanse vertaling" -#: main.cpp:113 -msgid "Norsk Bokmål translation" -msgstr "Vertaling naar Noors Bokmål" +#: main.cpp:128 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" -#: main.cpp:115 +#: main.cpp:129 +msgid "Norsk Bokmål translation" +msgstr "Noorse vertaling" + +#: main.cpp:129 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:131 +msgid "Serbian translation" +msgstr "Servische vertaling" + +#: main.cpp:131 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:133 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:133 +msgid "Slovak translation" +msgstr "Slowaakse vertaling" + +#: main.cpp:134 +msgid "Matjaž Kaše" +msgstr "Matjaž kaše" + +#: main.cpp:134 msgid "Slovenian translation" msgstr "Sloveense vertaling" -#: main.cpp:116 +#: main.cpp:136 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:136 msgid "Spanish translation" msgstr "Spaanse vertaling" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:137 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 main.cpp:141 +#: main.cpp:142 main.cpp:143 msgid "More Spanish translation" msgstr "Verdere Spaanse vertaling" -#: main.cpp:121 +#: main.cpp:138 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:139 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:140 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:141 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:142 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:143 +msgid "Manuel Ramírez" +msgstr "Manuel Ramírez" + +#: main.cpp:145 +msgid "Christian Lundgren" +msgstr "Christian Lundgren " + +#: main.cpp:145 msgid "Swedish translation" msgstr "Zweedse vertaling" -#: main.cpp:123 -msgid "Thai translation" -msgstr "Siamese vertaling" +#: main.cpp:146 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" -#: main.cpp:124 +#: main.cpp:146 +msgid "More Swedish translation" +msgstr "Verdere Zweedse vertaling" + +#: main.cpp:148 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:148 +msgid "Thai translation" +msgstr "Thaise vertaling" + +#: main.cpp:149 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:149 msgid "Turkish translation" msgstr "Turkse vertaling" -#: main.cpp:125 main.cpp:126 +#: main.cpp:150 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:150 main.cpp:151 msgid "More Turkish translation" msgstr "Verdere Turkse vertaling" -#: main.cpp:129 +#: main.cpp:151 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:154 +msgid "MSNP12 support, various patches" +msgstr "Ondersteuning voor MSN P 12, verschillende patches" + +#: main.cpp:154 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:155 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:155 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:130 +#: main.cpp:156 +msgid "File transfer thumbnails" +msgstr "Voorvertoningen tijdens bestandsoverdracht" + +#: main.cpp:156 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:157 msgid "P4-Context field support" -msgstr "Ondersteuning voor 'P4-context'veld" +msgstr "P4-context-ondersteuning in tekstvelden" -#: main.cpp:131 +#: main.cpp:158 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:158 msgid "Xinerama fixes" -msgstr "Verbeterde ondersteuning van Xinerama" +msgstr "Fixes betreft Xinerama" -#: main.cpp:132 +#: main.cpp:159 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:159 msgid "Original file receive code" -msgstr "Originele programmacode voor de ontvangst van bestanden" +msgstr "Oorspronkelijke code voor ontvangen van bestanden" -#: main.cpp:133 -msgid "Various internationalization fixes." -msgstr "Verscheidene verbeteringen van internationalisatie." +#: main.cpp:160 +msgid "KWallet support" +msgstr "Ondersteuning voor KWallet" -#: main.cpp:134 -msgid "GnomeMeeting developer" -msgstr "Ontwikkelaar van GnomeMeeting" +#: main.cpp:160 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:135 -msgid "Guy with a bag over his head" -msgstr "Jongen met zak over zijn hoofd" - -#: main.cpp:138 -msgid "Inspiration and assorted code" -msgstr "Inspiratie en wat programmeerwerk" - -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +#: main.cpp:161 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" msgstr "" -"Oude programmacode voor aankondigingen, basis van de p2p-code, \"msn " -"challenge handler\"" +"Optie voor blokkeren van meldingen, optie voor uitzetten van winks, datum " +"van laatste bericht-mogelijkheid" -#: main.cpp:140 +#: main.cpp:162 +msgid "IRC-like commands in the chat window" +msgstr "IRC-achtige commando's in het chatvenster" + +#: main.cpp:163 +msgid "Chat history dialog" +msgstr "Dialoogvenster voor chatgeschiedenis" + +#: main.cpp:163 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:166 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:166 +msgid "Various internationalization fixes" +msgstr "Verschillende internationalisatiefixes" + +#: main.cpp:167 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:167 +msgid "Various internationalization fixes." +msgstr "Verschillende internationalisatiefixes." + +#: main.cpp:169 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:169 +msgid "GnomeMeeting developer" +msgstr "GnomeMeeting-ontwikkelaar" + +#: main.cpp:170 +msgid "Guy with a bag over his head" +msgstr "Gast met een zak over z'n hoofd" + +#: main.cpp:170 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:173 +msgid "Inspiration and assorted code" +msgstr "Inspiratie en code" + +#: main.cpp:173 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:174 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:174 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" +"Oude code voor pop-upmeldingen, oorspronkelijke p2p-code, msn-" +"challengehandler" + +#: main.cpp:175 msgid "Idle timer code" -msgstr "Programmacode voor \"Niet actief\"-tijdsduur" +msgstr "Code voor inactiviteitsteller" -#: main.cpp:141 +#: main.cpp:175 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:176 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:176 msgid "Close-to-tray icon screenshot code" msgstr "" +"Code voor screenshot met instructies betreft het sluiten naar het systeemvak" -#: main.cpp:144 +#: main.cpp:177 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:177 +msgid "Custom crash handler implementation" +msgstr "Implementatie van eigen crash-handler" + +#: main.cpp:178 +msgid "" +"KNotify not giving focus bug fix and KWin focus stealing prevention " +"workaround" +msgstr "" +"KNotify geeft geen focus bug fix en KWin focus stealing prevention workaround" + +#: main.cpp:178 +msgid "Quassel" +msgstr "Quassel" + +#: main.cpp:181 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" +"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:181 msgid "Your name here?" msgstr "Uw naam hier?" -#: main.cpp:144 -#, fuzzy -msgid "" -"You are welcome to sent 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:184 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Uw namen" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:185 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Uw e-mailadressen" + +#: main.cpp:191 +msgid "Do not show the contact list window initially" +msgstr "Het contactenvenster niet weergeven tijdens opstarten van KMess" + +#: main.cpp:192 +msgid "Autologin with the given email address" +msgstr "Automatisch inloggen met het opgegeven e-mailadres" + +#: main.cpp:197 +msgid "Run a debug test (developer build only)" +msgstr "Een debugtest starten (alleen voor ontwikkelaars!)" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "Individuelen" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Toegestaan" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Verwijderd" + +#: network/applications/application.cpp:294 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:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "De contactpersoon heeft de uitnodiging geweigerd." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." -msgstr "U heeft de sessie afgebroken." +msgstr "U heeft de sessie beëindigd." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "U heeft de uitnodiging geweigerd." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to
accept or cancel?" -msgstr "Wilt u aanvaarden of weigeren?" +msgstr "Wilt u dit accepteren of weigeren?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." msgstr "Klik om te weigeren." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +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:209 -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 +#, kde-format +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:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Wordt verbonden met %1, poort %2" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"De overdracht van bestand "%1" is mislukt. Kon het bestand niet " +"opslaan." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "De overdracht werd afgebroken" +#: network/applications/filetransfer.cpp:295 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "" +"De overdracht van "%1" is mislukt. Kon het bronbestand niet openen." -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Verbinding gemaakt" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Bestand met succes verzonden: %1" - -#: network/applications/filetransfer.cpp:600 -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:604 -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:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "%1 wordt nu verzonden" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Overdracht geaccepteerd." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Verbinden met %1, poort %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:548 +#, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "" +"De contactpersoon heeft de bestandsoverdracht van "%1" geannuleerd." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:559 +#, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "U heeft de bestandsoverdracht van "%1" geannuleerd." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:570 +#, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "U heeft de bestandsoverdracht van "%1" geweigerd." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Verbinding gemaakt" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:674 +#, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Bestand "%1" succesvol verzonden." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:678 +#, kde-format +msgid "Successfully received the file "%1"." +msgstr "Bestand "%1" succesvol ontvangen." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:811 +#, kde-format +msgid "" +"The transfer of the 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:816 +#, kde-format +msgid "" +"The transfer of the 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:850 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Verzenden van bestand "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:888 +#, kde-format +msgid "The contact has accepted the transfer of the 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:3217 msgid "Negotiating options to connect" -msgstr "" +msgstr "Onderhandelingsopties om te verbinden" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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." +msgstr "" +"De uitnodiging voor de bestadsoverdracht is geannuleerd. Er is corrupte data " +"ontvangen." -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "De overdracht van %1 is mislukt. Bestand kon niet worden geopend" +#: network/applications/filetransferp2p.cpp:404 +#, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "U heeft de bestandsoverdracht van "%1" geaccepteerd." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "De contactpersoon heeft de overdracht afgebroken." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:614 msgid "File could not be written" -msgstr "" +msgstr "Bestand kon niet geschreven worden" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "De overdracht van %1 is mislukt. Het bestand bestaat niet." - -#: network/applications/filetransferp2p.cpp:779 -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/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "Bestand %1 (%2) wordt nu verzonden" - -#: network/applications/gnomemeeting.cpp:55 +#: 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:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "GnomeMeeting wordt gestart. Wordt verbonden met %1." +msgstr "GnomeMeeting starten. Verbinden met %1." -#: network/applications/gnomemeeting.cpp:156 +#: 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:109 -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." - -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "De uitnodiging is afgebroken. Er is een interne fout is opgetreden." - -#: network/applications/mimeapplication.cpp:125 -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." - -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "" -"De uitnodiging is afgebroken. Het wachten op bestandsgegevens duurde te " -"lang." - -#: network/applications/mimeapplication.cpp:135 +#: network/applications/inktransferp2p.cpp:108 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +"%1 has tried to send you an handwritten message, but it could not be " +"received." msgstr "" -"De uitnodiging is afgebroken. De chatverbinding werd afgesloten door de " -"schakelserver." +"%1 probeerde een handgeschreven bericht naar u te versturen, maar het " +"kon niet worden ontvangen." -#: network/applications/mimeapplication.cpp:141 +#: network/applications/inktransferp2p.cpp:114 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "The handwritten message to %1 could not be delivered." +msgstr "" +"Het verzenden van het handgeschreven bericht naar %1 is mislukt." + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "" +"De uitnodiging is afgewezen. Ze wordt niet ondersteund door het " +"chatprogramma van deze contactpersoon." + +#: network/applications/mimeapplication.cpp:164 +msgid "The invitation was aborted. An internal error occured." +msgstr "De uitnodiging is afgebroken. Er is een interne fout opgetreden." + +#: network/applications/mimeapplication.cpp:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "" +"De uitnodiging is afgebroken. Er trad een time-out op terwijl er werd " +"gewacht op de gebruiker." + +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "" +"De uitnodiging is afgebroken. Er trad een time-out op terwijl er werd " +"gewacht op data." + +#: network/applications/mimeapplication.cpp:180 +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "" +"De uitnodiging is afgebroken. Het schakelbord heeft de chatverbinding " +"gesloten." + +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." -msgstr "De uitnodiging werd afgebroken." +msgstr "De uitnodiging is afgebroken." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "U wordt uitgenodigd het bureaublad van deze persoon te delen." +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this contact's desktop." +msgstr "U bent uitgenodigd om het bureaublad van deze persoon te bekijken." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." -msgstr "KRDC wordt gestart. Wordt verbonden met %1." +msgstr "KRDC starten. Verbinden met %1." -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by KMess." msgstr "" -"De contactpersoon heeft een MSN6-functie gestart die KMess nog niet " -"ondersteunt." +"De contactpersoon nodigt u uit voor een activiteit die nog niet ondersteund " +"wordt door KMess." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" -"De uitnodiging is afgebroken. De contactpersoon stuurde onjuiste gegevens, " -"of KMess ondersteunt die niet." +"De uitnodiging is afgebroken. De contactpersoon heeft corrupte data " +"verzonden, of KMess ondersteunt dit niet." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "De overdracht is mislukt. Gereed maken van gegevens niet gelukt." +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "De overdracht is mislukt. De datavoorbereiding is mislukt." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." msgstr "" -"De contactpersoon heeft de uitnodiging afgewezen. Er is een interne fout " -"opgestreden." +"De uitnodiging is geannuleerd. Het bericht werd niet naar ons verstuurd." -#: network/applications/p2papplication.cpp:1624 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "" +"De overdracht is afgebroken. De contactpersoon heeft corrupte data " +"verzonden, of KMess ondersteunt dit niet." + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "" +"De contactpersoon heeft de uitnodiging geweigerd. Er is een interne fout " +"opgetreden." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "Wachten op verbinding op %1, poort %2" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "" +"Terugschakelen naar indirecte bestandsoverdracht (is mogelijk langzaam)" + +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "Wachten op verbinding" + +#: network/applications/p2papplication.cpp:3423 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "" +"De uitnodiging is afgebroken. Er trad een time-out op terwijl er werd " +"gewacht op de contactpersoon." + +#: network/applications/p2papplication.cpp:3432 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "" +"De uitnodiging is afgebroken. Er trad een time-out op terwijl er werd " +"gewacht op een succesvolle of mislukte verbindingspoging." + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "" +"De uitnodiging is afgebroken. Er trad een time-out op terwijl er werd " +"gewacht op data." + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +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/p2papplicationbase.cpp:627 msgid "The transfer failed." msgstr "De overdracht is mislukt." -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." msgstr "" -"De overdracht is mislukt. De contactpersoon stuurde onjuiste gegevens, of " -"KMess ondersteunt die niet." +"De overdracht is mislukt. Er trad een time-out op terwijl er werd gewacht op " +"de contactpersoon." -#: network/applications/p2papplication.cpp:2038 -msgid "The invitation was cancelled. Message was not directed to us." -msgstr "De uitnodiging is afgebroken. Het bericht was niet voor ons." +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." +msgstr "De overdracht is mislukt. Er trad een interne fout op." -#: network/applications/p2papplication.cpp:2584 -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:1208 +msgid "The transfer failed. Could not open data source." +msgstr "De overdracht is mislukt. Kon de databron niet openen." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 -msgid "Awaiting connection at %1, port %2" -msgstr "Wacht op verbinding op %1, poort %2" - -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 -msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "Terug naar indirecte bestandsoverdracht (mogelijk langzamer)." - -#: network/applications/p2papplication.cpp:3274 -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/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "De overdracht is mislukt. Er is een interne fout is opgetreden." - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "De overdracht is mislukt. Kon gegevensbron niet openen." - -#: network/applications/p2papplication.cpp:4844 -#, fuzzy -msgid "Waiting for connection" -msgstr "Wachten op lijst met contactpersonen..." - -#: network/applications/p2papplication.cpp:5013 -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." - -#: network/applications/p2papplication.cpp:5022 -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." - -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "De uitnodiging is geannuleerd. Het wachten op gegevens duurde te lang." - -#: network/applications/voiceconversation.cpp:77 +#: 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:82 +#: 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:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "U heeft de uitnodiging voor een gesprek (microfoon) geannuleerd." +msgstr "U heeft het audiogesprek beëindigd." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "De uitnodiging werd geannuleerd. Er is geen microfoon beschikbaar." +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "" +"De uitnodiging is geannuleerd. Het audioapparaat kon niet geopend worden." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." -msgstr "Start gesprek (microfoon). Verbinden met %1." +msgstr "Audiogesprek starten. Verbinden met %1." -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." -msgstr "Start gesprek (microfoon). Luisteren op %1." +msgstr "Audiogesprek starten. Luisteren op %1." -#: network/applications/voiceconversation.cpp:293 +#: 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:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Het verzenden van %1 is.geannuleerd." +#: 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/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "U bent uitgenodigd om het webcambeeld van deze persoon te kijken." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webcam" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "U heeft de bestandsoverdracht van "%1" geannuleerd." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "" +"De contactpersoon heeft de bestandsoverdracht van "%1" geannuleerd." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "Mislukt" -#: network/extra/msnftpconnection.cpp:410 -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 +#, kde-format +msgid "Sending file %1" +msgstr "Bestand verzenden naar %1" -#: network/extra/msnftpconnection.cpp:411 -#, fuzzy -msgid "Couldn't open a local port." -msgstr "" -"De overdracht van %1 is mislukt. Kon geen poort openen op deze computer." +#: network/extra/msnftpconnection.cpp:398 +#, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "De bestandsoverdracht van %1 is mislukt. Kon geen lokale poort openen." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." +msgstr "Kon geen lokale poort openen." + +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "Beginnen met de bestandsoverdracht" +msgstr "Bestandsoverdracht beginnen" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +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:482 -#, 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:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" -msgstr "Bestand %1 wordt ontvangen" +msgstr "Ontvangen van bestand %1" -#: network/msnconnection.cpp:140 +#: network/msnconnection.cpp:378 +msgid "Invalid command syntax" +msgstr "Ongeldige commandosyntaxis" + +#: network/msnconnection.cpp:382 +msgid "Invalid command parameter" +msgstr "Ongeldige commandoparameter" + +#: network/msnconnection.cpp:385 +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "" +"Het e-mailadres dat u probeert toe te voegen, is geen Live Messenger-account." + +#: network/msnconnection.cpp:390 +msgid "Domain name missing" +msgstr "Ontbrekende domeinnaam" + +#: network/msnconnection.cpp:394 +msgid "Already logged in" +msgstr "Al ingelogd" + +#: network/msnconnection.cpp:397 +msgid "The given account name is invalid" +msgstr "De opgegeven accountnaam is ongeldig" + +#: network/msnconnection.cpp:401 msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"KMess kon geen verbinding maken met de MSN Messenger service.\n" -"Controleer uw verbinding met het internet.\n" -"Systeemfout: %1 (code %2)." +"deze accountnaam is ongeldig, of uw Passport-account is nog niet bevestigd" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping gemist" - -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 pings gemist" - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "De verbinding met de server is verbroken." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "De verbinding werd door de andere server beëindigd." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Toegestaan" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Verwijderd" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -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." - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "Status van MSN Messenger Service weergeven?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Serverfout" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy -msgid "" -"You have been disconnected because you connected from another MSN 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:1553 -msgid "Got synchronization" -msgstr "Synchronisatie verkregen" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Aanmelden" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Ontving bevestiging gebruiker" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Wachten op lijst met contactpersonen..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Overdracht naar meldingenserver" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "Aanmelden is mislukt, controleer uw gebruikersnaam en wachtwoord" - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Verbinden..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess ontving een onbekende opdracht van de server: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Er is een interne fout opgetreden in KMess: %1" - -#: network/msnnotificationconnection.cpp:2243 -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" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "De opgegeven gebruikersnaam is ongeldig" - -#: network/msnnotificationconnection.cpp:2255 -msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "" -"De opgegeven gebruikersnaam is ongeldig, of uw \"paspoort\" is nog niet " -"bevestigd" - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:404 msgid "Your contact list is full" -msgstr "Uw lijst met contactpersonen is vol" +msgstr "Uw contactenlijst is vol" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:409 +msgid "Invalid SBP parameter" +msgstr "Ongeldige SBP-parameter" + +#: network/msnconnection.cpp:412 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:2267 +#: network/msnconnection.cpp:416 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:2270 +#: network/msnconnection.cpp:420 msgid "This contact is not online" msgstr "Deze contactpersoon is niet online" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Er zijn teveel groepen in uw lijst van contactpersonen" +#: network/msnconnection.cpp:425 +msgid "Already in this mode" +msgstr "Al reeds in deze modus" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" +#: network/msnconnection.cpp:429 +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/msnconnection.cpp:433 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"Deze groepnaam is al in gebruik in uw contactenlijst. Gelieve een andere " +"naam te gebruiken." + +#: network/msnconnection.cpp:437 +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/msnconnection.cpp:441 +msgid "This group cannot be changed" msgstr "Deze groep kan niet gewijzigd worden" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:446 +msgid "Contact is not added to this group" +msgstr "Contact is niet aan deze groep toegevoegd" + +#: network/msnconnection.cpp:450 msgid "This group is not empty" -msgstr "Deze groep is niet leeg" +msgstr "De groep is niet leeg" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "" -"Deze naam voor een groep komt reeds voor in uw lijst van contactpersonen " -"voor Messenger of Hotmail" +#: network/msnconnection.cpp:454 +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:2291 -msgid "The group name is too long" -msgstr "De opgegeven naam voor een groep is te lang" +#: network/msnconnection.cpp:459 +msgid "Attempted to change group \"0\"" +msgstr "Geprobeerd om groep \"0\" te wijzigen" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:459 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Er trad een interne fout op in KMess: %1" + +#: network/msnconnection.cpp:463 +msgid "Invalid Group" +msgstr "Ongeldige groep" + +#: network/msnconnection.cpp:467 +msgid "Empty domain" +msgstr "Lege domeinnaam" + +#: network/msnconnection.cpp:471 +msgid "Wrong ADL command format" +msgstr "Ongeldig ADL-commandoformaat" + +#: network/msnconnection.cpp:474 msgid "Switchboard server failed" -msgstr "Schakelserver is uitgevallen" +msgstr "Schakelbordserver gefaald" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:477 msgid "Transfer to switchboard server failed" -msgstr "Overdracht naar schakelserver is mislukt" +msgstr "Overdracht naar schakelbordserver is mislukt" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:481 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:2316 +#: network/msnconnection.cpp:485 +msgid "Required field missing" +msgstr "Vereist veld mist" + +#: network/msnconnection.cpp:489 +msgid "Not logged in" +msgstr "Niet ingelogd" + +#: network/msnconnection.cpp:493 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "Dit account heeft geen toegang tot de Live Messenger-service" + +#: network/msnconnection.cpp:498 +msgid "Command is disabled" +msgstr "Commando is uitgeschakeld" + +#: network/msnconnection.cpp:501 +msgid "Your account is banned" +msgstr "Uw account is verbannen" + +#: network/msnconnection.cpp:505 +msgid "Challenge response failed" +msgstr "Challenge-antwoord mislukt" + +#: network/msnconnection.cpp:510 +msgid "Bad command data" +msgstr "Corrupte commandodata" + +#: network/msnconnection.cpp:514 +msgid "You are opening chat sessions too fast" +msgstr "U opent de chatsessies te snel" + +#: network/msnconnection.cpp:518 +msgid "You have too many open chat sessions" +msgstr "U heeft te veel actieve chatsessies" + +#: network/msnconnection.cpp:525 +msgid "Unexpected command sequence" +msgstr "Onverwachte commandosequentie" + +#: network/msnconnection.cpp:529 +msgid "Bad friend name" +msgstr "Corrupte schermnaam" + +#: network/msnconnection.cpp:535 +msgid "Bad CVR data" +msgstr "Corrupte CVR-data" + +#: network/msnconnection.cpp:541 +msgid "The server reports KMess is flooding it with too much data" +msgstr "De server meldt dat KMess hem overspoelt met data" + +#: network/msnconnection.cpp:548 +msgid "Authentication ticket was incorrect" +msgstr "Aanmeldingsticket was incorrect" + +#: network/msnconnection.cpp:551 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "" +"U kunt geen chat met iemand starten terwijl uw status op "" +"Onzichtbaar" staat ingesteld" + +#: network/msnconnection.cpp:555 +msgid "Not accepting new contacts" +msgstr "Geen nieuwe contacten accepteren" + +#: network/msnconnection.cpp:559 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" +"Je hebt een Kids Passport-account, dus heb je toestemming van je ouders " +"nodig om online te chatten" + +#: network/msnconnection.cpp:562 +msgid "Your Passport account needs to be verified first" +msgstr "Uw Passport-account moet nog geverifieerd worden" + +#: network/msnconnection.cpp:566 +msgid "Bad USR ticket" +msgstr "Corrupt USR-ticket" + +#: network/msnconnection.cpp:576 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:2322 -msgid "Your account is banned." -msgstr "Uw account is in de ban gedaan." - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "U heeft teveel sessies kort na elkaar geopend" - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "U heeft teveel sessies geopend" - -#: network/msnnotificationconnection.cpp:2341 -msgid "Bad friend name" -msgstr "Ongeldige bijnaam" - -#: 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/msnnotificationconnection.cpp:2359 -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." - -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:585 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" msgstr "" -"Je gebruikt een \"kinderpaspoort\", vraag aan je ouders toestemming om te " -"chatten." +"De Live Messenger-service is tijdelijk onbeschikbaar, er trad een interne " +"serverfout op" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Uw \"paspoort\" moet eerst bevestigd worden." +#: network/msnconnection.cpp:596 +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" +"De Live Messenger-service is tijdelijk onbeschikbaar, de server is overbelast" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN-fout" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Er is een interne serverfout" - -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "De server is te druk bezet" - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "De server is niet bereikbaar" - -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:600 msgid "Peer notification server down" -msgstr "Peer meldingsserver is uitgevallen" +msgstr "Peermeldingsserver offline" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:604 msgid "The server is going down" msgstr "De server wordt uitgezet" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:608 msgid "The server is going down soon" -msgstr "De server zal zo dadelijk worden uitgezet" +msgstr "De server wordt spoedig uitgezet" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:613 msgid "Write is blocking" -msgstr "Schrijven is geblokkeerd" +msgstr "Schrijven blokkeert" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:617 msgid "Session is overloaded" msgstr "Sessie is overbelast" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:624 msgid "The server is not available" -msgstr "De server is niet bereikbaar" +msgstr "De server is niet beschikbaar" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:628 msgid "Authentication failed" -msgstr "Aanmelden is mislukt" +msgstr "Aanmelden mislukt" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "De server accepteert geen nieuwe personen" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess ontving een onbekende foutmelding van de server: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Waarschuwing: de server wordt over 1 minuut voor onderhoud uitgezet!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:635 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "" -"De MSN-server meldt dat die over een minuut voor onderhoud wordt uitgezet." +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "Onbekende foutcode ontvangen van server: %1
Technische details: %2" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Waarschuwing: de server wordt over %1 minuten voor onderhoud uitgezet!" +#: network/msnconnection.cpp:652 network/msnnotificationconnection.cpp:2922 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN-fout" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnconnection.cpp:957 +msgid "Trying the HTTP fallback..." +msgstr "HTTP-terugvalmethode proberen..." + +#: network/msnnotificationconnection.cpp:1344 +msgid "Authenticating..." +msgstr "Aanmelden..." + +#: network/msnnotificationconnection.cpp:1368 +msgid "Authenticated" +msgstr "Aangemeld" + +#: network/msnnotificationconnection.cpp:1438 +msgid "Switching to another server..." +msgstr "Wisselen naar andere server..." + +#: network/msnnotificationconnection.cpp:1802 +msgid "Connecting..." +msgstr "Verbinden..." + +#: network/msnnotificationconnection.cpp:1947 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Onbekend commando ontvangen van de server: %1" + +#: network/msnnotificationconnection.cpp:2107 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuut" +msgstr[1] "%1 minuten" + +#: network/msnnotificationconnection.cpp:2110 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "De server wordt afgesloten voor onderhoud over %1!" + +#: network/msnnotificationconnection.cpp:2115 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "De Live Messenger-server wordt over %1 afgesloten voor onderhoud." + +#: network/msnnotificationconnection.cpp:2316 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess kon de offlineberichten niet doorvoeren.
Details: %1" + +#: network/msnnotificationconnection.cpp:2317 +msgid "SOAP client is no longer valid." +msgstr "SOAP-client is niet langer geldig" + +#: network/msnnotificationconnection.cpp:2587 +msgid "Authentication time limit exceeded" +msgstr "Aanmeldstijdslimiet verlopen" + +#: network/msnnotificationconnection.cpp:2766 +msgid "Waiting for contact list..." +msgstr "Wachten op contactenlijst..." + +#: network/msnnotificationconnection.cpp:2812 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Waarschuwing: %1

" + +#: network/msnnotificationconnection.cpp:2813 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "MSN-waarschuwing" + +#: network/msnnotificationconnection.cpp:2885 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Reden voor interne fout: %1" + +#: network/msnnotificationconnection.cpp:2920 +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" -"KMess kon Offline-IM-berichten niet verwerken.\n" -"\n" -"Details: %1" +"

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

" +msgstr "

Aanmelden mislukt, controleer uw accountnaam en wachtwoord.

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2933 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

het account %1 is op een andere locatie aangemeld.

" + +#: network/msnnotificationconnection.cpp:2936 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"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 %1 is ingelogd met een ander " +"chatprogramma, of op een andere locatie.

" -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2948 +msgctxt "Connection error: passive notification message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"KMess heeft geen toegang tot de andere webservice.\n" -"\n" -"Details: %1" +"

Kon geen verbinding maken met de Live Messenger-service.
Wellicht " +"moet u zich eerst aanmelden bij het netwerk?

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Deze persoon is offline of onzichtbaar." - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" -"De contactpersoon heeft een MSN7-functie gestart die KMess nog niet " -"ondersteunt." - -#: network/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "Het bericht \"%1\" is niet aangekomen!" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Er kon geen verbinding worden gemaakt: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "Te veel omleidingen door de logindienst" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Verbinding maken duurt te lang" - -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "In %1's chat: %2" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 zegt:
'%2'" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 heeft u een offline-bericht gestuurd:
'%2'" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "%1's chat vraagt aandacht!" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1:
%2" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 heeft u een buzzer verstuurd!" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1heeft u een wink verstuurd!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 wil de webcam gebruiken!" - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 zendt u een bestand!" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 heeft u een uitnodiging gestuurd!" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 heeft de webcam-sessie afgbroken!" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 heeft de bestandsoverdracht afgebroken!" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "De activiteit van %1 is beëindigd!" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 gaat accoord met het gebruik van de webcam!" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 gaat accoord met de bestandsoverdracht!" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 heeft uw uitnodiging aanvaard!" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 heeft de webcam-sessie beëindigd!" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "De bestandsuitwisseling met %1 is klaar!" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "De activiteit van %1 is beëindigd!" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "De webcam-sessie met %1 is mislukt!" - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "De bestandsuitwisseling met %1 is mislukt!" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "De activiteit van %1 is met een foutmelding beëindigd!" - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 is weggegaan" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 komt zodadelijk terug" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 is nu bezig" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 heeft uitgelogd" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 is nu onzichtbaar" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 is nu niet actief" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 is gaan lunchen" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 is aan de telefoon" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 is nu online" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Nieuwe email:
'%1'
van '%2'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "Verz&enden" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "Nieu&we regel" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Zijbalk" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Deze contactpersoon is niet in uw lijst opgenomen" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Klik hier om het profiel te tonen van deze contactpersoon." - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Klik om een email naar deze contactpersoon te sturen." - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Voer een sneltoets in voor deze emoticon:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Selecteer een afbeeldingsbestand:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Contactpersoon toevoegen" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/msnnotificationconnection.cpp:2951 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"

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 "" -"%1\n" -"heeft u toegevoegd aan zijn/haar lijst van contactpersonen. Wilt u:" +"

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 krijgt tot het netwerk.

Klik hier om de statuspagina van de Live Messenger-" +"service te openen.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Deze contactpersoon &toevoegen aan uw lijst van \"Vrienden\"" +#: network/msnnotificationconnection.cpp:2970 +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.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" +#: network/msnnotificationconnection.cpp:2972 +#, kde-format +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 "" -"Deze contactpersoon &niet toevoegen, maar hem/haar uw online-status tonen" +"

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.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" +#: network/msnnotificationconnection.cpp:2983 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Fout: %1

" + +#: network/msnnotificationconnection.cpp:2985 +#, kde-format +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:2996 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Messenger Service-fout: %1

" + +#: network/msnnotificationconnection.cpp:2998 +#, kde-format +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:3006 +#, kde-format +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Foutmelding van KMess

%1

" + +#: network/msnnotificationconnection.cpp:3008 +#, kde-format +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:3019 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Netwerkverbinding verbroken.

" + +#: network/msnnotificationconnection.cpp:3021 +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:3077 +#, kde-format +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

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

" msgstr "" -"&Blokkeren dat deze persoon contact met u maakt of uw online-status ziet" +"

Informatie voor ontwikkelaars:
Foutcode: %1
Foutmelding: %2

" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "&Opschonen" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" +"Voer uw gebruikersnaam en wachtwoord in om aan te melden bij de netwerkproxy." -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Vul uw inloggegevens in:" +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Interne foutcode: %2)" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "Emailadres" +#: network/msnsockethttp.cpp:696 +#, kde-format +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" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Wachtwoord" +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "Verbindings-tijdlimiet is verlopen" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Status bij inloggen" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping verloren" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "&Onthoud dit profiel" +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pings verloren" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Verbinden" +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "De verbinding met de server is verbroken" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Type hier uw persoonlijke bericht in" +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "Het opgegeven e-mailadres, \"%1\", is geen geldig adres." -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Luistert naar %1" +#: network/soap/addressbookservice.cpp:787 +#, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" +"Het opgegeven e-mailadres, \"%1\", behoort niet tot een Live Messenger-" +"account." -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess-melding" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:295 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Ongeldige webserviceaanvraag (%1)" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/soap/httpsoapconnection.cpp:427 +#, kde-format +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:504 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Te veel omleidingen bij de webservice" + +#: network/soap/httpsoapconnection.cpp:548 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "De service voor offlineberichten is momenteel niet beschikbaar" + +#: network/soap/httpsoapconnection.cpp:554 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "De webservice van Live Messenger ondergaat momenteel problemen" + +#: network/soap/httpsoapconnection.cpp:568 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Ongeldig webserviceantwoord %1 (%2)" + +#: network/soap/httpsoapconnection.cpp:607 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Geen antwoord van webservice" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Onverwacht antwoord van server (%1)" + +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "In %1's chat:
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 zegt:
'%2'" + +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 heeft u een offlinebericht verstuurd:
'%2'" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "%1's chatgesprek vraagt attentie!" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 heeft u een handgeschreven bericht verstuurd!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 heeft u een buzzer verstuurd!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 heeft u een wink verstuurd!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 wilt uw webcambeeld bekijken!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 stuurt u een bestand!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 heeft u een uitnodiging verstuurd!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 heeft de webcamsessie geannuleerd!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 heeft de bestandsoverdracht geannuleerd!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1's activiteit is beëindigd!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 heeft het webcamverzoek geaccepteerd!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 heeft de bestandsoverdracht geaccepteerd!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 heeft uw uitnodiging geaccepteerd!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 heeft de webcamsessie beëindigd!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "De bestandsoverdracht met %1 is klaar!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1's activiteit is beëindigd!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1's webcamsessie is mislukt!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "De bestandsoverdracht met %1 is mislukt!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1'activiteit is beëindigd met een fout!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
is nu online" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
is weg gegaan" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
is zo terug" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
is nu bezig" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
is onzichtbaar geworden" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
is inactief geworden" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
heeft uitgelogd" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
is aan de telefoon" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
gaat lunchen" + +#: notification/newemailnotification.cpp:92 +#, kde-format +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'" + +#: 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 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Bladeren..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Afbeelding selecteren en bijsnijden..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Vorige afbeelding instellen..." + +#. i18n: file: settings/accountpage.ui:136 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:458 rc.cpp:372 +msgid "Display Picture" +msgstr "Schermafbeelding" + +#: settings/accountpage.cpp:488 +msgid "Downloading of display picture failed" +msgstr "Laden van schermafbeelding mislukt" + +#: settings/accountpage.cpp:547 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Er trad een fout op tijdens het veranderen van de schermafbeelding.\n" +"Zorg dat u een bestaande afbeelding heeft geselecteerd." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Instellingen" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Account" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Mijn account" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Contactenlijst" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Chatten" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Chatloggen" + +#: 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 "Klik hier om dit account" + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"Het ingevoerde e-mailadres is niet geldig, en kan niet als account gebruikt " +"worden: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "Het e-mailadres dat u heeft ingevoerd is al in gebruik: '%1'" + +#: settings/accountsettingsdialog.cpp:220 +msgid "Please enter a friendly name for this account." +msgstr "Voer alstublieft een msn-naam in voor deze account." + +#: settings/accountsettingsdialog.cpp:301 +msgid "Are you sure you want to delete this account?" +msgstr "Weet u zeker dat u dit account wilt verwijderen?" + +#: settings/accountsmanagerpage.cpp:160 +#, kde-format +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 het account '%1' wilt verwijderen?
Alle " +"instellingen van dit account zullen verloren gaan." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Hoi, hoe gaat het? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Stacy" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Goed!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Ik kom /net/ terug van mijn vakantie in Italië!" + +#: 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 emoticon-naam" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Bestaande emoticon vervangen" + +#: settings/emoticonspage.cpp:233 +#, kde-format +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 "KMess Instellingen" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Accounts" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Uw bijnaam:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notificaties" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -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." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." +msgstr "Geen beschikbare webbrowsers gevonden." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Uw emailadres:" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Geen beschikbare e-mailprogramma's gevonden." -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format -msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom web browser!" msgstr "" -"Vul het emailadres in van uw MSN-paspoort. U kunt een nieuw paspoort " -"verkrijgen op http://register.passport.com/" +"U moet een terminalcommando opgeven om een eigen webbrowser op te starten." -#. i18n: file ./settings/accountswidgetinterface.ui line 59 +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 webbrowser 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: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:321 +#, c-format +msgid "" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing emails 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:344 +msgid "You have to select a directory for the received files!" +msgstr "U moet een map voor ontvangen bestanden selecteren!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Selecteer bestandslocatie" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Verzenden met KMess" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess kon de configuratiebestanden niet openen!

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "Een opmerking naar de ontwikkelaars &versturen" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "Feedback&-pictogrammen weergeven" + +#: utils/likeback/likeback.cpp:323 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Welkom bij de testversie van %1." + +#: utils/likeback/likeback.cpp:328 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Welkom bij %1." + +#: utils/likeback/likeback.cpp:336 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" +"Wanneer u een frustrerende of positieve ervaring heeft, klik dan op het " +"bijbehorende gezichtje onder de vensterbalk, beschrijf uw ervaring en klik " +"op 'Verzenden'." + +#: utils/likeback/likeback.cpp:343 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" +"Wanneer u een positieve ervaring heeft, klik dan op het lachende gezichtje " +"onder de vensterbalk, beschrijf uw ervaring en klik op 'Verzenden'." + +#: utils/likeback/likeback.cpp:350 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" +"Wanneer u een frustrerende ervaring heeft, klik dan op het fronsende " +"gezichtje onder de vensterbalk, beschrijf uw ervaring en klik op 'Verzenden'." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on '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:372 +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:380 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" +"De welkomstpagina van deze assistent gebruik ik niet. Kost onnodig " +"veel tijd." + +#: utils/likeback/likeback.cpp:388 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows 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:396 +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:409 +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:412 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Voorbeeld" +msgstr[1] "Voorbeelden" + +#: utils/likeback/likeback.cpp:418 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" +"

U kunt de ontwikkelaars een korte omschrijving sturen van uw mening over %" +"1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +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:290 +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 bedanken u voor de moeite.

" + +#: utils/likeback/likebackdialog.cpp:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Opmerking verzonden." + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" +"

Er was een probleem met het verzenden van het rapport.

Gelieve het " +"later nog een keer te proberen.

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Probleem met opmerking verzenden" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +msgid "Standard text mode" +msgstr "Standaard tekstmodus" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to the standard text mode." +msgstr "Klik op deze knop om naar de standaard tekstmodus te om te schakelen." + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten message." +msgstr "" +"Klik op deze knop om naar de tekenmodus over te schakelen, zodat u " +"handgeschreven berichten kunt verzenden." + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Standaardemoticons" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Klik op deze knop om alle standaard Live Messenger emoticons te laten zien, " +"zodat u ze makkelijk kunt invoegen in uw berichten." + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "Eigen emoticons" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Klik op deze knop om al uw eigen emoticons te laten zien, zodat u deze " +"makkelijk kunt invoegen in uw berichten." + +#. 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 "Klik op deze knop om beschikbare winks te tonen." + +#. 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "V&erzenden" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chatten" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Hoofdwerkbalk" + +#. 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 tonen" + +#. i18n: file: chat/contactswidget.ui:107 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Klik hier om uw accountinstellingen te openen" + +#. 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 "" +"Voer hiet het e-mailadres in van de contactpersoon die u aan de " +"contactenlijst wilt toevoegen" + +#. 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:267 +msgid "Email address:" +msgstr "E-mailadres:" + +#. 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: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Kies een afbeelding:" + +#. 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 "" +"Voer een bericht in dat automatisch wordt verzonden naar mensen die u " +"proberen te bereiken." + +#. 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Filter voor chatloggen" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Op &gesprek sorteren" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:103 +msgid "Filter by &date" +msgstr "Op &datum sorteren" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:106 +msgid "from" +msgstr "van" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:109 +msgid "to" +msgstr "naar" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:112 +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:115 +msgid "&Add this person to the following groups of your contact list:" +msgstr "&Voeg deze persoon aan de volgende groepen toe:" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:118 +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "" +"Voeg deze persoon &niet toe, maar sta hem of haar alleen toe om mijn status " +"te zen" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:121 +msgid "&Block this person from contacting you and seeing your status" +msgstr "" +"&Blokkeer deze persoon, zodat deze mij niet kan bereiken of mijn online " +"status kan zien" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:127 +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: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:130 +msgid "&Restore" +msgstr "&Herstellen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:133 +msgid "&Groups:" +msgstr "&Groepen:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:136 +msgid "Use an &alternative name for this contact" +msgstr "Gebruik een &alternatieve naam voor deze persoon" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:139 +msgid "Disable notifications for this contact" +msgstr "Schakel notificaties uit voor deze contactpersoon" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:142 +msgid "&Sound:" +msgstr "&Geluid:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:145 +msgid "&Display Pictures" +msgstr "Schermafbeel&dingen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:148 +msgid "Click here to use the selected picture as your display picture" +msgstr "" +"Klik hier om de geselecteerde foto te gebruiken als uw schermafbeelding" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) #: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Uw wachtwoord:" +msgid "Use As Display Picture" +msgstr "Als schermafbeelding gebruiken" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) #: rc.cpp:154 -#, no-c-format +msgid "&Clear Cache" +msgstr "&Cache legen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:163 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"Het is mogelijk om alle door deze contactpersoon ontvangen emoticons " +"te verbergen. Klik met de rechtermuisknop op een ontvangen emoticon, en kies " +"\"Deze emoticon negeren\". Met dit venster kunt u verborgen emoticons " +"herstellen. " + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:166 +msgid "Click here to restore the selected emoticon" +msgstr "Klik hier om de geselecteerde emoticon terug te zetten" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:169 +msgid "Resto&re" +msgstr "He&rstellen" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:175 +msgid "Available Contacts" +msgstr "Beschikbare contactpersonen" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:178 +msgid "Invite a person not on your contact 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:181 +msgid "Enter the email address of a person to invite" +msgstr "Voer het e-mailadres in van de contactpersoon die u wilt uitnodigen" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:184 +msgid "Invited Contacts" +msgstr "Uitgenodigde contactpersonen" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:193 +msgid "Items to export:" +msgstr "Te exporteren items:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:196 +msgid "Format" +msgstr "Formaat" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:199 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:202 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:205 +msgid "Contacts:" +msgstr "Contactpersonen:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:208 +msgid "Select All" +msgstr "Alles selecteren" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:211 +msgid "Deselect All" +msgstr "Alles deselecteren" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:214 +msgid "Export..." +msgstr "Exporteren..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:217 +msgid "Close" +msgstr "Sluiten" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:223 +msgid "Command to Current Tab" +msgstr "Commando naar huidig tabblad " + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:226 +msgid "Command:" +msgstr "Commando:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:229 +msgid "Type:" +msgstr "Type:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:232 +msgid "Standard" +msgstr "Standaard" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:235 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:238 +msgid "Send" +msgstr "Verzenden" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:241 +msgid "Command payload (can be empty):" +msgstr "Commandopayload (kan leeg gelaten worden):" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:246 +msgid "Open" +msgstr "Openen" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:249 +msgid "Cancel" +msgstr "Annuleren" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:252 +msgid "&Download" +msgstr "&Download" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:255 +msgid "&Upload" +msgstr "&Upload" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:258 +msgid "C&lean Up" +msgstr "O&pschonen" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:261 +msgid "&Close" +msgstr "&Sluiten" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:264 +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 geselecteerhet account te bekijken, " +"of scroll met de muis om tussen de opgeslagen accounts te wisselen" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:270 +msgid "" +"Enter 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: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:273 +msgid "Password:" +msgstr "Wachtwoord:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:276 +msgid "Enter here your account's password" +msgstr "Voer hier het wachtwoord van uw account in" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:279 +msgid "Status at login:" +msgstr "Status bij login:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:282 +msgid "Choose a status to set when successfully connected." +msgstr "" +"Kies een status die wordt ingesteld wanneer u succesvol bent aangemeld." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:285 +msgid "If enabled, KMess will save your account" +msgstr "KMess zal uw account bewaren, wanneer dit is ingeschakeld" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:288 +msgid "Remem&ber account" +msgstr "Account onthou&den" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:294 +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: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:297 +msgid "R&emember password" +msgstr "Wachtwoord o&nthouden" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:303 +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:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:309 +msgid "New Account" +msgstr "Nieuw account" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:312 +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:315 +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 "" +"Klik hier om een nieuwe Live-account te registreren, waarmee u op MSN " +"kunt inloggen.
U kunt ook een bestaand e-mailadres gebruiken." + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:318 +msgid "Password forgotten?" +msgstr "Wachtwoord vergeten?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:321 +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:324 +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 accountwachtwoord " +"te herstellen" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:327 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Verbinden" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:330 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Beeld" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Acties" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:336 +msgid "Form" +msgstr "Formulier" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:339 +msgid "Account &Info" +msgstr "Account&info" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:342 +msgid "Your Account Information" +msgstr "Uw accountinformatie" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:345 +msgid "Enter a name other contacts should see when you are connected." +msgstr "Voer een naam in die contactpersonen zien wanneer u aangemeld bent." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:348 +msgid "&Friendly name:" +msgstr "&Schermnaam:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:351 +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:354 +msgid "&Email address:" +msgstr "&E-mailadres:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:357 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: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Afbeelding:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:360 +msgid "&Password:" +msgstr "&Wachtwoord:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:363 +msgid "Click here to have your password saved by KMess" +msgstr "Klik hier om uw wachtwoord op te laten slaan door KMess" + +#. i18n: file: settings/accountpage.ui:117 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:366 +msgid "" +"If you enable this option, KMess will save your account's password. This way " +"you will not have to enter your password on every start up, in order to log " +"in. Please keep in mind, that other persons that have access to this " +"computer may easily log in to your account, if this option is enabled." +msgstr "" +"Als u deze optie inschakelt, zal KMess uw wachtwoord opslaan. Op deze manier " +"hoeft u niet uw wachtwoord in te geven bij elke opstart van KMess om in te " +"loggen. Houdt in gedachten dat andere personen die toegang hebben tot deze " +"computer, in kunnen loggen op uw account, als u dit inschakelt." + +#. i18n: file: settings/accountpage.ui:120 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:369 +msgid "&Remember password" +msgstr "Wachtwoord &onthouden" + +#. i18n: file: settings/accountpage.ui:236 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:375 msgid "C&hange..." -msgstr "&Wijzigen..." +msgstr "&Veranderen..." -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "&Geen afbeelding tonen" +#. i18n: file: settings/accountpage.ui:261 +#. i18n: ectx: property (toolTip), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:381 +msgid "Enable this option, if you do not want to use a display picture." +msgstr "Schakel deze optie in, als u geen schermafbeelding wilt gebruiken." -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Onthoud de instellingen van deze account" +#. i18n: file: settings/accountpage.ui:264 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "&Niet gebruiken" -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:294 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are 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 internetcafé, " +"bijvoorbeeld)." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "&Automatisch aanmelden met deze account tijdens het starten van KMess" +#. i18n: file: settings/accountpage.ui:297 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "On&thoud de instellingen van dit account" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:307 +#. i18n: ectx: property (toolTip), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." +msgstr "Wanneer ingeschakeld, logt KMess automatisch in met dit account." + +#. i18n: file: settings/accountpage.ui:310 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +msgid "Log in &with this account automatically" +msgstr "Log automatisch &in met dit account" + +#. i18n: file: settings/accountpage.ui:322 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Log in &als" + +#. i18n: file: settings/accountpage.ui:335 +#. i18n: ectx: property (whatsThis), widget (QComboBox, initialStatus_) +#: rc.cpp:410 +msgid "Here you can select which status KMess should set, after logging in." msgstr "" -"Als deze optie aanstaat wordt bij het opstarten van Kmess automatisch " -"ingelogd met deze account." +"Hier kunt u selecteren welke status KMess moet aannemen, na het inloggen." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "In te stellen status bij het inloggen:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:378 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:413 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"U dient te verbinden met de Passport-site om te bevestigen dat uw e-" +"mailadres bestaat." + +#. i18n: file: settings/accountpage.ui:381 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:416 +msgid "" +"You cannot 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 " +"geverifieerd is." -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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." - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "Request verification email" -msgstr "Verzoek om een email ter bevestiging" +msgstr "Controle-e-mail aanvragen" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:427 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:425 msgid "Go to accountservices.passport.net" msgstr "Ga naar accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:446 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:428 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"U heeft een Passport-account nodig om te verbinden met het Live " +"Messenger-netwerk. U kunt uw huidige e-mailadres hiervoor registreren op " +"register.passport.com, of u kunt een Live Mail-account gebruiken." + +#. i18n: file: settings/accountpage.ui:449 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:431 +msgid "" +"To connect to the Live 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 heeft een e-mailadres als Passport-account nodig om met de Live Messenger-" +"service te verbinden." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:489 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "Register new account" -msgstr "Registreer nieuwe account" +msgstr "Nieuw account registreren" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:492 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:495 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:440 msgid "Go to register.passport.com" msgstr "Ga naar register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Waarschuwingen" +#. i18n: file: settings/accountpage.ui:513 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:443 +msgid "&Status Options" +msgstr "&Statusopties" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Meldingen" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Toon een melding wanneer uw contactpersoon:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "&Online komt" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:519 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when you " +"are 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 een melding getoond indien een van uw " -"contactpersonen verbinding maakt met MSN." +"Wanneer ingeschakeld, wordt uw status automatisch gewijzigd naar " +"\"Inactief\" wanneer u de computer voor een paar minuten niet gebruikt. Als " +"deze optie niet aanwezig is, werd KMess zonder deze optie gecompileerd " +"(broncode omzetten naar een uitvoerbaar programma, red.)." -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Een &chat met u begint" +#. i18n: file: settings/accountpage.ui:522 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:449 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Verander status naar \"&Inactief\" wanneer inactief" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountpage.ui:553 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:572 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:579 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:455 rc.cpp:461 rc.cpp:464 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" -"Als deze optie aan staat wordt een melding getoond indien een van uw " -"contactpersonen een conversatie met u begint." - -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "U &een bericht stuurt" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Als deze optie aan staat wordt elke keer een melding getoond indien een van " -"uw contactpersonen u een bericht stuurt." - -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Zijn/haar &status wijzigt" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Als deze optie aan staat wordt een melding getoond indien een van uw " -"contactpersonen zijn MSN-status wijzigt." - -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "O&ffline gaat" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Als deze optie aan staat wordt een melding getoond indien een van uw " -"contactpersonen offline gaat." - -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Toon een melding als u een email ont&vangt" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Verberg aankondigingen na" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Bepaalt na hoeveel seconden aankondigingen weer weggaan." - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "seconden" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "&Schud het chatvenster bij zenden of ontvangen van een buzzer" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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 "" -"

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.

" - -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Contactpersonen informeren naar &welk liedje ik nu luister." - -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" -"Indien ingeschakeld krijgen contactpersonen informatie over waar u naar " -"luistert. Deze informatie wordt verkregen van de thans actieve toepassingen " -"voor audio." - -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Verander de status in \"&Afwezig-niet actief\" indien niet actief" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Als deze optie aan staat wordt uw status automatisch veranderd in \"Afwezig " -"- niet actief\" wanneer u de computer enkele minuten niet heeft gebruikt." - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Word \"Niet actief\" na" - -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"Bepaalt het aantal minuten voordat KMess de status verandert naar \"Inactief" "\"." -msgstr "" -"Bepaalt na hoeveel minuten dat de computer niet wordt gebruikt, de status in " -"\"Afwezig - niet actief\" wordt veranderd." -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:556 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:458 +msgid "Become idle after" +msgstr "Word inactief na" + +#. i18n: file: settings/accountpage.ui:582 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:467 msgid "minutes" msgstr "minuten" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Chat bewaren" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "&Alle chats opslaan" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Bewaar chat-bestanden in deze hoofdmap:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/accountpage.ui:615 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 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: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Deel de chat-mappen in naar:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -"KMess maakt automatisch de nodige submappen aan als de optie \"deel de chat-" -"mappen in naar jaar, maand of dag\" aan staat." +"Dit is uitgeschakeld, omdat KMess is gecompileerd zonder ondersteuning " +"voor de \"XScreenSaver\" Xorg-extensie, die gebruikersactiviteit detecteert. " +"Raadpleeg uw pakketbeheerder voor meer informatie. " -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/accountpage.ui:618 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:473 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"Deze functie kan niet gebruikt worden: deze uitgave van KMess ondersteunt " +"dit niet." + +#. i18n: file: settings/accountpage.ui:644 +#. i18n: ectx: property (toolTip), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:476 +msgid "" +"If enabled, you will not receive any notifications when your status is set " +"to \"Busy\"." +msgstr "" +"Wanneer ingeschakeld, zal u geen mel&dingen ontvangen wanneer uw status is " +"ingesteld op \"Bezig\"." + +#. i18n: file: settings/accountpage.ui:647 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:479 +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "Verberg mel&dingen wanneer mijn status is ingesteld op \"Bezig\"" + +#. i18n: file: settings/accountsmanagerpage.ui:26 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:482 +msgid "Saved accounts:" +msgstr "Opgeslagen accounts:" + +#. i18n: file: settings/accountsmanagerpage.ui:76 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:485 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" +"Klik hier om een KMess-account te maken voor een e-mailadres dat reeds is " +"gekoppeld aan een Live-account" + +#. i18n: file: settings/accountsmanagerpage.ui:79 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:488 +msgid "&Add Account..." +msgstr "Account &toevoegen..." + +#. i18n: file: settings/accountsmanagerpage.ui:92 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:494 +msgid "Select an account and click here to modify it" +msgstr "Kies een account, en klik daarna hier om het te wijzigen" + +#. i18n: file: settings/accountsmanagerpage.ui:95 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:497 +msgid "&Edit" +msgstr "&Bewerken" + +#. i18n: file: settings/accountsmanagerpage.ui:108 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:503 +msgid "Select an account and click here to remove it" +msgstr "Kies een account, en klik daarna hier om het te verwijderen" + +#. i18n: file: settings/accountsmanagerpage.ui:111 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:506 +msgid "&Remove" +msgstr "&Verwijderen" + +#. i18n: file: settings/chatloggingpage.ui:17 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:512 +msgid "Enable this option to have your chats saved for later viewing" +msgstr "" +"Schakel deze optie in om uw chatgesprekken op te slaan, zodat u ze later " +"terug kunt lezen" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:515 +msgid "" +"

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

\n" +"

The chat logs 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 "" +"

Wanneer u chatloggen inschakelt, 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 bepaalde uitspraak.

\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: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:521 +msgid "Enable chat logging" +msgstr "Schakel chatloggen in" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:524 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"Wanneer ingeschakeld, worden uw chatlogs tevens opgeslagen in HTML-formaat, " +"of als platte tekst" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:527 +msgid "Additionally save chat logs to file" +msgstr "Chatgesprekken tevens in bestand bewaren" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:530 +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:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:533 +msgid "Save chat logs as:" +msgstr "Chatgesprekken bewaren als:" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\n" +"

Het is belangrijk welk bestandsformaat u hier kiest.

\n" +"

HTML-bestanden kunnen in elke webbrowser geopend worden, maar opmaak en " +"afbeeldingen worden niet getoond op computers zonder ondersteuning hiervoor." +"

\n" +"

Tekstbestanden kunnen daarentegen overal goed worden gelezen; ze bevatten " +"echter geen tekstopmaak, schermafbeeldingen of emoticons.

\n" +" " + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:543 +msgid "Web Pages (HTML)" +msgstr "Webpagina's (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:546 +msgid "Plain Text" +msgstr "Platte tekst" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:549 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" +"Met deze opties kunt u kiezen hoe KMess uw gelogde chatgesprakken " +"organiseert in de hieronder opgegeven locatie." + +#. i18n: file: settings/chatloggingpage.ui:137 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:552 +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 "" +"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: file: settings/chatloggingpage.ui:140 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:555 +msgid "Separate logged chats by:" +msgstr "Scheid gelogde chats met:" + +#. i18n: file: settings/chatloggingpage.ui:156 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +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:163 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:561 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/date-and-contact-name.html

" +msgstr "" +"

Met deze optie scheidt KMess uw gelogde chats alleen op jaar.\n" +" U zult dan mappen voor elk jaar gelogde chatgesprekken vinden; deze " +"bevatten alle chatgesprekken van het betreffende jaar, samen in één map. \n" +"\n" +"

Een chatgesprek op 29 November 2008 zal dan opgeslagen worden als:

\n" +"

<map voor chatlogboeken>/2008/datum-en-contactpersoon.html

" + +#. i18n: file: settings/chatloggingpage.ui:166 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:568 msgid "Year" msgstr "Jaar" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Maand" +#. i18n: file: settings/chatloggingpage.ui:182 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +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: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Dag" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Bewaar alle chats in de hoofdmap" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Het lettertype voor uw berichten:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Gebruik dit lettertype voor de berichten van uw contactpersonen:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:574 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"

This option tells KMess to divide your chat logs 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" +"

A chat had on November 29, 2008 will be saved in your chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/date-and-contact-name.html

" msgstr "" -"Deze optie geeft de mogelijkheid om een ander lettertype en -kleur in te " -"stellen voor de berichten van contactpersonen." +"

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" +"

Een chatgesprek van 29 November 2008 zal dan opgeslagen worden als:

\n" +"<map voor chatlogboeken>/2008/11/datum-en-contactpersoon.html

" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Chatstijl:" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:580 +msgid "Year then Month" +msgstr "Jaar en maand" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +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:586 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/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 op 29 November 2008 zal dan opgeslagen worden als:

\n" +"

<map voor chatlogboeken>/2008/11/29/datum-en-contactpersoon.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:593 +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:596 +msgid "Place all saved chat logs 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:599 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"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:602 +msgid "Do not organize files" +msgstr "Bestanden niet ordenen" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:605 +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:611 +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:614 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "Kies een locatie waarin u de chatlogs wilt bewaren." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:617 +msgid "Save chat logs in the following directory:" +msgstr "Bewaar gelogde chats in de volgende locatie:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:620 +msgid "St&yle" +msgstr "St&ijl" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:623 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." +"Hiermee kunt u het thema veranderen dat KMess gebruikt om chatberichten te " +"tonen." -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Toon &afbeeldingen in chatberichten" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:626 +msgid "&Chat style:" +msgstr "&Chatstijl:" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Dit zorgt ervoor dat emoticons in chatberichten getoond worden." +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:629 +msgid "Get &New Styles..." +msgstr "&Nieuwe stijlen ophalen..." -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Toon &tijd in chatberichten" +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:632 +msgid "Chat Settings" +msgstr "Chatinstellingen" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -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: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (toolTip), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:635 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Schakelt emoticons in chatgesprekken in." -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" -"&Gebruik effecten van lettertypen in berichten, zoals *vet*, /cursief/ en " -"_onderstreept_" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:638 +msgid "&Show emoticons" +msgstr "Emoticons &weergeven" -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:644 +msgid "Enables the appearance of winks in the chat window." +msgstr "Schakelt winks in chatgesprekken in." + +#. i18n: file: settings/chatstylepage.ui:246 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:647 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, winks you send or receive will be displayed in the chat window. " +"Please note that in order to use this feature, you need to have a working " +"Flash-plugin installed." 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." +"Wanner ingeschakeld, zullen winks die u verzend of ontvangt zullen worden " +"weergegeven in het chatgesprek. Om deze functie te laten werken, moet u een " +"werkende Flash-plugin geïnstalleerd hebben." -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:249 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:650 +msgid "Show &winks" +msgstr "Winks &weergeven" + +#. i18n: file: settings/chatstylepage.ui:256 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:653 +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:259 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:656 msgid "&Group follow-up messages from the same contact" -msgstr "&Voeg op elkaar volgende berichten van dezelfde contactpersoon samen" +msgstr "Opvolgende berichten van dezelfde contact &groeperen" -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:285 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:662 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Schakelt een tijdsstempel bij elk chatbericht in." + +#. i18n: file: settings/chatstylepage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:665 +msgid "S&how timestamp" +msgstr "Beric&httijden weergeven" + +#. i18n: file: settings/chatstylepage.ui:319 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:671 +msgid "Show &date" +msgstr "&Datum weergeven" + +#. i18n: file: settings/chatstylepage.ui:349 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:674 +msgid "Show s&econds" +msgstr "S&conden weergeven" + +#. i18n: file: settings/chatstylepage.ui:362 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:677 +msgid "&Text" +msgstr "&Tekst" + +#. i18n: file: settings/chatstylepage.ui:374 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:680 +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:377 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:683 +msgid "Your &message font:" +msgstr "Uw &berichtenlettertype:" + +#. i18n: file: settings/chatstylepage.ui:458 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:686 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." +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." 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." +"Hiermee forceert u de kleur en lettertype van een ontvangen bericht met de " +"gekozen lettertype- en kleur." -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Emailprogramma" +#. i18n: file: settings/chatstylepage.ui:461 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:689 +msgid "&Force messages from your contacts to use this font:" +msgstr "&Ontvangen berichten forceren om dit lettertype te gebruiken:" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:692 +msgid "Chat Window Formatting" +msgstr "Chatvensteropmaak" + +#. i18n: file: settings/chatstylepage.ui:542 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:695 msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." +"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 "" -"U kunt het emailprogramma kiezen waarmee KMess uw emailberichten opent." +"Schakelt lettertype-effecten in. Het typen van *vet*, /schuin/ en " +"_onderstreept_ maakt de tekst resp. vet,schuin of onderstreept." -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Gebruik Hotmail" +#. i18n: file: settings/chatstylepage.ui:545 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:698 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Gebruik &effecten in berichten, zoals *vet*, /schuin/ en _onderstreept_" -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Gebruik een bepaalde opdracht:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Melding van email" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Toon informatie over nieuwe email" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableChatFormattingCheckBox_) +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:704 rc.cpp:771 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." +"Enables the use of \"Messenger Plus!\" formattings in the chat window. " +"For example, [b]this text[/b] will be replaced with this text." 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." +"Schakelt het gebruik van \"Messenger Plus!\" opmaak in het chatgesprek " +"in. Bijvoorbeeld, [b]deze tekst[/b] zal worden vervangen door deze tekst." -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "" -"Toon een melding als een emailbericht in een \"andere map\" wordt ontvangen" +#. i18n: file: settings/chatstylepage.ui:558 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:707 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "\"Messenger Plus\"-indeling inschakelen" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:582 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:710 +msgid "&Behavior" +msgstr "&Gedrag" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:713 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" -"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." +"

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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:592 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:717 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Schud het chat&venster wanneer een buzzer wordt ontvangen of verzonden" + +#. i18n: file: settings/chatstylepage.ui:602 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:723 +msgid "" +"If this option is enabled, your own display picture will be shown in the " +"contacts panel, along with the pictures of the contacts in that chat." +msgstr "" +"Wanneer ingeschakeld, wordt uw eigen schermafbeelding in het contactenpaneel " +"getoond, samen met de schermafbeeldingen van de aanwezige personen." + +#. i18n: file: settings/chatstylepage.ui:605 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:726 +msgid "Display your own &display picture in the chat window" +msgstr "Mijn eigen schermafbeel&ding in het chatvenster tonen" + +#. i18n: file: settings/chatstylepage.ui:630 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:729 +msgid "G&roup chats in the same window:" +msgstr "Chatgesprekken in één venster g&roeperen" + +#. i18n: file: settings/chatstylepage.ui:650 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:732 +msgid "Always" +msgstr "Altijd" + +#. i18n: file: settings/chatstylepage.ui:655 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:735 +msgid "For contacts in the same group" +msgstr "Voor contacten in dezelfde groep" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:738 +msgid "Never" +msgstr "Nooit" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:741 +msgid "Display Options" +msgstr "Weergaveopties" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:744 +msgid "" +"If enabled, a notification is shown when an email message is received in " +"your inbox. The number of unread email messages is shown above the contact " +"list. This option is only available for Live Mail accounts." +msgstr "" +"Wanneer ingeschakeld, wordt er een notificatie weergegeven wanneer u nieuwe " +"mail heeft ontvangen in uw inbox. Het aantal ongelezen berichten wordt boven " +"de contactenlijst weergegeven. Deze optie is enkel beschikbaar voor Live " +"Mail-accounts." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:747 +msgid "Display a count of &unread mail" +msgstr "Toon het aantal &ongelezen e-mails" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:750 +msgid "" +"If enabled, your contacts can see which song you are listening to. This " +"information is retrieved from the currently active media player." +msgstr "" +"Wanneer ingeschakeld, kunnen contacten zien naar wat voor muziek u aan het " +"luisteren bent. Deze informatie is afkomstig van de huidige geopende " +"muziekspeler." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:753 +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:46 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:759 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" +"Indien ingeschakeld, zal het logo van KMess getoond worden op de achtergrond " +"van de contactenlijst." + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:762 +msgid "Show background &image" +msgstr "&Achtergrondafbeelding weergeven" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:768 +msgid "List Formatting" +msgstr "Lijstopmaak" + +#. i18n: file: settings/contactlistpage.ui:71 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:774 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "\"Messenger &Plus!\"-indeling inschakelen" + +#. i18n: file: settings/contactlistpage.ui:78 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:777 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "Toon het &e-mailadres van contacten in plaats van hun schermnaam" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:780 msgid "&Emoticon Themes" -msgstr "Thema's voor &Emoticons" +msgstr "&Emoticonthema's" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "Beschibare emoticontypen:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:783 +msgid "Available emoticon themes:" +msgstr "Beschikbare emoticonthema's:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:786 msgid "&Custom Emoticons" -msgstr "&Aangepaste emoticons" +msgstr "&Eigen emoticons" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Aangepaste emoticons voor deze account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:789 +msgid "Available custom emoticons:" +msgstr "Beschikbare eigen emoticons:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:792 +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:795 +msgid "Add Ne&w..." msgstr "Nieu&we toevoegen..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Klik" +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:801 +msgid "Click here to rename the selected emoticon" +msgstr "Klik hier om de geselecteerde emoticon te hernoemen" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Klik hier om nieuwe aangepaste emoticons toe te voegen die u naar uw " -"contactpersonen wilt kunnen sturen." - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:804 msgid "Re&name" -msgstr "Her&noemen" +msgstr "He&rnoemen" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -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:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:810 +msgid "Click here to remove the selected emoticon" +msgstr "Klik hier om de geselecteerde emoticon te verwijderen" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:813 msgid "Remo&ve" -msgstr "&Verwijderen" +msgstr "Verwijde&ren" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Selecteer een emoticon en klik hier om die te verwijderen." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:819 +msgid "Web Browser" +msgstr "Webbrowser" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "zegt:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Bladeren naar en bijsnijden van afbeelding..." - -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Afbeelding tonen" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Het ophalen van de afbeelding is mislukt" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:822 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -"Er is een fout opgetreden bij het veranderen van uw afbeelding.\n" -"Gebruik een afbeeldingsbestand van het juiste type" +"Kies deze optie om de browser te gebruiken die door KDE gebruikt wordt." -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Instellingen" +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:825 +msgid "&Use the KDE default browser" +msgstr "&Gebruik de standaard KDE-browser" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Account" +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:828 rc.cpp:863 +msgid "Select this option to choose from a list of installed browsers." +msgstr "Kies deze optie om te kiezen uit een lijst van beschikbare browsers." -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Chatten" +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:831 +msgid "&Use an installed browser:" +msgstr "G&ebruik een beschikbare browser:" -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Weet u zeker dat u deze account wilt verwijderen?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Hai, hoe gaat het ermee? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Stacy" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Groots!" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Ik kom /juist/ terug van vakantie in Italië!" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:834 rc.cpp:869 +msgid "Choose this option to enter the path to your favorite browser." 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." +"Kies deze optie om het commando voor uw favoriete browser in te voeren." -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Actief in systeemvak" +#. 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:837 rc.cpp:872 +msgid "&Specify a custom command:" +msgstr "Een eigen &commando invoeren:" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. 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:841 rc.cpp:876 +#, 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." -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:845 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Gebruik '%u' om de URL in de opdrachtregel in te voeren." -#~ msgid "The current status of your contact." -#~ msgstr "De huidige status van uw contactpersoon." +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:848 +msgid "Email Client" +msgstr "E-mailprogramma" -#~ msgid "File transfer dialog message" -#~ msgstr "Bericht in dialoog voor bestandsoverdracht" +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:851 +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 " +"ingeloghet account daar ondersteuning voor biedt." -#~ msgid "The file transfer invitation was cancelled. Bad data was received." -#~ msgstr "" -#~ "De bestandsoverdracht werd afgebroken. Verkeerde gegevens ontvangen." +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:854 +msgid "Use &Live Mail if the account supports it" +msgstr "Gebruik &Live Mail als het account dat ondersteunt" -#~ msgid "ChatViewInterface" -#~ msgstr "ChatViewInterface" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:857 +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." -#~ msgid "Alt+E" -#~ msgstr "Alt+E" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:860 +msgid "Use the &KDE default email client" +msgstr "&Gebruik het standaard KDE-mailprogramma" -#~ msgid "Alt+W" -#~ msgstr "Alt+W" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:866 +msgid "Use an &installed email client:" +msgstr "Gebruik een beschikbaar &e-mailprogramma" -#~ msgid "ContactFrameInterface" -#~ msgstr "ContactFrameInterface" +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:880 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "Gebruik '%u' om de URL in de opdrachtregel in te voeren." -#~ msgid "AddEmoticonDialogInterface" -#~ msgstr "AddEmoticonDialogInterface" +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:886 +msgid "&Save all received files in one directory:" +msgstr "&Bewaar alle ontvangen bestanden in één map:" -#~ msgid "..." -#~ msgstr "..." +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:892 +msgid "&Use ports between" +msgstr "&Gebruik de poorten" -#~ msgid "TransferEntryInterface" -#~ msgstr "TransferEntryInterface" +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:895 +msgid "and" +msgstr "t/m" -#~ msgid "InitialViewInterface" -#~ msgstr "InitialViewInterface" +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:898 +msgid "for file transfers" +msgstr "voor bestandsoverdrachten" -#~ msgid "Alt+B" -#~ msgstr "Alt+O" +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about something you liked" +msgstr "" +"Klik hier om de ontwikkelaars te vertellen over iets wat u leuk vind aan " +"KMess" -#~ msgid "KMessViewInterface" -#~ msgstr "KMessViewInterface" +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:904 rc.cpp:911 rc.cpp:918 rc.cpp:925 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" +"Klik op één van deze pictogrammen om uw feedback te verzenden naar de " +"ontwikkelaars van dit programma. U kunt deze pictogrammen uitschakelen via " +"\"Feedback-pictogrammen weergeven\" in het Help-menu.\n" +" " -#~ msgid "popupMessage" -#~ msgstr "Aankondiging" +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:908 +msgid "Click here to tell the developers about something you did not like" +msgstr "" +"Klik hier om de ontwikkelaars te vertelen over iets dat u niet waardeert" -#~ msgid "Alt+H" -#~ msgstr "Alt+W" +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:915 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" +"Klik hier om de ontwikkelaars te vertellen over een probleem in of met KMess" -#~ msgid "Alt+Y" -#~ msgstr "Alt+G" +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:922 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" +"Klik hier om de ontwikkelaars te vertellen over mogelijkheden die u wenst in " +"dit programma." -#~ msgid "Alt+G" -#~ msgstr "Alt+O" +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:929 +msgid "Your comment:" +msgstr "Uw opmerking:" -#~ msgid "Alt+C" -#~ msgstr "Alt+C" +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:932 +msgid "Your comment is about:" +msgstr "Betreft:" -#~ msgid "Alt+S" -#~ msgstr "Alt+S" +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:935 +msgid "Something you like" +msgstr "Iets dat u leuk vindt" -#~ msgid "Alt+F" -#~ msgstr "Alt+F" +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:938 +msgid "Something you dislike" +msgstr "Iets dat u niet leuk vindt" -#~ msgid "Alt+V" -#~ msgstr "Alt+V" +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:941 +msgid "An improper behavior of the application" +msgstr "Incorrect gedrag van het programma" -#~ msgid "ChattingWidget" -#~ msgstr "ChattingWidget" +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:944 +msgid "A new feature you desire" +msgstr "Een gewenste mogelijkheid" -#~ msgid "EmailWidget" -#~ msgstr "EmailWidget" +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:947 +msgid "Specify an email address to be contacted back:" +msgstr "Geef een e-mailadres op waarnaar geantwoord dient te worden:" -#~ msgid "EmoticonWidgetInterface" -#~ msgstr "EmoticonWidgetInterface" - -#~ msgid "Alt+N" -#~ msgstr "Alt+N" +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:950 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +"Your email address will not be used for anything else but this report." +msgstr "" +"Door uw e-mailadres op te geven, kunnen de ontwikkelaars u om verdere " +"informatie vragen, of u vertellen wanneer de door u gewenste mogelijkheid " +"geïmplementeerd gaat worden.
\n" +"Uw e-mailadres zal alleen voor dit dit doeleinde worden gebruikt." diff --git a/po/pt_BR.po b/po/pt_BR.po index b4afab6..58f1684 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -1,2995 +1,6980 @@ +# translation of pt_BR.po to Português Brasileiro +# translation of pt_BR.po to Brazilian Portuguese # translation of pt_BR.po to -# Copyright (C) 2003, 2008 Free Software Foundation, Inc. -# , 2003 -# Mauricio Röther , 2003 -# Darlan Campos , 2008 +# Copyright (C) 2003 Free Software Foundation, Inc. # +# Mauricio Röther , 2003. +# Sergio Rafael Lemke , 2009. +# Mauricio Arozi Moraes , 2009. msgid "" msgstr "" "Project-Id-Version: pt_BR\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2008-05-11 00:37+0000\n" -"Last-Translator: Darlan\n" -"Language-Team: \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-05-07 22:14+0200\n" +"PO-Revision-Date: 2009-05-07 20:49+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.11.4\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Mauricio Röther, Darlan Campos" +#: account.cpp:45 account.cpp:744 +msgid "I am away from my computer" +msgstr "Estou Longe do meu Computador" -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "mauricio@digicomm.com.br, darlanpedro@gmail.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" -msgstr "Estou distante do computador" - -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Seu nome" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:217 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "voce@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Iniciando sessão..." +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored 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ê gostaria de " +"importá-las para a Carteira do KDE chamada '%1', mantê-las assim, ou 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/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" -msgstr "%1 está enviando um wink: %2" +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Secure Password Storage" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importar" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Remover" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Manter" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"Você não pode enviar convites quanto está numa conversa com múltiplos " +"participantes. Para isso inicie uma nova conversa com o destinatário, e " +"envie seu convite normalmente." + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 juntou-se à conversa." + +#: chat/chat.cpp:191 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "A conversa ficou parada, %1 deixou o bate-papo" + +#: chat/chat.cpp:197 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 deixou a conversa." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 e %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 et al." + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Esta mensagem foi enviada automaticamente)" + +#: chat/chat.cpp:829 +#, kde-format +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:949 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Você enviou um wink!" + +#: chat/chat.cpp:954 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Você enviou o wink "%1"!" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" +"A conversa foi desativada por que você não está mais conectado ao servidor " +"Live Messenger." + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Ocorreu um problema com a conexão" + +#: chat/chat.cpp:1154 +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 "" +"Havia muitos emoticons personalizados diferentes na sua última " +"mensagem. Apenas os sete primeiros foram enviados." + +#: chat/chat.cpp:1167 +#, kde-format +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." +msgstr "" +"%1 enviou-lhe um clipe de voz, mas o KMess ainda não os suporta." + +#: chat/chat.cpp:1181 +#, kde-format +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 as suporta." + +#: chat/chat.cpp:1196 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "" +"%1 usou um recurso do Live Messenger que o KMess ainda não suporta." + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"Você recebeu um wink de %1, mas a sua exibição foi desativada nas opções de " +"conta. Você pode mudar isto nas configurações de conta." + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"%1 enviou-lhe um wink: "%2", mas a sua exibição foi " +"desativada nas opções de conta. Você pode mudar isto nas configurações de conta." + +#: chat/chat.cpp:1262 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 enviou um wink!" + +#: chat/chat.cpp:1269 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 enviou um wink: "%2"!" + +#: chat/chat.cpp:1291 +#, kde-format +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." +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:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Você recebeu o wink "%2" de %1, mas ele não pôde ser " +"exibido. Certifique-se de que você possui o "cabextract" instalado." +"" + +#: chat/chat.cpp:1312 +#, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"Voce recebeu um wink de %1, mas ele não pôde ser exibido devido a uma " +"falha na extração do pacote utilizando o "cabextract"." + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"Voce recebeu o wink "%2" de %1, mas ele não pôde ser exibido " +"devido a uma falha na extração do pacote utilizando o "cabextract"." +"" + +#: chat/chat.cpp:1333 +#, kde-format +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. Os dados não " +"puderam ser lidos." + +#: chat/chat.cpp:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" +"Voce recebeu o wink "%2" de %1, mas ele não pôde ser exibido " +"devido. Os dados não puderam ser lidos." + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs 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:1389 +#, kde-format +msgid "%1 has gone offline." +msgstr "%1 ficou offline." + +#: chat/chat.cpp:1399 +#, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 mudou seu status para "%2"" + +#: chat/chat.cpp:1430 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 enviou um nudge!" + +#: chat/chat.cpp:1463 +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:1476 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Falha ao enviar o nudge para %1." + +#: chat/chat.cpp:1481 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1." +msgstr "Falha ao enviar o wink para %1." + +#: chat/chat.cpp:1491 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "Falha ao enviar o desenho para %1." + +#: chat/chat.cpp:1506 +#, kde-format +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 "Falha ao enviar a seguinte mensagem para %2:
%1" + +#: chat/chat.cpp:1589 +#, kde-format +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:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Você enviou um nudge para %1!" + +#: chat/chat.cpp:1632 +msgid "You have sent a nudge!" +msgstr "Você enviou um nudge!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" +"%1 está offline. Quaisquer mensagens que você enviar serão entregues " +"na próxima vez que ele(a) se conectar." + +#: chat/chatmaster.cpp:1387 +#, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 está enviando um wink: "%2"" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 diz:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, kde-format +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:1065 utils/richtextparser.cpp:657 +#, kde-format msgid "Add this emoticon: %1" msgstr "Adicionar este emoticon: %1" -#: chat/chatview.cpp:463 -msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." -msgstr "Impossível salvar histórico. Certifique-se de ter permissão de escrita na pasta de gravação das conversas." +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Reconectar" -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:306 +#, kde-format +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:445 +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:464 +#, kde-format 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" -"Deseja sobrescrever?" +"Você gostaria de sobrescrevê-lo?" -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:465 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" -msgstr "Sobrescrever Arquivo" +msgstr "Substituir arquivo" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:466 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "&Sobrescrever" +msgstr "Substituir" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:831 msgid "Add this &Emoticon..." msgstr "Adicionar este &Emoticon..." -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:834 +msgid "Hide this &Emoticon" +msgstr "Esconder este &Emoticon" + +#: chat/chatview.cpp:840 msgid "Send &Email" -msgstr "&Enviar E-Mail" +msgstr "Enviar &Email" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "Copiar E-&Mail" +#: chat/chatview.cpp:844 +msgid "Add &Contact" +msgstr "Adicionar &Contato" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:848 +msgid "Copy E&mail Address" +msgstr "Copiar endereço de E&mail" + +#: chat/chatview.cpp:854 msgid "Visit &Link" msgstr "Visitar &Link" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:858 msgid "Copy &Address" -msgstr "Copiar E&ndereço" +msgstr "Copi&ar Endereço" -#: chat/chatview.cpp:946 -msgid "&Copy text" -msgstr "&Copiar Texto" +#: chat/chatview.cpp:874 +msgid "&Copy Text" +msgstr "Copiar Texto" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:875 msgid "Select &All" -msgstr "Selecionar &Tudo" +msgstr "Selecion&ar Tudo" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "Salvar Histórico em &Arquivo" +#: chat/chatview.cpp:876 +msgid "Find &Text..." +msgstr "Procurar &Texto..." -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Coversa" +#: chat/chatview.cpp:877 chat/chatwindow.cpp:503 +msgid "C&lear Chat" +msgstr "&Limpar Conversa" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" -"Não é possível aceitar este convite porque há muitos contatos nesta " -"conversa." +#: chat/chatview.cpp:878 +msgid "Save Chat to &File..." +msgstr "Salvar conversa para Arquivo..." -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 entrou na conversa" - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "A conversa está inativa, %1 saiu da conversa" - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 saiu da conversa" - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Conversa" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 e %2 - Conversa" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 e outros - Conversa" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Contatos" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticons" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" -msgstr "Meus emoticons" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Meus Emoticons" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Esta mensagem foi enviada automaticamente)" +#: chat/chatwindow.cpp:337 +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/chatwindow.cpp:1493 -msgid "The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "O wink não pôde ser exibido. Verifique se possui 'cabextract' instalado." +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Fechar uma aba da conversa" -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "O wink não pôde ser exibido. Não foi possível ler os dados." +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "Fechar Todas as Abas" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "Você recebeu um wink de %1" +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "Fechar Aba Corrente" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "A mensagem '%1' não pôde ser enviada." +#: chat/chatwindow.cpp:418 +msgid "&Invite..." +msgstr "Conv&idar..." -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "%q pediu sua atenção!" +#: chat/chatwindow.cpp:419 +msgid "Send a &File..." +msgstr "Enviar um Arquivo..." -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Você pediu a atenção de %1!" +#: chat/chatwindow.cpp:420 +msgid "Webcam Chat" +msgstr "Conversa via webcam" -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Você pediu a atenção!" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 está digitando" - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 e %2 estão digitando" - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 e outros %3 estão digitando" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Enviar um &Arquivo" - -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:421 msgid "Start a &Meeting" msgstr "Iniciar uma &Conferência" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:422 msgid "Send a &Nudge!" -msgstr "Pedir Atenção!" +msgstr "Enviar um &Nudge!" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Iniciar ou Terminar &Conversa" +#: chat/chatwindow.cpp:423 +msgid "Save Chat..." +msgstr "Salvar conversa..." -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Salvar conversa" +#: chat/chatwindow.cpp:424 +msgid "Close &All Tabs" +msgstr "Fechar Todas as &Abas" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "Conv&idar" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Conversa" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:429 msgid "Change &Font" msgstr "Mudar &Fonte" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:430 msgid "Change Font &Color" msgstr "Mudar &Cor de Fonte" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Inserir um emoticon" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "Usar &Verificação Ortográfica" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:437 msgid "Show &Emoticons" msgstr "Mostrar &Emoticons" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Mostrar/Esconder Barra de &Contatos" +#: chat/chatwindow.cpp:438 +msgid "Show S&tatus Messages" +msgstr "Mostrar Mensagens de S&tatus" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Mostrar ou esconder barra de contatos" +#: chat/chatwindow.cpp:444 +msgid "&Panels" +msgstr "Paineis" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "&Enviar E-mail" +#: chat/chatwindow.cpp:447 +msgid "Use &Spell Checking" +msgstr "U&sar Verificação Ortográfica" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:451 +msgid "Meeting" +msgstr "Conferência" + +#: chat/chatwindow.cpp:452 +msgid "Nudge" +msgstr "Nudge" + +#: chat/chatwindow.cpp:453 +msgid "Send a &File" +msgstr "Enviar um &Arquivo" + +#: chat/chatwindow.cpp:456 chat/chatwindow.cpp:457 +msgid "P&revious Tab" +msgstr "Aba anterior" + +#: chat/chatwindow.cpp:458 chat/chatwindow.cpp:459 +msgid "Ne&xt Tab" +msgstr "Aba posterior" + +#: chat/chatwindow.cpp:474 +msgid "Enable or disable the contacts panel" +msgstr "Ativar ou desativar o painel de Contatos" + +#: chat/chatwindow.cpp:475 chat/chatwindow.cpp:476 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contatos" + +#: chat/chatwindow.cpp:480 +msgid "Enable or disable the standard emoticons panel" +msgstr "Ativar ou desativar a barra padrão de Emoticons" + +#: chat/chatwindow.cpp:481 chat/chatwindow.cpp:482 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticons" + +#: chat/chatwindow.cpp:486 +msgid "Enable or disable the custom emoticons panel" +msgstr "Ativar ou desativar o painel de Emoticons personalizados" + +#: chat/chatwindow.cpp:487 chat/chatwindow.cpp:488 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Meus Emoticons" + +#: chat/chatwindow.cpp:500 +msgid "&Font" +msgstr "&Fonte" + +#: chat/chatwindow.cpp:501 +msgid "Font &Color" +msgstr "&Cor da Fonte" + +#: chat/chatwindow.cpp:502 +msgid "C&lear Chat Window" +msgstr "Limpar Janela da Conversa" + +#: chat/chatwindow.cpp:570 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Iniciar ou Terminar uma &Conversa" + +#: chat/chatwindow.cpp:993 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" +"Você utilizou uma sintaxe incorreta para o comando /status. A correta " +"é: /status online|away|idle|brb|busy|lunch|phone|invisible.
Você pode utilizar os atalhos /online, /phone etc." + +#: chat/chatwindow.cpp:996 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Sintaxe /status incorreta" + +#: chat/chatwindow.cpp:1059 +msgid "You cannot use the /block command in a group chat." +msgstr "Você não pode bloquear alguém em uma conversa em grupo." + +#: chat/chatwindow.cpp:1061 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1072 +msgid "You cannot use the /unblock command in a group chat." +msgstr "Você não pode bloquear alguém em uma conversa em grupo." + +#: chat/chatwindow.cpp:1074 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1104 +#, kde-format +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:1107 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Comando desconhecido" + +#: chat/chatwindow.cpp:1574 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Conversa" + +#: chat/chatwindow.cpp:1578 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Conversa" + +#: chat/chatwindow.cpp:1598 kmessinterface.cpp:674 +#, kde-format +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 menus? Para mostrá-la " +"novamente você vai precisar utilizar o atalho: %1" + +#: chat/chatwindow.cpp:1602 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Escondendo o Menu" + +#: chat/chatwindow.cpp:1855 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 está digitando..." + +#: chat/chatwindow.cpp:1865 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 e %2 estão digitando..." + +#: chat/chatwindow.cpp:1869 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 e %3 outros estão digitando..." + +#: chat/chatwindow.cpp:2320 +#, kde-format +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
" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: chat/chatwindow.cpp:2486 rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#: chat/chatwindow.cpp:2495 +msgctxt "Label text" +msgid "" +"Handwriting is disabled: KMess cannot send drawings to some of the contacts." +msgstr "" + +#: chat/chatwindow.cpp:2501 +msgctxt "Label text" +msgid "Handwriting is disabled: KMess cannot send drawings to this contact." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: chat/chatwindow.cpp:2509 rc.cpp:27 +msgid "Winks" +msgstr "Winks" + +#: chat/chatwindow.cpp:2518 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to some of the contacts." +msgstr "" + +#: chat/chatwindow.cpp:2524 +msgctxt "Label text" +msgid "Winks are disabled: KMess cannot send winks to this contact" +msgstr "" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "Iniciar Conver&sa Privada" + +#: chat/contactframe.cpp:298 kmessview.cpp:609 +msgid "&Send Email" +msgstr "Enviar Email" + +#: chat/contactframe.cpp:299 kmessview.cpp:610 msgid "&View Profile" -msgstr "Mo&strar Perfil " +msgstr "&Ver Perfil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:612 +msgid "&Properties" +msgstr "&Propriedades" + +#: chat/contactframe.cpp:303 kmessview.cpp:614 msgid "&Add Contact" msgstr "&Adicionar Contato" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:615 msgid "A&llow Contact" -msgstr "&Permitir Contato " +msgstr "Permitir Contato" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:618 msgid "&Delete Contact" msgstr "&Remover Contato" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:616 msgid "&Block Contact" msgstr "&Bloquear Contato" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:617 msgid "&Unblock Contact" msgstr "&Desbloquear Contato" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:621 msgid "&Friendly Name" -msgstr "&Nome para Exibição" +msgstr "Apelido" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:622 msgid "&Personal Message" msgstr "&Mensagem Pessoal" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:623 msgid "&Email Address" -msgstr "&Endereço de Email:" +msgstr "&Endereço de Email" -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "&Copiar..." +#: chat/contactframe.cpp:313 kmessview.cpp:624 +msgid "Song &Name" +msgstr "&Nome da Música" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:124 +msgid "&Information" +msgstr "&Informação" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "Imagens de Exibição" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:157 +msgid "&Notes" +msgstr "&Notas" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:160 +msgid "&Emoticons" +msgstr "&Emoticons" + +#: chat/contactframe.cpp:347 kmessview.cpp:659 +msgid "&Copy" +msgstr "&Copiar" + +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Bloqueado" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Ausente" - -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Volto Logo" - -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Ocupado" - -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Offline" - -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Ausente - Inativo" - -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Saí para Comer" - -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "Online" - -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "Ao telefone" - -#: chat/contactframe.cpp:558 +#: chat/contactframe.cpp:765 +#, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" msgid "The contact is %1" msgstr "O contato está %1" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "texto-estilo-conversa" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" +"

Você não adicionou nenhum emoticon personalizado ainda.

" +"

Para isso, clique aqui!

" -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "Cliente: %1" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Adicionar a conversa" -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "Adicionar Novo" + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Editar" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Remover" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" +"

Você ainda não possui nenhum wink..

Peça para seus " +"contatos enviarem-lhe alguns!

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "Compatível com MSN Messenger %1" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Compatível com Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 +msgid "Windows Live Messenger compatible" +msgstr "Compatível com Windows Live Messenger" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Online" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Ocupado" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Ausente" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "Ausente com auto-resposta" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Inativo" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Volto Logo" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "No telefone" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Saiu para Comer" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Invisível" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Esta conta não possui caixa de entrada no Hotmail!" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Offline" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "Adicionar um contato" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Meu Status" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Informe o email da pessoa que você deseja adicionar:" +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Desconectar" -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "O endereço de e-mail informado é inválido!" +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Adicionar um Contato" -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" -msgstr "Adicionar Emoticon" +msgstr "Adicionar Novo Emoticon" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "O emoticon \"%1\" já existe. Deseja substituí-lo?" +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Editar Emoticon" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Especificar uma mensagem de ausência" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +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:37 +msgid "Automatic Away Message" +msgstr "Mensagem de Ausente Automática" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Histórico da Conversa" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Digite a mensagem que será automaticamente\n" -"enviada às pessoas que tentarem entrar em contato:" +"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:67 -msgid "Use an alternative name for this person" -msgstr "Usar um nome diferente para esta pessoa" +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Impossível abrir o histórico de conversas." -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Exibir um balão popup quando esta pessoa mudar para online/offline" +#: dialogs/chathistorydialog.cpp:572 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Carregando..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Imagem:" +#: dialogs/chathistorydialog.cpp:594 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Nenhuma conversa registrada" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Som:" +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Você foi adicionado por alguém" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"adicionou você a lista de contatos dele(a)." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +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:282 +#, kde-format msgid "Contact Properties for %1" msgstr "Propriedades do contato %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "Endereço de E-mail: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:814 kmessview.cpp:1190 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Conectado" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Nome atual: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1194 +msgid "Not seen yet" +msgstr "Não visto ainda" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1209 +msgid "No messages yet" +msgstr "Nenhuma mensagem ainda" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Última vez visto: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Última mensagem: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Endereço de Email: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Cliente: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" +"Você tem certeza de que deseja utilizar a imagem de exibição deste contato?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "Lista de Contatos" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "O tipo de arquivo selecionado não é suportado pelo Phonon." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Convidar Contatos" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:220 msgid "Network Window" -msgstr "Janela de Rede" +msgstr "Janela da Rede" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Salvar aba" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "S&alvar Aba" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Limpar aba" +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "Limpas Aba" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Fechar aba" +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "Fechar Todas as Abas" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Nenhuma conexão ativa. Impossível abrir a Janela de Rede." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Nenhuma conexão presente.\n" +"Impossível abrir a Janela da Rede." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" -"Impossível salvar conteúdo da Janela de Rede. Verifique se tem permissão de " -"escrita na pasta onde os dados estão sendo salvos." +"Impossível salvar o registro de da Janela da Rede. Certifique-se de que você " +"possui permissões de escrita na pasta em que ele esta sendo salvo.\t" -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." -msgstr "Impossível fechar a aba de conexão principal." +msgstr "Impossível fechar a aba da conexão principal." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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 "" +"Enviar comandos ao servidor é uma operação arriscada.
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 prosseguir com o envio desta mensagem?" + +#: dialogs/networkwindow.cpp:1303 +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 é exigido ('\\r\\n')!
O KMess deve adicioná-la para você?" + +#: dialogs/networkwindow.cpp:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Não posso enviar comandos para este tipo de conexão" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:766 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "Cancelado" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Falhou!" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Concluído" +msgstr "Finalizado" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:741 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:746 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:750 +#, kde-format msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "%1 de %2 recebidos" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 de %2 recebido." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "%1 de %2 enviados" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 de %2 enviado." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "Infinito" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:883 msgid "File Transfers" msgstr "Transferências de Arquivo" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Usar" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Remover" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "Escolha ou remova sua Imagem de Exibição" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "Tem certeza que deseja remover esta imagem de exibição?" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Remover Imagem de Exibição" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -"Impossível salvar o tema de emoticons. Verifique se tem permissão de " -"escrita na pasta de temas '%1'." +"Impossível salvar o tema de emoticons. Certifique-se de possuir permissões " +"de escrita na pasta '%1'." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" -msgstr "Sorriso" +msgstr "Sorrindo" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" -msgstr "Piscando" +msgstr "Wink" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" -msgstr "Língua para fora" +msgstr "Mostrando a língua" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" -msgstr "Sorriso aberto" +msgstr "Grande Sorriso" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Triste" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Chorando" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" -msgstr "Zangado" +msgstr "Raivoso" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Confuso" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" -msgstr "Embaraçado" +msgstr "Envergonhado" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" -msgstr "Desapontado" +msgstr "Desapontamento" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Quente" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" -msgstr "Mostrando os dentes" +msgstr "Rangindo os dentes" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Nerd" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Doente" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Surpreso" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Festa" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" -msgstr "Sonolento" +msgstr "Cansado" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Pensando" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" -msgstr "Não conte a ninguém" +msgstr "É segredo" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" -msgstr "Contando segredo" +msgstr "Segredinho" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" -msgstr "Cansado" +msgstr "Olhos girando" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" -msgstr "Sarcástico" +msgstr "Sarcasmo" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" -msgstr "Não sei" +msgstr "Eu não sei" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" -msgstr "Já volto" +msgstr "Volto Logo" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Anjo" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" -msgstr "Abraço" +msgstr "Abraço pela esquerda" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Garoto" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" -msgstr "Coração" +msgstr "Coração vermelho" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Rosa vermelha" -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "Legal" +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "Polegar para cima" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" -msgstr "Cão" +msgstr "Cachorro" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Sol" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Demônio" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" -msgstr "Abraço" +msgstr "Abraço pela direita" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Garota" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Coração partido" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Rosa murcha" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" -msgstr "Mal" +msgstr "Polegar para baixo" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Gato" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Meia-lua dormindo" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" -msgstr "Lábios" +msgstr "Lábios vermelhos" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" -msgstr "Aplausos" +msgstr "Batendo as Mãos" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Dedos cruzados" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Carro" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Avião" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Tartaruga" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" -msgstr "Caracol" +msgstr "Lesma" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Ovelha negra" +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "Ovelha" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" -msgstr "Cabra" +msgstr "Bode" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Morcego vampiro" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" -msgstr "Cerveja" +msgstr "Caneca de chope" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" -msgstr "Martini" +msgstr "Dose de martini" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" -msgstr "Café" +msgstr "Chícara de café" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Bolo de aniversário" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Prato" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" -msgstr "Tijela" +msgstr "Arco" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Estrela" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Arco-íris" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" -msgstr "Tempestade" +msgstr "Nuvens chovendo" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" -msgstr "Raios" +msgstr "Luminária" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Guarda-chuva" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" -msgstr "Ilha com palmeiras" +msgstr "Ilha com palma" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" -msgstr "Telefone" +msgstr "Raio" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" -msgstr "Telefone celular" +msgstr "Celular" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" -msgstr "E-mail" +msgstr "Email" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Relógio" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Câmera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" -msgstr "Filme" +msgstr "Rolo de filme" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Nota" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Algemas" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Dinheiro" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Lâmpada" -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "Cigarro" +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "Cigarros" -#: emoticontheme.cpp:810 -msgid "Soccer ball" +#: emoticontheme.cpp:907 +msgid "Football ball" msgstr "Bola de futebol" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" -msgstr "Presente" +msgstr "Presente com laço" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Computador" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +msgid "KMess icon" msgstr "Ícone do KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "O endereço do contato informado não é válido: '%1' " +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Impossível reconectar: conta não encontrada" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "Adicionar grupo" +#: 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." -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Informe o nove nome para este grupo:" +#: initialview.cpp:280 initialview.cpp:375 +#, kde-format +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!" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Ausente com auto-resposta" +#: initialview.cpp:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Conexão com internet indisponível" -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Inativo" +#: initialview.cpp:401 +#, kde-format +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] "" +"Aguardando %1 segundos antes de reconectar...
Reconectar " +"agora!" -#: kmess.cpp:715 +#: initialview.cpp:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Conectar" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Cancelar" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Por favor, especifique ambos seu e-mail e senha" + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Por favor, especifique um endereço de email válido" + +#: kmess.cpp:218 +#, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "" +"O contato %1 já está presente em sua lista de contatos." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Informação do Contato" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Novo Grupo" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Adicionar um grupo" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Informe nome para o novo grupo:" + +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" -"Tem certeza que deseja remover o contato %1 de sua lista de " +"Você tem certeza que deseja remover o contato %1 de sua lista de " "contatos?" -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "Remover contato" +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "Remover Contato" -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "Remover e bloquear" +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "Remover e Bloquear" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Remoção de Grupo" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" -"Tem certeza que deseja remover o grupo %1 de sua lista de " +"Você tem certeza que deseja remover o grupo %1 de sua lista de " "contatos?" -#: kmess.cpp:763 -msgid "Remove group" -msgstr "Remover grupo" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Remover" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." msgstr "Este é um grupo especial e não pode ser alterado." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "Renomear grupo" +#: kmess.cpp:676 +msgid "Rename Group" +msgstr "Renomear Grupo" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Conectado" +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "Especifique um novo nome para este grupo:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:754 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" +"

Não pude conectar automaticamente com a conta %1:
primeiro " +"você deve salvar a senha desta conta!

" + +#: kmess.cpp:757 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Entrada Automática Falhou" + +#: kmess.cpp:1041 +msgid "Connection could be down..." +msgstr "A conexão pode ter caído..." + +#: kmess.cpp:1111 +msgctxt "Status bar message" msgid "Disconnected" msgstr "Desconectado" -#: kmess.cpp:1669 +#: kmess.cpp:1450 +#, kde-format +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:1462 +#, kde-format +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 'eventsrc' 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 poderá usar sons e notificações.

O arquivo " -"'eventsrc' não foi encontrado em uma das seguintes pastas: %1

" -"

Por favor, verifique sua instalação e copie o arquivo ausente para uma " -"dessas pastas.

" +"

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:1673 -msgid "Error with notifications" -msgstr "Erro com as notificações" +#: kmess.cpp:1468 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Erro com Notificações" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nova Cont&a" +#: kmess.cpp:1746 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Novo &Contato" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Novo &Grupo" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "&Localizar Contato" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Pesquisar por &Interesse" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Con&figurações de Conta" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Ações" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Co&nectar" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Desconectar" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Mostrar Meu &Perfil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Meu Status" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:306 msgid "&Connect" msgstr "&Conectar" -#: kmessinterface.cpp:275 -msgid "Show &Allowed Contacts" -msgstr "E&xibir Contatos Permitidos" +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Desconectar" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Mostrar Meu &Perfil" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "Exibir Removidos não Bloque&ados" + +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "Exibir Contatos &Offline" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" -msgstr "Exibir Contatos &Removidos" +msgstr "Exibir &Removidos Bloqueados" -#: kmessinterface.cpp:278 -msgid "Show &Display Pictures" -msgstr "Mostrar &Imagens de Exibição" +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "Mostrar Caixa do &Histórico" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Mostrar Janela de &Rede" +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "Exibir Barra de Procura" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Exibir Grupos Va&zios" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "Tamanho da Imagem" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "&Ordenar Contatos por" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "Mostrar Janela de Transferência" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Novo &Contato" + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Novo &Grupo" + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "&Exportar Lista de Contatos..." + +#: kmessinterface.cpp:183 kmessview.cpp:611 +msgid "Show Chat &History..." +msgstr "Mostrar &Histórico de Conversas" + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Nova Cont&a" + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "Configurar Conta..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Co&nfigurações" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Mostrar &Menu de Seleção" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Não Mostrar" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Pequena" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Média" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Grande" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Grupo" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Mostrar &Transferências de Arquivos" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Misturado" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Ouvindo %1" +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "Mostrar Ja&nela de Rede" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:327 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Conectado como %2" -#: kmessview.cpp:613 +#: kmessview.cpp:364 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 conectou" + +#: kmessview.cpp:369 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 desconectou" + +#: kmessview.cpp:608 msgid "Cha&t" -msgstr "&Conversa..." +msgstr "&Conversar" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Propriedades" +#: kmessview.cpp:619 +msgid "&Remove From Group" +msgstr "Remover do Grupo" -#: kmessview.cpp:623 -msgid "&Remove from group" -msgstr "&Remover do Grupo" - -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Mover para Grupo" - -#: kmessview.cpp:641 +#: kmessview.cpp:652 msgid "&Copy to Group" -msgstr "&Copiar para Grupo" +msgstr "&Copiar para o Grupo" -#: kmessview.cpp:674 +#: kmessview.cpp:653 +msgid "&Move to Group" +msgstr "&Mover para o Grupo" + +#: kmessview.cpp:704 msgid "Move Group &Down" msgstr "Mover Grupo para &Baixo" -#: kmessview.cpp:675 +#: kmessview.cpp:705 msgid "Move Group &Up" msgstr "Mover Grupo para &Cima" -#: kmessview.cpp:676 +#: kmessview.cpp:706 msgid "Re&move Group" msgstr "Re&mover Grupo" -#: kmessview.cpp:677 +#: kmessview.cpp:707 msgid "Re&name Group" msgstr "Re&nomear Grupo" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "1 novo e-mail em sua caixa de entrada" +#: kmessview.cpp:1146 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Esta pessoa não tem você na lista dela" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "%1 novos e-mails em sua caixa de entrada" +#: kmessview.cpp:1155 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Endereço de email" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Ausente)" +#: kmessview.cpp:1162 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Cliente" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Volto Logo)" +#: kmessview.cpp:1174 +msgid "Yes" +msgstr "Sim" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Ocupado)" +#: kmessview.cpp:1178 +msgid "No" +msgstr "Não" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Invisível)" +#: kmessview.cpp:1181 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloqueado" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Ausente - Inativo)" +#: kmessview.cpp:1201 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Última vez visto" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Saí para Comer)" +#: kmessview.cpp:1216 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Última mensagem" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Ao telefone)" +#: kmessview.cpp:1226 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Grupo %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Conectar automaticamente com o endereço fornecido" +#: kmessview.cpp:1234, kde-format +msgctxt "Contact counters in normal group tooltip, first part" +msgid "%1 contact, " +msgid_plural "%1 contacts, " +msgstr[0] "%1 contato." +msgstr[1] "%1 contatos." -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1237, kde-format +msgctxt "Contact counters in normal group tooltip, second part" +msgid "%1 online" +msgid_plural "%1 online" +msgstr[0] "%1 online" +msgstr[1] "%1 online" + +#: kmessview.cpp:1243 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contato" +msgstr[1] "%1 contatos" + +#: kmessview.cpp:1663 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Mensagem pessoal>" + +#: kmessview.cpp:1664 +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 de exibição" + +#: kmessview.cpp:1847 +msgid "No chat logs could be found for this contact." +msgstr "" + +#: kmessview.cpp:1848 kmessview.cpp:1854 +msgid "No chat history found" +msgstr "Nenhum registro encontrado." + +#: kmessview.cpp:1853 +msgid "" +"No chats logs could be found for this contact. Note that new chats are not " +"logged; if you want your chats to be logged, you can enable it in your " +"account settings." +msgstr "" + +#: kmessview.cpp:2041 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 email novo" +msgstr[1] "%1 emails novos" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:488 settings/accountpage.cpp:549 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "Um cliente Live Messenger para o KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Desenvolvedor e fundado do projeto" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "Desenvolvedor" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "Suporte ao projeto" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Desenvolvedor atual" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:125 +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:67 main.cpp:162 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:161 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "" -"Tradução para alemão, testes, documentação, página web, gerenciamento " -"do projeto etc." +"Tradução para Alemão, testes, documentação, página web, gerenciamento do " +"projeto, etc..." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 msgid "Web design" -msgstr "Web design" +msgstr "Web-design" + +#: main.cpp:73 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:73 +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:74 +msgid "Cartoon emoticons" +msgstr "Emoticons Cartoon" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "Tema padrão de som" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "Ícones do Kmess no estilo Oxygen" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:109 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" #: 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 o italiano" - -#: main.cpp:81 -msgid "Cartoon emoticons" -msgstr "Emoticons cartoon" +msgid "Translations Maintainer" +msgstr "Mantenedor de traduções" #: main.cpp:82 -msgid "Default sound theme" -msgstr "Tema de som padrão" +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" +"Tradução para Árabe, correção para internacionalização do texto de salvar " +"arquivos." + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "Adições à tradução para Árabe" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "Tradução para Português do Brasil" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" #: main.cpp:86 -msgid "Arabic translation, internationalization of file saving fix." -msgstr "Tradução para árabe, internacionalização da correção do salvamento de arquivos." +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "Tradução para Português do Brasil" #: main.cpp:87 -msgid "More Arabic translation" -msgstr "Mais tradução para árabe" +msgid "Sergio Rafael Lemke" +msgstr "" #: main.cpp:88 -msgid "Brazilian Portuguese translation" -msgstr "Tradução para português do Brasil" +msgid "Maurício Arozi Moraes" +msgstr "Maurício Arozi Moraes" -#: main.cpp:89 +#: main.cpp:90 msgid "Catalan translation" -msgstr "Tradução para catalão" +msgstr "Tradução para Catalão" + +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" #: main.cpp:91 -msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgid "Adrià Arrufat" msgstr "" -"Tradução para chinês simplificado, correção do envio de arquivos, " -"código de conexão por proxy" -#: main.cpp:92 -msgid "More Simplified Chinese translation" -msgstr "Mais tradução para chinês simplificado" +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "Mais tradução catalã" #: main.cpp:93 -msgid "Traditional Chinese translation" -msgstr "Tradução para chinês tradicional" +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" +"Tradução para Chinês Simplificado, correção do envio de arquivos, código de " +"conexão por proxy" + +#: main.cpp:94 main.cpp:157 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "Adições à tradução para Chines Simplificado" #: main.cpp:95 -msgid "Danish translation" -msgstr "Tradução para dinamarquês" +msgid "Cheng Yang" +msgstr "Cheng Yang" #: main.cpp:96 -msgid "More Danish translation" -msgstr "Mais tradução para dinamarquês" +msgid "Traditional Chinese translation" +msgstr "Tradução para Chinês Tradicional" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" #: main.cpp:97 -msgid "Dutch translation" -msgstr "Tradução para neerlandês" +msgid "More Traditional Chinese translation" +msgstr "Mais tradução para Chinês Tradicional" -#: main.cpp:98 -msgid "More Dutch translation" -msgstr "Mais tradução para neerlandês" +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "Tradução para Dinamarquês" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" #: main.cpp:100 -msgid "Estonian translation" -msgstr "Tradução para estoniano" +msgid "More Danish translation" +msgstr "Adições à tradução para Dinamarquês" -#: main.cpp:101 -msgid "Finnish translation" -msgstr "Tradução para finlandês" +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" -#: main.cpp:102 main.cpp:103 -msgid "More Finnish translation" -msgstr "Mais tradução para finlandês" +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "Tradução para Holandês" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 main.cpp:107 +msgid "More Dutch translation" +msgstr "Adições à tradução para Holandês" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" #: main.cpp:105 -msgid "French translation" -msgstr "Tradução para francês" +msgid "Elve" +msgstr "Elve" #: main.cpp:106 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "Mais tradução para francês, definições de emoticon para MSN6" +msgid "Sander Pientka" +msgstr "Sander Pientka" #: main.cpp:107 -msgid "More French translation" -msgstr "Mais tradução para francês" +msgid "Heimen Stoffels" +msgstr "" #: main.cpp:109 -msgid "Hungarian translation" -msgstr "Tradução para húngaro" +msgid "More German translation, Greek translation" +msgstr "Mais tradução alemã, tradução para Grego" -#: main.cpp:110 main.cpp:111 -msgid "More Italian translation" -msgstr "Mais tradução para italiano" +#: main.cpp:110 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:110 +msgid "More Greek translation" +msgstr "Mais traduções em Grego" #: main.cpp:112 -msgid "Korean translation" -msgstr "Tradução para coreano" +msgid "Estonian translation" +msgstr "Tradução para Estoniano" + +#: main.cpp:112 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" #: main.cpp:113 -msgid "Norsk Bokmål translation" -msgstr "Tradução para bokmål" +msgid "Finnish translation" +msgstr "Tradução para Finlandês" + +#: main.cpp:113 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:114 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:114 main.cpp:115 +msgid "More Finnish translation" +msgstr "Adições à tradução para Finlandês" #: main.cpp:115 -msgid "Slovenian translation" -msgstr "Tradução para esloveno" +msgid "Jussi Timperi" +msgstr "Jussi Timperi" -#: main.cpp:116 -msgid "Spanish translation" -msgstr "Tradução para espanhol" +#: main.cpp:117 +msgid "Choplair" +msgstr "Choplair" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 -msgid "More Spanish translation" -msgstr "Mais tradução para espanhol" +#: main.cpp:117 +msgid "French translation" +msgstr "Tradução para Francês" + +#: main.cpp:118 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "Mais traduções francesas, definição dos emoticons do MSN6" + +#: main.cpp:118 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:119 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:119 main.cpp:120 main.cpp:121 +msgid "More French translation" +msgstr "Adições à tradução para Francês" + +#: main.cpp:120 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" #: main.cpp:121 -msgid "Swedish translation" -msgstr "Tradução para sueco" +msgid "Scias" +msgstr "" #: main.cpp:123 -msgid "Thai translation" -msgstr "Tradução para tailandês" +msgid "Hungarian translation" +msgstr "Tradução para Húngaro" + +#: main.cpp:123 +msgid "Páder Rezső" +msgstr "Páder Rezső" #: main.cpp:124 -msgid "Turkish translation" -msgstr "Tradução para turco" +msgid "More Hungarian translation" +msgstr "Adições à tradução para Húngaro" + +#: main.cpp:124 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" #: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "Mais tradução para turco" +msgid "More Italian translation" +msgstr "Mais tradução italiana" + +#: main.cpp:126 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:127 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:127 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" +"Mais tradução italiana, seleção de Grupo no diálogo de "adição de " +"usuário"" + +#: main.cpp:128 +msgid "Korean translation" +msgstr "Tradução para Coreano" + +#: main.cpp:128 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" #: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "" -"Código para imagens na lista de contato, informação de cliente do " -"contato, zoom de fonte das mensagens" +msgid "Norsk Bokmål translation" +msgstr "Tradução para Norsk Bokmi" -#: main.cpp:130 -msgid "P4-Context field support" -msgstr "Suporte para o campos \"P4-Context\"" +#: main.cpp:129 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" #: main.cpp:131 -msgid "Xinerama fixes" -msgstr "Correções de Xinerama" +msgid "Serbian translation" +msgstr "Tradução para Sérbio" -#: main.cpp:132 -msgid "Original file receive code" -msgstr "Código de recebibemnto de arquivo original" +#: main.cpp:131 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" #: main.cpp:133 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:133 +msgid "Slovak translation" +msgstr "Tradução para Eslovaco" + +#: main.cpp:134 +msgid "Matjaž Kaše" +msgstr "Matjaž Kaše" + +#: main.cpp:134 +msgid "Slovenian translation" +msgstr "Tradução para Esloveno" + +#: main.cpp:136 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:136 +msgid "Spanish translation" +msgstr "Tradução para Espanhol" + +#: main.cpp:137 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 main.cpp:141 +#: main.cpp:142 main.cpp:143 +msgid "More Spanish translation" +msgstr "Mais tradução Espanhola" + +#: main.cpp:138 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:139 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:140 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:141 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:142 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:143 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:145 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:145 +msgid "Swedish translation" +msgstr "Tradução para Sueco" + +#: main.cpp:146 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:146 +msgid "More Swedish translation" +msgstr "Mais tradução para Sueco" + +#: main.cpp:148 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:148 +msgid "Thai translation" +msgstr "Tradução para Tailandês" + +#: main.cpp:149 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:149 +msgid "Turkish translation" +msgstr "Tradução para Turco" + +#: main.cpp:150 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:150 main.cpp:151 +msgid "More Turkish translation" +msgstr "Adições à tradução para Turco" + +#: main.cpp:151 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:154 +msgid "MSNP12 support, various patches" +msgstr "Suporte ao MSNP12, diversos patches" + +#: main.cpp:154 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:155 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:155 +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:156 +msgid "File transfer thumbnails" +msgstr "Miniaturas das transferências" + +#: main.cpp:156 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:157 +msgid "P4-Context field support" +msgstr "Suporte ao campo P4-Context" + +#: main.cpp:158 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:158 +msgid "Xinerama fixes" +msgstr "Correções Xinerama" + +#: main.cpp:159 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:159 +msgid "Original file receive code" +msgstr "Código de recepção do arquivo original" + +#: main.cpp:160 +msgid "KWallet support" +msgstr "Suporte KWallet" + +#: main.cpp:160 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:161 +msgid "" +"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:162 +msgid "IRC-like commands in the chat window" +msgstr "Comandos tipo IRC na janela de conversas" + +#: main.cpp:163 +msgid "Chat history dialog" +msgstr "Diálogo do Histórico da Conversa" + +#: main.cpp:163 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:166 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:166 +msgid "Various internationalization fixes" +msgstr "Várias correções de internacionalização." + +#: main.cpp:167 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:167 msgid "Various internationalization fixes." msgstr "Várias correções de internacionalização." -#: main.cpp:134 +#: main.cpp:169 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:169 msgid "GnomeMeeting developer" msgstr "Desenvolvedor do GnomeMeeting" -#: main.cpp:135 +#: main.cpp:170 msgid "Guy with a bag over his head" -msgstr "Homem com um saco sobre a cabeça" +msgstr "Cara com um saco sobre a cabeça" -#: main.cpp:138 +#: main.cpp:170 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:173 msgid "Inspiration and assorted code" msgstr "Inspiração e códigos diversos" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +#: main.cpp:173 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:174 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:174 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "" -"Código de dicas balão antigo, código p2p inicial, gerenciador de msn " -"\"challenge\"" +"Código anterior dos balões de mensagem, código de p2p inicial, manipulador " +"do desafio do MSN" -#: main.cpp:140 +#: main.cpp:175 msgid "Idle timer code" -msgstr "Código de tempo de inatividade" +msgstr "Código do temporizador de Intatividade" -#: main.cpp:141 +#: main.cpp:175 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:176 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:176 msgid "Close-to-tray icon screenshot code" -msgstr "Código para exibir imagem da bandeja dos sistema" +msgstr "Código de fechar para a bandeja do sistema" -#: main.cpp:144 +#: main.cpp:177 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:177 +msgid "Custom crash handler implementation" +msgstr "Implementação do gerenciador de erros personalizado" + +#: main.cpp:178 +msgid "" +"KNotify not giving focus bug fix and KWin focus stealing prevention " +"workaround" +msgstr "" + +#: main.cpp:178 +msgid "Quassel" +msgstr "" + +#: main.cpp:181 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\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:181 msgid "Your name here?" msgstr "Seu nome aqui?" -#: main.cpp:144 -msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" -"If you feel your name is missing here, please contact us too!" -msgstr "" -"Sinta-se livre para enviar correções e patches para o fórum de ajuda do KMess!\n" -"Se você percebeu que seu nome está faltando aqui, contacte-nos também!" +#: main.cpp:184 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Seus nomes" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:185 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Seu endereço de email" + +#: main.cpp:191 +msgid "Do not show the contact list window initially" +msgstr "Não mostrar a lista de contatos inicialmente" + +#: main.cpp:192 +msgid "Autologin with the given email address" +msgstr "Conectar automaticamente com o email fornecido" + +#: main.cpp:197 +msgid "Run a debug test (developer build only)" +msgstr "Rodar um teste de depuração (compilações de desenvolvedor apenas)" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "Pessoas" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Permitido" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Removido" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." -msgstr "O contato cancelou a sessão." +msgstr "O Contato cancelou a sessão." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "O contato rejeitou o convite." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Você cancelou a sessão." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Você rejeitou o convite." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, kde-format msgid "Do you want to accept or cancel?" -msgstr "aceitar ou cancelar?" +msgstr "Você gostaria de aceitar ou cancelar?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, kde-format msgid "Click to cancel." msgstr "Clique para cancelar." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Você deseja aceitar o arquivo: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +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:209 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "A transferência de %1 falhou. Impossível abrir o arquivo" +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, kde-format +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:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Conectando-se a %1, porta %2" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"A transferência do arquivo "%1" falhou. Impossível salvar o " +"arquivo." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Transferência cancelada" +#: network/applications/filetransfer.cpp:295 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "" +"A Transferência do arquivo %1 falhou. Impossível abrir o arquivo de destino." -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Conexão estabelecida" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Arquivo transferido com sucesso: %1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "A transferência de %1 falhou. O arquivo não existe." - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "A transferência de %1 falhou. Impossível ler o arquivo" - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Enviando arquivo %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Transferência aceita." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 -msgid "Negotiating options to connect" -msgstr "Negociando opções de conexão" +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Conectando em %1, porta %2" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:548 +#, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "O contato cancelou a transferência do arquivo "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:559 +#, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Você cancelou a transferência do arquivo "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:570 +#, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Você rejeitou a transferência do arquivo "%1"." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Conexão estabelecida" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:674 +#, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Arquivo "%1" enviado com sucesso." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:678 +#, kde-format +msgid "Successfully received the file "%1"." +msgstr "Arquivo "%1" recebido com sucesso." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:811 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "A transferência do arquivo "%1" falhou. Arquivo inexistente." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:816 +#, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "" +"A transferência do arquivo "%1" falhou. Impossível ler o arquivo." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:850 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Enviando arquivo "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:888 +#, kde-format +msgid "The contact has accepted the transfer of the 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:3217 +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 msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "" -"A transferência do arquivo foi cancelada. Foram recebidos dados " -"inválidos." +"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:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "A transferência de %1 falhou. Impossível abrir arquivo" +#: network/applications/filetransferp2p.cpp:404 +#, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Você aceitou a transferência do arquivo "%1"." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "O Contato cancelou a transferência." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:614 msgid "File could not be written" -msgstr "Impossível gravar o arquivo" +msgstr "O arquivo não pôde ser escrito." -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "A transferência de %1 falhou. O arquivo não existe." - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "A transferência de %1 falhou. Impossível ler o arquivo." - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "Enviando arquivo %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "Você foi convidado a iniciar uma conferência (usando GnomeMeeting)." +msgstr "Você está convidado a iniciar uma conferência (usando GnomeMeeting)." -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "Iniciando o GnomeMeeting. Conectando a %1." +msgstr "Iniciando o GnomeMeeting. Conectando a %1." -#: network/applications/gnomemeeting.cpp:156 +#: 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:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "O convite foi cancelado. Não é suportado pelo outro cliente." - -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "O convite foi abortado. Ocorreu um erro interno." - -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/inktransferp2p.cpp:108 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has tried to send you an handwritten message, but it could not be " +"received." msgstr "" -"O convite foi abortado. Limite de tempo atingido ao esperar " -"que o usuário aceitasse." +"%1 tentou enviar-lhe uma mensagem manuscrita, mas ela não pôde ser " +"recebida." -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." +#: network/applications/inktransferp2p.cpp:114 +#, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "The handwritten message to %1 could not be delivered." +msgstr "A mensagem manuscrita para %1 não pôde ser entregue." + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "O convite foi rejeitado. Ele não é suportado pelo outro cliente." + +#: network/applications/mimeapplication.cpp:164 +msgid "The invitation was aborted. An internal error occured." +msgstr "O contato convite foi abortado. Ocorreu um erro interno." + +#: network/applications/mimeapplication.cpp:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" -"O convite foi abortado. Limite de tempo atingido durante " -"espera pelos dados do arquivo." +"O convite foi abortado. Tempo esgotado enquanto aguardava uma aceitação do " +"contato." -#: network/applications/mimeapplication.cpp:135 -msgid "The invitation was aborted. The switchboard closed the chat connection." -msgstr "O convite foi abortado. O sistema encerrou a conexão da conversa." +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "" +"O convite foi abortado. Tempo esgotado enquanto aguardava uma aceitação do " +"contato." -#: network/applications/mimeapplication.cpp:141 +#: 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:186 msgid "The invitation was aborted." msgstr "O convite foi abortado." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "Você foi convidado a compartilhar o desktop desta pessoa." +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this contact's desktop." +msgstr "Você foi convidado a compartilhar o desktop dessa pessoa." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." -msgstr "Iniciando o KRDC. Conectando a %1." +msgstr "Iniciando KRDC. Conectando a %1." -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "O contato iniciou uma função que o KMess ainda não suporta." +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "" +"O contato está convidando você para uma atividade não suportada pelo KMess." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" -"O convite foi cancelado. O contato enviou dados inválidos ou não suportados " -"pelo KMess." +"Este convite foi cancelado. O contato enviou dados estranhos, ou que o KMess " +"não os suporta." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "Falha na transferência. A preparação dos dados falhou." +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "A transferência falhou. Preparação de dados incorreta." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "O convite foi cancelado. A mensagem não era direcionada a nós." + +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "" +"A transferência falhou. O contato enviou dados estranhos ou que o KMess não " +"suporta." + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." msgstr "O contato rejeitou o convite. Ocorreu um erro interno." -#: network/applications/p2papplication.cpp:1624 +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "Esperando conexão em %1, porta %2" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +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:3169 +msgid "Waiting for connection" +msgstr "Aguardando pela conexão" + +#: network/applications/p2papplication.cpp:3423 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "" +"O convite foi cancelado. Tempo esgotado enquanto aguardava uma aceitação do " +"contato.." + +#: network/applications/p2papplication.cpp:3432 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "" +"O convite foi cancelado. Tempo esgotado enquanto aguardava uma conexão " +"acontecer ou não." + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "O convite foi cancelado. Tempo esgotado enquanto aguardava dados." + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "O contato rejeitou o convite. Ocorreu um erro interno." + +#: network/applications/p2papplicationbase.cpp:627 msgid "The transfer failed." msgstr "A transferência falhou." -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "A transferência falhou. O contato enviou dados inválidos ou não suportados pelo KMess." - -#: network/applications/p2papplication.cpp:2038 -msgid "The invitation was cancelled. Message was not directed to us." -msgstr "O convite foi cancelado. A mensagem não foi dirigida a nós." - -#: network/applications/p2papplication.cpp:2584 -msgid "The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "A transferência falhou. O contato enviou dados inválidos ou não suportados pelo KMess." - -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 -msgid "Awaiting connection at %1, port %2" -msgstr "Aguardando conexão em %1, porta %2" - -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 -msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "Enviando por transferência indireta (pode ser mais lento)." - -#: network/applications/p2papplication.cpp:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." msgstr "" -"A transferência falhou. Limite de tempo atingido esperando " -"que o usuário aceitasse." +"A Transferência de arquivos falhou. Tempo esgotado enquanto aguardava uma " +"aceitação do contato." -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "A transferência falhou. Houve um erro interno." +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." +msgstr "A transferência falhou. Um erro interno ocorreu." -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "Falha na transferência. Impossível abrir fonte dos dados." +#: network/applications/p2papplicationbase.cpp:1208 +msgid "The transfer failed. Could not open data source." +msgstr "A transferência falhou. Impossível abrir dados para envio." -#: network/applications/p2papplication.cpp:4844 -msgid "Waiting for connection" -msgstr "Aguardando conexão" - -#: network/applications/p2papplication.cpp:5013 -msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " -"accept." -msgstr "" -"Convite cancelado. Limite de tempo atingido esperando que o usuário " -"aceitasse." - -#: network/applications/p2papplication.cpp:5022 -msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " -"succeed or fail." -msgstr "" -"Convite cancelado. Limite de tempo atingido esperando por sucesso ou " -"falha de uma conexão." - -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "Convite cancelado. Limite de tempo atingido esperando dados." - -#: network/applications/voiceconversation.cpp:77 +#: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." -msgstr "Você foi convidado a iniciar uma conversa por voz" +msgstr "Você foi convidado a iniciar um conversa por voz." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "" -"Você foi convidade a iniciar uma conversa por voz, mas o suporte para isso " -"não foi instalado" +"Você iniciou uma conversa por voz, mas o suporte para isto não foi instalado" -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "Você cancelou a conversa por voz" +msgstr "Você cancelou a conversa por voz." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "Convite cancelado. O dispositivo de áudio não pôde ser aberto." +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "" +"O convite foi cancelado. Não foi possível abrir o dispositivo de áudio." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." -msgstr "Iniciando conversa por voz. Conectando a %1." +msgstr "Iniciar conversa por voz. Conectando a %1" -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." -msgstr "Iniciando conversa por voz. Ouvindo em %1." +msgstr "Iniciar conversa por voz. Ouvindo em %1." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." -msgstr "Convidadando o contato para uma conversa por voz." +msgstr "Convidando o contato para uma conversa por voz." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" -"O contato está convidando-o para '%1', mas isso ainda não foi " +"O contato está convidando você para '%1', mas isso ainda não foi " "implementado." -#: network/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "A transferência de %1 foi cancelada." +#: 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:136 +#: 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 contact'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:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Você cancelou a transferência do arquivo "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "O contato cancelou a transferência do arquivo "%1"." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Falhou" -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "A transferência de %1 falhou. Impossível abrir uma porta local." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Enviando arquivo %1" -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:398 +#, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "A Transferência de %1 falhou. Impossível abrir uma porta local." + +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." msgstr "Impossível abrir uma porta local." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "Iniciando transferência de arquivo" +msgstr "Iniciando a transferência de arquivos" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "Falha ao transferir %1. Uma conexão não pôde ser estabelecida" +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +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:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "Impossível estabelecer conexão." +msgstr "Impossível fazer uma conexão" -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" -msgstr "Recebendo o arquivo %1" +msgstr "Recebendo arquivo %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:378 +msgid "Invalid command syntax" +msgstr "Sintaxe de comando inválida" + +#: network/msnconnection.cpp:382 +msgid "Invalid command parameter" +msgstr "Parâmetro de comando inválido" + +#: network/msnconnection.cpp:385 +msgid "The email address you have tried to add is not a Live Messenger account" msgstr "" -"Impossível estabelecer conexão com o serviço MSN Messenger.\n" -"Por favor, certifique-se de estar conectado à internet.\n" -"Erro: %1 (código %2)" +"O endereço de email que você tentou adicionar não é uma conta do Live " +"Messenger" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping perdido" +#: network/msnconnection.cpp:390 +msgid "Domain name missing" +msgstr "Nome de domínio faltando" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 pings perdidos" +#: network/msnconnection.cpp:394 +msgid "Already logged in" +msgstr "Já logado" -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "A conexão ao servidor falhou. " +#: network/msnconnection.cpp:397 +msgid "The given account name is invalid" +msgstr "O nome da conta dado é inválido" -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "O servidor remoto encerrou a conexão." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Permitido" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Removido" - -#: network/msnnotificationconnection.cpp:545 +#: network/msnconnection.cpp:401 msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"O KMess não pôde se conectar aos servidores do .MSN Messenger. Os servidores " -"podem estar temporariamente indisponíveis ou há um problema com sua " -"conexão com a internet." +"Este nome de conta é inválido ou sua conta passaporte ainda não foi " +"confirmada" -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "Exibir status do serviço MSN Messenger?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Erro do servidor" - -#: network/msnnotificationconnection.cpp:1339 -msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "" -"Você foi desconectado porque se conectou com outro cliente MSN Messenger " -"ou a partir de outro local." - -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "Sincronização efetuada" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Autenticando..." - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Recebida confirmação de usuário" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Aguardando lista de contatos..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Transferência para o servidor de notificação..." - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "Falha de autenticação. Por favor, verifique seu nome de conta e senha" - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Conectando..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess recebeu um comando desconhecido do servidor: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Houve um erro interno do KMess: %1" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "O e-mail digitado não é uma conta válida do MSN Messenger" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "O nome de conta informado é inválido" - -#: network/msnnotificationconnection.cpp:2255 -msgid "That account name is invalid, or your passport has not been confirmed yet" -msgstr "O nome de conta é inválido ou seu MSN Passport ainda não foi confirmado" - -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:404 msgid "Your contact list is full" msgstr "Sua lista de contatos está cheia" -#: network/msnnotificationconnection.cpp:2264 -msgid "This contact is already on your list" -msgstr "Este contato já está em sua lista" +#: network/msnconnection.cpp:409 +msgid "Invalid SBP parameter" +msgstr "Parâmetro SBP inválido" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:412 +msgid "This contact is already on your list" +msgstr "Este contato já encontra-se em sua lista" + +#: network/msnconnection.cpp:416 msgid "This contact is not on your list" msgstr "Este contato não está em sua lista" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:420 msgid "This contact is not online" -msgstr "O contato não está online" +msgstr "Este contato não está online" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Há grupos grupos demais em sua lista de contatos" +#: network/msnconnection.cpp:425 +msgid "Already in this mode" +msgstr "Já neste modo" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" +#: network/msnconnection.cpp:429 +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/msnconnection.cpp:433 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"O nome do grupo já esta presente nesta lista de contatos. Por favor, utilize " +"um nome diferente." + +#: network/msnconnection.cpp:437 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30" +msgstr "Sua lista de contatos tem muitos grupos; para o máximo de 30." + +#: network/msnconnection.cpp:441 +msgid "This group cannot be changed" msgstr "Este grupo não pode ser alterado" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:446 +msgid "Contact is not added to this group" +msgstr "Contato não está adicionado neste grupo" + +#: network/msnconnection.cpp:450 msgid "This group is not empty" -msgstr "O grupo não está vazio" +msgstr "Este grupo não está vazio" -#: network/msnnotificationconnection.cpp:2288 -msgid "The group name is already in use by your Messenger or Hotmail contact list" -msgstr "O nome já é utilizado por sua lista de contatos do MSN Messenger ou Homail" +#: network/msnconnection.cpp:454 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "O nome do grupo é muito longo; para o máximo de 61 bytes" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "O nome do grupo é muito longo" +#: network/msnconnection.cpp:459 +msgid "Attempted to change group \"0\"" +msgstr "Tentei mudar o grupo \"0\"" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:459 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Há um erro interno no Kmess: %1" + +#: network/msnconnection.cpp:463 +msgid "Invalid Group" +msgstr "Grupo Inválido" + +#: network/msnconnection.cpp:467 +msgid "Empty domain" +msgstr "Domínio vazio" + +#: network/msnconnection.cpp:471 +msgid "Wrong ADL command format" +msgstr "Formado errado de comando ADL" + +#: network/msnconnection.cpp:474 msgid "Switchboard server failed" -msgstr "Falha no servidor de intercâmbio" +msgstr "O servidor de distribuição falhou" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:477 msgid "Transfer to switchboard server failed" -msgstr "A transferência para o servidor de intercâmbio falhou" +msgstr "Transferência para o servidor de distribuição falhou" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:481 msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "Erro de conexão direta (MSNLSP), a conexão falhou" +msgstr "Erro de conexão direta (MSNSLP); a conexão falhou" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "" -"Erro ao acessar a lista de contatos, tente novamente " -"mais tarde" +#: network/msnconnection.cpp:485 +msgid "Required field missing" +msgstr "Campo necessário faltando" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "Sua conta foi banida." +#: network/msnconnection.cpp:489 +msgid "Not logged in" +msgstr "Não logado" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Você está abrindo sessões muito rapidamente" +#: network/msnconnection.cpp:493 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "O acesso ao serviço Live Messenger foi negado para esta conta" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Você tem sessões demais abertas" +#: network/msnconnection.cpp:498 +msgid "Command is disabled" +msgstr "O comando está desabilitado" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:501 +msgid "Your account is banned" +msgstr "Sua conta está banida." + +#: network/msnconnection.cpp:505 +msgid "Challenge response failed" +msgstr "Falha de pedido de resposta" + +#: network/msnconnection.cpp:510 +msgid "Bad command data" +msgstr "Dados de comando errados" + +#: network/msnconnection.cpp:514 +msgid "You are opening chat sessions too fast" +msgstr "Você esta abrindo sessões de conversa muito rápido" + +#: network/msnconnection.cpp:518 +msgid "You have too many open chat sessions" +msgstr "Você tem excessivo número de janelas abertas" + +#: network/msnconnection.cpp:525 +msgid "Unexpected command sequence" +msgstr "Sequência inesperada de comandos" + +#: network/msnconnection.cpp:529 msgid "Bad friend name" -msgstr "Nome para exibição inválido" +msgstr "Nome de amigo inválido" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "O servidor relata que o KMess o está sobrecarregando com dados demais" +#: network/msnconnection.cpp:535 +msgid "Bad CVR data" +msgstr "Dado CVR errado" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." -msgstr "Você não pode iniciar uma conversa com alguém enquanto estiver invisível." +#: network/msnconnection.cpp:541 +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:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:548 +msgid "Authentication ticket was incorrect" +msgstr "Tiquete de autenticação incorreto" + +#: network/msnconnection.cpp:551 +msgid "You cannot start a chat with someone while you are invisible" msgstr "" -"Você possui um MSN Passport infantil e precisa de consentimento " -"paterno para conversar online." +"Você não pode iniciar um chat com alguém enquanto você estiver invisível." -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Seu Passport precisa ser confirmado primeiro." +#: network/msnconnection.cpp:555 +msgid "Not accepting new contacts" +msgstr "Não aceitando novos contatos" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - Erro do MSN" +#: network/msnconnection.cpp:559 +msgid "" +"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:2401 -msgid "There was an internal server error" -msgstr "Houve um erro interno do servidor" +#: network/msnconnection.cpp:562 +msgid "Your Passport account needs to be verified first" +msgstr "Seu passaporte precisa ser confirmado primeiro." -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "O servidor está ocupado" +#: network/msnconnection.cpp:566 +msgid "Bad USR ticket" +msgstr "Tiquete USR errado" -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "O servidor está indisponível" +#: network/msnconnection.cpp:576 +msgid "Error accessing contact list, try again later" +msgstr "Erro ao acessar a lista de contatos, tente novamente mais tarde" -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:585 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"O serviço Live Messenger está temporariamente indisponível, ocorreu um erro " +"interno no servidor" + +#: network/msnconnection.cpp:596 +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "" +"O serviço Live Messenger está temporariamente indisponível, o servidor está " +"muito ocupado" + +#: network/msnconnection.cpp:600 msgid "Peer notification server down" -msgstr "Servidor de notificação de usuários indisponível" +msgstr "Servidor de notificação de pontos indisponível" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:604 msgid "The server is going down" -msgstr "O servidor estará indisponível" +msgstr "O servidor esta saindo do ar" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:608 msgid "The server is going down soon" -msgstr "O servidor estará indisponível em breve" +msgstr "O servidor sairá do ar em breve" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:613 msgid "Write is blocking" -msgstr "Bloqueio de escrita" +msgstr "A escrita está bloqueando" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:617 msgid "Session is overloaded" -msgstr "A sessão está sobrecarregada" +msgstr "A sessão esta sobrecarregada" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:624 msgid "The server is not available" msgstr "O servidor está indisponível" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:628 msgid "Authentication failed" -msgstr "A autenticação falhou" +msgstr "Autenticação falhou" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Novos principais não aceitos" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" -"O KMess recebeu uma mensagem de erro desconhecida do servidor: " -"%1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Atenção: O servidor será fechado para manutenção em 1 minuto!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:635 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -"O servidor MSN avisou que estará indisponível em um minuto para " -"manutenção." +"Código de erro desconhecido recebido do servidor: %1
Detalhes " +"técnicos: %2" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Atenção: O servidor será fechado para manutenção em %1!" +#: network/msnconnection.cpp:652 network/msnnotificationconnection.cpp:2922 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Erro MSN" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnconnection.cpp:957 +msgid "Trying the HTTP fallback..." +msgstr "Tentando o modo HTTP..." + +#: network/msnnotificationconnection.cpp:1344 +msgid "Authenticating..." +msgstr "Autenticando..." + +#: network/msnnotificationconnection.cpp:1368 +msgid "Authenticated" +msgstr "Autenticado" + +#: network/msnnotificationconnection.cpp:1438 +msgid "Switching to another server..." +msgstr "Mudando de servidor..." + +#: network/msnnotificationconnection.cpp:1802 +msgid "Connecting..." +msgstr "Conectando..." + +#: network/msnnotificationconnection.cpp:1947 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Comando desconhecido recebido do servidor: %1" + +#: network/msnnotificationconnection.cpp:2107 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuto" +msgstr[1] "%1 minutos" + +#: network/msnnotificationconnection.cpp:2110 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Servidor fechado para manutenção em %1!" + +#: network/msnnotificationconnection.cpp:2115 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "Os servidores Live Messenger serão desligados em %1 para manutenção." + +#: network/msnnotificationconnection.cpp:2316 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess não pôde processar mensagens offline.
Detalhes: %1" + +#: network/msnnotificationconnection.cpp:2317 +msgid "SOAP client is no longer valid." +msgstr "Cliente SOAP não é mais válido." + +#: network/msnnotificationconnection.cpp:2587 +msgid "Authentication time limit exceeded" +msgstr "Tempo para autenticação excedido" + +#: network/msnnotificationconnection.cpp:2766 +msgid "Waiting for contact list..." +msgstr "Carregando a lista de contatos..." + +#: network/msnnotificationconnection.cpp:2812 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Aviso: %1

" + +#: network/msnnotificationconnection.cpp:2813 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Aviso do MSN" + +#: network/msnnotificationconnection.cpp:2885 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Razão do erro interno: %1" + +#: network/msnnotificationconnection.cpp:2920 +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"O KMess não pôde processar mensagens offline.\n" -"\n" -"Detalhes: %1" +"

Falha na autenticação, por favor verifique seu nome de usuário e a senha." +"

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2933 +#, kde-format +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:2936 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"Falha de autenticação. O KMess não conseguiu processar a " -"autententicação do Passport.\n" -"\n" -"Detalhes %1" +"

Você foi desconectado: porque você conectou com a conta %1 em " +"outro cliente Messenger ou de outro local.

" -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2948 +msgctxt "Connection error: passive notification message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +"

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 web remoto.\n" -"\n" -"Detalhes %1" +"

Impossível acessar o serviço Live Messenger.
Talvez você precise " +"autenticar-se antes de acessar a rede?

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Esta pessoa está offline ou invisível." - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" -"O contato iniciou uma função do MSN que o KMess ainda não " -"suporta." - -#: network/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "A mensagem \"%1\" não foi recebida!" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Impossível efetuar uma conexão: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "Excessivos redirecionamentos pelo serviço de acesso" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "Tempo limite de conexão atingido" - -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "Na conversa de %1: %2" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 diz:
'%2'" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 lhe enviou uma mensagem offline:
'%2'" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "A conversa de %1 pediu atenção!" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1:
%2" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 pediu sua atenção!" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1 enviou um wink!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 deseja utilizar a webcam!" - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 está lhe enviando um arquivo!" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 está lhe enviando um convite!" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 cancelou a sessão de webcam!" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 cancelou a transferência!" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "A atividade com %1 foi cancelada!" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 aceitou usar a webcam!" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 aceitou a transferência!" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 aceitou seu convite!" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 encerrou a sessão de webcam!" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "A transferência com %1 está completa!" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "A atividade com %1 terminou!" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "Sessão de webcam com %1 falhou!" - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "A transferência com %1 falhou!" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "A atividade com %1 terminou com um erro!" - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 está ausente" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 mudou seu status para \"Volto logo\"" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 está ocupado" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 está offline" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 está invisível" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 está inativo" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 saiu para comer" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 está ao telefone" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 está online" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Novo e-mail:
'%1'
de '%2'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "&Enviar" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "Nova Linha " - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Barra lateral" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, no-c-format -msgid "The contact is listening to music" -msgstr "O contato está ouvindo música" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Clique para ver o perfil deste contato" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Clique para enviar um e-mail para este contato" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Digite um atalho para este emoticon:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Selecione uma imagem:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Adicionar Contato" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/msnnotificationconnection.cpp:2951 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "%1\n adicionou você à lista de contatos dele(a). Você deseja:" +"

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 seja " +"necessária para acessar a rede

Clique aqui para " +"visitar a página de status do serviço.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "&Adicionar este contato à sua lista de \"Amigos\"" +#: network/msnnotificationconnection.cpp:2970 +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.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "&Não adicionar este contato, mas deixar que veja seu status" +#: network/msnnotificationconnection.cpp:2972 +#, kde-format +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 " +"status do serviço.

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "Bloquear esta pessoa para não contactar você ou ver seu status online" +#: network/msnnotificationconnection.cpp:2983 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Erro: %1

" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" -msgstr "Li&mpar" +#: network/msnnotificationconnection.cpp:2985 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Digite os dados de sua conta:" +#: network/msnnotificationconnection.cpp:2996 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Erro no servidor Live Messenger:

%1

" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "Endereço de e-mail" +#: network/msnnotificationconnection.cpp:2998 +#, kde-format +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

" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Senha" +#: network/msnnotificationconnection.cpp:3006 +#, kde-format +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Erro do KMess: %1

" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Status quando entrar" +#: network/msnnotificationconnection.cpp:3008 +#, kde-format +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess encontrou um erro interno:

%1

" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "Lem&brar este perfil" +#: network/msnnotificationconnection.cpp:3019 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Conexão de rede perdida.

" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Conectar" +#: network/msnnotificationconnection.cpp:3021 +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

" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Digite sua mensagem pessoal aqui" +#: network/msnnotificationconnection.cpp:3077 +#, kde-format +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
String " +"do erro: %2

" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Ouvindo %1" +#: 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" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "Notificação do KMess" +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Código de erro interno: %2)" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/msnsockethttp.cpp:696 +#, kde-format +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:364 +msgid "Connection time limit exceeded" +msgstr "Tempo Limite de Conexão Atingido" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping perdido" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pings perdidos" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "A conexão com o servidor foi perdida" + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +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/soap/addressbookservice.cpp:787 +#, kde-format +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/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:295 +#, kde-format +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:427 +#, kde-format +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:504 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Redirecionamentos demais feitos pelo serviço web" + +#: network/soap/httpsoapconnection.cpp:548 +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" + +#: network/soap/httpsoapconnection.cpp:554 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "O serviço web do Live Messenger está passando por problemas" + +#: network/soap/httpsoapconnection.cpp:568 +#, kde-format +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)" + +#: network/soap/httpsoapconnection.cpp:607 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Sem respostas do serviço web" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Resposta inesperada do servidor (%1)" + +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "In %1's chat:
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 diz:
'%2'" + +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 enviou para você uma mensagem offline:
'%2'" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "Conversa de %1 pede atenção!" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 enviou uma mensagem escrita a mão!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 enviou um nudge!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 enviou um wink!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 quer usar a webcam!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 está enviando um arquivo!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 fez um convite!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 cancelou a sessão de webcam!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 cancelou a transferência de arquivo!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "A atividade de %1 foi cancelada!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 aceitou em usar a webcam!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 aceitou a transferência de arquivo!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 aceitou o seu convite!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 encerrou essa sessão webcam!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "Transferência de arquivos com %1 terminada!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "A atividade de %1 terminou!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "A sessão de webcam de %1 falhou!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "A transferência com %1 falhou!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "A atividade de %1 terminou com um erro!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
está conectado" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
ficou ausente" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
já volto" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
está ocupado" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
ficou Invisível" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
está inativo" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
desconectou" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
está ao telefone" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
saiu para almoçar" + +#: notification/newemailnotification.cpp:92 +#, kde-format +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 mantém o KMess rodando na bandeja do sistema. Use " +"'Sair' no menu 'Conectar' para finalizar o aplicativo." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Indo para Bandeja do Sistema" + +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " - %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Escolher..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Escolher e cortar imagem..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Usar imagem anterior..." + +#. i18n: file: settings/accountpage.ui:136 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:458 rc.cpp:372 +msgid "Display Picture" +msgstr "Imagem" + +#: settings/accountpage.cpp:488 +msgid "Downloading of display picture failed" +msgstr "Baixar imagem do contato falhou" + +#: settings/accountpage.cpp:547 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Um erro ocorreu ao tentar modificar a sua imagem de exibição.\n" +"Certifique-se de você selecionou um arquivo de imagem existente." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Configurações" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Conta" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Minha Conta" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Lista de Contatos" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Conversas" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Registro das Conversas" + +#: 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, que " +"será deletada ao se desconectar." + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +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:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "O endereço de email que você especificou já esta em uso: '%1'" + +#: settings/accountsettingsdialog.cpp:220 +msgid "Please enter a friendly name for this account." +msgstr "Por favor especifique um nome amigável para esta conta" + +#: settings/accountsettingsdialog.cpp:301 +msgid "Are you sure you want to delete this account?" +msgstr "Tem certeza que deseja remover esta conta?" + +#: settings/accountsmanagerpage.cpp:160 +#, kde-format +msgid "" +"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:371 +msgid "Hi, how are you doing? :)" +msgstr "Olá, como vai você? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Maria" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Ótimo!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Eu /acabei/ de voltar das minhas férias na Itália!" + +#: 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 "Substituir Emoticon existente" + +#: settings/emoticonspage.cpp:233 +#, kde-format +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:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Contas" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Seu nome para exibição:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notificações" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "Digite o nome que os outros contatos verão quando você estiver online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." +msgstr "Nenhum navegador selecionável detectado." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Seu endereço de e-mail:" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Nenhum cliente de emails selecionável detectado." -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format -msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom web browser!" msgstr "" -"Digite o endereço de e-mal de sua conta MSN Passport. Você pode criar uma nova " -"conta em http://register.passport.com/" +"Você deve especificar um comando de console para executar um navegador " +"personalizado!" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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.
Devo adicioná-lo para você?" + +#: 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:321 +#, c-format +msgid "" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing emails 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.
Devo adicioná-lo para você?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "Você tem que selecionar um diretório para os arquivos recebidos!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Selecionar diretório de arquivos" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "Enviando com o KMess" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

Impossível acessar os seus arquivos de configuração!

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "Enviar comentário aos desenvolvedores" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "Mostrat ícones de &Feedback" + +#: utils/likeback/likeback.cpp:323 +#, kde-format +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:328 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Bem-vindo a %1." + +#: utils/likeback/likeback.cpp:336 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" +"Cada vez que você tiver uma experiência ótima, ou frustrante, clique na " +"carinha apropriada abaixo da barra de título, resumidamente descreva o que " +"você gosta ou não e clique em enviar." + +#: utils/likeback/likeback.cpp:343 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" +"Cada vez que você tiver uma ótima experiência, clique na carinha sorridente " +"abaixo da barra de título, resumidamente descreva o que você gosta e clique " +"em 'Enviar'." + +#: utils/likeback/likeback.cpp:350 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" +"Cada vez que você tiver uma experiência frustrante, clique na carinha triste " +"abaixo da barra de título, resumidamente descreva o que você não gosta e " +"clique em 'Enviar'." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on '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 e clique em 'Enviar'." + +#: utils/likeback/likeback.cpp:372 +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:380 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" +"Eu não gosto da página de boas-vindas deste assistente. Toma muito " +"tempo." + +#: utils/likeback/likeback.cpp:388 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows 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:396 +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:409 +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:412 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Exemplo" +msgstr[1] "Exemplos" + +#: utils/likeback/likeback.cpp:418 +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:139, kde-format +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 de tradução online para isto).
" + +#: utils/likeback/likebackdialog.cpp:146, kde-format +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 de tradução online para isto).
" + +#: utils/likeback/likebackdialog.cpp:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%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:216 +#, kde-format +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:290 +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 o " +"aplicativo!

Obrigado pelo seu tempo.

" + +#: utils/likeback/likebackdialog.cpp:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Comentário Enviado" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" +"

Houve um erro durante o envio do relatório.

Por favor, rente " +"novamente mais tarde.

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Erro no Envio do Comentário" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +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 the standard text mode." +msgstr "Clique neste botão para mudar para o modo padrão de texto" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Clique neste botão para mostrar todos os emoticons padrão do Live Messenger, " +"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 "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Clique neste botão para mostrar todos os emoticons personalizados, e então " +"você pode adicioná-los facilmente nas suas mensagens" + +#. 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "&Enviar" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Conversa" + +#. 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: 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: file: chat/contactswidget.ui:107 +#. 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 aqui o email da pessoa que você deseja adicionar" + +#. 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:267 +msgid "Email address:" +msgstr "Endereço de 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 "Digite um atalho para este emoticon:" + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Selecione um arquivo de imagem:" + +#. 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 "" +"Digite uma mensagem a ser enviada automaticamente as pessoas que tentarem " +"entrar em contato com você." + +#. 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "Filtro dos Registros de Conversa" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "Filtrar por &chat" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:103 +msgid "Filter by &date" +msgstr "Filtrar por &data" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:106 +msgid "from" +msgstr "de" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:109 +msgid "to" +msgstr "para" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:112 +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:115 +msgid "&Add this person to the following groups of your 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:118 +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "Não adicionar esta pessoa; &Deixar ela ver quando eu estou online" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:121 +msgid "&Block this person from contacting you and seeing your status" +msgstr "&Bloquear esta pessoa para não contatar ou ver quando estou online." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:127 +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: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:130 +msgid "&Restore" +msgstr "&Restaurar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:133 +msgid "&Groups:" +msgstr "&Grupos:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:136 +msgid "Use an &alternative name for this contact" +msgstr "Us&ar um nome diferente para esta pessoa" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:139 +msgid "Disable notifications for this contact" +msgstr "Desativar notivacações para esta pessoa" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:142 +msgid "&Sound:" +msgstr "&Som:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:145 +msgid "&Display Pictures" +msgstr "Imagens &de Exibição" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:148 +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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) #: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Sua senha:" +msgid "Use As Display Picture" +msgstr "Usar Como Imagem de Exibição" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) #: rc.cpp:154 -#, no-c-format +msgid "&Clear Cache" +msgstr "Limpar &Cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:163 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". 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 \"Esconder este Emoticon" +"\".\n" +"Com esta página você pode restaurar os emoticons escondidos." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:166 +msgid "Click here to restore the selected emoticon" +msgstr "Clique aqui restaurar o emoticon selecionado" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:169 +msgid "Resto&re" +msgstr "Restau&rar" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:175 +msgid "Available Contacts" +msgstr "Contatos Disponíveis" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:178 +msgid "Invite a person not on your contact 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:181 +msgid "Enter the email address of a person to invite" +msgstr "Insira o email da pessoa a convidar" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:184 +msgid "Invited Contacts" +msgstr "Contatos Convidados" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:193 +msgid "Items to export:" +msgstr "Itens a exportar:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:196 +msgid "Format" +msgstr "Formato" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:199 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:202 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:205 +msgid "Contacts:" +msgstr "Contatos:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:208 +msgid "Select All" +msgstr "Marcar Todos" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:211 +msgid "Deselect All" +msgstr "Desmarcar Todos" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:214 +msgid "Export..." +msgstr "Exportar..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:217 +msgid "Close" +msgstr "Fechar" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:223 +msgid "Command to Current Tab" +msgstr "Comando para a Aba Atual" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:226 +msgid "Command:" +msgstr "Comando:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:229 +msgid "Type:" +msgstr "Tipo:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:232 +msgid "Standard" +msgstr "Padrão" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:235 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:238 +msgid "Send" +msgstr "Enviar" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:241 +msgid "Command payload (can be empty):" +msgstr "Command payload (can be empty):" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:246 +msgid "Open" +msgstr "Abrir" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:249 +msgid "Cancel" +msgstr "Cancelar" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:252 +msgid "&Download" +msgstr "Recebido" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:255 +msgid "&Upload" +msgstr "Enviado" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:258 +msgid "C&lean Up" +msgstr "&Limpar" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:261 +msgid "&Close" +msgstr "Fe&char" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:264 +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: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:270 +msgid "" +"Enter 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: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:273 +msgid "Password:" +msgstr "Senha:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:276 +msgid "Enter here your account's password" +msgstr "Insira aqui a senha da sua conta" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:279 +msgid "Status at login:" +msgstr "Status Inicial:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:282 +msgid "Choose a status to set when successfully connected." +msgstr "Escolha um status para usar ao se conectar" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:285 +msgid "If enabled, KMess will save your account" +msgstr "Se habilitado, KMess vai salvar sua conta" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:288 +msgid "Remem&ber account" +msgstr "Lem&brar Conta" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:294 +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: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:297 +msgid "R&emember password" +msgstr "L&embrar Senha" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:303 +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:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:309 +msgid "New Account" +msgstr "Nova Conta" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:312 +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:315 +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 "" +"Clique aqui para registrar uma nova conta Live que você poderá usar " +"para se conectar no Live Messenger.
Se preferir poderá usar seu email " +"existente" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:318 +msgid "Password forgotten?" +msgstr "Esqueceu a senha?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:321 +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:324 +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, para alterar a senha desta " +"conta" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:327 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Conectar" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:330 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Ver" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Ações" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:336 +msgid "Form" +msgstr "Formato" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:339 +msgid "Account &Info" +msgstr "&Informações da Conta" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:342 +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:345 +msgid "Enter a name other contacts should see when you are connected." +msgstr "Insira o nome que outros contatos vão ver quando você estiver online." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:348 +msgid "&Friendly name:" +msgstr "Apelido:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:351 +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 Live. 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:354 +msgid "&Email address:" +msgstr "&Endereço de Email: " + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:357 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"Digite a senha de sua conta MSN Passport. Você pode criar uma nova " +"Insira a senha da sua conta de Passaporte Live. Voce pode registrar uma nova " "conta em http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Imagem de exibição:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:360 +msgid "&Password:" +msgstr "Senha:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format -msgid "C&hange..." -msgstr "&Alterar..." +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:363 +msgid "Click here to have your password saved by KMess" +msgstr "Clique aqui para ter a sua senha salva pelo KMess" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Não mostrar &imagem de exibição" - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Lembrar configurações desta conta" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:117 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:366 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" -"\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)." +"If you enable this option, KMess will save your account's password. This way " +"you will not have to enter your password on every start up, in order to log " +"in. Please keep in mind, that other persons that have access to this " +"computer may easily log in to your account, if this option is enabled." msgstr "" -"A opção \"Lembrar esta conta\" não foi ativada durante o login, portanto " -"suas configurações não serão salvas por padrão. Ative esta opção se " -"você deseja salvar suas configurações de conta permanentemente neste " -"sistema\n" -"\n" -"Recomenda-se habilitar esta opção a menos que esteja utilizando o KMess " -"como visitante ou em um computador de uso público." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Entrar &com esta conta automaticamente ao iniciar" +#. i18n: file: settings/accountpage.ui:120 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:369 +msgid "&Remember password" +msgstr "Lemb&rar Senha" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format -msgid "If enabled, KMess automatically logs in with this account." -msgstr "Se ativada, o KMess se conectará automaticamente com esta conta." +#. i18n: file: settings/accountpage.ui:236 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:375 +msgid "C&hange..." +msgstr "&Modificar..." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Status inicial ao entrar:" +#. i18n: file: settings/accountpage.ui:261 +#. i18n: ectx: property (toolTip), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:381 +msgid "Enable this option, if you do not want to use a display picture." +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:264 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "Não Usar" + +#. i18n: file: settings/accountpage.ui:294 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"The option \"Remember account\" was left unchecked while logging in, " +"so your settings will not be saved by default. Enable this option if you " +"want to save your account settings permanently on this system.\n" +"\n" +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are 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: file: settings/accountpage.ui:297 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "Lembrar as preferências desta conta" + +#. i18n: file: settings/accountpage.ui:307 +#. i18n: ectx: property (toolTip), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 +msgid "If enabled, KMess automatically logs in with this account." +msgstr "Se habilitada o KMess vai conectar esta conta automaticamente ao abrir" + +#. i18n: file: settings/accountpage.ui:310 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +msgid "Log in &with this account automatically" +msgstr "Entrar com esta conta automaticamente ao iniciar" + +#. i18n: file: settings/accountpage.ui:322 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Entr&ar como" + +#. i18n: file: settings/accountpage.ui:335 +#. i18n: ectx: property (whatsThis), widget (QComboBox, initialStatus_) +#: rc.cpp:410 +msgid "Here you can select which status KMess should set, after logging in." +msgstr "" + +#. i18n: file: settings/accountpage.ui:378 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +msgid "" +"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: file: settings/accountpage.ui:381 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:416 +msgid "" +"You cannot change your friendly name because your Passport email address is " "not verified." msgstr "" -"Você não pode alterar seu nome para exibição porque seu endereço de e-mail " -"no MSN Passport não foi confirmado." +"Você não pode alterar o seu apelido porque o email do Passporte não é " +"verificado" -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" -"É preciso uma conta no MSN Passport para acessar a rede do MSN Messenger. Você " -"pode registrar seu endereço de e-mail agora em register.passport.com ou usar " -"uma conta do Hotmail para conectar." - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "Request verification email" -msgstr "Requisitar e-mail de confirmação" +msgstr "Requisitar email de verificação" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:427 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:425 msgid "Go to accountservices.passport.net" -msgstr "Ir para accountservices.passport.net" +msgstr "Vá para accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:446 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:428 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"Você precisa de um passaporte para conectar a rede Live Messenger. " +"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:449 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:431 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" -"Para acessar o serviço MSN Messenger, é preciso registrar um endereço de e-mail " -"como conta do MSN Passport." +"Para se conectar ao serviço Live Messenger você precisa registrar um " +"endereço de email como uma conta Passaporte." -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:489 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "Register new account" -msgstr "Registrar uma nova conta" +msgstr "Registrar nova conta" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:492 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:495 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:440 msgid "Go to register.passport.com" -msgstr "Ir para register.passport.com" +msgstr "Vá para register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Alertas" +#. i18n: file: settings/accountpage.ui:513 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:443 +msgid "&Status Options" +msgstr "&Opções de Status" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Notificações popup" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Exibir notificações quando seus contatos:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "Estão o&nline" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:519 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "Se ativada, uma mensagem popup é exibida quando um de seus contatos se conecta." - -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Iniciam &conversa com você" - -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "Se ativada, uma mensagem popup é exibida quando um de seus contatos inicia uma conversa com você" - -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "Enviam uma &mensagem" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "Se ativada, uma mensagem popup é exibida quando um de seus contatos lhe envia uma mensagem." - -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Mudam de &status" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "Se ativada, uma mensagem popup também é exibida quando seus contatos mudam de status." - -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "Estão o&ffline" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "Se ativada, uma mensagem popup é exibida quando um de seus contatos se desconecta." - -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Exibir notificação quando você receber um e-mail" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Esconder popups após" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Controla o número de segundos de exibição de popups." - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "segundos" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "Balançar &janela de conversa quando um contato pede sua atenção." - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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.

" +"If enabled, your status will be changed automatically to \"Idle\" when you " +"are not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." msgstr "" -"

Seus contatos podem pedir a sua atenção quando desejarem. Por padrão, " -"a janela de conversa balança quando você ou seus contatos pedem atenção. " -"Desabilite esta opção se este efeito lhe parecer incômodo.

\n" -"

Se esta opção estiver ativada, ainda assim o KMess limitará o efeito " -" na janela. Podem ser enviados vários pedidos de atenção ao mesmo tempo, " -"mas só o primeiro pedido balançará a janela de conversa.

" +"Se habilitado, seu status será mudado para \"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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Informar aos contatos o que estou &ouvindo." +#. i18n: file: settings/accountpage.ui:522 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:449 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Mudar status para \"&Inativo\" quando ocioso" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/accountpage.ui:553 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:572 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:579 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:455 rc.cpp:461 rc.cpp:464 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" -"Se ativada, o KMess informará aos seus contatos o que você está ouvindo. " -"Esta informação é obtida do programa de áudio ativo no momento." +"Controla o número de minutos para o KMess alterar o status para \"Inativo\"." -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Mudar status para \"Ausente - Inativo\" quando sem atividade" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Se ativada, seu status será mudado automaticamente para \"Ausente-Inativo\" " -"se você não usar o computador por alguns minutos." - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format +#. i18n: file: settings/accountpage.ui:556 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:458 msgid "Become idle after" -msgstr "Ficar inativo após" +msgstr "Alterar para inativo depois de" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Controla o número de minutos para o KMess mudar o status para " -"\"Ausente-Inativo\"." - -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:582 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:467 msgid "minutes" msgstr "minutos" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Histórico" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "Gravar &todas as conversas" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "Se ativada, as conversas serão salvas em um diretório específico." - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Salvar arquivos de conversa neste diretório:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format -msgid "Choose the directory on your system where you'd like to save the chat logs." -msgstr "Selecione a pasta do seu sistema onde deseja salvar o histórico de conversas." - -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organizar pastas de conversas por:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format +#. i18n: file: settings/accountpage.ui:615 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." msgstr "" -"O KMess cria subdiretórios automaticamente quando você escolhe organizar a " -"pasta de conversas por ano, mês ou dia." +"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" +"Consulte o seu gerenciador de pacotes para mais detalhes." -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/accountpage.ui:618 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:473 +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:644 +#. i18n: ectx: property (toolTip), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:476 +msgid "" +"If enabled, you will not receive any notifications when your status is set " +"to \"Busy\"." +msgstr "" +"Se ativado, você não receberá quaisquer notificações quando o seu status for " +"\"Ocupado\"." + +#. i18n: file: settings/accountpage.ui:647 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:479 +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "Não mostrar notificações quan&do meu status for \"Ocupado\"" + +#. i18n: file: settings/accountsmanagerpage.ui:26 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:482 +msgid "Saved accounts:" +msgstr "Contas Salvas:" + +#. i18n: file: settings/accountsmanagerpage.ui:76 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:485 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" +"Clique aqui para criar uma nova conta no KMess usando um email ja associado " +"a uma conta Live" + +#. i18n: file: settings/accountsmanagerpage.ui:79 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:488 +msgid "&Add Account..." +msgstr "&Adicionar Conta..." + +#. i18n: file: settings/accountsmanagerpage.ui:92 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:494 +msgid "Select an account and click here to modify it" +msgstr "Selecione uma conta, depois clique aqui para modificá-la" + +#. i18n: file: settings/accountsmanagerpage.ui:95 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:497 +msgid "&Edit" +msgstr "&Editar" + +#. i18n: file: settings/accountsmanagerpage.ui:108 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:503 +msgid "Select an account and click here to remove it" +msgstr "Selecione uma conta, depois clique aqui para removê-la" + +#. i18n: file: settings/accountsmanagerpage.ui:111 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:506 +msgid "&Remove" +msgstr "&Remover" + +#. i18n: file: settings/chatloggingpage.ui:17 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:512 +msgid "Enable this option to have your chats saved for later viewing" +msgstr "" +"Ative esta opção para salvar suas conversas podendo vê-las posteriormente" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:515 +msgid "" +"

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

\n" +"

The chat logs 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 " +"autorizadas que utilizarem a sua conta podem ler estes registro.

\n" +"

Tenha certeza de manter esta opção inativa em computadores públicos!

" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:521 +msgid "Enable chat logging" +msgstr "Salvar Conversas" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:524 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"Se ativado o KMess irá salvar suas conversar como arquivos em HTML ou texto " +"puro" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:527 +msgid "Additionally save chat logs to file" +msgstr "Registrar conversas em arquivo" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:530 +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:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:533 +msgid "Save chat logs as:" +msgstr "Salvar registros como::" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, 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: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:543 +msgid "Web Pages (HTML)" +msgstr "Páginas (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:546 +msgid "Plain Text" +msgstr "Texto Plano" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:549 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"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: file: settings/chatloggingpage.ui:137 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:552 +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 "" +"Dependendo de qual opções você escolher aqui, o KMess irá criar alguns " +"diretórios para ajudá-lo(a) a manter seus registros organizados. Use a " +"função "O que é isso?" em uma opção específica para obter mais " +"detalhes" + +#. i18n: file: settings/chatloggingpage.ui:140 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:555 +msgid "Separate logged chats by:" +msgstr "Salvar conversas salvas por:" + +#. i18n: file: settings/chatloggingpage.ui:156 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Create a directory to organize chats by year" +msgstr "Criar um diretório para organizar conversas por ano" + +#. i18n: file: settings/chatloggingpage.ui:163 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:561 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/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ório como:\n" +"<diretório das conversas>/2008/data-e-nome-do-contato.html" + +#. i18n: file: settings/chatloggingpage.ui:166 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:568 msgid "Year" msgstr "Ano" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Mês" +#. i18n: file: settings/chatloggingpage.ui:182 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Create directories to organize chats by year then by month" +msgstr "Criar diretórios para organizar conversas por ano e mês" -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Dia" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Salvar todos as conversas no diretório principal" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Sua fonte para mensagens:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "Estas são a fonte e a cor usadas em suas mensagens." - -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Forçar mensagens dos contatos a usar esta fonte:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:574 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"

This option tells KMess to divide your chat logs 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" +"

A chat had on November 29, 2008 will be saved in your chat logs directory " +"as:

\n" +"

<chat logs directory here>/2008/11/date-and-contact-name.html

" msgstr "" -"Permite que as preferências de cor e fonte de seus contatos sejam trocados " -"pela fonte e cor selecionadas abaixo." +"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. Neles diretórios " +"para cada mês registrado no ano.\n" +"\n" +"Uma conversa de 29 de Novembro de 2008 seria salva no diretório de registros " +"como:\n" +"<diretório das conversas>/2008/11/data-e-nome-do-contato.html" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Estilo de mensagens:" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:580 +msgid "Year then Month" +msgstr "Ano e Mês" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +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:586 +msgid "" +"

This option tells KMess to divide your chat logs 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 chat logs directory " +"as:

\n" +"

<chat logs directory here>/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. Dentro destes, " +"diretórios para cada mês registrado no ano, e, dentro destes as conversas, " +"divididas em diretórios de acordo com os seus dias.\n" +"\n" +"Uma conversa de 29 de Novembro de 2008 seria salva no diretório de registros " +"como:\n" +"<diretório das conversas>/2008/11/29/data-e-nome-do-contato.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:593 +msgid "Year, Month then Day" +msgstr "Ano, Mês e Dia" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:596 +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "" +"Salvar todas conversas registradas diretamente no diretório especificado " +"abaixo" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:599 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"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:602 +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:605 +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:611 +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:614 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" +"Escolha o diretório onde você deseja salvar os registros das suas covnersas." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:617 +msgid "Save chat logs in the following directory:" +msgstr "Salvar os registros das conversas neste diretório:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:620 +msgid "St&yle" +msgstr "Est&ilo" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:623 msgid "Allows you to change the theme KMess uses to display all chat messages." msgstr "" -"Permite que você mude o tema que o KMess usa para exibir todas as " -"mensagens." +"Permite que você escolha o tema utilizado pelo KMess para mostrar suas " +"conversas" -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Mostrar &gráficos nas mensagens" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:626 +msgid "&Chat style:" +msgstr "Estilo da &conversa:" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Ativa a exibição de emoticons nas conversas." +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:629 +msgid "Get &New Styles..." +msgstr "Obter &Novos Estilos..." -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Mostrar &hora nas mensagens" +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:632 +msgid "Chat Settings" +msgstr "Configurações da Conversa" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Ativa a exibição da hora em cada mensagem." +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (toolTip), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:635 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Ativa os emoticons nas conversas" -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "Usar efeitos de fonte nas mensagens (*negrito*, /itálico/ e _sublinhado_)" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:638 +msgid "&Show emoticons" +msgstr "Mostrar &Emoticons" -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:644 +msgid "Enables the appearance of winks in the chat window." +msgstr "Ativa winks nas conversas." + +#. i18n: file: settings/chatstylepage.ui:246 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:647 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, winks you send or receive will be displayed in the chat window. " +"Please note that in order to use this feature, you need to have a working " +"Flash-plugin installed." msgstr "" -"Habilita o uso de efeitos de fontes. Digitar *negrito*, /itálico/ e _sublinhado_ faz com " -"que essas palavras apareçam em negrito, itálico ou sublinhado respectivamente." -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:249 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:650 +msgid "Show &winks" +msgstr "Mostrar &winks" + +#. i18n: file: settings/chatstylepage.ui:256 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:653 +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 usado na conversa." + +#. i18n: file: settings/chatstylepage.ui:259 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:656 msgid "&Group follow-up messages from the same contact" -msgstr "Agrupar mensagens seguidas do mesmo contato" +msgstr "A&grupar mensagens consecutivas de um mesmo contato" -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:285 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:662 +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:288 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:665 +msgid "S&how timestamp" +msgstr "Mostrar carimbo do tempo" + +#. i18n: file: settings/chatstylepage.ui:319 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:671 +msgid "Show &date" +msgstr "Mostrar &data" + +#. i18n: file: settings/chatstylepage.ui:349 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:674 +msgid "Show s&econds" +msgstr "Mostrar s&egundos" + +#. i18n: file: settings/chatstylepage.ui:362 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:677 +msgid "&Text" +msgstr "&Texto" + +#. i18n: file: settings/chatstylepage.ui:374 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:680 +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:377 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:683 +msgid "Your &message font:" +msgstr "Fonte de suas &mensagens:" + +#. i18n: file: settings/chatstylepage.ui:458 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:686 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." +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." msgstr "" -"Esta opção habilita o agrupamento de mensagens do mesmo contato. " -"Quando um contato digitar várias mensagens seguidas, o KMess as agrupará como " -"uma só mensagem. A aparência exata depende do estilo de mensagens escolhido." +"Esta opção permite-lhe substituir a formatação das mensagens vindas dos seus " +"contatos pela escolhida abaixo." -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Cliente de e-mail" +#. i18n: file: settings/chatstylepage.ui:461 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:689 +msgid "&Force messages from your contacts to use this font:" +msgstr "&Forçar mensagens dos contatos a usar esta fonte:" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:692 +msgid "Chat Window Formatting" +msgstr "Formatação da Janela de Conversas" + +#. i18n: file: settings/chatstylepage.ui:542 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:695 msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." +"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 "" -"Permite que você escolha qual programa o KMess deve abrir para ver " -"mensagens de e-mail." +"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/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Usar Hotmail" +#. i18n: file: settings/chatstylepage.ui:545 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:698 +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/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Executar comando específico:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Notificação de e-mail" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Exibir informação de e-mail" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableChatFormattingCheckBox_) +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:704 rc.cpp:771 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." +"Enables the use of \"Messenger Plus!\" formattings in the chat window. " +"For example, [b]this text[/b] will be replaced with this text." msgstr "" -"Se ativada, uma mensagem popup é exibida quando um novo e-mail é recebido " -"em sua caixa de entrada. O número de mensagens não lidas é exibido " -"acima da lista de contatos. Disponível apenas para contas do Hotmail." -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Exibir uma notificação ao receber email em \"outras pastas\"" +#. i18n: file: settings/chatstylepage.ui:558 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:707 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "Ativar formatação do \"Messenger Plus\"" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:582 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:710 +msgid "&Behavior" +msgstr "Comportamento" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:713 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" -"Se ativada, uma mensagem popup é exibida também ao receber e-mail " -"em outras pastas. Opção válida somente para contas do Hotmail." +"

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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:592 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:717 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Balançar a janela de mensagem quando receber ou enviar um Nudge" + +#. i18n: file: settings/chatstylepage.ui:602 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:723 +msgid "" +"If this option is enabled, your own display picture will be shown 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: file: settings/chatstylepage.ui:605 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:726 +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:630 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:729 +msgid "G&roup chats in the same window:" +msgstr "Ag&rupar conversas na mesma janela:" + +#. i18n: file: settings/chatstylepage.ui:650 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:732 +msgid "Always" +msgstr "Sempre" + +#. i18n: file: settings/chatstylepage.ui:655 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:735 +msgid "For contacts in the same group" +msgstr "Para contatos do mesmo grupo" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:738 +msgid "Never" +msgstr "Nunca" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:741 +msgid "Display Options" +msgstr "Opções de Exibição" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:744 +msgid "" +"If enabled, a notification is shown when an email message is received in " +"your inbox. The number of unread email messages is shown above the contact " +"list. This option is only available for Live Mail 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 Live Mail." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:747 +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_) +#: rc.cpp:750 +msgid "" +"If enabled, your contacts can see which song you are listening to. This " +"information is retrieved from the currently active media player." +msgstr "" +"Se habilitado, KMess mostra aos contatos o que você está ouvindo. Esta " +"informação é pega do tocador de música em uso." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:753 +msgid "Show contacts w&hich song I am listening to" +msgstr "Mostrar aos contatos a música que estou ouvindo" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (toolTip), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:759 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:762 +msgid "Show background &image" +msgstr "Usar imagem de fundo na lista de contatos" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:768 +msgid "List Formatting" +msgstr "Formatação da Lista" + +#. i18n: file: settings/contactlistpage.ui:71 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:774 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "Ativar formatações do \"Messenger &Plus\"" + +#. i18n: file: settings/contactlistpage.ui:78 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:777 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "Mostrar &email dos contatos ao invés do nome de exibição" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:780 msgid "&Emoticon Themes" -msgstr "Temas de &Emoticons" +msgstr "T&emas" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "Temas de emoticons disponíves:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:783 +msgid "Available emoticon themes:" +msgstr "Temas de emoticon disponíveis:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:786 msgid "&Custom Emoticons" -msgstr "Emoticons &Personalizados" +msgstr "Emoticons Personalizados" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Emoticons personalizados para esta conta:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:789 +msgid "Available custom emoticons:" +msgstr "Emoticons persoanlizados:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "No&vo..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:792 +msgid "Click here to add a new custom emoticon" +msgstr "Clique aqui para adicionar um novo Emoticon personalizado" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Clique" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:795 +msgid "Add Ne&w..." +msgstr "Adicionar novo..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Clique para adicionar um emoticon personalizado para enviar para os " -"seus contatos." +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:801 +msgid "Click here to rename the selected emoticon" +msgstr "Clique aqui para renomear o Emoticon selecinonado" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:804 msgid "Re&name" -msgstr "Re&nomear" +msgstr "Renomear" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "Clique aqui para remover o emoticon selecionado." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:810 +msgid "Click here to remove the selected emoticon" +msgstr "Clique aqui para remover o emoticon selecionado" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:813 msgid "Remo&ve" -msgstr "Remover" +msgstr "Remo&ver" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Selecione um emoticon e clique aqui para remover." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:819 +msgid "Web Browser" +msgstr "Navegador Web" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "diz:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Procurar e cortar imagem..." - -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Imagem de exibição" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Falha no download da imagem de exibição" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:822 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -"Ocorreu um erro ao tentar alterar a imagem de exibição.\n" -"Verifique se você selecionou um arquivo de imagem válido." +"Escolha esta opção para usar o navegador padrão usado pelo resto do KDE" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Configurações" +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:825 +msgid "&Use the KDE default browser" +msgstr "&Usar o navegador padrão do KDE" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Conta" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Conversando" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Tem certeza que deseja remover esta conta?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Oi, como vai? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Ana" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Bem!" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Eu /acabo/ de voltar das minhas férias na Itália!" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:828 rc.cpp:863 +msgid "Select this option to choose from a list of installed browsers." msgstr "" -"Fechar a janela principal manterá o KMess em execução na bandeja do " -"sistema. Use 'Sair' do menu 'Arquivo' para finalizar a aplicação." +"Selecione esta opção escolher entre uma lista dos navegadores instalados." -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Acoplando à para a bandeja do sistema" +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:831 +msgid "&Use an installed browser:" +msgstr "Us&ar outro navegador:" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:834 rc.cpp:869 +msgid "Choose this option to enter the path to your favorite browser." +msgstr "Escolha esta opção para especificar o caminho do seu navegador." -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. 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:837 rc.cpp:872 +msgid "&Specify a custom command:" +msgstr "Especificar um comando personalizado:" +#. 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:841 rc.cpp:876 +#, 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: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:845 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Use '%u' para inserir a URL na linha de comando." + +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:848 +msgid "Email Client" +msgstr "Cliente de Email" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:851 +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 compatíveis com Live Mail." + +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:854 +msgid "Use &Live Mail if the account supports it" +msgstr "Usar o &Live Mail caso seja suportado" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:857 +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: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:860 +msgid "Use the &KDE default email client" +msgstr "Usar o cliente de email padrão do &KDE" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:866 +msgid "Use an &installed email client:" +msgstr "Usar outro cl&iente de Email:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:880 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "Use '%u' para inserir o endereço de email na linha de comando." + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:886 +msgid "&Save all received files in one directory:" +msgstr "&Salvar todos os arquivos recebidos em um único diretório:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:892 +msgid "&Use ports between" +msgstr "&Usar portas entre" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:895 +msgid "and" +msgstr "e" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:898 +msgid "for file transfers" +msgstr "para as transferências de arquivo" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about something you liked" +msgstr "Clique aqui para contar aos desenvolvedores sobre algo que você gostou" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:904 rc.cpp:911 rc.cpp:918 rc.cpp:925 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:908 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:915 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" +"Clique aqui para contar aos desenvolvedores sobre um problema no aplicativo" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:922 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:929 +msgid "Your comment:" +msgstr "Seu comentário:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:932 +msgid "Your comment is about:" +msgstr "Seu comentário é sobre:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:935 +msgid "Something you like" +msgstr "Algo que você gosta" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:938 +msgid "Something you dislike" +msgstr "Algo que você não gosta" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:941 +msgid "An improper behavior of the application" +msgstr "Um comportamento inadequado do aplicativo" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:944 +msgid "A new feature you desire" +msgstr "Uma função nova que você deseja" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:947 +msgid "Specify an email address to be contacted back:" +msgstr "Especifique um endereço de email para ser contato novamente:" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:950 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +"Your email address will not be used for anything else but this report." +msgstr "" + +#~ msgid "I'm away from my computer" +#~ msgstr "Estou Longe do meu Computador" + +#~ msgctxt "Contacts counters in normal group tooltip" +#~ msgid "%1 contact, %2 online" +#~ msgid_plural "%1 contacts, %2 online" +#~ msgstr[0] "%1 contato, %2 online" +#~ msgstr[1] "%1 contatos, %2 online" + +#~ msgid "You have not chatted with this contact yet." +#~ msgstr "Você ainda não conversou com esta pessoa." + +#~ msgid "Select an account and click here to delete it" +#~ msgstr "Selecione uma conta, depois clique aqui para remover ela" + +#~ msgid "Click here to delete the selected emoticon" +#~ msgstr "Clique aqui remover o Emoticon selecionado" + +#~ msgid "I&mages" +#~ msgstr "I&magens" + +#~ msgid "Ink message" +#~ msgstr "Manuscrito" + +#~ 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" + +#~ msgid "&Do not filter" +#~ msgstr "Não Filtrar" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Notificar quando este contato conectar/desconectar-se" + +#~ msgid "File format used for saving:" +#~ msgstr "Gravar em formato de arquivo:" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Emoticons personalizados para esta conta:" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "

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

" + +#~ msgid "Show the feedback buttons bar on the windows" +#~ msgstr "Mostrar a barra dos botões de opinião nas janelas" + +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Ignorar este &Emoticon" + +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "Impossível bloquear agora!" + +#~ msgid "Ed&it Notes" +#~ msgstr "Ed&itar Notas" + +#~ 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 " +#~ "eles foram gerados com uma versão antiga do KMess" + +#~ 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 antiga " +#~ "do KMess. O KMess pode tentar migrar os seus registros. Deseja fazer isto " +#~ "agora?" + +#~ 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 migrados com sucesso\n" +#~ "%3 itens não puderam ser migrados." + +#~ msgid "Alpha logs migration" +#~ msgstr "Migração de registros do Alpha" + +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Deletar Imagem" + +#~ msgid "Search for C&ontact" +#~ msgstr "Localizar C&ontato" + +#~ msgid "Search by &Interest" +#~ msgstr "Pesquisar por &Interesse" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Seus Emails:" + +#~ 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." + +#~ 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." + +#~ 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 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 "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" + +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Esconder Contatos" + +#~ msgid "Also r&emember the password" +#~ msgstr "L&embrar minha senha" + +#~ 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:" + +#, fuzzy +#~ msgid "Speed:" +#~ msgstr "Erro no servidor" + +#~ msgid "Use a specified command:" +#~ msgstr "Usar um comando específico:" + +#, fuzzy +#~ msgid "Remove group" +#~ msgstr "Re&mover Grupo" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Imagem:" + +#, fuzzy +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "novo email" + +#, fuzzy +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "novos emails" + +#, fuzzy +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "falhou. Impossível abrir arquivo" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Mostrar/Esconder Barra de &Contatos" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "Novo &Contato" + +#, fuzzy +#~ msgid "Enter your login information:" +#~ msgstr "Ou entre seus dados de login:" + +#~ msgid "Your friendly name:" +#~ msgstr "Seu nome amigável:" + +#~ msgid "Your password:" +#~ msgstr "Sua senha:" + +#, fuzzy +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "" +#~ "Exibir uma notificação quando o email for recebido em \"outras pastas\"" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Organizar pastas de chat por:" + +#, fuzzy +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Mostrar data/hora nas mensagens" + +#~ msgid "Use Hotmail" +#~ msgstr "Usar Hotmail" + +#~ msgid "says:" +#~ msgstr "diz:" + +#~ msgid "Current name: " +#~ msgstr "Nome atual: " + +#, fuzzy +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Exibir status do serviço .NET?" + +#~ msgid "Received user confirmation" +#~ msgstr "Recebida confirmação de usuário" + +#~ msgid "Transfer to notification server" +#~ msgstr "Transferir para servidor de notificação" + +#, fuzzy +#~ msgid "The server is too busy" +#~ msgstr "O servidor está ocupado" + +#~ msgid "The server is unavailable" +#~ msgstr "O servidor está indisponível" + +#~ msgid "Add contact" +#~ msgstr "Adicionar Contato" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "Notificação de email" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Mauricio Röther" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "mauricio@digicomm.com.br" + +#~ msgid "Away - Idle" +#~ msgstr "Ausente - Inativo" + +#, fuzzy +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "O usuário informado é inválido" + +#~ msgid "(Away)" +#~ msgstr "(Ausente)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Volto Logo)" + +#~ msgid "(Busy)" +#~ msgstr "(Ocupado)" + +#~ msgid "(Invisible)" +#~ msgstr "(Invisível)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Ausente - Inativo)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Saiu para Comer)" + +#~ msgid "(On the Phone)" +#~ msgstr "(No telefone)" + +#, fuzzy +#~ msgid "File transfer dialog message" +#~ msgstr "Transferência de arquivo completada." + +#, fuzzy +#~ msgid "The file transfer invitation was cancelled. Bad data was received." +#~ msgstr "O Contato cancelou o convite." + +#~ msgid "..." +#~ msgstr "..." + +#, fuzzy +#~ msgid "popupMessage" +#~ msgstr "A mensagem" + +#, fuzzy +#~ msgid "ChattingWidget" +#~ msgstr "Conversando" + +#, fuzzy +#~ msgid "EmailWidget" +#~ msgstr "Conversando" + +#, fuzzy +#~ msgid "Message from %1" +#~ msgstr "Mensagem de " + +#, fuzzy +#~ msgid "Notification message" +#~ msgstr "Mensagem do aplicativo" + +#~ msgid "You may not be connected to the internet." +#~ msgstr "Você pode não estar conectado à internet." + +#, fuzzy +#~ msgid "There was a problem connecting to the proxy." +#~ msgstr "Deve haver um problema com os servidores" + +#~ msgid "This person is online, but he or she is blocking you." +#~ msgstr "A pessoa está online, mas está bloqueando você." + +#, fuzzy +#~ msgid "says" +#~ msgstr "diz:" + +#~ msgid "Show this person's profile" +#~ msgstr "Exibir o perfil dessa pessoa" + +#~ msgid "Send this person an email" +#~ msgstr "Enviar um email a essa pessoa" + +#, fuzzy +#~ msgid "&Start in \"Invisible\" mode" +#~ msgstr "Iniciar em modo \"Invisível\"." + +#~ msgid "Show popup notifications for program events" +#~ msgstr "Exibir notificações popup para eventos do programa" + +#, fuzzy +#~ msgid "Server too busy" +#~ msgstr "O servidor está ocupado" + +#, fuzzy +#~ msgid "Server unavailable" +#~ msgstr "O servidor está indisponível" + +#, fuzzy +#~ msgid "New chat notification:" +#~ msgstr "Notificação de email" + +#, fuzzy +#~ msgid "You have new mail:" +#~ msgstr "Você tem um email novo" + +#, fuzzy +#~ msgid "" +#~ "\"%1\"\n" +#~ "from %2\n" +#~ "in your inbox" +#~ msgstr "em sua caixa de entrada" + +#~ msgid "says: " +#~ msgstr "diz: " + +#, fuzzy +#~ msgid "(Online)" +#~ msgstr "Online" + +#~ msgid "There may be a problem with the servers" +#~ msgstr "Deve haver um problema com os servidores" + +#, fuzzy +#~ msgid "Show outgoing server messages" +#~ msgstr "Exibir gráficos nas mensagens de chat" + +#, fuzzy +#~ msgid "The transfer of %1 failed. Couldn't create a socket." +#~ msgstr "falhou. Impossível criar um soquete" + +#~ msgid "Login with a saved profile:" +#~ msgstr "Conectar com um perfil salvo:" + +#~ msgid "Changes will take place when the program is restarted." +#~ msgstr "As alterações entrarão em vigor quando o programa for reiniciado." + +#~ msgid "Get New Emoticon or Sound &Themes" +#~ msgstr "Obter Novo Emoticon ou Som &Temas" diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..1905ef6 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,6851 @@ +# 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-04-21 00:17+0200\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" + +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" +msgstr "Som preč" + +#: account.cpp:54 +msgid "Your name" +msgstr "Vaše meno" + +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "" + +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Som preč" + +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +#, fuzzy +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Zabudnuté heslo?" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "&Odstrániť" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Nuda" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"Nemôžete spustiť toto privítanie, pretože je v tejto konverzácii viacej " +"kontaktov." + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "Konverzácia sa stala nečinnou, %1 opustil konverzáciu." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +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:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 a %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 a iní." + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Táto správa bola odoslaná automaticky)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Prijali ste odkaz od %1" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Prijali ste odkaz od %1" + +#: chat/chat.cpp:987 +#, fuzzy +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger 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:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 sa stal neviditeľný" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1 vám odoslal offline správu:
'%2'" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1 vám odoslal správu písanú rukou!" + +#: chat/chat.cpp:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"Prijali ste odkaz od %1, ale zobrazenie odkazov je vypnuté v možnostiach " +"účtu." + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"Prijali ste odkaz od %1, ale zobrazenie odkazov je vypnuté v možnostiach " +"účtu." + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 vám odoslal odkaz!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 vám odoslal odkaz!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "" +"Prijali ste odkaz od %1, ale nemôže byť zobrazený. Uistite sa, že máte " +"nainštalované 'cabextract'." + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Prijali ste odkaz od %1, ale nemôže byť zobrazený. Uistite sa, že máte " +"nainštalované 'cabextract'." + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"Prijali ste odkaz od %1, ale nemôže byť zobrazený. Extrahovanie odkazu s " +"balíkom 'cabextract zlyhalo'." + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"Prijali ste odkaz od %1, ale nemôže byť zobrazený. Extrahovanie odkazu s " +"balíkom 'cabextract zlyhalo'." + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 vám odoslal/la štuchanec!" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +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:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Poslali ste štuchanec %1!" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Poslali ste štuchanec!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 odosiela štuchnutie: %2" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format +msgid "%1 says:" +msgstr "%1 hovorí:" + +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format +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:300 +#, fuzzy, kde-format +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:439 +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:458 +#, fuzzy, kde-format +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:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "Prepísať súbor" + +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "Pre&písať" + +#: chat/chatview.cpp:825 +msgid "Add this &Emoticon..." +msgstr "Pridať túto &emotikonu..." + +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Pridať túto &emotikonu..." + +#: chat/chatview.cpp:834 +msgid "Send &Email" +msgstr "Odoslať &e-mail" + +#: chat/chatview.cpp:838 +#, fuzzy +msgid "Add &Contact" +msgstr "&Pridať kontakt" + +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-mailová adresa" + +#: chat/chatview.cpp:848 +msgid "Visit &Link" +msgstr "Navštíviť &odkaz" + +#: chat/chatview.cpp:852 +msgid "Copy &Address" +msgstr "Kopírovať &adresu" + +#: chat/chatview.cpp:868 +#, fuzzy +msgid "&Copy Text" +msgstr "&Kopírovať text" + +#: chat/chatview.cpp:869 +msgid "Select &All" +msgstr "Vybrať &všetko" + +#: chat/chatview.cpp:870 +#, fuzzy +msgid "Find &Text..." +msgstr "Nájsť &text" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +#, fuzzy +msgid "C&lear Chat" +msgstr "V&yčistiť kartu" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." +msgstr "Uložiť konverzáciu do &súboru" + +#: chat/chatwindow.cpp:115 +msgid "Contacts" +msgstr "Kontakty" + +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Emotikony" + +#: chat/chatwindow.cpp:128 +#, fuzzy +msgid "My Emoticons" +msgstr "Moje emotikony" + +#: chat/chatwindow.cpp:337 +#, 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:340 +#, 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:341 +#, fuzzy +msgid "Close All Tabs" +msgstr "Zatvoriť &všetky karty" + +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "Zatvoriť aktuálnu kartu" + +#: chat/chatwindow.cpp:451 +#, fuzzy +msgid "&Invite..." +msgstr "&Pozvať" + +#: chat/chatwindow.cpp:452 +#, fuzzy +msgid "Send a &File..." +msgstr "Odoslať &súbor" + +#: chat/chatwindow.cpp:453 +#, fuzzy +msgid "Webcam Chat" +msgstr "Konverzáciu pomocou webovej kamery" + +#: chat/chatwindow.cpp:454 +msgid "Start a &Meeting" +msgstr "Spustiť &schôdzku" + +#: chat/chatwindow.cpp:455 +msgid "Send a &Nudge!" +msgstr "Odoslať &štuchanec!" + +#: chat/chatwindow.cpp:456 +#, fuzzy +msgid "Save Chat..." +msgstr "Uložiť konverzáciu" + +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "Zatvoriť &všetky karty" + +#: chat/chatwindow.cpp:462 +msgid "Change &Font" +msgstr "Zmeniť &písmo" + +#: chat/chatwindow.cpp:463 +msgid "Change Font &Color" +msgstr "Zmeniť &farbu písma" + +#: chat/chatwindow.cpp:470 +msgid "Show &Emoticons" +msgstr "Zobraziť &emotikony" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Z&obraziť čas správ" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "&Panels" +msgstr "&Zrušiť" + +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "Použiť &kontrolu pravopisu" + +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "Schôdzka" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Štuchanec" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Odoslať &súbor" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Povoliť v zozname kontaktov" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakty" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Povoliť v zozname kontaktov" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emotikony" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Povoliť v zozname kontaktov" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Moje emotikony" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "&Písmo" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "&Farba písma" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "V&yčistiť kartu" + +#: chat/chatwindow.cpp:603 +#, 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:1026 +#, fuzzy +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +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:1029 +#, fuzzy +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Nesprávna /stav syntax " + +#: chat/chatwindow.cpp:1092 +#, fuzzy +msgid "You cannot use the /block command in a group chat." +msgstr "Nemôžete blokovať nikoho v skupinovej konverzácii." + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +#, fuzzy +msgid "You cannot use the /unblock command in a group chat." +msgstr "Nemôžete blokovať nikoho v skupinovej konverzácii." + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +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:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Neznámy príkaz" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Konverzácia" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Konverzácia" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1 píše." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 a %2 píšu." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 a %3 píšu." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Spustiť &schôdzku" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "Odoslať &e-mail" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 +msgid "&View Profile" +msgstr "&Zobraziť profil" + +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Vlastnosti" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 +msgid "&Add Contact" +msgstr "&Pridať kontakt" + +#: chat/contactframe.cpp:304 kmessview.cpp:606 +msgid "A&llow Contact" +msgstr "P&ovoliť kontakt" + +#: chat/contactframe.cpp:305 kmessview.cpp:609 +msgid "&Delete Contact" +msgstr "&Odstrániť kontakt" + +#: chat/contactframe.cpp:307 kmessview.cpp:607 +msgid "&Block Contact" +msgstr "&Blokovať kontakt" + +#: chat/contactframe.cpp:308 kmessview.cpp:608 +msgid "&Unblock Contact" +msgstr "&Odblokovať kontakt" + +#: chat/contactframe.cpp:310 kmessview.cpp:612 +msgid "&Friendly Name" +msgstr "&Meno" + +#: chat/contactframe.cpp:311 kmessview.cpp:613 +msgid "&Personal Message" +msgstr "&Súkromná správa" + +#: chat/contactframe.cpp:312 kmessview.cpp:614 +msgid "&Email Address" +msgstr "&E-mailová dresa" + +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Informácia" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Zobraziť obrázok" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +#, fuzzy +msgid "&Notes" +msgstr "Poznámky" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "&Emotikony" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" +msgstr "&Kopírovať..." + +#: chat/contactframe.cpp:753 +msgid "Blocked" +msgstr "Blokovaný" + +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Kontakt je %1" + +#: chat/emoticonswidget.cpp:289 +#, fuzzy +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not 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:451 +msgid "Add to Chat" +msgstr "Pridať do konverzácie" + +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Pridať no&vé..." + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Editovať" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Odobrať" + +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not 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:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 kompatibilný" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 kompatibilný" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 kompatibilný" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Online" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Nemám čas" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Som preč" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Preč s automatickou odpoveďou" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Nečinný" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Hneď sa vrátim" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Na telefóne" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Obedujem" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Neviditeľný" + +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Offline" + +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Môj stav" + +#: contact/msnstatus.cpp:218 +#, 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:276 +msgid "Add New Emoticon" +msgstr "Pridať novú emotikonu" + +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Editovať emotikonu" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +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:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Štýl &konverzácie:" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Nedal sa otvoriť lokálny port." + +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Pripája sa..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Uložiť záznam &všetkých konverzácií" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Boli ste niekým pridaný" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2) \n" +"si vás pridal/la do zoznamu kontaktov. " + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +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:282 +#, kde-format +msgid "Contact Properties for %1" +msgstr "Vlastnosti kontaktu pre %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Pripojené" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "Zatiaľ nevidený" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "Zatiaľ žiadne správy" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Videný naposledy: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Posledná správa: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-mailová adresa:" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Klient: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakty" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "Pozvanie bolo odmietnuté. Nie je podporované iným klientom." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "%1 kontakty" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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é" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 +msgid "Network Window" +msgstr "Sieťové okno" + +#: 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:1086 +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:1130 +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:1177 +msgid "Cannot close the main connection tab." +msgstr "Nedá sa zatvoriť hlavná karta pripojenia." + +#: dialogs/networkwindow.cpp:1273 +#, fuzzy +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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 +#, kde-format +msgid "%1 MB" +msgstr "%1 MB" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format +msgid "%1 kB" +msgstr "%1 kB" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format +msgid "%1 bytes" +msgstr "%1 bytov" + +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 z %2 prijaté." + +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 z %2 odoslané." + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "nekonečný" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 +msgid "File Transfers" +msgstr "Prenosy súborov" + +#: 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:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Ste si istý, že chcete odstrániť toto konto?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Zobraziť obrázok" + +#: emoticontheme.cpp:627 +#, kde-format +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:833 +msgid "Smile" +msgstr "Úsmev" + +#: emoticontheme.cpp:834 +msgid "Wink" +msgstr "Žmurk" + +#: emoticontheme.cpp:835 +msgid "Tongue out" +msgstr "Uštipačnosť" + +#: emoticontheme.cpp:836 +msgid "Big smile" +msgstr "Široký úsmev" + +#: emoticontheme.cpp:837 +msgid "Sad" +msgstr "Smútok" + +#: emoticontheme.cpp:838 +msgid "Crying" +msgstr "Plač" + +#: emoticontheme.cpp:839 +msgid "Angry" +msgstr "Hnev" + +#: emoticontheme.cpp:840 +msgid "Confused" +msgstr "Bezradnosť" + +#: emoticontheme.cpp:841 +msgid "Embarrassed" +msgstr "Rozpaky" + +#: emoticontheme.cpp:842 +msgid "Disappointed" +msgstr "Sklamanie" + +#: emoticontheme.cpp:843 +msgid "Hot" +msgstr "Pohoda" + +#: emoticontheme.cpp:844 +msgid "Baring teeth" +msgstr "Zúrivosť" + +#: emoticontheme.cpp:845 +msgid "Nerd" +msgstr "Intelektuál" + +#: emoticontheme.cpp:846 +msgid "Sick" +msgstr "Je mi zle" + +#: emoticontheme.cpp:847 +msgid "Surprised" +msgstr "Údiv" + +#: emoticontheme.cpp:848 +msgid "Party" +msgstr "Oslava" + +#: emoticontheme.cpp:849 +msgid "Sleepy" +msgstr "Nuda" + +#: emoticontheme.cpp:850 +msgid "Thinking" +msgstr "Rozmýšľam" + +#: emoticontheme.cpp:851 +msgid "Don't tell anyone" +msgstr "Nikomu ani slovo" + +#: emoticontheme.cpp:852 +msgid "Secret telling" +msgstr "Pošepkám ti tajomstvo" + +#: emoticontheme.cpp:853 +msgid "Eye-rolling" +msgstr "Ach jaj" + +#: emoticontheme.cpp:854 +msgid "Sarcastic" +msgstr "Sarkazmus" + +#: emoticontheme.cpp:855 +msgid "I don't know" +msgstr "Neviem" + +#: emoticontheme.cpp:856 +msgid "Be right back" +msgstr "Hneď sa vrátim" + +#: emoticontheme.cpp:857 +msgid "Angel" +msgstr "Anjelik" + +#: emoticontheme.cpp:858 +msgid "Left hug" +msgstr "Objatie" + +#: emoticontheme.cpp:859 +msgid "Boy" +msgstr "Chlapec" + +#: emoticontheme.cpp:860 +msgid "Red heart" +msgstr "Srdce" + +#: emoticontheme.cpp:861 +msgid "Red rose" +msgstr "Ruža" + +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "OK" + +#: emoticontheme.cpp:863 +msgid "Dog face" +msgstr "Pes" + +#: emoticontheme.cpp:864 +msgid "Sun" +msgstr "Slnko" + +#: emoticontheme.cpp:865 +msgid "Devil" +msgstr "Čert" + +#: emoticontheme.cpp:866 +msgid "Right hug" +msgstr "Objatie" + +#: emoticontheme.cpp:867 +msgid "Girl" +msgstr "Dievča" + +#: emoticontheme.cpp:868 +msgid "Broken heart" +msgstr "Zlomené srdce" + +#: emoticontheme.cpp:869 +msgid "Wilted rose" +msgstr "Zvädnutá ruža" + +#: emoticontheme.cpp:870 +msgid "Thumbs down" +msgstr "K.O." + +#: emoticontheme.cpp:871 +msgid "Cat face" +msgstr "Mačka" + +#: emoticontheme.cpp:872 +msgid "Sleeping half-moon" +msgstr "Mesiac" + +#: emoticontheme.cpp:873 +msgid "Red lips" +msgstr "Bozk" + +#: emoticontheme.cpp:874 +msgid "Clapping" +msgstr "Potlesk" + +#: emoticontheme.cpp:875 +msgid "Crossed fingers" +msgstr "Skrížené prsty" + +#: emoticontheme.cpp:876 +msgid "Auto" +msgstr "Auto" + +#: emoticontheme.cpp:877 +msgid "Airplane" +msgstr "Lietadlo" + +#: emoticontheme.cpp:878 +msgid "Turtle" +msgstr "Korytnačka" + +#: emoticontheme.cpp:879 +msgid "Snail" +msgstr "Slimák" + +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "Nuda" + +#: emoticontheme.cpp:881 +msgid "Goat" +msgstr "Koza" + +#: emoticontheme.cpp:882 +msgid "Vampire bat" +msgstr "Upír" + +#: emoticontheme.cpp:883 +msgid "Pizza" +msgstr "Pizza" + +#: emoticontheme.cpp:884 +msgid "Beer mug" +msgstr "Pivo" + +#: emoticontheme.cpp:885 +msgid "Martini glass" +msgstr "Martini" + +#: emoticontheme.cpp:886 +msgid "Coffee cup" +msgstr "Šálka kávy" + +#: emoticontheme.cpp:887 +msgid "Birthday cake" +msgstr "Torta" + +#: emoticontheme.cpp:888 +msgid "Plate" +msgstr "Tanier" + +#: emoticontheme.cpp:889 +msgid "Bowl" +msgstr "Misa" + +#: emoticontheme.cpp:890 +msgid "Star" +msgstr "Hviezda" + +#: emoticontheme.cpp:891 +msgid "Rainbow" +msgstr "Dúha" + +#: emoticontheme.cpp:892 +msgid "Stormy cloud" +msgstr "Búrkové mračno" + +#: emoticontheme.cpp:893 +msgid "Lightning" +msgstr "Blesk" + +#: emoticontheme.cpp:894 +msgid "Umbrella" +msgstr "Dáždnik" + +#: emoticontheme.cpp:895 +msgid "Island with a palm tree" +msgstr "Palmový ostrov" + +#: emoticontheme.cpp:896 +msgid "Telephone receiver" +msgstr "Slúchadlo" + +#: emoticontheme.cpp:897 +msgid "Mobile Phone" +msgstr "Mobilný telefón" + +#: emoticontheme.cpp:898 +msgid "Email" +msgstr "E-mail" + +#: emoticontheme.cpp:899 +msgid "Clock" +msgstr "Hodiny" + +#: emoticontheme.cpp:900 +msgid "Camera" +msgstr "Fotoaparát" + +#: emoticontheme.cpp:901 +msgid "Filmstrip" +msgstr "Film" + +#: emoticontheme.cpp:902 +msgid "Note" +msgstr "Hudba" + +#: emoticontheme.cpp:903 +msgid "Handcuffs" +msgstr "Putá" + +#: emoticontheme.cpp:904 +msgid "Money" +msgstr "Peniaze" + +#: emoticontheme.cpp:905 +msgid "Light bulb" +msgstr "Žiarovka" + +#: emoticontheme.cpp:906 +#, fuzzy +msgid "Cigarette" +msgstr "Cigareta" + +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:908 +msgid "Gift with a bow" +msgstr "Darček" + +#: emoticontheme.cpp:909 +msgid "X-Box" +msgstr "X-Box" + +#: emoticontheme.cpp:910 +msgid "Computer" +msgstr "Počítač" + +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" +msgstr "KMess ikona" + +#: initialview.cpp:239 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Nedá sa obnoviť pripojenie: konto nenájdené." + +#: initialview.cpp:252 +#, fuzzy +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:375 +#, fuzzy, kde-format +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:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Nie je dostupné internetové pripojenie." + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Pripojiť" + +#: initialview.cpp:601 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Zrušiť" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Prosím vyplňte váš e-mail a heslo." + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Neplatná e-mailová adresa." + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Tento kontakt je už vo vašom zozname" + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Kontaktné informácie" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Nová skupina" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Pridať skupinu" + +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" +msgstr "Zadajte nový názov pre túto skupinu:" + +#: kmess.cpp:576 +#, kde-format +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:578 +#, fuzzy +msgid "Remove Contact" +msgstr "Odstrániť kontakt" + +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" +msgstr "Odstrániť a blokovať" + +#: kmess.cpp:626 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Odstránenie skupiny" + +#: kmess.cpp:633 +#, fuzzy, kde-format +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:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Odstrániť" + +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." +msgstr "Toto je špeciálna skupina a nemôže byť odstránená." + +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "Pr&emenovať skupinu" + +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Zadajte nový názov pre túto skupinu:" + +#: kmess.cpp:753 +#, fuzzy, kde-format +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:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatické prihlásenie zlyhalo" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Pripája sa..." + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Odpojený" + +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, fuzzy, kde-format +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:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Chyba s upozorneniami" + +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "&Pripojiť" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Odpojiť" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Zobraziť môj &profil" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "Zobraziť &povolené kontakty" + +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "Zobraziť &offline kontakty" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "Zobraziť &odstránené kontakty" + +#: kmessinterface.cpp:170 +#, fuzzy +msgid "Show &History Box" +msgstr "Štýl &konverzácie:" + +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Zobraziť bočný &panel" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Zobraziť &prázdne skupiny" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" +msgstr "Zobraziť veľkosť obrázkov" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "&Zoradiť kontakty podľa" + +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Zobraziť &okno prenosu" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "Nový &kontakt" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "Nová &skupina" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Export zoznamu kontaktov" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Štýl &konverzácie:" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "Nové &konto" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Nové &konto" + +#: kmessinterface.cpp:186 +#, fuzzy +msgid "Configure &KMess..." +msgstr "Konfigurovať &KMess" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +#, fuzzy +msgid "Do Not Display" +msgstr "Nezobraziť" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Malý" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Stredný" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Veľký" + +#: kmessinterface.cpp:197 +msgid "Group" +msgstr "Skupina" + +#: kmessinterface.cpp:198 +msgid "Online/Offline" +msgstr "Online/Offline" + +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Zmiešané" + +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Zobraziť &sieťové okno" + +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Prihlásený s %2" + +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 je online" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 je offline" + +#: kmessview.cpp:599 +msgid "Cha&t" +msgstr "Konverzáci&a" + +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" +msgstr "&Odstrániť zo skupiny" + +#: kmessview.cpp:643 +msgid "&Copy to Group" +msgstr "&Kopírovať do skupiny" + +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "&Presunúť do skupiny" + +#: kmessview.cpp:695 +msgid "Move Group &Down" +msgstr "Posunúť skupinu &nadol" + +#: kmessview.cpp:696 +msgid "Move Group &Up" +msgstr "Move Group &Up" + +#: kmessview.cpp:697 +msgid "Re&move Group" +msgstr "Od&strániť skupinu" + +#: kmessview.cpp:698 +msgid "Re&name Group" +msgstr "Pr&emenovať skupinu" + +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "&Pridať túto osobu do môjho \"Priatelia\" zoznamu" + +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-mailová adresa" + +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Klient: %1" + +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "Hudba" + +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokovaný" + +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Videný naposledy: %1" + +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Posledná správa: %1" + +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Skupina %1" + +#: kmessview.cpp:1224 +#, fuzzy, kde-format +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:1231 +#, fuzzy, kde-format +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:1651 +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:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Odmietol ste pozvánku." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "Štýl &konverzácie:" + +#: kmessview.cpp:2020 +#, kde-format +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 +#, kde-format +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 +#, kde-format +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:480 settings/accountpage.cpp:541 +msgid "KMess" +msgstr "KMess" + +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "MSN Messenger klient pre KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Vývojár a zakladateľ projektu" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "Vývojár" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "Podpora projektu" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Aktuálny vývojár" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 +msgid "" +"German translation, testing, documentation, web master, project management, " +"etc..." +msgstr "" + +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 +msgid "Web design" +msgstr "Webový design" + +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:74 +msgid "Cartoon emoticons" +msgstr "Kreslené emotikony" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "Predvolená zvuková téma" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "KMess ikona v štýle Oxygen" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 +msgid "Catalan translation" +msgstr "" + +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" + +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "" + +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 +msgid "Traditional Chinese translation" +msgstr "" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 +msgid "More Danish translation" +msgstr "" + +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 +msgid "More Dutch translation" +msgstr "" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +msgid "More Greek translation" +msgstr "" + +#: main.cpp:111 +msgid "Estonian translation" +msgstr "" + +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 +msgid "Finnish translation" +msgstr "" + +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 +msgid "More Finnish translation" +msgstr "" + +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 +msgid "French translation" +msgstr "" + +#: main.cpp:117 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 +msgid "More French translation" +msgstr "" + +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 +msgid "Hungarian translation" +msgstr "" + +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +msgid "More Hungarian translation" +msgstr "" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 +msgid "More Italian translation" +msgstr "" + +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 +msgid "Korean translation" +msgstr "" + +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +msgid "Serbian translation" +msgstr "" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "" + +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 +msgid "Spanish translation" +msgstr "" + +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 +msgid "More Spanish translation" +msgstr "" + +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 +msgid "Swedish translation" +msgstr "" + +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +msgid "More Swedish translation" +msgstr "" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 +msgid "Thai translation" +msgstr "" + +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 +msgid "Turkish translation" +msgstr "" + +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +#, fuzzy +msgid "MSNP12 support, various patches" +msgstr "MSNP12 podpora, rôzne opravy." + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "" + +#: main.cpp:154 +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:155 +msgid "File transfer thumbnails" +msgstr "Náhľady prenosu súborov" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 +msgid "Xinerama fixes" +msgstr "" + +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:159 +msgid "KWallet support" +msgstr "KWallet podpora" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +#, 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:161 +msgid "IRC-like commands in the chat window" +msgstr "Ako IRC príkazy v okne konverzácie" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "Štýl &konverzácie:" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "Rôzne medzinárodné opravy" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 +msgid "Various internationalization fixes." +msgstr "Rôzne medzinárodné opravy." + +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:169 +msgid "Guy with a bag over his head" +msgstr "Chlapík s taškou cez hlavu" + +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:173 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" + +#: main.cpp:174 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:174 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:175 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:175 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:176 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +#, fuzzy +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\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:179 +msgid "Your name here?" +msgstr "Vaše meno?" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Vaše mená" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "E-mailová adresa" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Uloženie zoznamu kontaktov je dokončené" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Prihlásenie s danou e-mailovou adresou" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Povolený" + +#: model/contactlist.cpp:1827 +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, kde-format +msgid "Do you want to
accept or cancel?" +msgstr "Chcete prijať, alebo zrušiť?" + +#: network/applications/application.cpp:581 +#, fuzzy, kde-format +msgid "Click to cancel." +msgstr "Kliknite pre zrušiť." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +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 +#, fuzzy, kde-format +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 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "Prenos súboru "%1" zlyhal. Súbor sa nedal uložiť." + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not 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:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Pripájanie k %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Kontakt zrušil prenos súboru "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Zrušili ste prenos súboru "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the 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 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Súbor úspešne odoslaný "%1"." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Súbor úspešne prijatý "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the 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 +#, fuzzy, kde-format +msgid "" +"The transfer of the 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 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Odosiela sa súbor "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Kontakt akceptoval prenos súboru "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +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 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the 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 +#, kde-format +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 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "Pozvanie bolo odmietnuté. Nie je podporované iným klientom." + +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "Pozvanie bolo prerušené. Vyskytla sa interná chyba." + +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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 +#, fuzzy +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 +#, fuzzy +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 +#, fuzzy +msgid "You are invited to share this contact's desktop." +msgstr "Ste pozvaný zdielať pracovnú plochu tejto osoby." + +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format +msgid "Starting KRDC. Connecting to %1." +msgstr "Spúšťa sa KRDC. Pripája sa k %1." + +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Kontakt vás pozýva na '%1', ale ešte nie je implementované." + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess does not " +"support it." +msgstr "" +"Pozvanie bolo zrušené. Kontakt odoslal chybné dáta, alebo KMess ich " +"nepodporuje." + +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "Prenos zlyhal. Príprava dát zlyhala." + +#: network/applications/p2papplication.cpp:1192 +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:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "" +"Prenos zlyhal. Kontakt odoslal chybné dáta, alebo KMess ich nepodporuje." + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Kontakt odmietol pozvanie. Vyskytla sa interná chyba." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "Čaká sa na pripojenie k %1, port %2" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +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:3169 +msgid "Waiting for connection" +msgstr "Čaká sa na pripojenie" + +#: network/applications/p2papplication.cpp:3423 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred 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:3432 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred 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:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "Pozvanie bolo zrušené. Vypršal časový limit na odpoveď." + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakt odmietol pozvanie. Vyskytla sa interná chyba." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Prenos sa zrušil." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Prenos zlyhal. Vyskytla sa vnútorná chyba." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "Pozvanie bolo zrušené. Audio zariadenie sa nedalo otvoriť." + +#: network/applications/voiceconversation.cpp:218 +#, kde-format +msgid "Start voice conversation. Connecting to %1." +msgstr "Spustiť hlasovú konverzáciu. Pripájanie k %1." + +#: network/applications/voiceconversation.cpp:224 +#, kde-format +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 +#, kde-format +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 +#, fuzzy +msgid "You are invited to view this contact'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:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Zrušili ste prenos súboru "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakt zrušil prenos súboru "%1"." + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "Neúspešné" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Odosielanie súboru %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "Prenos %1 zlyhal. Nedal sa otvoriť lokálny port." + +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not 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, kde-format +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 +#, kde-format +msgid "Receiving file %1" +msgstr "Prijímanie súboru %1" + +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "Neplatná syntax príkazu" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "Neplatný parameter príkazu" + +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "E-mail, ktorý ste sa snažili pridať, nie je konto MSN Messengera" + +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Chýba meno domény" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Už prihlásený" + +#: network/msnconnection.cpp:396 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Názov konta je neplatný" + +#: network/msnconnection.cpp:400 +#, fuzzy +msgid "" +"This 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:403 +msgid "Your contact list is full" +msgstr "Váš zoznam kontaktov je plný" + +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "Neplatný SBP parameter" + +#: network/msnconnection.cpp:411 +msgid "This contact is already on your list" +msgstr "Tento kontakt je už vo vašom zozname" + +#: network/msnconnection.cpp:415 +msgid "This contact is not on your list" +msgstr "Tento kontakt nie je vo vašom zozname" + +#: network/msnconnection.cpp:419 +msgid "This contact is not online" +msgstr "Tento kontakt nie je online" + +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Už sa nachádza v tomto režime" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your 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:436 +#, 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:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Táto skupina nemôže byť zmenená" + +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "Kontakt nie je pridaný do tejto skupiny" + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "Táto skupina nie je prázdna" + +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" + +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "Pokus o zmenu skupiny \"0\"" + +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "V KMess sa vyskytla vnútorná chyba: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Neplatná skupina" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "Prázdna doména" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "Nesprávny formát príkazu ADL" + +#: network/msnconnection.cpp:473 +msgid "Switchboard server failed" +msgstr "Server ústredne zlyhal" + +#: network/msnconnection.cpp:476 +msgid "Transfer to switchboard server failed" +msgstr "Prenos na server ústredne zlyhal" + +#: network/msnconnection.cpp:480 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "Chyba priameho pripojenia (MSNSLP), pripojenie zlyhalo" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Chýba požadované pole" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "Neprihlásený" + +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "Príkaz je zrušený" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "Vaše konto je zakázané." + +#: network/msnconnection.cpp:504 +msgid "Challenge response failed" +msgstr "Odpoveď výzvy zlyhala" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "Chybný príkaz údajov" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "Otvárate reláciu konverzácie príliš rýchlo" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "Máte otvorených príliš veľa relácií konverzácie" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "Neočakávaná postupnosť príkazu" + +#: network/msnconnection.cpp:528 +msgid "Bad friend name" +msgstr "Chybné meno priateľa" + +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "Chybné údaje CVR" + +#: network/msnconnection.cpp:540 +#, 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:547 +msgid "Authentication ticket was incorrect" +msgstr "Overovací lístok bol nesprávny" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot 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:554 +msgid "Not accepting new contacts" +msgstr "Neakceptovanie nových kontaktov" + +#: network/msnconnection.cpp:558 +#, 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:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "Vaše konto potrebuje byť najskôr overené." + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "Chyba prístupu k zoznamu, skúste to neskôr" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger 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:595 +#, fuzzy +msgid "" +"The Live Messenger 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:599 +msgid "Peer notification server down" +msgstr "Upozornenie server nepracuje" + +#: network/msnconnection.cpp:603 +msgid "The server is going down" +msgstr "Server prestáva pracovať" + +#: network/msnconnection.cpp:607 +msgid "The server is going down soon" +msgstr "Server nebude čoskoro pracovať" + +#: network/msnconnection.cpp:612 +msgid "Write is blocking" +msgstr "Písanie je blokované" + +#: network/msnconnection.cpp:616 +msgid "Session is overloaded" +msgstr "Relácia je preťažená" + +#: network/msnconnection.cpp:623 +msgid "The server is not available" +msgstr "Server nie je dostupný" + +#: network/msnconnection.cpp:627 +msgid "Authentication failed" +msgstr "Overenie zlyhalo" + +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "Prijatá neznáma chyba zo servera: %1" + +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN chyba" + +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "Overuje sa..." + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "Overené" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "Prepínanie na iný server..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Pripája sa..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Obdržaný neznámy príkaz zo servera: %1" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +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:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Server sa uzatvára pre údržbu v %1!" + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "MSN server nebude pracovať %1 pre údržbu." + +#: network/msnnotificationconnection.cpp:2309 +#, fuzzy, kde-format +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:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "Overovacia lehota prekročená" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Čaká sa na zoznam kontaktov..." + +#: network/msnnotificationconnection.cpp:2796 +#, fuzzy, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN správa

%1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Dôvod vnútornej chyby: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, 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:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:2932 +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:2935 +#, fuzzy, kde-format +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:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

" +msgstr "

MSN správa

%1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3005 +#, 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:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "
Dôvod vnútornej chyby: %1" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "Časový limit pripojenia bol prekročený" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping stratený" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pingy stratené" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "Pripojenie k serveru bolo stratené" + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy, kde-format +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, kde-format +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 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Server nie je dostupný" + +#: network/soap/httpsoapconnection.cpp:479 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Príliš veľa presmerovaní pri prihlásení" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Server nie je dostupný" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, fuzzy, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Neočakávaná postupnosť príkazu" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" +msgstr "V %1's konverzácii: %2" + +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 hovorí:
'%2'" + +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 vám odoslal offline správu:
'%2'" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "%1's vyžaduje pozornosť!" + +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 vám odoslal správu písanú rukou!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 vám odoslal/la štuchanec!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 vám odoslal odkaz!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 chce použiť kameru!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 vám odosiela súbor!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 vám odoslal privítanie!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 zrušil reláciu webovej kamery!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 zrušil prenos súboru!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1's činnosť bola zrušená!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 prijal použitie webovej kamery!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 akceptoval prenos súboru!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 prijal vaše privítanie!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 ukončil reláciu webovej kamery!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "prenos súboru s %1 ukončený!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1's činnosť sa ukončila!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1's zlyhala relácia webovej kamery!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Prenos súboru s %1 zlyhal!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1's činnosť ukončil s chybou!" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" +msgstr "%1 hneď sa vráti" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" +msgstr "%1 sa stal neviditeľný" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" +msgstr "%1 sa odhlásil" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr "%1 je na telefóne" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "%1 je na obede" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +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..." + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Zobraziť obrázok" + +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "Sťahovanie obrázka zlyhalo" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image 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 +#, kde-format +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 +#, kde-format +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, kde-format +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:371 +msgid "Hi, how are you doing? :)" +msgstr "Ahoj, ako sa ti darí? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Super!" + +#: settings/chatstylepage.cpp:375 +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, kde-format +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 +#, fuzzy +msgid "No selectable web 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 web 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 web 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 emails 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "&Zobraziť emotikony" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, fuzzy, kde-format +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:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Udalosti kontaktu" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the 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 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 +#, fuzzy +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Kliknite na toto tlačidlo, ak chcete začať používať KMess, alebo zrušiť " +"pripojenie" + +#. 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 +#, fuzzy +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Kliknite na toto tlačidlo, ak chcete začať používať KMess, alebo zrušiť " +"pripojenie" + +#. 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:107 +#. 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 +#, fuzzy +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:273 +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:70 +#. 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:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Začať alebo ukončiť &konverzáciu" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +msgstr "Auto" + +#. 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 the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "&Blokovať túto osobu, alebo vidieť môj online stav" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "Obnoviť" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "Skupina" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Použiť alternatívne meno pre túto osobu" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Zobraziť upozornenia keď váš kontakt:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "Zvuk:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Zobraziť obrázok" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, 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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Zobraziť obrázok" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "&Vyčistiť medzipamäť" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "Obnoviť" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "P&ovoliť kontakt" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact 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:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "" +"Zadajte sem e-mailovú adresu osoby, ktorú chcete pridať do vášho zoznamu " +"kontaktov" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "%1 kontakty" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Položky na export:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Formát" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Kontakty:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Vybrať všetko" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "Zrušiť všetko" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Export..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Zavrieť" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +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:228 +msgid "Command:" +msgstr "Príkaz:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Písať:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +#, fuzzy +msgid "Standard" +msgstr "Hviezda" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Odoslať" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Príkaz payload (môže byť prázdny):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Otvoriť" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Zrušiť" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "Vy&čistiť" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "Zavrieť" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +msgid "Password:" +msgstr "Heslo:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +#, fuzzy +msgid "Enter 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:285 +msgid "Status at login:" +msgstr "Stav pri prihlásení:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +#, 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:291 +#, 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:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "Zapamä&tať tento profil" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +#, 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:303 +#, fuzzy +msgid "R&emember password" +msgstr "&Zapamätať heslo" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +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:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Nové konto" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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:324 +msgid "Password forgotten?" +msgstr "Zabudnuté heslo?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +#, 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:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Pripojiť" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +#, fuzzy +msgctxt "@title:menu" +msgid "&View" +msgstr "Zobraziť" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Akcie" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "Tvar" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Konto" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +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:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +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:357 +msgid "&Friendly name:" +msgstr "&Meno:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +#, 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:363 +msgid "&Email address:" +msgstr "&E-mailová adresa:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 +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:369 +msgid "&Password:" +msgstr "&Heslo:" + +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "&Zapamätať heslo" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +msgid "C&hange..." +msgstr "Z&meniť..." + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "&Nepoužívať" + +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy +msgid "" +"The option \"Remember account\" was left unchecked while logging in, " +"so your settings will not be saved by default. Enable this option if you " +"want to save your account settings permanently on this system.\n" +"\n" +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are 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:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "Za&pamätať nastavenia tohto konta" + +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 +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:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Automaticky prihlásiť &s týmto kontom" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Prihlásiť &ako" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +#, 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:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot 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:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 +msgid "Request verification email" +msgstr "Požiadať overovací e-mail" + +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 +msgid "Go to accountservices.passport.net" +msgstr "Prejsť na accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, fuzzy +msgid "" +"You need a Passport account to connect to the Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail 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:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy +msgid "" +"To connect to the Live 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:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +msgid "Register new account" +msgstr "Zaregistrovať nové konto" + +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 +msgid "http://register.passport.com/" +msgstr "http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 +msgid "Go to register.passport.com" +msgstr "Prejsť na register.passport.com" + +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "Stav pri prihlásení:" + +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Zmeniť stav na \"Preč-Nečinný \" keď neaktívny" + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "Určuje počet sekúnd, kedy KMess zmení stav na \"Preč-Nečinný \"." + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Stať sa nečinný po" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "minútach" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your 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:476 +msgid "Saved accounts:" +msgstr "Uložené kontá:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +#, fuzzy +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live 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:482 +#, fuzzy +msgid "&Add Account..." +msgstr "&Pridať konto..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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:491 +msgid "&Edit" +msgstr "&Editovať" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +msgid "&Remove" +msgstr "&Odstrániť" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "Záznam konverzácie" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Uložiť konverzáciu do &súboru" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Uložiť konverzáciu" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +#, fuzzy +msgid "Plain Text" +msgstr "Nájsť &text" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Samostatne uložiť záznamy podľa:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +#, 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:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "Rok" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +#, 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:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +#, 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:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Uložiť priamo do určeného adresára" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" +"Vybrať adresár vo vašom systéme, kde chcete uložiť záznamy konverzácie." + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following 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:618 +msgid "St&yle" +msgstr "Št&ýl" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +#, fuzzy +msgid "&Chat style:" +msgstr "Štýl &konverzácie:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "Nastavenia konverzácie" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +msgid "&Show emoticons" +msgstr "&Zobraziť emotikony" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "Zobraziť &emotikony" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, 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:648 +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:654 +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:657 +#, 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:663 +#, fuzzy +msgid "Show &date" +msgstr "Kontakty" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "&Zobraziť emotikony" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "&Text" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +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:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "Váš typ písma &správ:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with 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:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, 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:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "V&yčistiť kartu" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +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:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +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:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +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:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "S&kupina konverzuje v tom istom okne:" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "Vždy" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "Pre kontakty v tej istej skupine" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "Nikdy" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Zobraziť obrázok" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail 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:736 +#, 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_) +#: rc.cpp:739 +#, fuzzy +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media 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:742 +#, fuzzy +msgid "Show contacts w&hich song I am listening to" +msgstr "Informovať kontakty, k&torú skladbu počúvam" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +msgid "&Emoticon Themes" +msgstr "Témy &emotikon" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" +msgstr "Dostupné štýly emotikon:" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +msgid "&Custom Emoticons" +msgstr "&Vlastné emotikony" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Dostupné štýly emotikon:" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +#, 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:781 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Pridať no&vé..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +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:790 +msgid "Re&name" +msgstr "Pre&menovať" + +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +#, fuzzy +msgid "Click here to delete the selected emoticon" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +msgid "Remo&ve" +msgstr "Odstrá&niť" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "Webový prehliadač" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +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:811 +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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 +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:827 rc.cpp:862 +#, 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:831 +#, 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:834 +msgid "Email Client" +msgstr "E-mailový klient" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +#, 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:843 +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:846 +#, 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:852 +#, 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:866 +#, 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:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +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:878 +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:881 +msgid "and" +msgstr "a" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "pre prenosy súborov" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "Vaše meno" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "Vaše konto je zakázané." + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "O&brázky" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Zatiaľ žiadne správy" + +#, fuzzy +#~ msgid "&Do not filter" +#~ msgstr "&Nepoužívať" + +#, fuzzy +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Zobraziť vyskakovacie okno keď sa kontakt pripojí/odpojí" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Vlastné emotikony pre toto konto:" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Pridať túto &emotikonu..." + +#, fuzzy +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "Nemôžete teraz blokovať!" + +#~ msgid "Ed&it Notes" +#~ msgstr "Up&raviť poznámky" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Zobraziť obrázok" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "Vyhľadať kontakt" + +#~ msgid "Search by &Interest" +#~ msgstr "Hľadať podľa &záujmov" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Vaše e-maily" + +#~ 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ť." + +#~ 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." + +#~ 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 "" +#~ "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" + +#~ 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 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 82d7046..8515591 100644 --- a/po/sl.po +++ b/po/sl.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: sl\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" "PO-Revision-Date: 2005-09-30 08:03+0200\n" "Last-Translator: Matjaž kaše \n" "Language-Team: Slovenščina \n" @@ -18,863 +18,1687 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3);\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Matjaž Kaše" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "matjazkase@hotmail.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "NIsem ob računalniku" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Vaše ime" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "vašeime@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Prijavljanje....." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "NIsem ob računalniku" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." msgstr "" -#: chat/chatmessagestyle.cpp:296 +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 #, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Odstrani to osebo" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Zaspan" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "%1 je zapustil/a klepet" + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +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:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "Klepet - %1 in %2" + +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "Klepet %1" + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "(To sporočilo je bilo poslano samodejno)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1291 +#, kde-format +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." +msgstr "" + +#: chat/chat.cpp:1300 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" + +#: chat/chat.cpp:1312 +#, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" + +#: chat/chat.cpp:1321 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" + +#: chat/chat.cpp:1333 +#, kde-format +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:1342 +#, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "" + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +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:1626 +#, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "Pošiljanje datoteke %1" + +#: chat/chatmessagestyle.cpp:382 +#, fuzzy, kde-format msgid "%1 says:" msgstr "pravi: " -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Poveži" + +#: chat/chatview.cpp:300 +#, kde-format 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:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, kde-format msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 #, fuzzy msgid "Add this &Emoticon..." msgstr "Prikaži sme&ške" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Prikaži sme&ške" + +#: chat/chatview.cpp:834 #, fuzzy msgid "Send &Email" msgstr "Pošlji e-poštno sporočilo" -#: chat/chatview.cpp:926 +#: chat/chatview.cpp:838 #, fuzzy -msgid "Copy E&mail" -msgstr "E-pošta" +msgid "Add &Contact" +msgstr "Dodaj osebo" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-poštni naslov:" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:948 +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "Mačji ksiht" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Pošlji &datoteko" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Klepet" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" - -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 se je pridružil/a klepetu." - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "%1 je zapustil/a klepet" - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 je zapustil/a klepet" - -#: chat/chatwindow.cpp:575 -#, fuzzy -msgid "%1 - Chat" -msgstr "Klepet" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 #, fuzzy msgid "Contacts" msgstr "Dodaj osebo" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "Prikaži sme&ške" -#: chat/chatwindow.cpp:799 +#: chat/chatwindow.cpp:128 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "Prikaži sme&ške" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr "(To sporočilo je bilo poslano samodejno)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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:1502 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:1791 +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "" + +#: chat/chatwindow.cpp:451 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "Sporočilo \"%1\"ni bilo sprejeto." +msgid "&Invite..." +msgstr "P&ovabi" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1tipka." - -#: chat/chatwindow.cpp:1985 +#: chat/chatwindow.cpp:452 #, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1tipka." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +msgid "Send a &File..." msgstr "Pošlji &datoteko" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "Prični &srečanje" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 #, fuzzy msgid "Send a &Nudge!" msgstr "Pošlji &datoteko" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Prični ali prekini &pogovor" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." msgstr "" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "P&ovabi" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Klepet" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "Spremeni P&isavo" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "Spremeni &barvo pisave" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Vstavi smeška" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "Prikaži sme&ške" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Prikaži/Skrij prijatelje&vo stransko okno" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "V sporočilih prikaži grafiko" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Prikaži ali skrij prijateljevo stransko okno" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:484 +#, fuzzy +msgid "Meeting" +msgstr "Nastavitve" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Pošlji &datoteko" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Čakanje na seznam stikov" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Dodaj osebo" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Čakanje na seznam stikov" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Prikaži sme&ške" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Čakanje na seznam stikov" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Prikaži sme&ške" + +#: chat/chatwindow.cpp:533 +#, fuzzy +msgid "&Font" +msgstr "&Povezava" + +#: chat/chatwindow.cpp:534 +#, fuzzy +msgid "Font &Color" +msgstr "Spremeni &barvo pisave" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "Mačji ksiht" + +#: chat/chatwindow.cpp:603 +#, 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:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Klepet" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "Klepet" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1tipka." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1tipka." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1tipka." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Prični &srečanje" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" msgstr "Pošlji e-poštno sporočilo" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "Prikaži profil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "Lastnosti" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "Dodaj osebo" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" msgstr "Dovoli stik" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 #, fuzzy msgid "&Delete Contact" msgstr "Odstrani to osebo" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "Blokiraj to osebo" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "Odblokiraj to osebo" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 #, fuzzy msgid "&Friendly Name" msgstr "Vaše prijazno ime:" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 #, fuzzy msgid "&Email Address" msgstr "E-poštni naslov:" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +#, fuzzy +msgid "Song &Name" +msgstr "&ime" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +#, fuzzy +msgid "&Information" +msgstr "Prikaži e-poštno sporočilo " + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Vaša slika" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +#, fuzzy +msgid "&Notes" +msgstr "Nota" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "Prikaži sme&ške" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" msgstr "" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Blokiran" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Odsoten" - -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Pridem takoj" - -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Zaseden" - -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Neprijavljen" - -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Odsoten" - -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Na kosilu" - -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "Prijavljen" - -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "Telefoniram" - -#: chat/contactframe.cpp:558 -#, fuzzy +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" msgid "The contact is %1" msgstr "Oseba ni prijavljena" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" msgstr "" -#: contactlistviewitem.cpp:214 -msgid "Client: %1" +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "Dodajte prijatelja" + +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Računi" + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" msgstr "" -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +#, fuzzy +msgid "Remove" +msgstr "Odstranjeno" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +#, fuzzy +msgid "Web Messenger" +msgstr "Spletno oblikovanje" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "Spletno oblikovanje" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, fuzzy, kde-format +msgid "Windows Live Messenger %1" +msgstr "Spletno oblikovanje" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Spletno oblikovanje" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Prijavljen" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Zaseden" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Odsoten" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Odsoten s samodejnim odgovarjanjem" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Pridem takoj" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Telefoniram" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Na kosilu" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Neviden" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Neprijavljen" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Moje stanje" + +#: contact/msnstatus.cpp:218 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Odklopi" + +#: dialogs/addcontactdialog.cpp:49 +#, fuzzy +msgid "Add a Contact" msgstr "Dodajte prijatelja" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Vpišite e-poštni naslov osebe, ki jo želite dodati:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "Vpisali ste neveljaven e-poštni naslov!" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 #, fuzzy msgid "Add New Emoticon" msgstr "Prikaži sme&ške" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "Prikaži sme&ške" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "Določite sporočilo ob odsotnosti" +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "" #: dialogs/awaymessagedialog.cpp:37 -msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +#, fuzzy +msgid "Automatic Away Message" +msgstr "Določite sporočilo ob odsotnosti" + +#: dialogs/chathistorydialog.cpp:57 +msgctxt "Dialog window title" +msgid "Chat History" msgstr "" -"Vnesite sporočilo, ki bo samodejno odoposlano\n" -"osebam, ki se skušajo povezati z vami:" -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Za to osebo uporabite nadomestno ime" +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "Prikaži oblaček, ko se ta oseba prijavi ali odjavi" +#: dialogs/chathistorydialog.cpp:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Slika:" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Prijavljanje....." -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Zvok:" +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Beleži vse pogovore" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"vas je dodal/a med prijatelje. Želite:" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%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:282 +#, kde-format msgid "Contact Properties for %1" msgstr "Lastnosti osebe %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Povezan" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +#, fuzzy +msgid "No messages yet" +msgstr "V sporočilih prikaži grafiko" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Oblika sporočila v pogovoru:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Oblika sporočila v pogovoru:" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "E-poštni naslov:" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Trenutno ime:" +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Poštni odjemalec" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Dodaj osebo" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "Vabilo je bilo zavrnjeno, ker na drugi strani ni podprto." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Dodaj osebo" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "Omrežno okno" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" msgstr "" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "Mačji ksiht" + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "" - -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Računalnik" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" msgstr "Prenosi datotek" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Zmeda" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "Odstrani to osebo" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Vaša slika" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Res želite izbrisati ta račun? " + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Vaša slika" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Nasmeh" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "Pomežik" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Jezik" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Širok nasmeh" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Žalost" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Jok" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "Jeza" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Zmeda" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Nerodno" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "razočaran" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Vroče" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Režanje" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Piflar" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "bolan" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Presenečen" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Zabava" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Zaspan" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Zamišljen" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Psssst" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Skrivnostno" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "zavijanje z očmi" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Sarkastično" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Ne vem" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Pridem takoj" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Angel" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Levi objem" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Fant" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Rdeče srce" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Rdeča vrtnica" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +#, fuzzy +msgid "Thumbs up" msgstr "Palec gor" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Pasji ksiht" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Sonček" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Hudič" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Desni objem" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Dekle" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Počeno srce" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Ovela vrtnica" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Palec dol" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Mačji ksiht" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Speči polmesec" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Žnabelčki" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Aplavz" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Fige" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Avto" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Letalo" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Želva" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Polž" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Črna ovca" +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "Zaspan" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Vampirski netopir" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Krugl pira" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "Martini" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "Kavica" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Torta" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Krožnik" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Čaša" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Zvezda" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Mavrica" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Necihtni oblak" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Bliskanje" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Dežnik" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Osamljeni otok" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "slušalka" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Mobi" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "E-pošta" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Ura" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Fotoaparat" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Filmski trak" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Nota" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Lisice" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Soldi" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Žarnica" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +#, fuzzy +msgid "Cigarette" msgstr "Čik" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "Žoga" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Darilo" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Računalnik" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" msgstr "Ikona KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" msgstr "" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +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:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Povezava s strežnikom ni uspela " + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Povezava" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "E-poštni naslov:" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "E-poštni naslov:" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Ta oseba je že na vašem seznamu." + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "Prikaži e-poštno sporočilo " + +#: kmess.cpp:248 +#, fuzzy +msgid "New Group" +msgstr "Nova &skupina" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Dodaj skupino" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Vnesite ime nove skupine:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Odsoten s samodejnim odgovarjanjem" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "" - -#: kmess.cpp:715 +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -882,16 +1706,32 @@ msgstr "" "Ste prepričani, da želite osebo %1 odstraniti z vašega seznama?" -#: kmess.cpp:718 -msgid "Remove contact" +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" msgstr "Odstrani osebo" -#: kmess.cpp:720 +#: kmess.cpp:580 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "Odstranjeno" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" @@ -899,2097 +1739,4963 @@ msgstr "" "Ste prepričani, da želite skupino %1 odstraniti s svojega seznama?" "list?" -#: kmess.cpp:763 -msgid "Remove group" -msgstr "Odstrani skupino" +#: kmess.cpp:636 +#, fuzzy +msgctxt "dialog button" +msgid "Remove" +msgstr "Odstranjeno" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "Te skupine ni mogoče spreminjati" -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "Preimenuj skupino" +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "Preimenu&j skupino" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Povezan" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Vnesite ime nove skupine:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Overitev ni uspela" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Povezava - dobra" + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Nepovezan" -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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:1448 +#, kde-format +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:1673 +#: kmess.cpp:1460 +#, kde-format +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:1466 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Obvestilo o e-pošti" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nov &Račun" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Nov &stik" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Nova &skupina" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "Poišči osebo" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Išči po interesih" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Nastavitve računa" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Dejanja" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Poveži" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "Odklopi" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Prikaži moj profil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Moje stanje" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "&Povezava" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Odklopi" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Prikaži moj profil" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "Prikaži dovoljene stike" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "Prikaži osebe, ki niso prijavljene" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "Prikaži odstranjene osebe" -#: kmessinterface.cpp:278 +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:171 #, fuzzy -msgid "Show &Display Pictures" +msgid "&Show Search Bar" +msgstr "Prikaži/Skrij prijatelje&vo stransko okno" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "Prikaži sme&ške" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" msgstr "Vaša slika" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Prikaži spletno okno" - -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "Razvrsti osebe po " -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Prikaži okno prenosov" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "Nov &stik" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "Nova &skupina" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Poišči osebo" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "Nov &Račun" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Nov &Račun" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "Nasmeh" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Skupini" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Prijavljene/neprijavljene" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Prikaži okno prenosov" - -#: kmessview.cpp:113 -msgid "Now listening to %1" +#: kmessinterface.cpp:199 +msgid "Mixed" msgstr "" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Prikaži spletno okno" + +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" msgstr "" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, fuzzy, kde-format +msgid "[%1] %2 goes online" +msgstr "%1 ni prijavljen" + +#: kmessview.cpp:360 +#, fuzzy, kde-format +msgid "[%1] %2 goes offline" +msgstr "%1 ni prijavljen" + +#: kmessview.cpp:599 #, fuzzy msgid "Cha&t" msgstr "Klepet" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "Lastnosti" - -#: kmessview.cpp:623 +#: kmessview.cpp:610 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "Odstrani skupino" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "Premakni v skupino" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 #, fuzzy msgid "&Copy to Group" msgstr "Premakni v skupino" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "Premakni v skupino" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "Pomakni skupino navzdol" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "Pomakni skupino navzgor" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "I&zbriši skupino" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "Preimenu&j skupino" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "V predalu imate 1 novo e-poštno sporočilo." +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "&Dodati to osebo na seznam\"Prijatelji\"" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "V predalu imate %1 novih e-poštnih sporočil" +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-poštni naslov:" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Odsoten)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Poštni odjemalec" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Pridem takoj)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Zaposlen)" +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "Nota" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Neviden)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokiran" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Odsoten/a)" +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Oblika sporočila v pogovoru:" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Na kosilu)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Oblika sporočila v pogovoru:" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "Telefoniram" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Samodejna prijava z navedenim e-poštnim naslovom" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +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" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +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:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "S tem računom se ne morete prijaviti" + +#: kmessview.cpp:1834 +msgid "No Chat History found." +msgstr "" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: kmessviewdelegate.cpp:148 +#, fuzzy, kde-format +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, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +#, fuzzy +msgid "Current developer" +msgstr "Razvijalec GnomeMeeting" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Nemški prevod, testiranje, dokumentacija...." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "Spletno oblikovanje" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "Italijanski prevod in večina smeškov" -#: main.cpp:81 +#: main.cpp:74 msgid "Cartoon emoticons" msgstr "Smeški iz risank" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Privzeta zvočna tema" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabski prevod" -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 #, fuzzy msgid "More Arabic translation" msgstr "Turški prevod" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Prevod v brazilsko portugalščino" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Prevod v brazilsko portugalščino" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 #, fuzzy msgid "Catalan translation" msgstr "Katalonski prevod" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Korejski prevod" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Prevod v poenostavljeno kitajščino" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 #, fuzzy msgid "More Simplified Chinese translation" msgstr "Prevod v poenostavljeno kitajščino" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 #, fuzzy msgid "Traditional Chinese translation" msgstr "Prevod v tradicionalno kitajščino" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Prevod v tradicionalno kitajščino" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 #, fuzzy msgid "Danish translation" msgstr "Danski prevod" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 #, fuzzy msgid "More Danish translation" msgstr "Danski prevod" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "Nizozemski prevod" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 #, fuzzy msgid "More Dutch translation" msgstr "Nizozemski prevod" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Turški prevod" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "Francoski prevod" + +#: main.cpp:111 #, fuzzy msgid "Estonian translation" msgstr "Estonski prevod" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 #, fuzzy msgid "Finnish translation" msgstr "Danski prevod" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 #, fuzzy msgid "More Finnish translation" msgstr "Danski prevod" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "Francoski prevod" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" msgstr "Francoski prevod, smeški MSN6" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 #, fuzzy msgid "More French translation" msgstr "Francoski prevod" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 #, fuzzy msgid "Hungarian translation" msgstr "Estonski prevod" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Estonski prevod" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 #, fuzzy msgid "More Italian translation" msgstr "Korejski prevod" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "Korejski prevod" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Norveški prevod bokmal" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "Korejski prevod" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "Korejski prevod" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 #, fuzzy msgid "Slovenian translation" msgstr "Korejski prevod" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 msgid "Spanish translation" msgstr "Španski prevod" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 #, fuzzy msgid "More Spanish translation" msgstr "Španski prevod" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 msgid "Swedish translation" msgstr "Švedski prevod" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "Švedski prevod" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 #, fuzzy msgid "Thai translation" msgstr "Tajski prevod" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 msgid "Turkish translation" msgstr "Turški prevod" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "Turški prevod" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "Prijavljen" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Prenosi datotek" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Popravki za Xineramo" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Originalna koda za sprejem datotek" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "Razni popravki" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "Razni popravki" -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "Razvijalec GnomeMeeting" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Tip z vrečko na glavi" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspiracija" -#: main.cpp:139 +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 #, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "Koda za oblačke" -#: main.cpp:140 +#: main.cpp:174 msgid "Idle timer code" msgstr "Koda za čas odsotnosti" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:179 #, fuzzy msgid "Your name here?" msgstr "Vaše ime" -#: main.cpp:144 -msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" -"If you feel your name is missing here, please contact us too!" +#: main.cpp:182 +#, fuzzy +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Vaše ime" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "E-poštni naslov:" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Čakanje na seznam stikov" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Samodejna prijava z navedenim e-poštnim naslovom" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" msgstr "" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Dovoljeno" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Odstranjeno" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." msgstr "Oseba je prekinila povezavo." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "Oseba je zavrnila povabilo." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Prekinili ste povezavo." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Zavrnili ste povabilo." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, fuzzy, kde-format msgid "Do you want to
accept or cancel?" msgstr "Boste sprejeli alizavrnili?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, fuzzy, kde-format msgid "Click to cancel." msgstr "Kliknite za preklic." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, 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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Povezujem se na %1:vrata %2" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Prenos je bil preklican." +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Povezava vzpostavljena" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Prenos datoteke %1 se je uspešno zaključil." - -#: network/applications/filetransfer.cpp:600 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Prenos %1 je spodletel. Datoteka ne obstaja." - -#: network/applications/filetransfer.cpp:604 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Prenos %1 je spodletel. Povezave ni mogoče vzpostaviti" - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Pošiljanje datoteke %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Prenos sprejet." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Povezujem se na %1:vrata %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Oseba je prekinila povezavo." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Prekinili ste povezavo." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Prekinili ste povezavo." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Povezava vzpostavljena" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Prenos datoteke %1 se je uspešno zaključil." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Prenos datoteke %1 se je uspešno zaključil." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "Prenos %1 je spodletel. Datoteka ne obstaja." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "Prenos %1 je spodletel. Povezave ni mogoče vzpostaviti" + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Pošiljanje datoteke %1" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Oseba je prekinila povezavo." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "" "Vabilo za prenos podatkov je bilo preklicano, ker so bili podatki slabi." -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Prekinili ste povezavo." -#: network/applications/filetransferp2p.cpp:531 -#, fuzzy -msgid "The contact cancelled the transfer." -msgstr "Oseba je prekinila povezavo." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Prenos %1 je spodletel. Datoteka ne obstaja." - -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Prenos %1 je spodletel. Povezave ni mogoče vzpostaviti" - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "Pošiljanje datoteke %1" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Povabljeni ste k srečanju GnomeMeeting." -#: network/applications/gnomemeeting.cpp:114 -#, fuzzy +#: network/applications/gnomemeeting.cpp:118 +#, fuzzy, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Pričenjam GnomeMeeting. Povezujem se na %1." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Vabilo osebi na sestanek" -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." msgstr "Vabilo je bilo zavrnjeno, ker na drugi strani ni podprto." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." msgstr "Povabilo je bilo prekinjeno. Prišlo je do notranje napake." -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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:130 -msgid "The invitation was aborted. Timeout while waiting for file data." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Povabilo je bilo prekinjeno. Čas se je iztekel." -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." msgstr "Povabilo je bilo prekinjeno." -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Povabilo je bilo prekinjeno." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Oseba vas vabi, da si delite njeno namizje." -#: network/applications/msnremotedesktop.cpp:155 -#, fuzzy +#: network/applications/msnremotedesktop.cpp:159 +#, fuzzy, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "Pričenjam KRDC Povezujem se na %1" -#: network/applications/p2papplication.cpp:276 -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:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Oseba vas vabi k %1, vendar ta funkcija še ni vključena." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" "Povabilo je bilo preklicano. Oseba je poslala slabe podatke, ali pa jih " "KMess ne podpira." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." msgstr "Prenos ni uspel; spodletela je priprava podatkov." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Oseba je zavrnila povabilo. Prišlo je notranje napake." - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "Prenos ni uspel." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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:2038 +#: network/applications/p2papplication.cpp:1192 #, 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:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 #, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "" "Prenos ni uspel. Oseba je poslala slabe podatke, ali pa jih KMess ne podpira." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Oseba je zavrnila povabilo. Prišlo je notranje napake." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Čakam na povezavo na %1: vrata%2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Prenos ni uspel.Iztekel se je čas za sprejem." - -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "Prenos ni uspel. Pojavila se je notranja napaka." - -#: network/applications/p2papplication.cpp:3670 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "Prenos ni uspel. Vira podatkov ni mogoče odpreti." - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 #, fuzzy msgid "Waiting for connection" msgstr "Čakanje na seznam stikov" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "" "Povabilo je bilo preklicano. Čas, določen, da oseba povabilo sprejme, se je " "iztekel." -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 #, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "" "Povabilo je bilo preklicano. Čas, določen, da oseba povabilo sprejme, se je " "iztekel." -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." msgstr "" "Povabilo je bilo preklicano. Čas, določen za sprejem podatkov, se je iztekel." -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Oseba je zavrnila povabilo. Prišlo je notranje napake." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Prenos ni uspel." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Prenos ni uspel. Pojavila se je notranja napaka." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "" "Vabijo vas k zvočnem pogovoru, vendar nimate nameščene ustrezne podpore." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "Zavrnili ste glasovni razgovor." -#: network/applications/voiceconversation.cpp:211 +#: network/applications/voiceconversation.cpp:205 #, fuzzy -msgid "The invitation was cancelled. The audio device couldn't be opened." +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "Povabilo je bilo preklicano, ker se zvočna naprava ni vključila." -#: network/applications/voiceconversation.cpp:222 -#, fuzzy +#: network/applications/voiceconversation.cpp:218 +#, fuzzy, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Pričenjam zvočno povezavo. Povezujem se na %1." -#: network/applications/voiceconversation.cpp:228 -#, fuzzy +#: network/applications/voiceconversation.cpp:224 +#, fuzzy, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Začenjam zvočni pogovor. Poslušam na %1." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "Osebo vabim n zvočni pogovor." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Prenos %1 je bil preklican. " +#: 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/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "Oseba vas vabi, da si delite njeno namizje." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Prekinili ste povezavo." + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Oseba je prekinila povezavo." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:410 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Pošiljanje datoteke %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/extra/msnftpconnection.cpp:411 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy -msgid "Couldn't open a local port." +msgid "Could not open a local port." msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Prenos datoteke protokola za zagon seje" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +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:482 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Sprejem datoteke %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" msgstr "" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping izgubljen" - -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "Izgubljeni pingi: %1" - -#: network/msnconnection.cpp:752 -#, fuzzy -msgid "The connection to the server was lost." -msgstr "Povezava s strežnikom ni uspela " - -#: network/msnconnection.cpp:803 -#, fuzzy -msgid "The remote server has closed the connection." -msgstr "Povabilo je bilo prekinjeno." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Dovoljeno" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Odstranjeno" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:740 +#: network/msnconnection.cpp:384 #, fuzzy -msgid "Show MSN Messenger Service status?" -msgstr "Prikažem stanje storitve NET?" +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "Vpišite e-poštni naslov osebe, ki jo želite dodati:" -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:396 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Navedeno ime računa ni veljavno" + +#: network/msnconnection.cpp:400 +#, fuzzy +msgid "" +"This 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/msnconnection.cpp:403 +msgid "Your contact list is full" +msgstr "Vaš seznam stikov je poln" + +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 +msgid "This contact is already on your list" +msgstr "Ta oseba je že na vašem seznamu." + +#: network/msnconnection.cpp:415 +msgid "This contact is not on your list" +msgstr "Te osebe ni na vašem seznamu" + +#: network/msnconnection.cpp:419 +msgid "This contact is not online" +msgstr "Oseba ni prijavljena" + +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "Ime skupine ste že uporabili." + +#: network/msnconnection.cpp:436 +#, 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/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Te skupine ni mogoče spreminjati" + +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "Vaš seznam vsebuje preveč skupin" + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "Taskupina ni prazna" + +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" + +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "" + +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "V KMess je prišlo do notranje napake: %1" + +#: network/msnconnection.cpp:462 +#, fuzzy +msgid "Invalid Group" +msgstr "Preimenu&j skupino" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 +msgid "Switchboard server failed" +msgstr "Preklopni strežnik ne deluje" + +#: network/msnconnection.cpp:476 +msgid "Transfer to switchboard server failed" +msgstr "Prenos k preklopnemu strežniku je spodletel " + +#: network/msnconnection.cpp:480 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "" + +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "Vaše ime" + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Prenos ni uspel." + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +#, fuzzy +msgid "You are opening chat sessions too fast" +msgstr "Prehitro odpirate sejo" + +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" +msgstr "Odprtih imate preveč sej" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 +msgid "Bad friend name" +msgstr "Neustrezno ime za prijatelja" + +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" +msgstr "" + +#: network/msnconnection.cpp:547 +#, fuzzy +msgid "Authentication ticket was incorrect" +msgstr "Overitev ni uspela" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Pogovora ne morete pričeti, dokler ste nevidni." + +#: network/msnconnection.cpp:554 +#, fuzzy +msgid "Not accepting new contacts" +msgstr "Novih vodij ni mogoče sprejeti" + +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr " " + +#: network/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr " " + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "Prišlo je do notranje napake strežnika." + +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "Prišlo je do notranje napake strežnika." + +#: network/msnconnection.cpp:599 +msgid "Peer notification server down" +msgstr "Strežnik za obveščanje je izključen" + +#: network/msnconnection.cpp:603 +msgid "The server is going down" +msgstr "Strežnik se izključuje" + +#: network/msnconnection.cpp:607 +msgid "The server is going down soon" +msgstr "strežnik se bo kmalu izključil" + +#: network/msnconnection.cpp:612 +msgid "Write is blocking" +msgstr "Pisanje je blokirano" + +#: network/msnconnection.cpp:616 +msgid "Session is overloaded" +msgstr "Saja je prezasedena" + +#: network/msnconnection.cpp:623 +#, fuzzy +msgid "The server is not available" +msgstr "Strežnik ni dosegljiv" + +#: network/msnconnection.cpp:627 +msgid "Authentication failed" +msgstr "Overitev ni uspela" + +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format +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/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" msgstr "Napaka strežnika" -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1337 #, fuzzy +msgid "Authenticating..." +msgstr "Overjanje" + +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "Overitev ni uspela" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Povezovanje..." + +#: network/msnnotificationconnection.cpp:1940 +#, fuzzy, kde-format +msgid "Unknown command received from the server: %1" +msgstr "KMess je dobil sporočilo o neznani napaki od strežnika %1" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "minutah" +msgstr[1] "minutah" +msgstr[2] "minutah" +msgstr[3] "minutah" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "" + +#: network/msnnotificationconnection.cpp:2108 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "Overitev ni uspela" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Čakanje na seznam stikov" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "V KMess je prišlo do notranje napake: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, fuzzy +msgctxt "Connection error: dialog box" msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." +"

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

" +msgstr "Overjanje ni uspelo; preverite svoj račun in geslo" + +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:1553 -msgid "Got synchronization" -msgstr "Sinhronizirano" +#: network/msnnotificationconnection.cpp:2932 +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:1690 -msgid "Authenticating" -msgstr "Overjanje" +#: network/msnnotificationconnection.cpp:2935 +#, kde-format +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:1732 -msgid "Received user confirmation" -msgstr "Uporabnik potrjen" +#: network/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Čakanje na seznam stikov" +#: network/msnnotificationconnection.cpp:2956 +#, kde-format +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:1811 -msgid "Transfer to notification server" -msgstr "Vaše podatke posredujem strežniku...." +#: network/msnnotificationconnection.cpp:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "Overjanje ni uspelo; preverite svoj račun in geslo" +#: network/msnnotificationconnection.cpp:2969 +#, kde-format +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Povezovanje..." +#: network/msnnotificationconnection.cpp:2980 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" -#: network/msnnotificationconnection.cpp:2216 +#: network/msnnotificationconnection.cpp:2982 +#, kde-format +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3005 #, fuzzy -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess je dobil sporočilo o neznani napaki od strežnika %1" +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:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" msgstr "V KMess je prišlo do notranje napake: %1" -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "Navedeno ime računa ni veljavno" - -#: network/msnnotificationconnection.cpp:2255 +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "Ime računa ni veljavno ali pa še ni uveljavljeno." - -#: network/msnnotificationconnection.cpp:2258 -msgid "Your contact list is full" -msgstr "Vaš seznam stikov je poln" - -#: network/msnnotificationconnection.cpp:2264 -msgid "This contact is already on your list" -msgstr "Ta oseba je že na vašem seznamu." - -#: network/msnnotificationconnection.cpp:2267 -msgid "This contact is not on your list" -msgstr "Te osebe ni na vašem seznamu" - -#: network/msnnotificationconnection.cpp:2270 -msgid "This contact is not online" -msgstr "Oseba ni prijavljena" - -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Vaš seznam vsebuje preveč skupin" - -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "Te skupine ni mogoče spreminjati" - -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "Taskupina ni prazna" - -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "Ime skupine ste že uporabili." - -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "Ime skupine je predolgo" - -#: network/msnnotificationconnection.cpp:2300 -msgid "Switchboard server failed" -msgstr "Preklopni strežnik ne deluje" - -#: network/msnnotificationconnection.cpp:2303 -msgid "Transfer to switchboard server failed" -msgstr "Prenos k preklopnemu strežniku je spodletel " - -#: network/msnnotificationconnection.cpp:2306 -msgid "Direct connection (MSNSLP) error, connection failed" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" msgstr "" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "" - -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "" - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Prehitro odpirate sejo" - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Odprtih imate preveč sej" - -#: network/msnnotificationconnection.cpp:2341 -msgid "Bad friend name" -msgstr "Neustrezno ime za prijatelja" - -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "" - -#: network/msnnotificationconnection.cpp:2359 -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:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr " " - -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr " " - -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Prišlo je do notranje napake strežnika." - -#: network/msnnotificationconnection.cpp:2411 +#: network/msnsockettcp.cpp:364 #, fuzzy -msgid "The server is too busy" -msgstr "Strežnik je zaseden" - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Strežnik ni dosegljiv" - -#: network/msnnotificationconnection.cpp:2419 -msgid "Peer notification server down" -msgstr "Strežnik za obveščanje je izključen" - -#: network/msnnotificationconnection.cpp:2423 -msgid "The server is going down" -msgstr "Strežnik se izključuje" - -#: network/msnnotificationconnection.cpp:2426 -msgid "The server is going down soon" -msgstr "strežnik se bo kmalu izključil" - -#: network/msnnotificationconnection.cpp:2430 -msgid "Write is blocking" -msgstr "Pisanje je blokirano" - -#: network/msnnotificationconnection.cpp:2433 -msgid "Session is overloaded" -msgstr "Saja je prezasedena" - -#: network/msnnotificationconnection.cpp:2438 -#, fuzzy -msgid "The server is not available" -msgstr "Strežnik ni dosegljiv" - -#: network/msnnotificationconnection.cpp:2441 -msgid "Authentication failed" -msgstr "Overitev ni uspela" - -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Novih vodij ni mogoče sprejeti" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess je dobil sporočilo o neznani napaki od strežnika %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2596 -msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "" - -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Oseba ni prijavljena ali pa ni vidna." - -#: network/msnswitchboardconnection.cpp:1052 -#, fuzzy -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "Oseba je uporabila funkcijo MSN6, ki je KMess ne podpira." - -#: network/msnswitchboardconnection.cpp:1648 -#, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "Sporočilo \"%1\"ni bilo sprejeto." - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 -#, fuzzy -msgid "Connection timeout" +msgid "Connection time limit exceeded" msgstr "Čas za povezavo se je iztekel." -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping izgubljen" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "Izgubljeni pingi: %1" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 +#: network/msnsockettcp.cpp:400 #, fuzzy -msgid "%1 has sent you a nudge!" +msgid "The connection to the server was lost" +msgstr "Povezava s strežnikom ni uspela " + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +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 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Strežnik ni dosegljiv" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Strežnik ni dosegljiv" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" msgstr "%1 je prijavljen/a" -#: notification/notificationchat.cpp:196 -#, fuzzy -msgid "%1 has sent you a wink!" +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" msgstr "%1 je prijavljen/a" -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 je prijavljen/a" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" msgstr "" -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" msgstr "%1 je prijavljen/a" -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" +#: notification/chatnotification.cpp:199 +#, fuzzy, kde-format +msgid "%1 has sent you a handwritten message!" msgstr "%1 je prijavljen/a" -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" +#: notification/chatnotification.cpp:203 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 je prijavljen/a" + +#: notification/chatnotification.cpp:207 +#, fuzzy, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 je prijavljen/a" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +#, fuzzy, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 je prijavljen/a" + +#: notification/chatnotification.cpp:215 +#, fuzzy, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 je prijavljen/a" + +#: notification/chatnotification.cpp:222 +#, fuzzy, kde-format +msgid "%1 has canceled the webcam session!" msgstr "Prekinili ste povezavo." -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" +#: notification/chatnotification.cpp:223 +#, fuzzy, kde-format +msgid "%1 has canceled the file transfer!" msgstr "Oseba je prekinila povezavo." -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" msgstr "" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "" +#: notification/chatnotification.cpp:231 +#, fuzzy, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "Prekinili ste povezavo." -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" +#: notification/chatnotification.cpp:232 +#, fuzzy, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "Oseba je prekinila povezavo." -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "" +#: notification/chatnotification.cpp:233 +#, fuzzy, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 je prijavljen/a" -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" +#: notification/chatnotification.cpp:240 +#, fuzzy, kde-format +msgid "%1 has ended the webcam session!" +msgstr "Prekinili ste povezavo." -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" msgstr "Prenos %1 je bil preklican. " -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" msgstr "" -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, fuzzy, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Prenos %1 je bil preklican. " + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" msgstr "%1 je prijavljen/a" -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" msgstr "%1 je prijavljen/a" -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" msgstr "%1 je prijavljen/a" -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" msgstr "%1 je prijavljen/a" -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" msgstr "%1 je prijavljen/a" -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" msgstr "%1 je prijavljen/a" -#: notification/notificationcontactstatus.cpp:74 -#, fuzzy -msgid "%1 is now online" +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" msgstr "%1 je prijavljen/a" -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr "%1 je prijavljen/a" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "%1 je prijavljen/a" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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 "" -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "&Pošlji" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "No&va vrstica" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Te osebe ni na vašem seznamu" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Dodaj prijatelja" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: notification/systemtraywidget.cpp:78 msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "" -"%1\n" -"vas je dodal/a med prijatelje. Želite:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "&Dodati to osebo na seznam\"Prijatelji\"" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "Te osebe ne dodaj, vendar naj vidi moje stanje" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "To osebo blokiraj v celoti" - -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "&Počisti" - -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, fuzzy, no-c-format -msgid "Enter your login information:" -msgstr "Oziroma vnesite podatke za prijavo:" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "E-poštni naslov:" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "Geslo:" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "Zapomni si ta profil" - -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Poveži" - -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" msgstr "" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, fuzzy, no-c-format -msgid "Listening to %1" -msgstr "Pošiljanje datoteke %1" +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, fuzzy, no-c-format -msgid "KMess Notification" -msgstr "Obvestilo o e-pošti" +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 MB" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: settings/accountpage.cpp:80 +#, fuzzy +msgid "Browse..." +msgstr "&Brskaj..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "" + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Vaša slika" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "Prenos slike zaslona ni uspel" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Pri poskusu zamenjave slike je prišlo do napake.\n" +"Prepričajte se, če ste izbrali pravo sliko." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Nastavitve" + +#: settings/accountsettingsdialog.cpp:78 +#, fuzzy +msgid "Account" +msgstr "Računi" + +#: settings/accountsettingsdialog.cpp:79 +#, fuzzy +msgid "My Account" +msgstr "Računi" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Dodaj osebo" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Klepet" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Dnevniki klepetov" + +#: 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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "Res želite izbrisati ta račun? " + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"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:371 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Stacy" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "" + +#: settings/chatstylepage.cpp:375 +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 "Prikaži sme&ške" + +#: settings/emoticonspage.cpp:233 +#, fuzzy, kde-format +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:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Računi" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "Obvestilo o e-pošti" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +msgid "Select Files Directory" +msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" + +#: 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "Prikaži sme&ške" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +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:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Dodaj osebo" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +#, fuzzy +msgid "S&end" +msgstr "&Pošlji" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Klepet" + +#. 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: file: chat/contactswidget.ui:107 +#. 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 +#, 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: 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:273 +#, fuzzy +msgid "Email address:" +msgstr "E-poštni naslov:" + +#. 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 "Vnesite ime nove skupine:" + +#. 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 +#, fuzzy +msgid "" +"Enter a message to be automatically sent to people who try to message you." +msgstr "" +"Vnesite sporočilo, ki bo samodejno odoposlano\n" +"osebam, ki se skušajo povezati z vami:" + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +msgid "&Specify an automatic away message:" +msgstr "Določite sporočilo ob odsotnosti" + +#. 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Dnevniki klepetov" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Prični ali prekini &pogovor" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +msgstr "Avto" + +#. 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 the following groups of your contact list:" +msgstr "&Dodati to osebo na seznam\"Prijatelji\"" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "Te osebe ne dodaj, vendar naj vidi moje stanje" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" +msgstr "To osebo blokiraj v celoti" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "Odstranjeno" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "Skupini" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Za to osebo uporabite nadomestno ime" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Sporoči, ko se osebe odjavijo" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "Zvok:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Vaša slika" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Vaša slika" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +#, fuzzy +msgid "&Clear Cache" +msgstr "Mačji ksiht" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "Odstranjeno" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "Dovoli stik" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "Te osebe ni na vašem seznamu" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "Vpišite e-poštni naslov osebe, ki jo želite dodati:" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "Dodaj osebo" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, 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:198 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "Dodaj osebo" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "Zmeda" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Vrsta:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +#, fuzzy +msgid "Standard" +msgstr "Zvezda" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +#, fuzzy +msgid "Send" +msgstr "&Pošlji" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "&Počisti" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "Zmeda" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +#, fuzzy +msgid "Password:" +msgstr "Geslo:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "Zapomni si ta profil" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +#, fuzzy +msgid "R&emember password" +msgstr "Geslo:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "Nov &Račun" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Povezava" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Dejanja" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Računi" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +#, fuzzy +msgid "Your Account Information" +msgstr "Nastavitve računa" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +#, fuzzy +msgid "&Friendly name:" msgstr "Vaše prijazno ime:" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Vaš e-poštni naslov:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 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: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Vaše geslo:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +#, fuzzy +msgid "&Email address:" +msgstr "E-poštni naslov:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, fuzzy, no-c-format -msgid "Display picture:" -msgstr "Vaša slika" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +#, fuzzy +msgid "&Password:" +msgstr "Geslo:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "Geslo:" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +#, fuzzy msgid "C&hange..." +msgstr "P&ovabi" + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, fuzzy, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Želim prikaz slike" - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Ob zagonu me samodejno prijavi s tem računom" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +#, fuzzy +msgid "Re&member the settings of this account" +msgstr "Zapomni si ta profil" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Ob zagonu me samodejno prijavi s tem računom" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +#, fuzzy +msgid "Login &as" +msgstr "Beleži vse pogovore" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You cannot change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "Zapomni si ta profil" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Opozorila" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "Obvestilo o e-pošti" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Ob nedejavnosti spremeni stanje v \"Odsoten\" " + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Kot \"Odsoten\" me prikaži po" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "minutah" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" msgstr "Sporoči, ko se osebe odjavijo" -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "Prijavljen" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +#, fuzzy +msgid "Saved accounts:" +msgstr "Računi" -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "Računi" + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +#, fuzzy +msgid "&Remove" +msgstr "Odstranjeno" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " msgstr "" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "Določite sporočilo ob odsotnosti" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "Dnevniki klepetov" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Pošlji &datoteko" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Pošlji &datoteko" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "Neprijavljen" +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Prikaži sporočilo, ko prispe pošta v \"druge mape\"" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Oblačke skrij po " - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "sekundah" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 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. " +"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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "Letih" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Vse pogovore shrani v matični imenik" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Vse pogovore shrani v matični imenik" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following 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:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +#, fuzzy +msgid "Chat Settings" +msgstr "Nastavitve" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +#, fuzzy +msgid "&Show emoticons" +msgstr "Prikaži sme&ške" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "Prikaži sme&ške" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +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:648 +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:654 +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:657 +#, 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:663 +#, fuzzy +msgid "Show &date" +msgstr "Dodaj osebo" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "Prikaži sme&ške" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +#, fuzzy +msgid "Your &message font:" +msgstr "Vaša pisava:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "Sporočila drugih oseb naj uporabijo pisavo:" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Mačji ksiht" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "Uporabi učinke pisave *poudarjeno*, /poševno/ in _podčrtano_" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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/alertswidget.ui line 300 -#: rc.cpp:313 -#, fuzzy, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Ob nedejavnosti spremeni stanje v \"Odsoten\" " +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Želim prikaz slike" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Vaš seznam vsebuje preveč skupin" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +#, fuzzy +msgid "Always" +msgstr "Odsoten" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Vaš seznam vsebuje preveč skupin" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +#, fuzzy +msgid "Never" +msgstr "Piflar" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Prikaži sliko" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Kot \"Odsoten\" me prikaži po" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "minutah" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +#, fuzzy +msgid "Show contacts w&hich song I am listening to" +msgstr "Te osebe ni na vašem seznamu" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Dnevniki klepetov" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, fuzzy, no-c-format -msgid "Log &all chats" -msgstr "Beleži vse pogovore" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Mape razgovorov razvrsti po:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "Letih" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Mesecih" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Dnevih" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Vse pogovore shrani v matični imenik" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Vaša pisava:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Sporočila drugih oseb naj uporabijo pisavo:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, fuzzy, no-c-format -msgid "&Show graphics in chat messages" -msgstr "V sporočilih prikaži grafiko" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, fuzzy, no-c-format -msgid "S&how time in chat messages" -msgstr "V sporočilih prikaži grafiko" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, fuzzy, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "Uporabi učinke pisave *poudarjeno*, /poševno/ in _podčrtano_" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "Poštni odjemalec" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Uporabi Hotmail" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Uporabi ukaz:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "Obvestilo o e-pošti" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Prikaži e-poštno sporočilo " - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "" - -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Prikaži sporočilo, ko prispe pošta v \"druge mape\"" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +#, fuzzy msgid "&Emoticon Themes" msgstr "Prikaži sme&ške" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Prikaži sme&ške" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +#, fuzzy msgid "&Custom Emoticons" msgstr "Smeški iz risank" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Prikaži sme&ške" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Računi" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "Ura" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +#, fuzzy msgid "Re&name" msgstr "ime" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +#, fuzzy msgid "Remo&ve" msgstr "Odstranjeno" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "" - -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "pravi:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "" - -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Vaša slika" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Prenos slike zaslona ni uspel" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" -msgstr "" -"Pri poskusu zamenjave slike je prišlo do napake.\n" -"Prepričajte se, če ste izbrali pravo sliko." - -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Nastavitve" - -#: settings/settingsdialog.cpp:93 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 #, fuzzy -msgid "Account" -msgstr "Računi" +msgid "Web Browser" +msgstr "Ovela vrtnica" -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Klepet" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Res želite izbrisati ta račun? " - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Stacy" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." -msgstr "" - -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "" - -#: systemtraywidget.cpp:278 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 #, fuzzy -msgid "%1 %2" -msgstr "%1 MB" +msgid "&Use the KDE default browser" +msgstr "&Uporabi privzeto sliko" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" +#. 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:814 rc.cpp:849 +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:817 +#, fuzzy +msgid "&Use an installed browser:" +msgstr "&Uporabi privzeto sliko" + +#. 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:820 rc.cpp:855 +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:823 rc.cpp:858 +#, fuzzy +msgid "&Specify a custom command:" +msgstr "Določite sporočilo ob odsotnosti" + +#. 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:827 rc.cpp:862 +#, 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:831 +#, 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:834 +#, fuzzy +msgid "Email Client" +msgstr "Poštni odjemalec" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +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:843 +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:846 +#, fuzzy +msgid "Use the &KDE default email client" +msgstr "&Uporabi privzeto sliko" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "&Uporabi privzeto sliko" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +msgid "&Save all received files in one directory:" +msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "in" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "Prenosi datotek" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "Vaše ime" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "Vaše ime" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "V sporočilih prikaži grafiko" + +#, fuzzy +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Prikaži oblaček, ko se ta oseba prijavi ali odjavi" + +#, fuzzy +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Zapomni si ta profil" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Prikaži sme&ške" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Vaša slika" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "Poišči osebo" + +#~ msgid "Search by &Interest" +#~ msgstr "Išči po interesih" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Vaš e-poštni naslov:" + +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "Oseba je uporabila funkcijo MSN6, ki je KMess ne podpira." + +#~ 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." + +#, 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 "&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:" + +#~ 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:" + +#, fuzzy +#~ msgid "Speed:" +#~ msgstr "Strežnik:" + +#~ msgid "Use a specified command:" +#~ msgstr "Uporabi ukaz:" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "E-pošta" + +#~ msgid "Remove group" +#~ msgstr "Odstrani skupino" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Vaša slika" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "V predalu imate 1 novo e-poštno sporočilo." + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "V predalu imate %1 novih e-poštnih sporočil" + +#, fuzzy +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Prikaži/Skrij prijatelje&vo stransko okno" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "Nov &stik" + +#, fuzzy +#~ msgid "Enter your login information:" +#~ msgstr "Oziroma vnesite podatke za prijavo:" + +#~ msgid "Your friendly name:" +#~ msgstr "Vaše prijazno ime:" + +#~ msgid "Your password:" +#~ msgstr "Vaše geslo:" + +#, fuzzy +#~ msgid "Display picture:" +#~ msgstr "Vaša slika" + +#, fuzzy +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Prikaži sporočilo, ko prispe pošta v \"druge mape\"" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Mape razgovorov razvrsti po:" + +#, fuzzy +#~ msgid "&Show graphics in chat messages" +#~ msgstr "V sporočilih prikaži grafiko" + +#~ msgid "Use Hotmail" +#~ msgstr "Uporabi Hotmail" + +#~ msgid "says:" +#~ msgstr "pravi:" + +#~ msgid "Current name: " +#~ msgstr "Trenutno ime:" + +#, fuzzy +#~ msgid "The remote server has closed the connection." +#~ msgstr "Povabilo je bilo prekinjeno." + +#, fuzzy +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Prikažem stanje storitve NET?" + +#~ msgid "Received user confirmation" +#~ msgstr "Uporabnik potrjen" + +#~ msgid "Transfer to notification server" +#~ msgstr "Vaše podatke posredujem strežniku...." + +#, fuzzy +#~ msgid "The server is too busy" +#~ msgstr "Strežnik je zaseden" + +#~ msgid "The server is unavailable" +#~ msgstr "Strežnik ni dosegljiv" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "KMess je dobil sporočilo o neznani napaki od strežnika %1" + +#~ msgid "Add contact" +#~ msgstr "Dodaj prijatelja" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "Obvestilo o e-pošti" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Matjaž Kaše" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "matjazkase@hotmail.com" + +#~ msgid "Away - Idle" +#~ msgstr "Odsoten" + +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "Vpisali ste neveljaven e-poštni naslov!" + +#~ msgid "(Away)" +#~ msgstr "(Odsoten)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Pridem takoj)" + +#~ msgid "(Busy)" +#~ msgstr "(Zaposlen)" + +#~ msgid "(Invisible)" +#~ msgstr "(Neviden)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Odsoten/a)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Na kosilu)" + +#~ msgid "(On the Phone)" +#~ msgstr "Telefoniram" + #, fuzzy #~ msgid "File transfer dialog message" #~ msgstr "Prenosi datotek" @@ -3020,12 +6726,6 @@ msgstr "" #~ msgid "Notification message" #~ msgstr "Sporočilo programa" -#~ msgid "You can't login to hotmail with this account." -#~ msgstr "S tem računom se ne morete prijaviti" - -#~ msgid "The connection to the server failed." -#~ msgstr "Povezava s strežnikom ni uspela " - #~ msgid "You may not be connected to the internet." #~ msgstr "Mogoče je, da niste povezani z internetom" @@ -3058,21 +6758,12 @@ msgstr "" #~ msgid "Preview:" #~ msgstr "Predogled:" -#~ msgid "&Browse..." -#~ msgstr "&Brskaj..." - -#~ msgid "&Use the default picture" -#~ msgstr "&Uporabi privzeto sliko" - #~ msgid "I want to use a proxy" #~ msgstr "Želim uporabljati proxy" #~ msgid "Port:" #~ msgstr "Vrata:" -#~ msgid "Type:" -#~ msgstr "Vrsta:" - #~ msgid "User ID:" #~ msgstr "Uporabnik." @@ -3085,9 +6776,6 @@ msgstr "" #~ msgid "SOCKS5 Proxy" #~ msgstr "SOCKS5 Proxy" -#~ msgid "Server:" -#~ msgstr "Strežnik:" - #~ msgid "Proxy" #~ msgstr "Proxy" @@ -3106,9 +6794,6 @@ msgstr "" #~ 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" @@ -3124,9 +6809,6 @@ msgstr "" #~ msgid "The following people are offline" #~ msgstr "Osebe, ki niso prijavljene:" -#~ msgid "%1 is offline" -#~ msgstr "%1 ni prijavljen" - #~ msgid "The following people are online" #~ msgstr "Prijavljene osebe:" @@ -3142,18 +6824,6 @@ msgstr "" #~ "\"%1\"\n" #~ "od %2" -#~ msgid "" -#~ "\"%1\"\n" -#~ "from %2\n" -#~ "in another folder" -#~ msgstr "" -#~ "V drugi mapi je\n" -#~ "\"%1\"\n" -#~ "od %2" - -#~ msgid "and" -#~ msgstr "in" - #~ msgid "says: " #~ msgstr "pravi: " @@ -3173,12 +6843,6 @@ msgstr "" #~ 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" @@ -3198,21 +6862,12 @@ msgstr "" #~ msgid "Chat - %1" #~ msgstr "Klepet -%1" -#~ msgid "Chat - %1 and %2" -#~ msgstr "Klepet - %1 in %2" - -#~ msgid "Chat - %1 et al." -#~ msgstr "Klepet %1" - #~ msgid "You're changing your name too rapidly" #~ msgstr "Prepogosto spreminjate svoje ime" #~ 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" @@ -3229,12 +6884,6 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Pridobi nove smeške ali zvoke" -#~ msgid "Chat message layout:" -#~ msgstr "Oblika sporočila v pogovoru:" - -#~ msgid "n&ame" -#~ msgstr "&ime" - #~ msgid "Update preview" #~ msgstr "Osveži predogled" diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..3676469 --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,6540 @@ +# 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-04-21 00:17+0200\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" + +#: account.cpp:45 +#, fuzzy +msgid "I am 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:209 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "vasa_adresa@hotmail.com" + +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Trenutno nisam za računarom" + +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Sigurna čuvalica za Vašu lozinku" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Uvezi" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Obriši" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Zadrži" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +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:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "Konverzacija nije bila aktivna, %1 je napustio čet." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +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:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 i %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Ova poruka je poslata automatski)" + +#: chat/chat.cpp:829 +#, fuzzy, kde-format +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:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Upravo ste primili namig od %1" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Upravo ste primili namig od %1" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Nastala je greška prilikom povezivanja." + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "" +"%1 Vam je poslao zvučnu poruku, ali KMess je ne može pustiti." + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger 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:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga je onemogućeno u " +"podešavanjima naloga." + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga je onemogućeno u " +"podešavanjima naloga." + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 Vam je poslao namig!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 Vam je poslao namig!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga nije moguće. Da li " +"ste sigurni da imate 'cabextract' instaliran." + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga nije moguće. Da li " +"ste sigurni da imate 'cabextract' instaliran." + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has 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:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"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:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 Vam je poslao nudge!" + +#: chat/chat.cpp:1463 +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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +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:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Nudge je poslat %1!" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Poslali ste nudge!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" +msgstr "%1 šalje namig: %2" + +#: chat/chatmessagestyle.cpp:382 +#, kde-format +msgid "%1 says:" +msgstr "%1 kaže:" + +#: chat/chatmessageview.cpp:322 +#, fuzzy, kde-format +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:366 +#, fuzzy, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format +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:300 +#, kde-format +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:439 +#, 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:458 +#, fuzzy, kde-format +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:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "Prebrisivanje fajla" + +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "Prebrisati" + +#: chat/chatview.cpp:825 +msgid "Add this &Emoticon..." +msgstr "Dodaj ovaj smešak" + +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Dodaj ovaj smešak" + +#: chat/chatview.cpp:834 +msgid "Send &Email" +msgstr "Pošalji email" + +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "Dodaj kontakt" + +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Kopiraj Email adresu" + +#: chat/chatview.cpp:848 +msgid "Visit &Link" +msgstr "Poseti link" + +#: chat/chatview.cpp:852 +msgid "Copy &Address" +msgstr "Kopiraj adresu" + +#: chat/chatview.cpp:868 +msgid "&Copy Text" +msgstr "Kopiraj tekst" + +#: chat/chatview.cpp:869 +msgid "Select &All" +msgstr "Označi sve" + +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "Pronađi tekst..." + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +msgid "C&lear Chat" +msgstr "Oč&isti čet prozor" + +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." +msgstr "Sačuvaj čet log kao..." + +#: chat/chatwindow.cpp:115 +msgid "Contacts" +msgstr "Kontakti" + +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Smešci" + +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "Moji smešci" + +#: chat/chatwindow.cpp:337 +#, 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:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Zatvori čet jezičak" + +#: chat/chatwindow.cpp:341 +#, fuzzy +msgid "Close All Tabs" +msgstr "Zatvori &sve jezičke" + +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "Zatvori aktivan jezičak" + +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "&Pozvati..." + +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." +msgstr "Pošalji &fajl..." + +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "Čet sa kamericom" + +#: chat/chatwindow.cpp:454 +msgid "Start a &Meeting" +msgstr "Pokreni &Meeting" + +#: chat/chatwindow.cpp:455 +msgid "Send a &Nudge!" +msgstr "Pošalji &nudge!" + +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." +msgstr "Sačuvaj čet..." + +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "Zatvori &sve jezičke" + +#: chat/chatwindow.cpp:462 +msgid "Change &Font" +msgstr "Promeni &font" + +#: chat/chatwindow.cpp:463 +msgid "Change Font &Color" +msgstr "Promeni &boju fonta" + +#: chat/chatwindow.cpp:470 +msgid "Show &Emoticons" +msgstr "Prika&zuj smeške" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "P&rikaži vreme poruke" + +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "&Paneli" + +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "Provera pravopi&sa" + +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "Meeting" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Nudge" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Pošalji &fajl" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Omogući ili onemogući Kontakt bar" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakti" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Omogući ili onemogući bar sa standardnim smešcima" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Smešci" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Omogući ili onemogući bar sa prilagođenim smešcima" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Moji smešci" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "&Font" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "&Boja Fonta" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "Očisti čet prozor" + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Pokreni ili zaustavi &konverzaciju" + +#: chat/chatwindow.cpp:1026 +#, fuzzy +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +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:1029 +#, fuzzy +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "Nepostojeća /status komanda" + +#: chat/chatwindow.cpp:1092 +#, fuzzy +msgid "You cannot use the /block command in a group chat." +msgstr "Ne možete blokirati ikoga u grupnom četu." + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +#, fuzzy +msgid "You cannot use the /unblock command in a group chat." +msgstr "Ne možete blokirati ikoga u grupnom četu." + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +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:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Nepoznata komanda" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Čet" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Čet" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Skrivanje menija" + +#: chat/chatwindow.cpp:1887 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 kuca poruku..." + +#: chat/chatwindow.cpp:1897 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 i %2 kucaju poruku..." + +#: chat/chatwindow.cpp:1901 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 i %3 kucaju poruku..." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, fuzzy, kde-format +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:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "&Započni privatni čet" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "Pošalji email" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 +msgid "&View Profile" +msgstr "&Pogledaj profil" + +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Podešavanja" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 +msgid "&Add Contact" +msgstr "&Dodaj kontakt" + +#: chat/contactframe.cpp:304 kmessview.cpp:606 +msgid "A&llow Contact" +msgstr "&Odobri kontakt" + +#: chat/contactframe.cpp:305 kmessview.cpp:609 +msgid "&Delete Contact" +msgstr "O&briši kontakt" + +#: chat/contactframe.cpp:307 kmessview.cpp:607 +msgid "&Block Contact" +msgstr "B&lokiraj kontakt" + +#: chat/contactframe.cpp:308 kmessview.cpp:608 +msgid "&Unblock Contact" +msgstr "Odblokira&j kontakt" + +#: chat/contactframe.cpp:310 kmessview.cpp:612 +msgid "&Friendly Name" +msgstr "Ime za prika&z" + +#: chat/contactframe.cpp:311 kmessview.cpp:613 +msgid "&Personal Message" +msgstr "Statusna poruka" + +#: chat/contactframe.cpp:312 kmessview.cpp:614 +msgid "&Email Address" +msgstr "&Email adresa" + +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Informacije" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Prikaži sliku" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "&Zabeleške" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "Smešci" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" +msgstr "&Kopiraj" + +#: chat/contactframe.cpp:753 +msgid "Blocked" +msgstr "Blokirani" + +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Kontakt je %1" + +#: chat/emoticonswidget.cpp:289 +#, fuzzy +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not 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:451 +msgid "Add to Chat" +msgstr "Pridruži četu" + +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Dodaj nov..." + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Izmeni" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Obriši" + +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not 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:290 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 compatible" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 compatible" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 compatible" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Na vezi" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Zauzet" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Udaljen od računara" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Odsutan sa automatskom porukom" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Zaludan" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Vraćam se brzo" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Telefoniram" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Ručam" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Nevidljiv" + +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Odjavljen" + +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Moj status" + +#: contact/msnstatus.cpp:218 +#, 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:276 +msgid "Add New Emoticon" +msgstr "Dodati nov smešak" + +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Izmeniti smešak" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +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:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "&Čet stil:" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Ne mogu da otvorim port." + +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Povezivanje..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Niste na vezi" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Neko Vas je dodao u listu prijatelja" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"Vas je dodao u njegovu/njenu listu prijatelja." + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +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:282 +#, kde-format +msgid "Contact Properties for %1" +msgstr "Osobine kontakta za %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Na vezi" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "Nije viđen do sada" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "Bez dopisivanja" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Poslednji put viđen u: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Poslednje dopisivanje u: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Email adresa: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Klijent: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakti" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "" +"Poziv je odbijen. Klijent na drugoj strani nije u mogućnosti da prihvati." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Pozovi kontakte" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 +msgid "Network Window" +msgstr "Mrežni prozor" + +#: 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:1086 +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:1130 +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:1177 +msgid "Cannot close the main connection tab." +msgstr "Ne možete zatvoriti ovaj jezičak." + +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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 +#, kde-format +msgid "%1 MB" +msgstr "" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format +msgid "%1 kB" +msgstr "" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format +msgid "%1 bytes" +msgstr "%1 bajta" + +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 id %2 primljeno." + +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 od %2 poslato." + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "beskonačno" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 +msgid "File Transfers" +msgstr "Transfer fajlova" + +#: 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:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Sigurno želite da obrišete ovaj nalog?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Prikaži sliku" + +#: emoticontheme.cpp:627 +#, kde-format +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:833 +msgid "Smile" +msgstr "" + +#: emoticontheme.cpp:834 +msgid "Wink" +msgstr "" + +#: emoticontheme.cpp:835 +msgid "Tongue out" +msgstr "" + +#: emoticontheme.cpp:836 +msgid "Big smile" +msgstr "" + +#: emoticontheme.cpp:837 +msgid "Sad" +msgstr "" + +#: emoticontheme.cpp:838 +msgid "Crying" +msgstr "" + +#: emoticontheme.cpp:839 +msgid "Angry" +msgstr "" + +#: emoticontheme.cpp:840 +msgid "Confused" +msgstr "" + +#: emoticontheme.cpp:841 +msgid "Embarrassed" +msgstr "" + +#: emoticontheme.cpp:842 +msgid "Disappointed" +msgstr "" + +#: emoticontheme.cpp:843 +msgid "Hot" +msgstr "" + +#: emoticontheme.cpp:844 +msgid "Baring teeth" +msgstr "" + +#: emoticontheme.cpp:845 +msgid "Nerd" +msgstr "" + +#: emoticontheme.cpp:846 +msgid "Sick" +msgstr "" + +#: emoticontheme.cpp:847 +msgid "Surprised" +msgstr "" + +#: emoticontheme.cpp:848 +msgid "Party" +msgstr "" + +#: emoticontheme.cpp:849 +msgid "Sleepy" +msgstr "" + +#: emoticontheme.cpp:850 +msgid "Thinking" +msgstr "" + +#: emoticontheme.cpp:851 +msgid "Don't tell anyone" +msgstr "" + +#: emoticontheme.cpp:852 +msgid "Secret telling" +msgstr "" + +#: emoticontheme.cpp:853 +msgid "Eye-rolling" +msgstr "" + +#: emoticontheme.cpp:854 +msgid "Sarcastic" +msgstr "" + +#: emoticontheme.cpp:855 +msgid "I don't know" +msgstr "" + +#: emoticontheme.cpp:856 +msgid "Be right back" +msgstr "" + +#: emoticontheme.cpp:857 +msgid "Angel" +msgstr "" + +#: emoticontheme.cpp:858 +msgid "Left hug" +msgstr "" + +#: emoticontheme.cpp:859 +msgid "Boy" +msgstr "" + +#: emoticontheme.cpp:860 +msgid "Red heart" +msgstr "" + +#: emoticontheme.cpp:861 +msgid "Red rose" +msgstr "" + +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "" + +#: emoticontheme.cpp:863 +msgid "Dog face" +msgstr "" + +#: emoticontheme.cpp:864 +msgid "Sun" +msgstr "" + +#: emoticontheme.cpp:865 +msgid "Devil" +msgstr "" + +#: emoticontheme.cpp:866 +msgid "Right hug" +msgstr "" + +#: emoticontheme.cpp:867 +msgid "Girl" +msgstr "" + +#: emoticontheme.cpp:868 +msgid "Broken heart" +msgstr "" + +#: emoticontheme.cpp:869 +msgid "Wilted rose" +msgstr "" + +#: emoticontheme.cpp:870 +msgid "Thumbs down" +msgstr "" + +#: emoticontheme.cpp:871 +msgid "Cat face" +msgstr "" + +#: emoticontheme.cpp:872 +msgid "Sleeping half-moon" +msgstr "" + +#: emoticontheme.cpp:873 +msgid "Red lips" +msgstr "" + +#: emoticontheme.cpp:874 +msgid "Clapping" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Crossed fingers" +msgstr "" + +#: emoticontheme.cpp:876 +msgid "Auto" +msgstr "" + +#: emoticontheme.cpp:877 +msgid "Airplane" +msgstr "" + +#: emoticontheme.cpp:878 +msgid "Turtle" +msgstr "" + +#: emoticontheme.cpp:879 +msgid "Snail" +msgstr "" + +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "" + +#: emoticontheme.cpp:881 +msgid "Goat" +msgstr "" + +#: emoticontheme.cpp:882 +msgid "Vampire bat" +msgstr "" + +#: emoticontheme.cpp:883 +msgid "Pizza" +msgstr "" + +#: emoticontheme.cpp:884 +msgid "Beer mug" +msgstr "" + +#: emoticontheme.cpp:885 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:886 +msgid "Coffee cup" +msgstr "" + +#: emoticontheme.cpp:887 +msgid "Birthday cake" +msgstr "" + +#: emoticontheme.cpp:888 +msgid "Plate" +msgstr "" + +#: emoticontheme.cpp:889 +msgid "Bowl" +msgstr "" + +#: emoticontheme.cpp:890 +msgid "Star" +msgstr "" + +#: emoticontheme.cpp:891 +msgid "Rainbow" +msgstr "" + +#: emoticontheme.cpp:892 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:893 +msgid "Lightning" +msgstr "" + +#: emoticontheme.cpp:894 +msgid "Umbrella" +msgstr "" + +#: emoticontheme.cpp:895 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:896 +msgid "Telephone receiver" +msgstr "" + +#: emoticontheme.cpp:897 +msgid "Mobile Phone" +msgstr "" + +#: emoticontheme.cpp:898 +msgid "Email" +msgstr "" + +#: emoticontheme.cpp:899 +msgid "Clock" +msgstr "" + +#: emoticontheme.cpp:900 +msgid "Camera" +msgstr "" + +#: emoticontheme.cpp:901 +msgid "Filmstrip" +msgstr "" + +#: emoticontheme.cpp:902 +msgid "Note" +msgstr "" + +#: emoticontheme.cpp:903 +msgid "Handcuffs" +msgstr "" + +#: emoticontheme.cpp:904 +msgid "Money" +msgstr "" + +#: emoticontheme.cpp:905 +msgid "Light bulb" +msgstr "" + +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "" + +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:908 +msgid "Gift with a bow" +msgstr "" + +#: emoticontheme.cpp:909 +msgid "X-Box" +msgstr "" + +#: emoticontheme.cpp:910 +msgid "Computer" +msgstr "" + +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" +msgstr "KMess podešavanja" + +#: initialview.cpp:239 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "Ponovno povezivanje neuspelo: nalog ne postoji." + +#: initialview.cpp:252 +#, fuzzy +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:375 +#, fuzzy, kde-format +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:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Internet veza nije dostupna." + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Poveži se" + +#: initialview.cpp:601 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Odkaži" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "Molim Vas, popunite polje za email i lozinku." + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "Pogrešna email adresa" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Kontakt %1 već postoji u vašoj listi prijatelja." + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "Kontakt informacije" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Nova grupa" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Dodaj grupu" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "Navedite ime nove grupe:" + +#: kmess.cpp:576 +#, kde-format +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:578 +#, fuzzy +msgid "Remove Contact" +msgstr "Obriši kontakt" + +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" +msgstr "Obriši i blokiraj" + +#: kmess.cpp:626 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Brisanje grupe" + +#: kmess.cpp:633 +#, fuzzy, kde-format +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:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Obriši" + +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." +msgstr "Ovo je specijalna grupa i ne može biti menjana." + +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "Preime&nuj grupu" + +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Unesite novo ime grupe:" + +#: kmess.cpp:753 +#, fuzzy, kde-format +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:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatsko povezivanje neuspešno" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Povezivanje..." + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Odjavljen" + +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, kde-format +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:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Javila se greška pri obaveštavanju" + +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "&Poveži se" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Odjava" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Prikaži moj &Profil" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "Prikaži &dozvoljene kontakte" + +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "Prikaži kontakte k&oji nisu na vezi" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "Prikaži ob&risane kontakte" + +#: kmessinterface.cpp:170 +#, fuzzy +msgid "Show &History Box" +msgstr "&Čet stil:" + +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "Omogući traku za pretraživanje" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Prikaži prazn&e grupe" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "Veličina prijate&ljeve slike" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "&Sortiraj kontakte po" + +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Prikaži &Transfer prozor" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "Dodaj nov &kontakt" + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "Dodaj novu &grupu" + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "&Izvezi kontakt listu..." + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "&Čet stil:" + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "Nov Nal&og" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Nov Nal&og" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "Podešavanje &Kmess..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "Prikaži selekcioni &Meni" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "Ne prikazuj" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Mala" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Velika" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Najveća" + +#: kmessinterface.cpp:197 +msgid "Group" +msgstr "Grupa" + +#: kmessinterface.cpp:198 +msgid "Online/Offline" +msgstr "Na vezi/Odjavljen" + +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Izmešan" + +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Prikaži &Mrežni prozor" + +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] Na vezi sa %2" + +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 se prijavio" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 se odjavio" + +#: kmessview.cpp:599 +msgid "Cha&t" +msgstr "Če&t" + +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" +msgstr "&Obriši iz grupe" + +#: kmessview.cpp:643 +msgid "&Copy to Group" +msgstr "&Kopiraj u grupu" + +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "&Prebaci u grupu" + +#: kmessview.cpp:695 +msgid "Move Group &Down" +msgstr "Pomeri grupu na &dole" + +#: kmessview.cpp:696 +msgid "Move Group &Up" +msgstr "Pomeri grupu na &gore" + +#: kmessview.cpp:697 +msgid "Re&move Group" +msgstr "O&briši grupu" + +#: kmessview.cpp:698 +msgid "Re&name Group" +msgstr "Preime&nuj grupu" + +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Dod&ajte osobu u listu prijatelja" + +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Email adresa:" + +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Klijent: %1" + +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1168 +msgid "No" +msgstr "" + +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokirani" + +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Poslednji put viđen u: %1" + +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Poslednje dopisivanje u: %1" + +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Grupa %1" + +#: kmessview.cpp:1224 +#, kde-format +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:1231 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 kontakt" +msgstr[1] "%1 kontakata" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Unesite vašu poruku ovde>" + +#: kmessview.cpp:1652 +#, 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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Vi ste odbili poziv." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "&Čet stil:" + +#: kmessview.cpp:2020 +#, kde-format +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 +#, kde-format +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, kde-format +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "" + +#: main.cpp:42 settings/accountpage.cpp:480 settings/accountpage.cpp:541 +msgid "KMess" +msgstr "" + +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "MSN Messanger klijent za KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 +msgid "" +"German translation, testing, documentation, web master, project management, " +"etc..." +msgstr "" + +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 +msgid "Web design" +msgstr "" + +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:74 +msgid "Cartoon emoticons" +msgstr "" + +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 +msgid "Default sound theme" +msgstr "" + +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" + +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 +msgid "More Arabic translation" +msgstr "" + +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 +msgid "Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 +msgid "Catalan translation" +msgstr "" + +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" + +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 +msgid "More Simplified Chinese translation" +msgstr "" + +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 +msgid "Traditional Chinese translation" +msgstr "" + +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 +msgid "Danish translation" +msgstr "" + +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 +msgid "More Danish translation" +msgstr "" + +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 +msgid "Dutch translation" +msgstr "" + +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 +msgid "More Dutch translation" +msgstr "" + +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +msgid "More Greek translation" +msgstr "" + +#: main.cpp:111 +msgid "Estonian translation" +msgstr "" + +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 +msgid "Finnish translation" +msgstr "" + +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 +msgid "More Finnish translation" +msgstr "" + +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 +msgid "French translation" +msgstr "" + +#: main.cpp:117 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 +msgid "More French translation" +msgstr "" + +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 +msgid "Hungarian translation" +msgstr "" + +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +msgid "More Hungarian translation" +msgstr "" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 +msgid "More Italian translation" +msgstr "" + +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 +msgid "Korean translation" +msgstr "" + +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +msgid "Serbian translation" +msgstr "" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "" + +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 +msgid "Spanish translation" +msgstr "" + +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 +msgid "More Spanish translation" +msgstr "" + +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 +msgid "Swedish translation" +msgstr "" + +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +msgid "More Swedish translation" +msgstr "" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 +msgid "Thai translation" +msgstr "" + +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 +msgid "Turkish translation" +msgstr "" + +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "" + +#: main.cpp:154 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:155 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 +msgid "Xinerama fixes" +msgstr "" + +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:159 +msgid "KWallet support" +msgstr "" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "&Čet stil:" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 +msgid "Various internationalization fixes." +msgstr "" + +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:169 +msgid "Guy with a bag over his head" +msgstr "" + +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" + +#: main.cpp:174 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:179 +msgid "Your name here?" +msgstr "" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Vaše ime" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "Email adresa:" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Čuvanje liste prijatelja je zavšeno" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Automatsko prijvljivanje sa ovom email adresom?" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Dozvoljen" + +#: model/contactlist.cpp:1827 +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 +#, kde-format +msgid "Do you want to
accept or cancel?" +msgstr "Zelite da prihvatite ili odbijete?" + +#: network/applications/application.cpp:581 +#, kde-format +msgid "Click to cancel." +msgstr "Da prekinete klikniteovde." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +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 +#, fuzzy, kde-format +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 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "Prenos fajla "%1" nije uspeo. Fajl ne može biti sačuvan." + +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not 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:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Povezujem se na %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Kontakt je otkazao prenos fajla "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Vi ste otkazali prenos fajla "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the 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 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Fajl uspešno poslat "%1". " + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Fajl uspešno primljen "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the 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 +#, fuzzy, kde-format +msgid "" +"The transfer of the 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 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Slanje fajla "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "Kontakt je prihvatio da preuzme fajl "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +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 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the 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 +#, kde-format +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 +#, fuzzy +msgid "The invitation was rejected. It is 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 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "Poziv je otkazan. Došlo je do greške." + +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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 +#, fuzzy +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 +#, fuzzy +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 +#, fuzzy +msgid "You are invited to share this contact's desktop." +msgstr "Pozvaniste da podelelite kontaktov desktop." + +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format +msgid "Starting KRDC. Connecting to %1." +msgstr "KRDC se startuje. Povezivanje sa %1." + +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Kontakt vas poziva na %1', ali ovo opcija još uvek nije uvedena." + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess does not " +"support it." +msgstr "" +"Poziv je obustavljen. Kontakt je poslao neispravan podatak ili nepoznat za " +"KMess." + +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "Prenos neuspešan. Pripremanje podataka neuspešno." + +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "Poziv je otkazan. Poruka nije poslata k Vama." + +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "" +"Transfer nije uspeo. Kontakt je poslao loš podatak ili ga KMess ne podržava." + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Kontakt je odbio poziv. Došlo je do greške." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "Čeka se konekcija na %1, port %2" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "Prelazak na indirektan transfer (ovo može biti sporije)." + +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "Čeka se konekcija" + +#: network/applications/p2papplication.cpp:3423 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "Poziv je otkazan. Vreme predviđeno da kontakt prihvati poziv isteklo." + +#: network/applications/p2papplication.cpp:3432 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "Poziv je otkazan. Vreme predviđeno za uspostavljanje veze je isteklo." + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "Poziv je otkazan. Isteklo je vreme za početak prenosa podataka." + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakt je odbio poziv. Došlo je do greške." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Transfer nije uspeo." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Transfer nije uspeo. Korisnik nije prihvatio poziv." + +#: network/applications/p2papplicationbase.cpp:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Transfer nije uspeo. Došlo je do greške." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "Poziv je otkazan.Vaš audio uređaj ne odgovara." + +#: network/applications/voiceconversation.cpp:218 +#, kde-format +msgid "Start voice conversation. Connecting to %1." +msgstr "Početak glasovne konverzacije. Uspostavljam vezu sa %1." + +#: network/applications/voiceconversation.cpp:224 +#, kde-format +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 +#, kde-format +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 +#, fuzzy +msgid "You are invited to view this contact's webcam." +msgstr "Pozvani ste da učestvujete u video razgovoru." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "kamerica" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Vi ste otkazali prenos fajla "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakt je otkazao prenos fajla "%1"." + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "Neuspešno" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Šaljem %1 fajl" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "Transfer %1 fajla nije uspeo. Ne mogu da otvorim port." + +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not 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 +#, fuzzy, kde-format +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 +#, kde-format +msgid "Receiving file %1" +msgstr "Primam %1 fajl" + +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "Pogrešna komanda" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "Pogrešan parametar komande" + +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "Email koji pokušavate da dodate nije MSN Messenger nalog" + +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Ime domena nedostaje" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Već ste ulogovani" + +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" +msgstr "Adresa naloga je nepostojeća" + +#: network/msnconnection.cpp:400 +#, fuzzy +msgid "" +"This 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:403 +msgid "Your contact list is full" +msgstr "Vaša kontakt lista je puna" + +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "Pogrešan SBP parametar" + +#: network/msnconnection.cpp:411 +msgid "This contact is already on your list" +msgstr "Ovaj kontakt već postoji u Vašoj listi" + +#: network/msnconnection.cpp:415 +msgid "This contact is not on your list" +msgstr "Ovaj kontakt nije na Vašoj listi" + +#: network/msnconnection.cpp:419 +msgid "This contact is not online" +msgstr "Kontakt nije na vezi" + +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Već koristite ovaj mod" + +#: network/msnconnection.cpp:428 +#, fuzzy +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:432 +#, fuzzy +msgid "" +"The group name is already present in your 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:436 +#, fuzzy +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:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Ova grupa ne dozvoljava promene" + +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "Kontakt nije u ovoj grupi" + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "Ova grupa sadrzi kontakte" + +#: network/msnconnection.cpp:453 +#, fuzzy +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:458 +msgid "Attempted to change group \"0\"" +msgstr "Pokušavam da promenim grupu \"0\"" + +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Došlo je do greške u radu KMess-a: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Pogrešna grupa" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "Bez domena" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "Pogrešna ADL komandni format" + +#: network/msnconnection.cpp:473 +msgid "Switchboard server failed" +msgstr "Neuspešno menjanje servera" + +#: network/msnconnection.cpp:476 +msgid "Transfer to switchboard server failed" +msgstr "Transfer do servera neuspešan" + +#: network/msnconnection.cpp:480 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "Direktna veza (MSNSLP) nije uspela" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Popunite označena polja" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "Niste na vezi" + +#: network/msnconnection.cpp:492 +#, fuzzy +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "Ovom nalugu je odbijen pristup na MSN sevisu." + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "Komanda je isključena" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "Vaš nalog je blokiran." + +#: network/msnconnection.cpp:504 +msgid "Challenge response failed" +msgstr "" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "Pogrešni podaci komande" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "Previše brzo otvarate čet sesije" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "Imate previše otvorenih čet sesija" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "Komanda nije odgovarajuća" + +#: network/msnconnection.cpp:528 +msgid "Bad friend name" +msgstr "Loše ime prijatelja" + +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "Loš CVR podatak" + +#: network/msnconnection.cpp:540 +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:547 +msgid "Authentication ticket was incorrect" +msgstr "Identifikaciona karta je nevažeća" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Ne možete započeti čet sa nekim dok ste nevidljivi." + +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "Ne prihvatam nove kontakte" + +#: network/msnconnection.cpp:558 +#, fuzzy +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:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "Vas Passport nalog trebate da potvrdite prvo." + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "Loša USR karta" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "Greška prilikom pribavljanja kontakt liste, probajte ponovo kasnije" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger 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:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "MSN servis je trenutno nedostupan, server je prezauzet." + +#: network/msnconnection.cpp:599 +msgid "Peer notification server down" +msgstr "Server trenutno nije aktivan" + +#: network/msnconnection.cpp:603 +msgid "The server is going down" +msgstr "Server prelazi u neaktivno stanje" + +#: network/msnconnection.cpp:607 +msgid "The server is going down soon" +msgstr "Server prelazi u neaktivno stanje uskoro" + +#: network/msnconnection.cpp:612 +msgid "Write is blocking" +msgstr "Pisanje je zabranjeno" + +#: network/msnconnection.cpp:616 +msgid "Session is overloaded" +msgstr "Sesija je prepunjena" + +#: network/msnconnection.cpp:623 +msgid "The server is not available" +msgstr "Server nije dostupan" + +#: network/msnconnection.cpp:627 +msgid "Authentication failed" +msgstr "Identifikacija neuspešna" + +#: network/msnconnection.cpp:634 +#, kde-format +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:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN greška" + +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "Pokušavam preko HTTP fallback..." + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "Identifikacija..." + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "Identifikovan" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "Prelazim na drugi server..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Povezivanje..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "Nepoznata komanda primljena sa servera: %1" + +#: network/msnnotificationconnection.cpp:2100 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minut" +msgstr[1] "%1 minuta" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Server prelazi u neaktivno stanje za %1!" + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "MSN Server prelazi u neaktivno stanje zbog odrzavanja za %1!" + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess ne može proslediti Offline-IM poruke.
Detalji: %1" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "SOAP klijent više nije ispravan." + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "Vreme za identifikaciju je isteklo" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Čekanje na spisak prijatelja...." + +#: network/msnnotificationconnection.cpp:2796 +#, fuzzy, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN poruka

%1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Interna greška, opis: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, 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:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:2932 +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:2935 +#, fuzzy, kde-format +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:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

" +msgstr "

MSN poruka

%1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3005 +#, 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:3061 +#, kde-format +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:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Interna greška, opis: %2)" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "Vreme predviđeno za povezivanje je isteklo" + +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping se nije vratio" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pinga se nisu vratila" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "Veza sa serverom je prekinuta" + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy, kde-format +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, kde-format +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 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Server nije dostupan" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Server nije dostupan" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, fuzzy, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Neočekivan tip odgovora" + +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "U %1's četova:
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 kaže:
'%2'" + +#: notification/chatnotification.cpp:180 +#, kde-format +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:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "%1's zahteva Vašu pažnju!" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 Vam je poslao poruku pisanu rukom!" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 Vam je poslao nudge!" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 Vam je poslao namig!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 želi da koristi kamericu!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 Vam šalje fajl!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 Vas poziva u grupni čet!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 je prekinuo video čet!" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 je prekinuo slanje fajla!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1više nije aktivan!" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 je prihvatio da koristi kamericu!" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 je prihvatio prenos fajla!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 je prihvatio Vaš poziv!" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 je prekinuo video čet!" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "Transfer fajla sa %1 je završen!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1biše nije aktivan!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1nije uspeo da aktivira čet sa kamericom!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Transfer fajla sa %1 nije uspeo!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1je prekinuo aktovnost, zbog pojave greške!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
je na vezi" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
je promenio status u odsutan" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
je promenio status u vracam se odmah" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
je promenio status u zauzet" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
je postao nevidljiv" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
je postao zaludan" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
se isključio sa mreže" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
trenutno razgovara telefonom" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
je otišao da ruča" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "Grupa %1" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +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..." + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Prikaži sliku" + +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "Preuzimanje slike kontakta nije uspelo" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image 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 +#, kde-format +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 +#, kde-format +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, kde-format +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:371 +msgid "Hi, how are you doing? :)" +msgstr "Ćao, kako si danas? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Zoran:" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Odlično!" + +#: settings/chatstylepage.cpp:375 +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, kde-format +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 +#, fuzzy +msgid "No selectable web 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 +#, fuzzy +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "" +"Potrebno je da navedete konzolnu komandu za pokretanje prilagođenog veb " +"čitača!" + +#: settings/miscellaneouspage.cpp:291 +#, fuzzy, c-format +msgid "" +"The console command you have specified to launch a custom web 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 +#, fuzzy, c-format +msgid "" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing emails 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:242 +msgid "&Send a Comment to the Developers" +msgstr "&Pošaljite komentar programerima" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "&Prikazuj smeške" + +#: utils/likeback/likeback.cpp:319 +#, fuzzy, kde-format +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:324 +#, fuzzy, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "Dobrodošli u %1." + +#: utils/likeback/likeback.cpp:332 +#, fuzzy +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on '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:339 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'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:346 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on '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:356 +#, fuzzy +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on '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:367 +#, fuzzy +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:374 +#, fuzzy +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "Ne dopada mi se strana dobrodošlice. Oduzima previše vremena." + +#: utils/likeback/likeback.cpp:381 +#, fuzzy +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows 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:388 +#, fuzzy +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:401 +#, fuzzy +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:404 +#, fuzzy +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Primer" +msgstr[1] "Primeri" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, fuzzy, kde-format +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 the developers a brief description of your opinions about " +"%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:216 +#, kde-format +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:290 +#, fuzzy +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:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Komentar je poslat" + +#: utils/likeback/likebackdialog.cpp:304 +#, fuzzy +msgctxt "Dialog box text" +msgid "" +"

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

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:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Greška prilikom slanja komentara" + +#. 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 the 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 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 +#, fuzzy +msgid "" +"Click this button to show all default Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "" +"Kliknite na ovo dugme da bi počeli koristiti KMess ili da prekinete pokušaj " +"povezivanja" + +#. 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 +#, fuzzy +msgid "" +"Click this button to show all custom emoticons, so you can easily insert " +"them in your messages." +msgstr "" +"Kliknite na ovo dugme da bi počeli koristiti KMess ili da prekinete pokušaj " +"povezivanja" + +#. 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:107 +#. 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 +#, fuzzy +msgid "Clear area" +msgstr "Očistiti &sve" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "Pen color" +msgstr "&Boja Olovke" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +#, fuzzy +msgid "Pen size" +msgstr "Veličina olovke" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +#, fuzzy +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:273 +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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Čet logovi" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Pokreni ili zaustavi &konverzaciju" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +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 "Š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 the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "Za&branite osobi da vidi Vaš status." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Vrati" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grupe:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Koristite &sopstveni nadimak za ovu osobu" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Prilagođeni smešci za ovaj nalog" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Zvuk:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Prikaži sliku" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, 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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Prikaži sliku" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Obriši keš" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Kliknite ovde da obrišete obeleženi smešak" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "&Vrati" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "Dostupni kontakti" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact 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:183 +#, fuzzy +msgid "Enter the email address of a person 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:186 +msgid "Invited Contacts" +msgstr "Pozvani kontakti" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "Stavke za izvoz:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "Format" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "Kontakti:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "Obeleži sve" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "Odselektovati sve" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "Izvezi..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "Zatvori" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +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:228 +msgid "Command:" +msgstr "Komanda:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Tip:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Standardni" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Pošalji" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "Vrednost komande (može biti prazno):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Otvori" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Odkaži" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "&Preuzimi" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "&Pošalji" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "&Očisti prozor" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "&Zatvori" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +msgid "Password:" +msgstr "Lozinka:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +#, fuzzy +msgid "Enter 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:285 +msgid "Status at login:" +msgstr "Stanje pri uključenju:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +#, 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:291 +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:294 +msgid "Remem&ber account" +msgstr "Zapamti nalo&g" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +msgid "R&emember password" +msgstr "Zapamti lozi&nku" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +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:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "Novi nalog" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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:324 +msgid "Password forgotten?" +msgstr "Zaboravljena lozinka?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +#, 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:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Veza" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Pogled" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Akcije" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, fuzzy +msgid "Form" +msgstr "Format" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Nalog" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +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:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +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:357 +msgid "&Friendly name:" +msgstr "&Nadimak:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +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:363 +msgid "&Email address:" +msgstr "&Email adresa:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 +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:369 +msgid "&Password:" +msgstr "&Lozinka:" + +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "&Zapamti lozinku" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +msgid "C&hange..." +msgstr "&Promeni..." + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "&Ne koristi" + +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +msgid "" +"The option \"Remember account\" was left unchecked while logging in, " +"so your settings will not be saved by default. Enable this option if you " +"want to save your account settings permanently on this system.\n" +"\n" +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." +msgstr "" + +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "Zapamti podešavanja ovog naloga" + +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 +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:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Prijavi se sa ovim nalogom automatski" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Prijavi se kao" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +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:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot 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:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 +msgid "Request verification email" +msgstr "Zahtevaj potvrdu za email" + +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 +msgid "Go to accountservices.passport.net" +msgstr "Go to accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, fuzzy +msgid "" +"You need a Passport account to connect to the Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail 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:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy +msgid "" +"To connect to the Live 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:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +msgid "Register new account" +msgstr "Otvori novi nalog" + +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 +msgid "http://register.passport.com/" +msgstr "http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 +msgid "Go to register.passport.com" +msgstr "Idi na register.passport.com" + +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "Stanje pri uključenju:" + +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Promeni status u \"&Idle\" kada sam neaktivan" + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "Broj minuta pre nego što KMess promeni status u \"Away-Idle\"." + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Promeni status u idle posle" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "minuta" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your 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:476 +msgid "Saved accounts:" +msgstr "Zapamćeni nalozi:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +#, fuzzy +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live 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:482 +#, fuzzy +msgid "&Add Account..." +msgstr "Dodaj nalog..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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:491 +msgid "&Edit" +msgstr "&Izmeniti" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +msgid "&Remove" +msgstr "I&zbrisati" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +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:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "Omogući čet logove" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +#, fuzzy +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" +"KMess može čuvati vaše četove kao HTML fajlove i održavatii ih organizovane" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Sačuvaj četove kao fajl" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +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:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Sačuvaj četove kao fajl" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +#, fuzzy +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, 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:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "Web strane (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "Običan tekst" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +#, fuzzy +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"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:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +#, fuzzy +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.\n" +" " +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:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +msgid "Separate logged chats by:" +msgstr "Razdvojiti čet logove pomoću:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "Napraviti direktorijum za organizovanje čet logova po godini" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs 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:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "Godina" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +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:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs 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:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "Godina pa mesec" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +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:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +#, fuzzy +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs 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:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "Godina, mesec zatim dan" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Čuvaj sve čet logove direktno u direktorijumu koji je naznačen ispod" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +#, fuzzy +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"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:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "Bez organizovanja fajlova" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "Kliknite ovde da odaberete direktorijum" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +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:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "Izaberite direktorijum na računaru gde želite da čuvate čet logove" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "Čuvaj čet logove u ovom direktorijumu:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "S&til" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +#, fuzzy +msgid "&Chat style:" +msgstr "&Čet stil:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "Podešavanja vezana za čet" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +msgid "&Show emoticons" +msgstr "&Prikazuj smeške" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "Prika&zuj smeške" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, 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 "" +"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:648 +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:654 +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:657 +#, 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:663 +msgid "Show &date" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "&Prikazuj smeške" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "&Tekst" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +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:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "&Font poruke:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with 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:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +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:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Dogadjaji za čet prozor" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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 "" +"Ukucavanjem *podebljan*, /nakošen/, and _podvučen_ menjati osobine fonta, " +"podebljano, nakošeno, podvučeno." + +#. i18n: file: settings/chatstylepage.ui:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +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:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +#, fuzzy +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "MSN Plus dodaci" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +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:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +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:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "G&rupiši četove u jednom prozoru:" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "Uvek" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "Samo za kontakte iz iste grupe" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "Nikada" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Prikaži sliku" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail 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:736 +#, 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_) +#: rc.cpp:739 +#, fuzzy +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media 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:742 +msgid "Show contacts w&hich song I am listening to" +msgstr "Prikaži kontaktima šta slušam trenutno" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +#, fuzzy +msgid "List Formatting" +msgstr "MSN Plus dodaci" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +#, fuzzy +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "MSN Plus dodaci" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +msgid "&Emoticon Themes" +msgstr "&Teme smešaka" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" +msgstr "Raspoloživi smešci" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +msgid "&Custom Emoticons" +msgstr "Prilagođeni smešci" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Raspoloživi smešci" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +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:781 +msgid "Add Ne&w..." +msgstr "Dodaj nov..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +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:790 +msgid "Re&name" +msgstr "Preime&novati" + +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "Kliknite ovde da obrišete obeleženi smešak" + +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +msgid "Remo&ve" +msgstr "Brisanje" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "Veb čitač" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +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:811 +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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 +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:827 rc.cpp:862 +#, 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:831 +#, 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:834 +msgid "Email Client" +msgstr "Email klijent" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +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:843 +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:846 +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:852 +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:866 +#, 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:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +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:878 +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:881 +msgid "and" +msgstr "i" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "za prenos fajlova" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Kliknite ovde da preimenujete obeleženi smešak" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Kliknite ovde da obrišete obeleženi smešak" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "Vaš komentar:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +msgid "Your comment is about:" +msgstr "Vaš komentar je u vezi sa:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "Vi volite" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "Vi ne volite" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +#, fuzzy +msgid "An improper behavior of the application" +msgstr "Pomognite da unapredimo KMess" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +#, fuzzy +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 (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "Sli&ke" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Bez dopisivanja" + +#, fuzzy +#~ msgid "&Do not filter" +#~ msgstr "&Ne koristi" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "Omogući iskačuće prozore kada se kontakt prijavljuje/odjavljuje." + +#~ msgid "File format used for saving:" +#~ msgstr "Koji format fajla koristiti za čuvanje:" + +#~ msgid "Show the feedback buttons bar on the windows" +#~ msgstr "Prikaži feedback dugmad na svim prozorima" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Dodaj ovaj smešak" + +#, 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!" + +#~ msgid "Ed&it Notes" +#~ msgstr "&Beleške" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Prikaži sliku" + +#~ msgid "Search for C&ontact" +#~ msgstr "Pronađi k&ontakt" + +#~ msgid "Search by &Interest" +#~ msgstr "Pretražuj po &Interesu" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Vaš email" + +#~ 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." + +#~ 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." + +#, 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 80143f6..90c6e00 100644 --- a/po/sv.po +++ b/po/sv.po @@ -1,873 +1,1724 @@ # 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: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2005-07-14 12:08+0200\n" -"Last-Translator: Christian Lundgren \n" -"Language-Team: \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\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" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "Christian Lundgren" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "zeflunk@gmail.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "Jag är inte vid datorn" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Ditt namn" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "du@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Loggar in..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Jag är inte vid datorn" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "Ta bo&rt" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Trött" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"Du kan inte starta den här inbjudan eftersom det är flera kontakter i den " +"här chatten." + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 har gått med i chatten." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "Konversationen blev overksam, %1 har lämnat chatten." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 har lämnat chatten." + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 och %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 och flera" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Det här meddelandet skickades automatiskt)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "Du har tagit emot en blinkning från %1" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "Du har tagit emot en blinkning från %1" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 har blivit osynlig" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "" +"%1 har skickat ett meddelande när du var nerkopplad:
\"%2\"" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1 har skickat dig ett handskrivet meddelande." + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "Blinkningen kunde inte visas. Kunde inte läsa data." + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 har skickat en blinkning." + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 har skickat en blinkning." + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "" +"Blinkningen kunde inte visas. Kontrollera att du har \"cabextract\" " +"installerat." + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Blinkningen kunde inte visas. Kontrollera att du har \"cabextract\" " +"installerat." + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"Blinkningen kunde inte visas. Kontrollera att du har \"cabextract\" " +"installerat." + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"Blinkningen kunde inte visas. Kontrollera att du har \"cabextract\" " +"installerat." + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 har gått med i chatten." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 har gått med i chatten." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 har skickat en knuff." + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 har gått med i chatten." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "Meddelandet \"%1\" kunde inte skickas." + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "Du har skickat en knuff till %1." + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Du har skickat en knuff." + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 skickar en blinkning: %2" -#: chat/chatmessagestyle.cpp:296 +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 säger:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "Lägg till denna uttryckssymbol: %1" -#: chat/chatview.cpp:463 -msgid "" -"Could not save chat log. 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." +# initialviewinterface.cpp:208 rc.cpp:7, no-c-format +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Anslut" -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:300 +#, fuzzy, kde-format +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 "" +"Kunde inte spara chattlogg. Konstrollera att du har rättighet att skriva " +"till katalogen där loggar sparas." + +#: chat/chatview.cpp:439 +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:458 +#, fuzzy, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" -msgstr "Skriv över Fil" +msgstr "Skriv över fil" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Skri&v över" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." -msgstr "Lägg till &Uttryckssymbol..." +msgstr "Lägg till &uttryckssymbol..." -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Lägg till &uttryckssymbol..." + +#: chat/chatview.cpp:834 msgid "Send &Email" -msgstr "Skicka &E-post" +msgstr "Skicka &e-post" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "Kopiera &E-post" +#: chat/chatview.cpp:838 +#, fuzzy +msgid "Add &Contact" +msgstr "&Lägg till kontakt" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Kopiera &adress" + +#: chat/chatview.cpp:848 msgid "Visit &Link" -msgstr "Besök &Länk" +msgstr "Besök &länk" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" -msgstr "Kopiera &Adress" +msgstr "Kopiera &adress" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +#, fuzzy +msgid "&Copy Text" msgstr "&Kopiera text" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" -msgstr "Välj &Alla" +msgstr "Välj &alla" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "Spara chatt till &Fil" +#: chat/chatview.cpp:870 +#, fuzzy +msgid "Find &Text..." +msgstr "Hitta &text" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Chatt" +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +#, fuzzy +msgid "C&lear Chat" +msgstr "Rensa f&lik" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "" -"Du kan inte starta den här inbjudan eftersom det är flera kontakter i den " -"härchatten." +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." +msgstr "Spara chatt till &fil" -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 har gått med i chatten." - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "Konversationen blev inaktiv, %1 har lämnat chatten." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 har lämnat chatten." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Chatt" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 och %2 - Chatt" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 och flera - Chatt" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Kontakter" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Uttryckssymboler" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +#, fuzzy +msgid "My Emoticons" msgstr "Mina uttryckssymboler" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (Det här meddelande skickades automatiskt)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 +#, fuzzy msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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 "" -"Blinkningen kunde inte visas. Kontrollera att du har 'cabextract' " -"installerat." +"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:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "Blinkningen kunde inte visas. Kunde inte läsa data" +#: chat/chatwindow.cpp:340 +#, 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:1603 -msgid "You have received a wink from %1" -msgstr "Du har tagit emot en blinkning från %1" +#: chat/chatwindow.cpp:341 +#, fuzzy +msgid "Close All Tabs" +msgstr "Stäng &alla flikar" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "Meddelandet '%1' kunde inte skickas." +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "Stäng aktuell flik" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "Du tog emot en knuff från %1!" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "Du har skickat en knuff till %1!" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Du har skickat en knuff!" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 skriver." - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 och %2 skriver." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1,%2 och %3 andra skriver." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "Skicka en &Fil" - -#: chat/chatwindowinterface.cpp:174 -msgid "Start a &Meeting" -msgstr "Starta Sa&mmanträde" - -#: chat/chatwindowinterface.cpp:175 -msgid "Send a &Nudge!" -msgstr "Skicka en K&nuff" - -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Starta eller Stoppa en &Konversation" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "Spara chatt" - -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" +#: chat/chatwindow.cpp:451 +#, fuzzy +msgid "&Invite..." msgstr "Bjud &in" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Chatta" +#: chat/chatwindow.cpp:452 +#, fuzzy +msgid "Send a &File..." +msgstr "Skicka en &fil" -#: chat/chatwindowinterface.cpp:221 -msgid "Change &Font" -msgstr "Ändra &Typsnitt" - -#: chat/chatwindowinterface.cpp:222 -msgid "Change Font &Color" -msgstr "Ändra T&ypsnittsfärg" - -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Infoga en uttryckssymbol" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:454 +msgid "Start a &Meeting" +msgstr "Starta ett &möte" + +#: chat/chatwindow.cpp:455 +msgid "Send a &Nudge!" +msgstr "Skicka en k&nuff" + +#: chat/chatwindow.cpp:456 +#, fuzzy +msgid "Save Chat..." +msgstr "Spara chatt" + +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "Stäng &alla flikar" + +#: chat/chatwindow.cpp:462 +msgid "Change &Font" +msgstr "Ändra &teckensnit" + +#: chat/chatwindow.cpp:463 +msgid "Change Font &Color" +msgstr "Ändra t&ypsnittsfärg" + +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" -msgstr "Visa &Uttryckssymboler" +msgstr "Visa &uttryckssymboler" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "Visa/Dölj &Kontaktpanelen" +# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Visa tid i c&hattmeddelanden" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Visa eller göm kontaktpanelen" +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "&Panels" +msgstr "Avbryt" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "&Skicka e-post" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "Använd &stavningskontroll" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "Möte" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "Knuff" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Skicka en &fil" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Aktivera i kontaktlistan" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakter" + +#: chat/chatwindow.cpp:513 +msgid "Enable or disable the standard emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Uttryckssymboler" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Aktivera i kontaktlistan" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mina uttryckssymboler" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "&Teckensnitt" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "T&ypsnittsfärg" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "" + +#: chat/chatwindow.cpp:603 +#, 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:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +#, fuzzy +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Kommando:" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Chatt" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Chatt" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1 skriver." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 och %2 skriver." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 och %3 andra skriver." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +msgid "&Start Private Chat" +msgstr "" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "Skicka &e-post" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" -msgstr "&Visa Profil" +msgstr "&Visa profil" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "Egenska&per" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "&Lägg till kontakt" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" -msgstr "Ti&llåt Kontakt" +msgstr "Ti&llåt kontakt" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" -msgstr "Ta bo&rt Kontakt" +msgstr "Ta bo&rt kontakt" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "&Blockera kontakt" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" -msgstr "&Avblockera Kontakt" +msgstr "&Avblockera kontakt" # settings/accountswidget.cpp:98 rc.cpp:88, no-c-format -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" -msgstr "&Visningsnamn:" +msgstr "&Visningsnamn" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" -msgstr "&Personligt Meddelande" +msgstr "&Personligt meddelande" # initialviewinterface.cpp:235 rc.cpp:20, no-c-format -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" msgstr "&E-postadress" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "&Information" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Visningsbild" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +#, fuzzy +msgid "&Notes" +msgstr "Anteckningar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "Uttryckssymbol&er" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" msgstr "&Kopiera.." -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Blockerad" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Frånvarande" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "Kontakten är %1" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Strax tillbaka" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Upptagen" +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "Lägg till i chatt" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Frånkopplad" +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "Lägg till &ny..." -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Frånvarande - Inaktiv" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "Redigera" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "På lunch" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "Ta bort" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows-mobil" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1-kompatibel" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1-kompatibel" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1-kompatibel" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "Ansluten" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Upptagen" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Frånvarande" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Frånvarande med autosvar" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Overksam" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Strax tillbaka" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Talar i Telefon" -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "Kontakten är inte ansluten" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "På lunch" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Osynlig" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Det här kontot har inte en Hotmail-inkorg!" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Frånkopplad" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Min status" + +#: contact/msnstatus.cpp:218 +#, 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:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Skriv in e-postadressen till den person du vill lägga till:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "Den angivna e-postadressen var inte giltig!" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Lägg till ny &Uttryckssymboler" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "Redigera uttryckssymbol" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +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:28 -msgid "Specify an Away message" -msgstr "Specifiera ett Frånvarandemeddelande" - #: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "&Automatiskt frånvaromeddelande" + +#: dialogs/chathistorydialog.cpp:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "&Chattstil:" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Skriv in meddelandet som ska skickas automatiskt\n" -" då personer försöker kontakta dig:" -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Använd ett alternativt namn för den här personen" +#: dialogs/chathistorydialog.cpp:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Kunde inte öppna en lokal port." -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Loggar in..." + +# settings/chatloggingwidget.cpp:119 rc.cpp:130, no-c-format +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Logga &alla chattar" + +#: 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:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." msgstr "" -"Visa poppupp-fönster när den här personen blir ansluten eller frånkopplad" +"%1 (%2)\n" +" har lagt till dig till hans eller hennes kontaktlista." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Bild:" +# dialogs/contactaddeduserdialoginterface.cpp:72 rc.cpp:60, no-c-format +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +" har lagt till dig till hans eller hennes kontaktlista." -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Ljud:" - -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" msgstr "Kontaktegenskaper för %1" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "E-postadress " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Ansluten" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Aktuellt namn: " +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "Inte sedd ännu" -#: dialogs/networkwindow.cpp:50 +# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "Inga meddelanden ännu" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Senast sedd: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Senaste meddelande: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +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:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Klient: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakter" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "Inbjudan nekades. Stöd saknas hos den andra klienten." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Kontakter" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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, kde-format +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 "" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "Nätverksfönster" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "Spara flik" +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "Sp&ara flik" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "Rensa flik" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "Rensa f&lik" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "Stäng flik" +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" +msgstr "Stäng &alla flikar" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "Inga anslutningar är närvarande. Kan inte öppna Nätverksfönstret." +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Inga anslutningar är närvarande.\n" +"Kan inte öppna nätverksfönstret." -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"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:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." -msgstr "Kan inte stänga huvudanslutningsfliken" +msgstr "Kan inte stänga huvudanslutningsfliken." -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +msgid "Cannot send commands to this kind of connection!" +msgstr "Kan inte skicka kommandon till den här sortens anslutning." + +#: 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 "" +msgstr "Avbruten" -#: dialogs/transferentry.cpp:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Misslyckades." -#: dialogs/transferentry.cpp:202 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Dator" +msgstr "Klar" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 byte" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 av %2 mottagna." -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 av %2 skickade." -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "oändlig" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" msgstr "Filöverföringar" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Använd" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Ta bo&rt" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Välj eller ta bort avatar" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Är du säker på att du vill ta bort det här kontot?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Visningsbild" + +#: emoticontheme.cpp:627 +#, kde-format 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:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Leende" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "Vinka" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Lipa" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Stort leende" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Ledsen" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Gråter" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "Arg" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Förvirrad" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Generad" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Missnöjd" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Het" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Visa tänderna" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Nörd" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Sjuk" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Överraskad" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" -msgstr "Party" +msgstr "Fest" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Trött" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Tänker" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Berätta inte för någon" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Skvaller" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Rullande ögon" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Sarkastisk" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Jag vet inte" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Strax tillbaka" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Ängel" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Vänsterkram" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Pojke" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Rött hjärta" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Röd ros" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +#, fuzzy +msgid "Thumbs up" msgstr "Tummen upp" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Hundansikte" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Sol" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Djävul" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Högerkram" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Flicka" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Brustet hjärta" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Vissen ros" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Tummen ner" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Kattansikte" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Sovande halvmåne" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Röda läppar" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Klappande" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Korsade fingrar" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" -msgstr "" +msgstr "Auto" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Flygplan" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Sköldpadda" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Snigel" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Svart får" +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "Trött" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Get" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Vampyrfladdermus" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" -msgstr "" +msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Ölglas" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "Martiniglas" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "Kaffekopp" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Födelsedagstårta" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Tallrik" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Skål" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Stjärna" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Regnbåge" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Stormmoln" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Blixt" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Paraply" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Ö med en palm" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" -msgstr "Telefon mottagare" +msgstr "Telefonmottagare" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "E-post" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Klocka" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Filmremsa" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Anteckning" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Handbojor" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Pengar" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Glödlampa" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +#, fuzzy +msgid "Cigarette" msgstr "Cigarett" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "Fotboll" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Paket med rosett" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Dator" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" msgstr "KMess-ikon" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "Kontaktadressen du skrivit in är inte giltig: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" + +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Internetanslutning inte tillgänglig." + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "A&nslut" + +#: initialview.cpp:601 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Avbryt" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "" + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Kontakten finns redan på din lista" + +# settings/emailwidget.cpp:112 rc.cpp:219, no-c-format +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "Visa e-postinformation" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "Ny grupp" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Lägg till en grupp" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "Skriv in det nya namnet för gruppen:" +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" +msgstr "Ange det nya namnet för gruppen:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Frånvarande med autosvar" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Inaktiv" - -#: kmess.cpp:715 +#: kmess.cpp:576 +#, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -875,236 +1726,485 @@ msgstr "" "Är du säker på att du vill ta bort kontakten %1 från din " "kontaktlista?" -#: kmess.cpp:718 -msgid "Remove contact" +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" msgstr "Ta bort kontakt" -#: kmess.cpp:720 -msgid "Remove and block" +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" msgstr "Ta bort och blockera" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First 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:628 kmess.cpp:635 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Ta bort grupp" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "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:763 -msgid "Remove group" -msgstr "Ta bort grupp" +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "Ta bort" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "Det här är en speciell grupp som inte kan ändras" -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "Byt namn på grupp" +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "Byt &namn på grupp" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Ansluten" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Ange det nya namnet för gruppen:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, fuzzy, kde-format +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:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatisk inloggning misslyckades" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Ansluter..." + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Frånkopplad" -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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:1448 +#, kde-format +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:1460 +#, fuzzy, kde-format +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:1673 -msgid "Error with notifications" -msgstr "Fel med notifikationer" +#: kmess.cpp:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Fel med meddelanden" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Nytt K&onto" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Ny &Kontakt" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Ny &Grupp" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "Sök &efter Kontakt" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "Sök genom &Intresse" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "Kontoin&ställningar" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Åtgärder" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "A&nslut" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&Koppla från" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "Visa Min &Profil" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Min Status" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "A&nslut" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&Koppla från" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "Visa min &profil" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" -msgstr "Vis&a Tillåtna Kontakter" +msgstr "Vis&a tillåtna kontakter" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" -msgstr "Visa Frånk&opplade Kontakter" +msgstr "Visa frånk&opplade kontakter" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" -msgstr "Visa Bo&rttagna Kontakter" +msgstr "Visa bo&rttagna kontakter" -#: kmessinterface.cpp:278 +#: kmessinterface.cpp:170 #, fuzzy -msgid "Show &Display Pictures" -msgstr "Visningsbild" +msgid "Show &History Box" +msgstr "&Chattstil:" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "Visa &Nätverksfönster" +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Visa sido&panel" -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "Visa tomma grupp&er" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" +msgstr "Visa bildstorlek" + +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" -msgstr "&Sortera Kontakter efter" +msgstr "&Sortera kontakter efter" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Visa överföringsföns&ter" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "Ny &kontakt" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "Ny &grupp" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "&Sortera kontakter efter" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "&Chattstil:" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "Nytt k&onto" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Lipa" + +#: kmessinterface.cpp:186 +#, fuzzy +msgid "Configure &KMess..." +msgstr "Ställ in &KMess" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +#, fuzzy +msgid "Do Not Display" +msgstr "Visa inte" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "Liten" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "Mellan" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "Stor" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Grupp" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Ansluten/Frånkopplad" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "Visa Överföringsföns&ter" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "Blandad" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Lyssnar nu till %1" +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Visa &nätverksfönster" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1] loggad med %2" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2 ansluter" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 kopplar ner" + +#: kmessview.cpp:599 msgid "Cha&t" msgstr "Cha&tta" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "Egenska&per" - -#: kmessview.cpp:623 -msgid "&Remove from group" +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" msgstr "Ta bo&rt från grupp" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "&Flytta till Grupp" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" -msgstr "&Kopiera till Grupp" +msgstr "&Kopiera till grupp" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "&Flytta till grupp" + +#: kmessview.cpp:695 msgid "Move Group &Down" -msgstr "Flytta Grupp &Ner" +msgstr "Flytta ner &grupp" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" -msgstr "Flytta Grupp &Upp" +msgstr "Flytta &upp grupp" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" -msgstr "Ta bort Grupp" +msgstr "Ta &bort grupp" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" -msgstr "Byt &namn på Grupp" +msgstr "Byt &namn på grupp" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "Du har 1 nytt e-postmeddelande i din inkorg." +# dialogs/contactaddeduserdialoginterface.cpp:74 rc.cpp:64, no-c-format +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact 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:1727 -msgid "You have %1 new emails in your inbox." -msgstr "Du har %1 nya e-postmeddelanden i din inkorg." +# initialviewinterface.cpp:235 rc.cpp:20, no-c-format +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-postadress" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Frånvarande)" +# settings/emailwidget.cpp:108 rc.cpp:207, no-c-format +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "Klient: %1" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Strax Tillbaka)" - -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Upptagen)" - -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Osynlig)" - -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Frånvarande - Inaktiv)" - -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(På Lunch)" - -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Pratar i Telefon)" - -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Logga in automatiskt med angiven e-postadress" - -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 -msgid "KMess" +#: kmessview.cpp:1164 +msgid "Yes" msgstr "" -#: main.cpp:78 +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "Anteckning" + +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blockerad" + +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Senast sedd: %1" + +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Senaste meddelande: %1" + +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Grupp %1" + +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +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:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 kontakter" +msgstr[1] "%1 kontakter" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Ange ditt personliga meddelande här>" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Du har nekat inbjudan." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "&Chattstil:" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 nytt e-postmeddelande" +msgstr[1] "%1 nya e-postmeddelanden" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:480 settings/accountpage.cpp:541 +msgid "KMess" +msgstr "KMess" + +#: main.cpp:44 +#, fuzzy +msgid "A Live Messenger client for KDE" +msgstr "En MSN Messenger-klient för KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Utvecklare och projektgrundare" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "Utvecklare" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "Projektstöd" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "Nuvarande utvecklare" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -1112,458 +2212,946 @@ msgstr "" "Tysk översättning, testning, dokumentation, webbmaster, projektledning, " "etc..." -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "Webbdesign" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +#, 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:74 msgid "Cartoon emoticons" msgstr "Tecknade uttryckssymboler" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Standardljudtema" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "KMess-ikon i Oxygen-stil" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabisk översättning, internationalisering av filsparningsfix." -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "Mer Arabiska översättningar" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Brasiliansk Portugisisk översättning" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Brasiliansk Portugisisk översättning" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Katalansk översättning" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Mer italiensk översättning" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Förenklad Kinesisk översättning, filöverföringsbuggfix, proxyanslutnings kod" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "Mer Förenklad Kinesisk översättning" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "Traditionell Kinesisk översättning" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Traditionell Kinesisk översättning" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 msgid "Danish translation" msgstr "Dansk översättning" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 msgid "More Danish translation" msgstr "Mer Dansk översättning" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "Holländsk översättning" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" msgstr "Mer Holländsk översättning" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Mer italiensk översättning" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "Mer fransk översättning" + +#: main.cpp:111 msgid "Estonian translation" msgstr "Estländsk översättning" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 msgid "Finnish translation" msgstr "Finsk översättning" -#: main.cpp:102 main.cpp:103 -msgid "More Finnish translation" -msgstr "Mer Finsk översättning" +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" -#: main.cpp:105 +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 +msgid "More Finnish translation" +msgstr "Mer finsk översättning" + +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "Fransk översättning" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" -msgstr "Mer Fransk översättning, MSN6 uttryckssymbolsdefinitioner" +msgstr "Mer fransk översättning, MSN6-uttryckssymbolsdefinitioner" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" -msgstr "Mer Fransk översättning" +msgstr "Mer fransk översättning" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "Ungersk översättning" -#: main.cpp:110 main.cpp:111 -msgid "More Italian translation" -msgstr "Mer Italiensk översättning" +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" -#: main.cpp:112 +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Ungersk översättning" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 +msgid "More Italian translation" +msgstr "Mer italiensk översättning" + +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "Koreansk översättning" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "Norsk Bokmal översättning" -#: main.cpp:115 -msgid "Slovenian translation" -msgstr "Slovensk översättning" - -#: main.cpp:116 -msgid "Spanish translation" -msgstr "Spansk översättning" - -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 -msgid "More Spanish translation" -msgstr "Mer Spansk översättning" - -#: main.cpp:121 -msgid "Swedish translation" -msgstr "Svensk översättning" - -#: main.cpp:123 -msgid "Thai translation" -msgstr "Thailändsk översättning" - -#: main.cpp:124 -msgid "Turkish translation" -msgstr "Turkisk översättning" - -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "Mer Turkisk översättning" - -#: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:128 +msgid "Øyvind Sæther" msgstr "" #: main.cpp:130 -msgid "P4-Context field support" -msgstr "P4-Kontextfält stöd" +#, fuzzy +msgid "Serbian translation" +msgstr "Slovensk översättning" -#: main.cpp:131 -msgid "Xinerama fixes" -msgstr "Xinerama fixar" +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" #: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "Slovensk översättning" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "Slovensk översättning" + +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 +msgid "Spanish translation" +msgstr "Spansk översättning" + +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 +msgid "More Spanish translation" +msgstr "Mer spansk översättning" + +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 +msgid "Swedish translation" +msgstr "Svensk översättning" + +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "Svensk översättning" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 +msgid "Thai translation" +msgstr "Thailändsk översättning" + +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 +msgid "Turkish translation" +msgstr "Turkisk översättning" + +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "Mer turkisk översättning" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +#, fuzzy +msgid "MSNP12 support, various patches" +msgstr "MSNP12-stöd, diverse programfixar." + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "Anslut" + +#: main.cpp:154 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:155 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 +msgid "P4-Context field support" +msgstr "P4-Kontextfältstöd" + +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 +msgid "Xinerama fixes" +msgstr "Xinerama-fixar" + +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "Ursprunglig filmottagningskod" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "KWallet-stöd" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +#, fuzzy +msgid "IRC-like commands in the chat window" +msgstr "Aktivera i chattfönster" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "&Chattstil:" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "Diverse internationaliseringsfixar" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." -msgstr "Olika internationaliserings fixar." +msgstr "Olika internationaliseringsfixar." -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" -msgstr "GnomeMeeting utvecklare" +msgstr "GnomeMeeting-utvecklare" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "Kille med en påse över sitt huvud" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "Inspiration och blandad kod" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Äldre popup-ballongkod, ursprunglig p2p-kod, msn-utmaningshanterare" +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" -#: main.cpp:140 +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +#, fuzzy +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "Äldre popup-ballongkod, ursprunglig p2p-kod, MSN-utmaningshanterare" + +#: main.cpp:174 msgid "Idle timer code" -msgstr "Inaktivitetsklockskod" +msgstr "Overksamhetsklockkod" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +#, fuzzy +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" +"Du är välkommen att skicka dina buggfixar och programfixar till KMess " +"hjälpforum!\n" +"Om du tycker att ditt namn saknas här, vänligen kontakta oss." + +#: main.cpp:179 msgid "Your name here?" msgstr "Ditt namn här?" -#: main.cpp:144 -#, fuzzy -msgid "" -"You are welcome to sent 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 " -"hjälpforum!\n" -"Om du känner att ditt namn saknas här, vänligen kontakta oss också!" +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Ditt namn" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "E-postadress " + +#: main.cpp:189 +msgid "Do not show the contact list window initially" +msgstr "" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Logga in automatiskt med angiven e-postadress" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "Tillåten" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Borttagen" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." msgstr "Kontakten avbröt sessionen." -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "Kontakten har nekat inbjudan." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Du har avbrutit konversationen." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Du har nekat inbjudan." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, fuzzy, kde-format msgid "Do you want to
accept or cancel?" -msgstr "Vill du acceptera eller avbryta?" +msgstr "Vill du acceptera eller avbryta?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, fuzzy, kde-format msgid "Click to cancel." -msgstr "Klicka för att avbryta." +msgstr "Klicka för att avbryta." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Kontakten vill skicka dig en fil: "%1" (%2)." -#: network/applications/filetransfer.cpp:209 -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 +#, fuzzy, kde-format +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:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Ansluter till %1, port %2" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "" +"Överföringen av filen "%1" misslyckades. Kunde inte spara filen." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Överföringen avbröts" +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "Överföringen av %1 misslyckades. Kunde inte öppna filen." -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Anslutning upprättad" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Lyckades överföra filen: %1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Överföringen av %1 misslyckades. Filen finns inte." - -#: network/applications/filetransfer.cpp:604 -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:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Skickar fil %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Överföringen accepterad." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Ansluter till %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Kontakten har avbrutit överföringen av filen "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Du har avbrutit överförningen av filen "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the 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:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Lyckades överföra filen "%1"." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Lyckades ta emot filen "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "Överföringen av filen "%1" misslyckades. Filen finns inte." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the 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 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Skickar fil "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the 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:3217 msgid "Negotiating options to connect" -msgstr "" +msgstr "Förhandlar alternativ för att ansluta" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "Överföringen av %1 misslyckades. Kunde inte öppna fil" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Du har accepterat överföringen av filen "%1"." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Kontakten avbröt överföringen." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" +msgstr "Filen kunde inte skrivas" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Överföringen av %1 misslyckades. Filen finns inte." - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Överföringen av %1 misslyckades. Filen kunde inte läsas" - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "Skickar fil %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: 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:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "Startar GnomeMeeting. Ansluter till %1." -#: network/applications/gnomemeeting.cpp:156 +#: 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:109 -msgid "The invitation was rejected. It's not supported by the other client." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." msgstr "Inbjudan nekades. Stöd saknas hos den andra klienten." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "Inbjudan avbröts. Ett internt fel inträffade." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "Inbjudan avbröts. Ett internt fel inträffade." -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "Inbjudan avbröts. Växeln stängde anslutningen till chatten." +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "Inbjudan avbröts. Växeln stängde anslutningen till chatten." -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Inbjudan avbröts." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Du är inbjuden till att dela den här personens skrivbord." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." -msgstr "Startar KRDC. Ansluter till %1." +msgstr "Startar KRDC. Ansluter till %1." -#: network/applications/p2papplication.cpp:276 -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:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "" +"Kontakten bjuder in dig till \"%1\", men det är inte implementerat ännu." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "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/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "Överföringen misslyckades. Förberedning av data misslyckades." +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "Överföringen misslyckades. Förberedning av data misslyckades." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakten avbröt inbjudan. Ett internt fel inträffade." - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "Överföringen misslyckades." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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/p2papplication.cpp:2038 +#: network/applications/p2papplication.cpp:1192 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:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not 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:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Kontakten avbröt inbjudan. Ett internt fel inträffade." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Väntar på anslutning vid %1, port %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 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:3274 -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/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "Överföringen misslyckades. Ett internet fel inträffade." - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "Överföringen misslyckades. Kunde inte öppna datakällan." - -#: network/applications/p2papplication.cpp:4844 -#, fuzzy +#: network/applications/p2papplication.cpp:3169 msgid "Waiting for connection" -msgstr "Väntar på kontaktlista..." +msgstr "Väntar på anslutning" -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "" "Inbjudan avbröts. En tidsgräns överskreds i väntan på att användaren skulle " "acceptera." -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "" "Inbjudan avbröts. En tidsgräns överskreds i väntan på att en anslutning " "skulle lyckas eller misslyckas." -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakten avbröt inbjudan. Ett internt fel inträffade." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Överföringen misslyckades." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Överföringen misslyckades. Ett internet fel inträffade." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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." msgstr "Du är inbjuden till att starta en röstkonversation." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" @@ -1571,785 +3159,2095 @@ msgstr "" "Du är inbjuden till en röstkonversation men stöd för det har inte " "installerats" -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "Du har avbrutit röstkonversationen." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "Inbjudan avbröts. Ljudenheten kunde inte öppnas." +#: network/applications/voiceconversation.cpp:205 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "Inbjudan avbröts. Ljudenheten kunde inte öppnas." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format 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:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format 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:293 +#: 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:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "Överföringen av %1 avbröts." +#: 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/extra/msnftpconnection.cpp:136 -msgid "Failed" +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:410 -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:411 +#: network/applications/webcamtransferp2p.cpp:138 #, fuzzy -msgid "Couldn't open a local port." -msgstr "Överföringen av %1 misslyckades. Kunde inte öppna en lokal port." +msgid "You are invited to view this contact's webcam." +msgstr "Du är inbjuden till att dela den här personens skrivbord." -#: network/extra/msnftpconnection.cpp:468 +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webbkamera" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Du har avbrutit överförningen av filen "%1"." + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakten har avbrutit överföringen av filen "%1"." + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "Misslyckades" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Skickar fil %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "Överföringen av %1 misslyckades. Kunde inte öppna en lokal port." + +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not 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:481 -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:469 +#, fuzzy, kde-format +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:482 -#, fuzzy +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "Kunde inte skapa en ansluting: %1" +msgstr "Kunde inte skapa en ansluting." -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Tar emot %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." -msgstr "" -"KMess kunde inte ansluta till MSN Messenger tjänsten.\n" -"Vänligen kontrollera att du är ansluten till Internet.\n" -"Systemfel: %1 (kod %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "Ogiltig kommandosyntax" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping förlorad" +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "Ogiltig kommandoparameter" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 ping förlorade" - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "Anslutningen till servern förlorades." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "Servern har stängt anslutningen" - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "Tillåten" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Borttagen" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -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." - -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "Vista MSN Messenger-tjänststatus?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Serverfel" - -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:384 #, fuzzy -msgid "" -"You have been disconnected because you connected from another MSN 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:1553 -msgid "Got synchronization" -msgstr "Fick synkronisering" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Autentiserar" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Mottog användarbekräftelse" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Väntar på kontaktlista..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Överför till notifikationsservern" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "" -"Autentisering misslyckades, vänligen kontrollera ditt kontonamn och lösenord" - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Ansluter..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess mottog ett okänt kommando från servern: %1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "Ett internt fel inträffade i KMess: %1" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" +msgid "The email address you have tried to add is not a Live Messenger account" msgstr "" "E-postadressen du har försökt lägga till är inte ett MSN Messenger-konto" -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "Det givna kontonamnet är inkorrekt" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "Domännamn saknas" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "Redan inloggad" + +#: network/msnconnection.cpp:396 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Det angivna kontonamnet är inkorrekt" + +#: network/msnconnection.cpp:400 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"This 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:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" -msgstr "Din kontaktlista är full." +msgstr "Din kontaktlista är full" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "Ogiltig SBP-parameter" + +#: network/msnconnection.cpp:411 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:2267 +#: network/msnconnection.cpp:415 msgid "This contact is not on your list" msgstr "Kontakten finns inte på din lista" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "Kontakten är inte ansluten" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "Redan i det här läget" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" +"Gruppnamnet är redan tillagt i din Messenger- eller Hotmail-kontaktlista. " +"Använd ett annat namn." + +#: network/msnconnection.cpp:436 +#, 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:2282 -msgid "This group can't be changed" +#: network/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" msgstr "Den här gruppen kan inte ändras" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "Kontakten är inte tillagd till den här gruppen" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "Den här gruppen är inte tom" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "Gruppnamnet används redan i din Messenger- eller Hotmail-kontaktlista" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "Gruppnamnet är för långt" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "Försökte ändra grupp \"0\"" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "Ett internt fel inträffade i KMess: %1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "Ogiltig grupp" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "Tom domän" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "Växelserver misslyckades" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" msgstr "Överföring till växelserver misslyckades" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Direktanslutningsfel (MSNSLP), anslutning misslyckades" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "Fel vid försök att hämta kontaktlistan, försök igen senare" +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "Fält som krävs saknas" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "Inte inloggad" + +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "Kommandot är inaktiverat" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" msgstr "Ditt konto är avstängt." -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Du öppnar sessioner för snabbt" +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Överföringen misslyckades." -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Du har för många sessioner öppna" +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "Dålig kommandodata" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "Du öppnar chattsessioner för snabbt" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "Du har för många chattsessioner öppna" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "Oväntad kommandosekvens" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" msgstr "Felaktigt namn på vän" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "Dålig CVR-data" + +#: network/msnconnection.cpp:540 +#, 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:2359 -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" +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "Autentiseringsbiljett var felaktig" -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Du kan inte starta en chatt med någon då du är osynlig." + +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "Accepterar inte nya kontakter" + +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"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:2366 -msgid "Your passport needs to be verified first." -msgstr "Ditt passportkonto måste bli bekräftat först." +#: network/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "Ditt passportkonto måste först bli verifierat." -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN fel" +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "Dålig USR-biljett" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Ett internt serverfel inträffade" +#: network/msnconnection.cpp:575 +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:2411 -msgid "The server is too busy" -msgstr "Servern är för upptagen" +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "" +"MSN-tjänsten är temporärt otillgänglig, ett internt serverfel inträffade." -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Servern är inte tillgängligt" +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "MSN-tjänsten är temporärt otillgänglig, servern är för upptagen" -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "Motpartsnotifieringsservern är nere" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" msgstr "Servern går ner" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" msgstr "Servern gå ner snart" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "Skriv är blockat" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "Sessionen är överbelastad" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" -msgstr "Servern är inte tillgängligt" +msgstr "Servern är inte tillgänglig" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "Autentisering misslyckades" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess mottog ett okänt felmeddelande från servern: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Varning: Serven stänger ner för underhåll om 1 minut!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "Okänd felkod mottagen från servern: %1" + +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN-fel" + +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." msgstr "" -"MSN Servern har rapporterat att den kommer gå ner inom en minut för " -"underhåll." -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Varning: Serven stänger ner för underhåll om %1 minuter!" +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "Autentiserar..." -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "Autentisering misslyckades" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "Byter till en annan server..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Ansluter..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +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:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "1 minut" +msgstr[1] "%1 minuter" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Serven stänger ner för underhåll om %1." + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "MSN-servern kommer gå ner om %1 för underhåll." + +#: network/msnnotificationconnection.cpp:2309 +#, fuzzy, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess kunde inte bearbeta Offline-IM-meddelanden.
Detaljer: %1" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "Autentiseringstidgräns överskriden" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Väntar på kontaktlista..." + +#: network/msnnotificationconnection.cpp:2796 +#, fuzzy, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN-meddelande

%1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
Internt fel. Anledning: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, fuzzy +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" -"KMess kunde inte bearbeta Offline-IM meddelanden.\n" -"\n" -"Detaljer: %1" +"

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

" +msgstr "Autentisering misslyckades, kontrollera ditt kontonamn och lösenord." -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"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/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: passive notification message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +"

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

" msgstr "" -"KMess kunde inte nå webbtjänsten.\n" -"Detaljer: %1" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Personen är frånkopplad eller osynlig." +#: network/msnnotificationconnection.cpp:2935 +#, fuzzy, kde-format +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/msnswitchboardconnection.cpp:1052 -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/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" -#: network/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "Meddelandet \"%1\" mottogs inte!" +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +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/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Kunde inte skapa en ansluting: %1" +#: network/msnnotificationconnection.cpp:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "För många omdirigeringar av inloggningstjänsten" +#: network/msnnotificationconnection.cpp:2969 +#, kde-format +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" +#: network/msnnotificationconnection.cpp:2980 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

" +msgstr "

MSN-meddelande

%1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3005 +#, 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:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "
Internt fel. Anledning: %1" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" msgstr "Anslutning överskred tidsgräns" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "I %1s chatt: %2" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping förlorad" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1 säger:
'%2'" +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 ping förlorade" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "Anslutningen till servern förlorades." + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -"%1 har skickat ett meddelande medans du var frånkopplad:
'%2'" +"E-postadressen du har försökt lägga till är inte ett MSN Messenger-konto" -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "%1s chatt begär uppmärksamhet!" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1 har skickat en knuff!" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1 har skickat en blinkning!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1 vill använda webbkameran!" - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 skickar en fil!" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 har skickat en inbjudan!" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 har avbrutit webbkamerasessionen!" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1 har avbrutit filöverföringen!" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "%1s aktivitet har avbrutits!" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 har accepterat att använda webbkameran!" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 har accepterat filöverföringen!" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 har accepterat din inbjudan!" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1 har avslutat webbkamerasessionen!" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "Filöverföringen med %1 är klar!" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "%1s aktivitet har avslutats!" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "%1s webbkamerasession har misslyckats!" - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "Filöverföringen med %1 har misslyckats!" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "%1s aktivitet har avslutats med ett fel!" - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 är nu frånvarande" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 är strax tillbaka" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 är nu upptagen" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 har loggat ut" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 har blivit osynlig" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 har blivit inaktiv" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 är på lunch" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 pratar i telefon" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 är nu ansluten" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "Nytt e-post:
'%1'
by '%2'" - -# chat/chatviewinterface.cpp:98 rc.cpp:33, no-c-format -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "Sk&icka" - -# chat/chatviewinterface.cpp:99 rc.cpp:36, no-c-format -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "N&y Rad" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "Sidopanel" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Kontakten finns inte på din lista" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "Klicka här för att visa den här kontaktens profil." - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Klicka för att skicka ett e-postmeddelande till den här kontakten." - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "Skriv in en genväg för den här uttryckssymbolen:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "Välj en bildfil:" - -# dialogs/contactaddeduserdialoginterface.cpp:71 rc.cpp:57, no-c-format -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Lägg till kontakt" - -# dialogs/contactaddeduserdialoginterface.cpp:72 rc.cpp:60, no-c-format -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/soap/addressbookservice.cpp:787 +#, fuzzy, kde-format +msgctxt "Error message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" msgstr "" -"%1\n" -"har lagt till dig till hans eller hennes kontaktlista. Vill du:" +"E-postadressen du har försökt lägga till är inte ett MSN Messenger-konto" -# dialogs/contactaddeduserdialoginterface.cpp:74 rc.cpp:64, no-c-format -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "Lägg till den här kont&akten till din \"Vänner\"-lista" - -# dialogs/contactaddeduserdialoginterface.cpp:75 rc.cpp:67, no-c-format -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -"I&nte lägga till den här kontakten, men tillåt den att se din anslutna status" -# dialogs/contactaddeduserdialoginterface.cpp:76 rc.cpp:70, no-c-format -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Servern är inte tillgänglig" + +#: network/soap/httpsoapconnection.cpp:479 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "För många omdirigeringar av inloggningstjänsten" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Servern är inte tillgänglig" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" msgstr "" -"Blockera den här personen från att kontakta dig och se din onlinestatus." -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "Rensa &upp" +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Skriv in din inloggningsinformation:" +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" -# initialviewinterface.cpp:235 rc.cpp:20, no-c-format -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "E-postadress" +#: network/soap/passportloginservice.cpp:208 +#, fuzzy, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Oväntad kommandosekvens" -# rc.cpp:17 rc.cpp:273, no-c-format -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "Lösenord" +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" +msgstr "I %1s chatt: %2" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "Status vid inloggning" +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 säger:
\"%2\"" -# initialviewinterface.cpp:223 rc.cpp:13, no-c-format -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "Kom ihåg den här profilen" +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1 har skickat ett meddelande när du var nerkopplad:
\"%2\"" -# initialviewinterface.cpp:208 rc.cpp:7, no-c-format -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Anslut" +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "%1s chatt begär uppmärksamhet." -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Skriv in ditt personliga meddelande här" +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" +msgstr "%1:
%2" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Lyssnar på %1" +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 har skickat dig ett handskrivet meddelande." -# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess Notifikation" +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 har skickat en knuff." + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1 har skickat en blinkning." + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1 vill använda webbkameran." + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 skickar en fil." + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 har skickat en inbjudan." + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 har avbrutit webbkamerasessionen." + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 har avbrutit filöverföringen." + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1s aktivitet har avbrutits." + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 har accepterat att använda webbkameran." + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 har accepterat filöverföringen." + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1 har accepterat din inbjudan." + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 har avslutat webbkamerasessionen." + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "Filöverföringen med %1 är klar." + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1s aktivitet har avslutats." + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1s webbkamerasession har misslyckats." + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "Filöverföringen med %1 har misslyckats." + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1s aktivitet har avslutats med ett fel." + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr "%1 är nu ansluten" + +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr "%1 är nu frånvarande" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" +msgstr "%1 är strax tillbaka" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" +msgstr "%1 är nu upptagen" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" +msgstr "%1 har blivit osynlig" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" +msgstr "%1 har blivit overksam" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" +msgstr "%1 har loggat ut" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr "%1 pratar i telefon" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "%1 är på lunch" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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\"" + +#: 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 "" + +#: 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 "" +"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, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +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:82 +#, fuzzy +msgid "Set Previous Image..." +msgstr "Ange föregående bild..." + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Visningsbild" + +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "Nerladdning av visningsbild misslyckades" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Ett fel inträffade vid försök att ändra visningsbild.\n" +"Kontrollera så du valt en befintlig bildfil." + +#: 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, -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +# +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Konto" + +# settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Mitt konto" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Kontakter" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Chattar" + +# rc.cpp:127, no-c-format +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Chattloggning" + +#: 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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"E-postadressen du har angivit är inte giltig och kan inte används som ett " +"konto: \"%1\"" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "E-postadressen du har angivit används redan: \"%1\"" + +#: 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:160 +#, fuzzy, kde-format +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 kontot \"%1\"?
Alla inställningar för " +"kontot kommer att försvinna." + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "Hej, hur mår du? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Sandra" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Bra!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Jag kom /precis/ tillbaka från min semester i Italien!" + +#: 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 "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, kde-format +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 "KMess-inställningar" + +# settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Konton" -# settings/accountswidget.cpp:98 rc.cpp:88, no-c-format -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Ditt visningsnamn:" +# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "Meddelande" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -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." +#: settings/miscellaneouspage.cpp:74 +#, fuzzy +msgid "No selectable web browsers detected." +msgstr "Inga valbara webbläsare identifierade." -# settings/accountswidget.cpp:99 rc.cpp:91, no-c-format -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "Din e-postadress:" +#: settings/miscellaneouspage.cpp:101 +#, fuzzy +msgid "No selectable email clients detected." +msgstr "Inga valbara e-postklienter identifierade." -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "Du måste välja ett kommando som ska köras som egen webbläsare." + +#: settings/miscellaneouspage.cpp:291 +#, c-format msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"The console command you have specified to launch a custom web 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 "" -"Skriv in e-postadressen för ditt MSN Passport-konto. Du kan registrera ett " -"nytt konto på http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Ditt lösenord:" +#: 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." -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#: 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 emails 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 "Du måste välja en katalog för mottagna filer." + +# settings/chatloggingwidget.cpp:120 rc.cpp:133, no-c-format +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Välj filkatalog" + +#: 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "Vi&sa uttryckssymboler" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, fuzzy, kde-format +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:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kontakthändelser" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the standard text mode." +msgstr "Klicka här för att visa den här kontaktens profil." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "N&y rad" + +# chat/chatviewinterface.cpp:98 rc.cpp:33, no-c-format +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "Sk&icka" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chatta" + +#. 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: file: chat/contactswidget.ui:107 +#. 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: 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 "Ange e-postadressen till personen du vill lägga till i kontaktlistan" + +#. 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:273 +msgid "Email address:" +msgstr "E-postadress:" + +#. 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 "Ange genväg för den här uttryckssymbolen:" + +#. 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: 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 "" +"Ange meddelandet som ska skickas automatiskt då personer försöker kontakta " +"dig." + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +msgid "&Specify an automatic away message:" +msgstr "&Automatiskt frånvaromeddelande" + +#. 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Chattloggning" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Starta eller stoppa en &konversation" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +msgstr "Auto" + +#. 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: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to the following groups of your 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: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "" +"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: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" +msgstr "" +"&Blockera den här personen från att kontakta mig och se min anslutningsstatus" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +#, fuzzy +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: file: dialogs/contactpropertiesdialog.ui:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "Återställ" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "Grupp" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Använd alternativt namn för den här personen" + +# settings/alertswidget.cpp:114 rc.cpp:124, no-c-format +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Visa meddelanden när dina kontakter:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "Ljud:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Visningsbild" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, 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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Visningsbild" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "Rensa &cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "Återställ" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "Ti&llåt kontakt" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "Kontakten finns inte på din lista" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "Ange e-postadressen till personen du vill lägga till i kontaktlistan" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "Kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, 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:198 +#, fuzzy +msgid "Format" +msgstr "Get" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "Kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +#, fuzzy +msgid "Select All" +msgstr "Välj &alla" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +#, fuzzy +msgid "Deselect All" +msgstr "Välj &alla" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "Förvirrad" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "Kommando till aktuell flik" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "Kommando:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "Typ:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "Standard" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME" + +# chat/chatviewinterface.cpp:98 rc.cpp:33, no-c-format +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "Skicka" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +#, fuzzy +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "KSqueezedTextLabel" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "Öppna" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "Avbryt" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "R&ensa upp" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "Förvirrad" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "Lösenord:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +#, fuzzy +msgid "Status at login:" +msgstr "Status vid inloggning" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +#, fuzzy +msgid "If enabled, KMess will save your account" +msgstr "Om aktiverat, kommer KMess automatiskt logga in med det här kontot." + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "Registrera nytt konto" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" + +# rc.cpp:17 rc.cpp:273, no-c-format +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +#, 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:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "Nytt k&onto" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +#, 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:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "A&nslut" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +#, fuzzy +msgctxt "@title:menu" +msgid "&View" +msgstr "&Visa" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Åtgärder" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, 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:348 +#, fuzzy +msgid "Account &Info" +msgstr "Konto" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "Din kontoinformation" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +msgstr "Ange namnet som andra kontakter ska se när du är ansluten." + +# settings/accountswidget.cpp:98 rc.cpp:88, no-c-format +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "&Visningsnamn:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +#, fuzzy +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: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "&E-postadress:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 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/" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Visningsbild:" +# rc.cpp:17 rc.cpp:273, no-c-format +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "&Lösenord:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +# rc.cpp:17 rc.cpp:273, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "Kom ihåg löseno&rd" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." -msgstr "Ändra..." +msgstr "Ä&ndra..." -# settings/imagewidgetinterface.cpp:104 rc.cpp:228, no-c-format -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Visa inte en visningsbild" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "Använ&d inte" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Kom ihåg inställningarna för det här kontot" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" "Alternativet \"Kom ihåg den här profilen\" lämnades avaktiverat vid " "inloggningen, så dina inställningar kommer inte sparas som standard. " @@ -2357,723 +5255,1856 @@ 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: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "Ko&m ihåg inställningarna för det här kontot" + +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 +msgid "If enabled, KMess automatically logs in with this account." +msgstr "Om aktiverat, kommer KMess automatiskt logga in med det här kontot." # settings/accountswidget.cpp:102 rc.cpp:100, no-c-format -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Logga in med det här konto automatiskt vid start" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "L&ogga in med det här kontot automatiskt" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format -msgid "If enabled, KMess automatically logs in with this account." -msgstr "Om aktiverat, kommer KMess automatiskt logga in med det här kontot" +# settings/chatloggingwidget.cpp:119 rc.cpp:130, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "Logg&a in som" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Status att sätta vid inloggning:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot 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: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -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/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "Begär e-postbekräftelse" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" -msgstr "" +msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "Gå till accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail 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:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy +msgid "" +"To connect to the Live 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: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" msgstr "Registrera nytt konto" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" -msgstr "" +msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "Gå till register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Meddelanden" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "Status vid inloggning" -# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Popupnotifikationer" - -# settings/alertswidget.cpp:114 rc.cpp:124, no-c-format -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "Visa notifikationer när dina kontaker:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "Anslut" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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, ett popupmeddelande visas när en av dina kontakter ansluter " -"till MSN." - -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Starta en &chatt med dig" - -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -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: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "Skicka ett m&eddelande till dig" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -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: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "Ändra deras &status" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -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: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "Koppla ifrån" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -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." - -# settings/emailwidget.cpp:113 rc.cpp:222, no-c-format -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Visa notifikationer när du får e-post" - -# settings/alertswidget.cpp:112 rc.cpp:118, no-c-format -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Dölj popups efter" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Kontrollerar antalet sekunder innan popupmeddelanden döljs" - -# settings/alertswidget.cpp:113 rc.cpp:121, no-c-format -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "sekunder" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "Skaka chattfönstret när en knuff tas emot eller skickas" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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 "" -"

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 " -"bara chattfönstret vid den första knuffen.

" - -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Informera kontakter om vilken sång jag lyssnar på." - -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -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." +"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/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Ändra status till \"Frånvarande-Inaktiv\" vid inaktivitet" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Ändra status till \"Fr&ånvarande-Overksam\" när overksam" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Om aktiverad, din status kommer att ändras automatiskt till \"Frånvarande-" -"Inaktiv\" när du inte använder datorn på ett par minuter." - -# settings/alertswidget.cpp:109 rc.cpp:109, no-c-format -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Bli inaktiv efter" - -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" "Kontrollerar antalet minuter innan KMess ändrar statusen till \"Frånvarande-" -"Inaktiv\"." +"Overksam\"." + +# settings/alertswidget.cpp:109 rc.cpp:109, no-c-format +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Bli overksam efter" # settings/alertswidget.cpp:110 rc.cpp:112, no-c-format -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 msgid "minutes" msgstr "minuter" +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your 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:476 +msgid "Saved accounts:" +msgstr "Sparade konton:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" + +# settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "L&ägg till konto..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "R&edigera" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +#, 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:500 +msgid "&Remove" +msgstr "Ta bo&rt" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" + # rc.cpp:127, no-c-format -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" msgstr "Chattloggning" -# settings/chatloggingwidget.cpp:119 rc.cpp:130, no-c-format -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "Logga &alla chattar" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -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:120 rc.cpp:133, no-c-format -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Spara chattfiler i följande katalog:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 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." - -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Organisera chattmappar med:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Spara chatt till &fil" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Spara chatt till &fil" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +#, fuzzy +msgid "Plain Text" +msgstr "Hitta &text" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Separera sparade chattar genom:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" msgstr "" -"KMess skapar automatiskt underkataloger när du väljer att organisera " -"chattkatalogen efter år, månad eller dag." # settings/chatloggingwidget.cpp:123 rc.cpp:142, no-c-format -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 msgid "Year" msgstr "År" -# settings/chatloggingwidget.cpp:124 rc.cpp:145, no-c-format -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Månad" +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" -# settings/chatloggingwidget.cpp:125 rc.cpp:148, no-c-format -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Dag" +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" # settings/chatloggingwidget.cpp:126 rc.cpp:151, no-c-format -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Spara alla chattloggar i följande katalog" +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Spara direkt i specificerad katalog" -# settings/chattingwidget.cpp:185 rc.cpp:157, no-c-format -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "Ditt meddelandetypsnitt:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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:188 rc.cpp:162, no-c-format -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Tvinga kontakters meddelanden att använda det här typsnittet:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." 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." -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Chattstil:" +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your 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:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "Spara chattfiler i katalog:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "St&il" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 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." -# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Vi&sa grafik i chattmeddelanden" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:624 +#, fuzzy +msgid "&Chat style:" +msgstr "&Chattstil:" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "Chattinställningar" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." msgstr "Aktiverar synlighet för uttryckssymboler i chattkonversationer." -# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Visa tid i c&hattmeddelanden" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:636 +msgid "&Show emoticons" +msgstr "Vi&sa uttryckssymboler" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Aktiverar synligheten för tidsstämplar i varje chattmeddelande" +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "Visa &uttryckssymboler" -# settings/chattingwidget.cpp:192 rc.cpp:170, no-c-format -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" -"Använd typsnitteffekter i meddelanden, dvs. *fet*, /kursiv/ och " -"_understruken_" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, fuzzy 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." - -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "&Gruppera följ-uppmeddelanden från samma kontakt" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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." +"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." -# settings/emailwidget.cpp:108 rc.cpp:207, no-c-format -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "E-postklient" +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:648 +msgid "&Group follow-up messages from the same contact" +msgstr "&Gruppera följ-uppmeddelanden från samma kontakt" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:654 +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:657 +#, 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:663 +msgid "Show &date" msgstr "" -"Tillåter dig att välja vilket e-postprogram KMess ska öppna för att läsa e-" -"postmeddelanden." -# settings/emailwidget.cpp:109 rc.cpp:210, no-c-format -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Använd Hotmail" +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "Vi&sa uttryckssymboler" -# settings/emailwidget.cpp:110 rc.cpp:213, no-c-format -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Använd ett specifikt kommando:" +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "&Text" -# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "E-postnotifikation" +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +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/emailwidget.cpp:112 rc.cpp:219, no-c-format -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "Visa e-postinformation" +# settings/chattingwidget.cpp:185 rc.cpp:157, no-c-format +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "Ditt &meddelandeteckensnitt:" -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, 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." +"This option allows you to override the font style and color of your " +"contacts' messages with 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:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, 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:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Kontakthändelser" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +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:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +#, fuzzy +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "MSN Plus-formatering" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" +"

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. " +"Inaktivera 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 " +"bara chattfönstret vid den första knuffen.

" + +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Skaka chattf&önstret när en knuff tas emot eller skickas" + +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +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 "" + +# settings/imagewidgetinterface.cpp:104 rc.cpp:228, no-c-format +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Visa inte en visningsbild" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "G&ruppera meddelanden i samma fönster:" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "Alltid" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "För kontakter i samma grupp" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "Aldrig" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Visningsbild:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail 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." -# settings/emailwidget.cpp:113 rc.cpp:222, no-c-format -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "Visa meddelande när ett e-postmeddelande mottas i \"andra mappar\"" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Visa antal olästa e-postbrev" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +#, fuzzy msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." 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." +"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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +#, fuzzy +msgid "Show contacts w&hich song I am listening to" +msgstr "Informera &kontakter om vilken låt jag lyssnar på" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +#, fuzzy +msgid "List Formatting" +msgstr "MSN Plus-formatering" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +#, fuzzy +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "MSN Plus-formatering" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" -msgstr "Visa &Uttryckssymbolteman" +msgstr "Visa &uttryckssymbolteman" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "Tillgängliga uttryckssymbolstilar" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" +msgstr "Tillgängliga uttryckssymbolstilar:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" msgstr "Egna uttry&ckssymboler" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Egna uttryckssymboler för det här kontot:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Tillgängliga uttryckssymbolstilar:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "Lägg till ny..." - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Klicka" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +#, fuzzy +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" +"dina kontakter." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, 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:787 +#, 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:790 msgid "Re&name" -msgstr "Döp om" +msgstr "Byt &namn" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "Klicka här för att döpa om den valda uttryckssymbolen" +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +#, fuzzy +msgid "Click here to delete the selected emoticon" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" -msgstr "Ta bort" +msgstr "Ta &bort" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "Webbläsare" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +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: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "&Använd KDE:s förvalda webbläsare" + +#. 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:814 rc.cpp:849 +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: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:817 +msgid "&Use an installed browser:" +msgstr "A&nvänd en installerad webbläsare:" + +#. 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:820 rc.cpp:855 +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: 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:823 rc.cpp:858 +msgid "&Specify a custom command:" +msgstr "An&ge ett eget kommando:" + +#. 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:827 rc.cpp:862 #, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Välj en uttryckssymbol och klicka är för att ta bort den" +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 ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 #, no-c-format -msgid "says:" -msgstr "säger:" +msgid "Use '%u' to insert the URL in the command line." +msgstr "Använd \"%u\" för att infoga URL:en i kommandoraden." -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Bläddra och beskär bild..." +# settings/emailwidget.cpp:108 rc.cpp:207, no-c-format +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "E-postklient" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Visningsbild" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Nerladdning av visningsbild misslyckades" - -#: settings/accountswidget.cpp:486 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" -msgstr "" -"Ett fel inträffade vid försök att ändra visningsbild.\n" -"Kontrollera så du valt en korrekt bildfil" - -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Inställningar" - -# settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, -# -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Konto" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Chattar" - -#: settings/settingsdialog.cpp:747 -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/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Hej, hur mår du? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Bra!" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +#, fuzzy +msgid "Use &Live Mail if the account supports it" +msgstr "Använd Live Mail om kontot stödjer det" -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Jag kom /precis/ tillbaka från min semester i Italien!" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +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." -#: systemtraywidget.cpp:91 +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +#, fuzzy +msgid "Use the &KDE default email client" +msgstr "&Använd KDE:s förvalda e-postklient" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "A&nvänd en installerad e-postklient:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "Använd \"%u\" för att infoga e-postadressen i kommandoraden." + +# settings/chatloggingwidget.cpp:120 rc.cpp:133, no-c-format +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +msgid "&Save all received files in one directory:" +msgstr "&Spara alla mottagna filer i katalog:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +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:881 +msgid "and" +msgstr "och" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "för filöverföringar" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 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:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Docka i Systempanelen" - -# -#: systemtraywidget.cpp:278 -msgid "%1 %2" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" msgstr "" +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "Ditt namn" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "Ditt konto är avstängt." + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "&Bilder" + +# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Inga meddelanden ännu" + +#, fuzzy +#~ msgid "&Do not filter" +#~ msgstr "Använ&d inte" + +#, 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" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Egna uttryckssymboler för det här kontot:" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Lägg till &uttryckssymbol..." + +#~ msgid "Ed&it Notes" +#~ msgstr "Red&igera anteckningar" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Visningsbild" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "Sök efter kontakt" + +#~ msgid "Search by &Interest" +#~ msgstr "Sök genom &intresse" + +# settings/accountswidget.cpp:99 rc.cpp:91, no-c-format +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "Din e-postadress" + +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "" +#~ "Kontakten initierade en MSN6-funktion som KMess inte kan hantera ännu." + +#~ 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." + +#, 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" + +#, 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" + +#~ 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." + +#~ 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:" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "" +#~ "Tillåter dig att välja vilket e-postprogram KMess ska öppna för att läsa " +#~ "e-postmeddelanden." + +# settings/emailwidget.cpp:110 rc.cpp:213, no-c-format +#~ msgid "Use a specified command:" +#~ msgstr "Använd ett specifikt kommando:" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "Det här kontot har inte en Hotmail-inkorg!" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "E-post" + +#~ msgid "Remove group" +#~ msgstr "Ta bort grupp" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Visningsbild" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "Du har 1 nytt e-postmeddelande i din inkorg." + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "Du har %1 nya e-postmeddelanden i din inkorg." + +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "Överföringen av %1 misslyckades. Kunde inte öppna fil" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Sidopanel" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "Ny &Kontakt" + +#~ msgid "Enter your login information:" +#~ msgstr "Skriv in din inloggningsinformation:" + +# settings/accountswidget.cpp:98 rc.cpp:88, no-c-format +#~ msgid "Your friendly name:" +#~ msgstr "Ditt visningsnamn:" + +#~ msgid "Your password:" +#~ msgstr "Ditt lösenord:" + +#~ msgid "Status to set at login:" +#~ msgstr "Status att sätta vid inloggning:" + +# settings/emailwidget.cpp:113 rc.cpp:222, no-c-format +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Visa notifikationer när du får e-post" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Organisera chattmappar med:" + +# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Vi&sa grafik i chattmeddelanden" + +# settings/emailwidget.cpp:109 rc.cpp:210, no-c-format +#~ msgid "Use Hotmail" +#~ msgstr "Använd Hotmail" + +#~ msgid "says:" +#~ msgstr "säger:" + +#~ msgid "Current name: " +#~ msgstr "Aktuellt namn: " + +#, 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 kunde inte ansluta till MSN Messenger tjänsten.\n" +#~ "Vänligen kontrollera att du är ansluten till Internet.\n" +#~ "Systemfel: %1 (kod %2)." + +#~ msgid "The remote server has closed the connection." +#~ msgstr "Servern har stängt anslutningen" + +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Vista MSN Messenger-tjänststatus?" + +#~ msgid "Received user confirmation" +#~ msgstr "Mottog användarbekräftelse" + +#~ msgid "Transfer to notification server" +#~ msgstr "Överför till notifikationsservern" + +#~ msgid "The server is too busy" +#~ msgstr "Servern är för upptagen" + +#~ msgid "The server is unavailable" +#~ msgstr "Servern är inte tillgängligt" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "KMess mottog ett okänt felmeddelande från servern: %1" + +#~ msgid "Warning: Server closes for maintenance in 1 minute!" +#~ msgstr "Varning: Serven stänger ner för underhåll om 1 minut!" + +# dialogs/contactaddeduserdialoginterface.cpp:71 rc.cpp:57, no-c-format +#~ msgid "Add contact" +#~ msgstr "Lägg till kontakt" + +# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "E-postnotifikation" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "Christian Lundgren" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "zeflunk@gmail.com" + +#~ msgid "Show/Hide &Contact Sidebar" +#~ msgstr "Visa/Dölj &Kontaktpanelen" + +#~ msgid "Away - Idle" +#~ msgstr "Frånvarande - Inaktiv" + +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "Den angivna e-postadressen var inte giltig!" + +#~ msgid "(Away)" +#~ msgstr "(Frånvarande)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Strax Tillbaka)" + +#~ msgid "(Busy)" +#~ msgstr "(Upptagen)" + +#~ msgid "(Invisible)" +#~ msgstr "(Osynlig)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Frånvarande - Inaktiv)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(På Lunch)" + +#~ msgid "(On the Phone)" +#~ msgstr "(Pratar i Telefon)" + #~ msgid "The current status of your contact." #~ msgstr "Nuvarande status för din kontakt." +#, fuzzy +#~ msgid "The contact is listening to music" +#~ msgstr "Kontakten finns inte på din lista" + #~ msgid "File transfer dialog message" #~ msgstr "Filöverföringsdialogmeddelande" diff --git a/po/th.po b/po/th.po index dd92d37..318d860 100644 --- a/po/th.po +++ b/po/th.po @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" +"Project-Id-Version: th\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" "PO-Revision-Date: 2003-02-11 11:29+0700\n" "Last-Translator: Rachan Hongpairote \n" "Language-Team: THAI \n" @@ -16,533 +16,1288 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 0.9.6\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "ราชันย์ หงษ์ไพโรจน์" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "rachanh@yahoo.com" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "ตอนนี้ไม่อยู่หน้าคอมฯ" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "ชื่อคุณ" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "เข้าสู่ระบบ ..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "ตอนนี้ไม่อยู่หน้าคอมฯ" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "&ลบผู้ติดต่อ" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "ง่วงนอน" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "คุณไม่สามารถทำการเชื้อเชิญเพราะว่ามีหลายคอนเท็กท์ในห้องสนทนานี้" + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "%1 เข้าร่วมวงสนทนา" + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "การสนทนาว่างลง, %1 ออกจากการสนทนา" + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 ออกจากการสนทนา" + +#: chat/chat.cpp:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 และ %2 กำลังพิมพ์" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "" + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "(ข้อความนี้ถูกส่งโดยอัตโนมัติ)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "คุณได้รับวิงค์จาก %1" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "คุณได้รับวิงค์จาก %1" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr " ออนไลน์" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr " ออนไลน์" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr " ออนไลน์" + +#: chat/chat.cpp:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "ไม่สามารถแสดงวิงค์ได้ เพราะไม่สามารถอ่านข้อมูลได้" + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "ไม่สามารถแสดงวิงค์ได้ เพราะไม่สามารถอ่านข้อมูลได้" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr " ออนไลน์" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr " ออนไลน์" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "ไม่สามารถแสดงวิงค์ได้ เพราะไม่สามารถอ่านข้อมูลได้" + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 เข้าร่วมวงสนทนา" + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 เข้าร่วมวงสนทนา" + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr " ออนไลน์" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 เข้าร่วมวงสนทนา" + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "ไม่สามารถส่งข้อความ '%1'" + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "คุณได้ทำการส่ง nudge ไปให้ %1 !" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "ส่ง nudge" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 กำลังส่งวิงค์ %2" -#: chat/chatmessagestyle.cpp:296 -#, fuzzy +#: chat/chatmessagestyle.cpp:382 +#, fuzzy, kde-format msgid "%1 says:" msgstr "%1 พูด: " -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "ส่&งไฟล์" + +#: chat/chatmessageview.cpp:1065 utils/richtextparser.cpp:653 +#, fuzzy, kde-format msgid "Add this emoticon: %1" msgstr "เพิ่มไอคอนแสดงอารมณ์" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "เชื่อมต่อ" + +#: chat/chatview.cpp:300 +#, fuzzy, kde-format 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:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, fuzzy, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "เขียนทับไฟล์" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 #, fuzzy msgid "Add this &Emoticon..." msgstr "เพิ่ม&ไอคอนแสดงอารมณ์" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "เพิ่ม&ไอคอนแสดงอารมณ์" + +#: chat/chatview.cpp:834 #, fuzzy msgid "Send &Email" msgstr "&ส่งอีเมล์" -#: chat/chatview.cpp:926 +#: chat/chatview.cpp:838 #, fuzzy -msgid "Copy E&mail" -msgstr "ก๊อปปี้อีเมล์" +msgid "Add &Contact" +msgstr "&เพิ่มผู้ติดต่อ" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "อีเมล์:" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "เข้าไปที่ลิงก์" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "ก๊อปปี้เอ็ดเดรส" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +#, fuzzy +msgid "&Copy Text" msgstr "ก๊อปปี้ข้อความเท็กซ์" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "เลือกทั้งหมด" -#: chat/chatview.cpp:948 +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "ยกเลิกแท็บ" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." msgstr "ส่&งไฟล์" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "สนทนา" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "คุณไม่สามารถทำการเชื้อเชิญเพราะว่ามีหลายคอนเท็กท์ในห้องสนทนานี้" - -#: chat/chatwindow.cpp:260 -#, fuzzy -msgid "%1 has joined the chat." -msgstr "%1 เข้าร่วมวงสนทนา" - -#: chat/chatwindow.cpp:311 -#, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "การสนทนาว่างลง, %1 ออกจากการสนทนา" - -#: chat/chatwindow.cpp:315 -#, fuzzy -msgid "%1 has left the chat." -msgstr "%1 ออกจากการสนทนา" - -#: chat/chatwindow.cpp:575 -#, fuzzy -msgid "%1 - Chat" -msgstr "สนทนา" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 #, fuzzy msgid "Contacts" msgstr "ผู้ติดต่อ" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "ไอคอนแสดงอารมณ์" -#: chat/chatwindow.cpp:799 +#: chat/chatwindow.cpp:128 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "ไอคอนแสดงอารมณ์ของฉัน" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr "(ข้อความนี้ถูกส่งโดยอัตโนมัติ)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" +"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:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "ไม่สามารถแสดงวิงค์ได้ เพราะไม่สามารถอ่านข้อมูลได้" - -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "คุณได้รับวิงค์จาก %1" - -#: chat/chatwindow.cpp:1791 +#: chat/chatwindow.cpp:340 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "ไม่สามารถส่งข้อความ '%1'" +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "ปิดแท็บ" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "คุณได้รับ nudge จาก %1 !" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "คุณได้ทำการส่ง nudge ไปให้ %1 !" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "ส่ง nudge" - -#: chat/chatwindow.cpp:1976 +#: chat/chatwindow.cpp:341 #, fuzzy -msgid "%1 is typing." -msgstr "%1 กำลังพิมพ์" +msgid "Close All Tabs" +msgstr "ปิดแท็บ" -#: chat/chatwindow.cpp:1985 +#: chat/chatwindow.cpp:342 #, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1 และ %2 กำลังพิมพ์" +msgid "Close Current Tab" +msgstr "ปิดแท็บ" -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 และ %3 อื่น ๆ กำลังพิมพ์" +#: chat/chatwindow.cpp:451 +#, fuzzy +msgid "&Invite..." +msgstr "เ&ชื้อเชิญ" -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +#: chat/chatwindow.cpp:452 +#, fuzzy +msgid "Send a &File..." msgstr "ส่&งไฟล์" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +#, fuzzy +msgid "Webcam Chat" +msgstr "บันทึกการสนทนา" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "เริ่มต้นการประชุม" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 #, fuzzy msgid "Send a &Nudge!" msgstr "ส่ง Nudge !" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "เริ่ม หรือ หยุด การสนทนา" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:456 +#, fuzzy +msgid "Save Chat..." msgstr "บันทึกการสนทนา" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "เ&ชื้อเชิญ" +#: chat/chatwindow.cpp:457 +#, fuzzy +msgid "Close &All Tabs" +msgstr "ปิดแท็บ" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&สนทนา" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "เปลี่ยน&ฟอนต์" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "เปลี่ยนสีฟ&อนต์" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "เพิ่มไอคอนแสดงอารมณ์" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "แสดงเวลาบนข้อความ" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "แสดงหรือซ่อนแถบผู้ติดต่อ" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:484 +#, fuzzy +msgid "Meeting" +msgstr "กำหนดค่า" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "ส่&งไฟล์" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "ค้น&หารายชื่อ" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "ผู้ติดต่อ" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "ค้น&หารายชื่อ" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "ไอคอนแสดงอารมณ์" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "ค้น&หารายชื่อ" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "ไอคอนแสดงอารมณ์ของฉัน" + +#: chat/chatwindow.cpp:533 +#, fuzzy +msgid "&Font" +msgstr "&เชื่อมต่อ" + +#: chat/chatwindow.cpp:534 +#, fuzzy +msgid "Font &Color" +msgstr "เปลี่ยนสีฟ&อนต์" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "ยกเลิกแท็บ" + +#: chat/chatwindow.cpp:603 +#, fuzzy +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "เริ่ม หรือ หยุด การสนทนา" + +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "สนทนา" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "สนทนา" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1 กำลังพิมพ์" + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 และ %2 กำลังพิมพ์" + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 และ %3 อื่น ๆ กำลังพิมพ์" + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "เริ่มต้นการประชุม" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" msgstr "&ส่งอีเมล์" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/contactframe.cpp:299 kmessview.cpp:601 #, fuzzy msgid "&View Profile" msgstr "&แสดงโปรไฟล์" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&พรอฟเพอรตี้" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "&เพิ่มผู้ติดต่อ" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 #, fuzzy msgid "A&llow Contact" msgstr "&ผู้ติดต่อรับอนุญาต" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 #, fuzzy msgid "&Delete Contact" msgstr "&ลบผู้ติดต่อ" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "&บล๊อคผู้ติดต่อ" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "&ยกเลิกการบล๊อคผู้ติดต่อ" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 #, fuzzy msgid "&Friendly Name" msgstr "ชื่อเล่น: " -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 #, fuzzy msgid "&Email Address" msgstr "อีเมล์:" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +#, fuzzy +msgid "&Information" +msgstr "แสดงข้อมูลอีเมล์ในรายชื่อผู้ติดต่อ" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "แสดงรูปภาพ" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +#, fuzzy +msgid "&Notes" +msgstr "โน้ต" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "ไอคอนแสดงอารมณ์" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" msgstr "ก๊อปปี้" -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#: chat/contactframe.cpp:753 #, fuzzy msgid "Blocked" msgstr "(บล๊อค)" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "ไม่อยู่" +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "เดี๋ยวกลับมาใหม่" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "กำลังยุ่ง" +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "เพิ่มผู้ติดต่อ" -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "ออฟไลน์" +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "เอคเค้าท์" -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "(ว่าง - ไม่อยู่หน้าคอมฯ)" +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "" -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "ไปกินข้าว" +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +#, fuzzy +msgid "Remove" +msgstr "เอาออก" -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:353 +msgid "Windows Live Messenger compatible" +msgstr "" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 msgid "Online" msgstr "ออนไลน์" -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "กำลังยุ่ง" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "ไม่อยู่" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "ว่าง" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "เดี๋ยวกลับมาใหม่" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "กำลังคุยโทรศัพท์" -#: chat/contactframe.cpp:558 -msgid "The contact is %1" -msgstr "" +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "ไปกินข้าว" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "รูปแบบข้อความสนทนา" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "ไม่แสดง" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "เอคเค้าท์นี้ไม่มีตู้จดหมาย hotmail" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "ออฟไลน์" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&สถานะ" + +#: contact/msnstatus.cpp:218 #, fuzzy -msgid "Add a contact" +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "&ยกเลิกการเชื่อมต่อ" + +#: dialogs/addcontactdialog.cpp:49 +#, fuzzy +msgid "Add a Contact" msgstr "เพิ่มผู้ติดต่อ" -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "ใส่อีเมล์ของบุคคลที่ต้องการจะเพิ่ม: " - -#: dialogs/addcontactdialog.cpp:88 -#, fuzzy -msgid "The e-mail address given was invalid!" -msgstr "ชื่อผู้ใช้ที่ให้ ไม่ถูกต้อง" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 #, fuzzy msgid "Add New Emoticon" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "ไอคอนแสดงอารมณ์" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "ไอคอนแสดงอารมณ์ \"%1\" มีอยู่แล้ว ต้องการทับหรือไม่?" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "เจาะจงข้อความเมื่อไม่อยู่" -#: dialogs/awaymessagedialog.cpp:37 +#: dialogs/chathistorydialog.cpp:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "รูปแบบข้อความสนทนา" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"บันทึกข้อความที่ซึ่งจะถูกส่งโดยอัตโนมัติ \n" -"ถึงคนที่พยายามส่งข้อความถึงคุณ" -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "เลือกชื่อสำหรับบุคคลนี้" +#: dialogs/chathistorydialog.cpp:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "ผิดพลาด ไม่สามารถเปิดไฟล์ " -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "แสดงหน้าต่างป๊อปอัพเมื่อบุคคลนี้ออนไลน์หรือออฟไลน์" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "เข้าสู่ระบบ ..." -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "รูปภาพ: " +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "บันทึกทุกการสนทนา" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "เสียง: " +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" -#: dialogs/contactpropertiesdialog.cpp:229 +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "ได้มีการเพิ่มคุณเข้าไปยังรายชื่อผู้ติดต่อ คุณต้องการที่จะ " + +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "ได้มีการเพิ่มคุณเข้าไปยังรายชื่อผู้ติดต่อ คุณต้องการที่จะ " + +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" msgstr "คุณสมบัติคอนเท็กท์สำหรับ %1" -#: dialogs/contactpropertiesdialog.cpp:261 +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "เชื่อมต่อ" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 #, fuzzy -msgid "Email address: " +msgid "No messages yet" +msgstr "แสดงเวลาบนข้อความ" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "อีเมล์:" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "ชื่อปัจจุบัน: " +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "เมล์ไคลเอนต์" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" + +#: dialogs/contactpropertiesdialog.cpp:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "ผู้ติดต่อ" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "ผู้ติดต่อ" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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, kde-format +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 "ค้น&หารายชื่อ" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "หน้าต่างเน็ทเวิร์ก" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" msgstr "บันทึกแท็บ" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" msgstr "ยกเลิกแท็บ" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" msgstr "ปิดแท็บ" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." +#: dialogs/networkwindow.cpp:1086 +#, fuzzy +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." msgstr "ไม่มีการเชื่อมต่อในขณะนี้ ไม่สามารถเปิดหน้าต่างเน็ทเวิร์กได้" -#: dialogs/networkwindow.cpp:928 +#: dialogs/networkwindow.cpp:1130 +#, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" "ไม่สามารถบันทึกล๊อคไฟล์เกี่ยวกับระบบเน็ทเวิร์กได้ ให้แน่ใจว่าคุณมีสิทธิ์ในการเขียนทับแฟ้มที่กำลังจะบันทึก" -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "ไม่สามารถปิดหน้าต่างการเชื่อมต่อหลักได้" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +#, fuzzy +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:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "คอมพิวเตอร์" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 #, fuzzy msgid "File Transfers" msgstr "ไฟล์ส่งออก" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "สับสน" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&ลบผู้ติดต่อ" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "แสดงรูปภาพ" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "แสดงรูปภาพ" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -550,2495 +1305,5415 @@ msgstr "" "ไม่สามารถบันทึกรูปแบบไอคอนแสดงอารมณ์ ให้แน่ใจว่าคุณมีสิทธิ์ในการเขียนทับแฟ้มรูปแบบ (theme) '%" "1'." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 #, fuzzy msgid "Smile" msgstr "ยิ้ม" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "วิงค์" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "แลบลิ้น" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "ยิ้มปากกว้าง" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 #, fuzzy msgid "Sad" msgstr "เสียใจ" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "ร้องไห้" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "โกรธ" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "สับสน" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "เขิน" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 #, fuzzy msgid "Disappointed" msgstr "ยกเลิก" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "น่าเบื่อ" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "ป่วย" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "ประหลาดใจ" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "ปาร์ตี้" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "ง่วงนอน" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "กำลังคิด" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "ห้ามบอกคนอื่น" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 #, fuzzy msgid "Secret telling" msgstr "บอกความลับ" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "กรอกตาไปมา" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "ไม่ทราบ" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 #, fuzzy msgid "Be right back" msgstr "เดี๋ยวกลับมาใหม่" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "นางฟ้า" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "กอด" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "ผู้ชาย" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "หัวใจเต้นแรง" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "กุหลาบแดง" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "หน้าหมา" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 #, fuzzy msgid "Sun" msgstr "อาทิตย์" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "ปีศาจ" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "กอด" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "ผู้หญิง" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "อกหัก" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "หน้าแมว" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "ปากแดง" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 #, fuzzy msgid "Clapping" msgstr "ปรบมือ" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "อัตโนมัติ" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "เครื่องบิน" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "เต่า" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 #, fuzzy msgid "Snail" msgstr "หอยทาก" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "แกะดำ" +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "ง่วงนอน" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "แพะ" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "ค้างคาวดูดเลือด" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "พิชซ่า" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "ถังเบียร์" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "แก้วมาตินี่" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "แก้วกาแฟ" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "เค้กวันเกิด" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "จาน" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "ถ้วย" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "ดาว" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "รุ้ง" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "เมฆฝน" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "ฟ้าแลบ" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "ร่ม" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "ต้นปาร์มบนเกาะ" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "เครื่องรับโทรศัพท์" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "โทรศัพท์มือถือ" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "อีเมล์" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 #, fuzzy msgid "Clock" msgstr "นาฬิกา" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 #, fuzzy msgid "Camera" msgstr "กล้อง" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "แผ่นฟิมล์" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "โน้ต" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "กุญแจมือ" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 #, fuzzy msgid "Money" msgstr "เงิน" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "หลอดไฟ" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +#, fuzzy +msgid "Cigarette" msgstr "บุหรี่" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "ลูกฟุตบอล" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "คอมพิวเตอร์" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" msgstr "ไอคอน KMess" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" msgstr "" -#: kmess.cpp:288 kmess.cpp:292 +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" + +#: initialview.cpp:380 #, fuzzy -msgid "Add a group" +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&เชื่อมต่อ" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "อีเมล์:" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "อีเมล์:" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "แสดงข้อมูลอีเมล์ในรายชื่อผู้ติดต่อ" + +#: kmess.cpp:248 +#, fuzzy +msgid "New Group" +msgstr "&กลุ่มใหม่" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "&เพิ่มกลุ่ม" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "บันทึกชื่อใหม่สำหรับกลุ่มนี้: " -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "ว่าง" - -#: kmess.cpp:715 -#, fuzzy +#: kmess.cpp:576 +#, fuzzy, kde-format msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "คุณแน่ใจที่จะทำการลบกลุ่มนี้ ?" -#: kmess.cpp:718 +#: kmess.cpp:578 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "&ลบผู้ติดต่อ" -#: kmess.cpp:720 +#: kmess.cpp:580 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "เอาออกและบล๊อค" -#: kmess.cpp:760 -#, fuzzy +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" msgstr "คุณแน่ใจที่จะทำการลบกลุ่มนี้ของจากรายชื่อ ?" -#: kmess.cpp:763 +#: kmess.cpp:636 #, fuzzy -msgid "Remove group" -msgstr "&ลบกลุ่ม" +msgctxt "dialog button" +msgid "Remove" +msgstr "เอาออก" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "นี่เป็นกลุ่มพิเศษและไม่สามารถเปลี่ยนแปลงได้" -#: kmess.cpp:805 kmess.cpp:809 +#: kmess.cpp:676 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "เ&ปลี่ยนชื่อกลุ่ม" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "บันทึกชื่อใหม่สำหรับกลุ่มนี้: " + +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "การขอ Authentication ไม่สำเร็จ" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." msgstr "เชื่อมต่อ" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "ยกเลิกการเชื่อมต่อ" -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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:1448 +#, kde-format +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:1673 +#: kmess.cpp:1460 +#, kde-format +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:1466 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "เกิดข้อผิดพลาดกับระบบแจ้งเตือน" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "&เอคเค้าท์ใหม่" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "ไอคอน KMess" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "ผู้ติ&ดต่อใหม่" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "&กลุ่มใหม่" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "ค้น&หารายชื่อ" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "ค้นหาจากสิ่งที่&สนใจ" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "&ตั้งค่าเอคเค้าท์" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "เ&อคชั่น" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "เชื่อ&มต่อ" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "&ยกเลิกการเชื่อมต่อ" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "แสดง&โปรไฟล์" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&สถานะ" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "&เชื่อมต่อ" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "&ยกเลิกการเชื่อมต่อ" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "แสดง&โปรไฟล์" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "แสดงรายชื่อที่อนุญาต" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 #, fuzzy msgid "Show &Offline Contacts" msgstr "แสดงรายชื่อที่ออฟไลน์" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "&แสดงและลบรายชื่อ" -#: kmessinterface.cpp:278 +#: kmessinterface.cpp:170 #, fuzzy -msgid "Show &Display Pictures" +msgid "Show &History Box" +msgstr "รูปแบบข้อความสนทนา" + +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" msgstr "แสดงรูปภาพ" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "แสดงหน้าต่างเน็ทเวิร์ก" - -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "&เรียงรายชื่อโดย" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "แสดงหน้าต่างส่งไฟล์" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "ผู้ติ&ดต่อใหม่" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "&กลุ่มใหม่" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "ค้น&หารายชื่อ" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "รูปแบบข้อความสนทนา" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "&เอคเค้าท์ใหม่" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "&เอคเค้าท์ใหม่" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "ยิ้ม" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "กลุ่ม" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "ออนไลน์ / ออฟไลน์" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "แสดงหน้าต่างส่งไฟล์" - -#: kmessview.cpp:113 -msgid "Now listening to %1" +#: kmessinterface.cpp:199 +msgid "Mixed" msgstr "" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "(ใส่ข้อความที่นี่)" +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "แสดงหน้าต่างเน็ทเวิร์ก" -#: kmessview.cpp:613 +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "" + +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "" + +#: kmessview.cpp:599 #, fuzzy msgid "Cha&t" msgstr "สนทนา" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&พรอฟเพอรตี้" - -#: kmessview.cpp:623 +#: kmessview.cpp:610 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "&ลบออกจากกลุ่ม" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "ย้ายไปยัง&กลุ่ม" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 #, fuzzy msgid "&Copy to Group" msgstr "ย้ายไปยัง&กลุ่ม" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "ย้ายไปยัง&กลุ่ม" + +#: kmessview.cpp:695 #, fuzzy msgid "Move Group &Down" msgstr "ย้ายไปยัง&กลุ่ม" -#: kmessview.cpp:675 +#: kmessview.cpp:696 #, fuzzy msgid "Move Group &Up" msgstr "ย้ายไปยัง&กลุ่ม" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "&ลบกลุ่ม" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "เ&ปลี่ยนชื่อกลุ่ม" -#: kmessview.cpp:1723 +#: kmessview.cpp:1136 #, fuzzy -msgid "You have 1 new e-mail in your inbox." -msgstr " มีอีเมล์ใหม่ในกล่องเมล์" +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: kmessview.cpp:1727 +#: kmessview.cpp:1145 #, fuzzy -msgid "You have %1 new emails in your inbox." -msgstr " เมล์ใหม่ในกล่องรับเมล์" +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "อีเมล์:" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(ไม่อยู่หน้าเครื่องฯ)" - -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(เดี๋ยวกลับมาใหม่)" - -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(กำลังยุ่ง)" - -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(ไม่แสดง)" - -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(กำหนดว่าง - ไม่อยู่หน้าคอมฯ)" - -#: kmessview.cpp:1786 +#: kmessview.cpp:1152 #, fuzzy -msgid "(Out to Lunch)" -msgstr "(ไปกินข้าว)" +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "เมล์ไคลเอนต์" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(กำลังคุยโทรศัพท์)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "ล๊อคอินโดยอัตโนมัติด้วยอีเมล์นี้" +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "โน้ต" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "(บล๊อค)" + +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "" + +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "แสดงเวลาบนข้อความ" + +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "" + +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "ผู้ติดต่อ" +msgstr[1] "ผู้ติดต่อ" + +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "ผู้ติดต่อ" +msgstr[1] "ผู้ติดต่อ" + +#: kmessview.cpp:1651 +#, fuzzy +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "(ใส่ข้อความที่นี่)" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "คุณได้ทำการยกเลิก" + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "รูปแบบข้อความสนทนา" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +#, fuzzy +msgid "Current developer" +msgstr "นักพัฒนา Gnome Meeting" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "แปลเป็นภาษาเยอรมัน, ทดสอบ, เอกสาร" -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" msgstr "" -#: main.cpp:81 +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:74 msgid "Cartoon emoticons" msgstr "การ์ตูนไอคอนแสดงอารมณ์" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "รูปแบบเสียงมาตรฐาน" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "แปลเป็นอารบิก" -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 #, fuzzy msgid "More Arabic translation" msgstr "แปลเป็นภาษาตุรกี" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "แปลเป็นภาษาบลาซิล โปรตุเกส" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "แปลเป็นภาษาบลาซิล โปรตุเกส" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 #, fuzzy msgid "Catalan translation" msgstr "แปลเป็นคาตาลาน" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "แปลเป็นภาษาอิตาเลี่ยน" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "แปลเป็นจืน" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 #, fuzzy msgid "More Simplified Chinese translation" msgstr "แปลเป็นจืน" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 #, fuzzy msgid "Traditional Chinese translation" msgstr "แปลเป็นภาษาจีน" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "แปลเป็นภาษาจีน" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 #, fuzzy msgid "Danish translation" msgstr "แปลเป็นภาษาเดนมาร์ก" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 #, fuzzy msgid "More Danish translation" msgstr "แปลเป็นภาษาเดนมาร์ก" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "แปลเป็นภาษาดัชท์" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 #, fuzzy msgid "More Dutch translation" msgstr "แปลเป็นภาษาดัชท์" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "แปลเป็นภาษาตุรกี" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "แปลเป็นภาษาฝรั่งเศส" + +#: main.cpp:111 #, fuzzy msgid "Estonian translation" msgstr "แปลเป็นภาษาเอสโทเนีย" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 #, fuzzy msgid "Finnish translation" msgstr "แปลเป็นภาษาฟินแลนด์" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 #, fuzzy msgid "More Finnish translation" msgstr "แปลเป็นภาษาฟินแลนด์" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "แปลเป็นภาษาฝรั่งเศส" -#: main.cpp:106 +#: main.cpp:117 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "แปลเป็นภาษาฝรั่งเศส" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 #, fuzzy msgid "More French translation" msgstr "แปลเป็นภาษาฝรั่งเศส" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 #, fuzzy msgid "Hungarian translation" msgstr "แปลเป็นภาษาฮังกาเลี่ยน" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "แปลเป็นภาษาฮังกาเลี่ยน" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 #, fuzzy msgid "More Italian translation" msgstr "แปลเป็นภาษาอิตาเลี่ยน" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 #, fuzzy msgid "Korean translation" msgstr "แปลเป็นภาษาเกาหลี" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 #, fuzzy msgid "Norsk Bokmål translation" msgstr "แปลเป็นภาษา Norsk Bokml" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "แปลเป็นภาษาสโลวาเกีย" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "แปลเป็นภาษาสโลวาเกีย" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 #, fuzzy msgid "Slovenian translation" msgstr "แปลเป็นภาษาสโลวาเกีย" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 msgid "Spanish translation" msgstr "แปลเป็นภาษาสเปน" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 #, fuzzy msgid "More Spanish translation" msgstr "แปลเป็นภาษาสเปนอื่น ๆ" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 #, fuzzy msgid "Swedish translation" msgstr "แปลเป็นภาษาสวีเดน" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "แปลเป็นภาษาสวีเดน" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 #, fuzzy msgid "Thai translation" msgstr "แปลเป็นภาษาไทย" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 msgid "Turkish translation" msgstr "แปลเป็นภาษาตุรกี" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 #, fuzzy msgid "More Turkish translation" msgstr "แปลเป็นภาษาตุรกี" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "ออนไลน์" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "ไฟล์ส่งออก" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "ได้รับรหัสไฟล์ต้นฉบับ" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "รูปแบบข้อความสนทนา" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "แปลเป็นอารบิก" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "" -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "นักพัฒนา Gnome Meeting" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" msgstr "" -#: main.cpp:140 +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "" + +#: main.cpp:174 msgid "Idle timer code" msgstr "" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:179 #, fuzzy msgid "Your name here?" msgstr "ชื่อคุณที่นี่" -#: main.cpp:144 -msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" -"If you feel your name is missing here, please contact us too!" +#: main.cpp:182 +#, fuzzy +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "ชื่อคุณ" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "อีเมล์:" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "ค้น&หารายชื่อ" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "ล๊อคอินโดยอัตโนมัติด้วยอีเมล์นี้" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" msgstr "" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "อนุญาต" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "เอาออก" + +#: network/applications/application.cpp:294 #, fuzzy msgid "The contact cancelled the session." msgstr "รายชื่อได้ถูกยกเลิกเซสซั่น" -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 #, fuzzy msgid "The contact rejected the invitation." msgstr "รายชื่อได้ถูกยกเลิก" -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 #, fuzzy msgid "You have cancelled the session." msgstr "คุณได้ทำการยกเลิกเซสซั่น" -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 #, fuzzy msgid "You have rejected the invitation." msgstr "คุณได้ทำการยกเลิก" -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, fuzzy, kde-format msgid "Do you want to
accept or cancel?" msgstr "คุณต้องการให้ ยอมรับ หรือ ยกเลิก?" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, fuzzy, kde-format msgid "Click to cancel." msgstr "คลิ๊กที่ ยกเลิก." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "คุณต้องการที่จะยอมรับไฟล์: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +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, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่สามารถเปิดไฟล์ " -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -#, fuzzy +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่สามารถเปิดไฟล์ " + +#: network/applications/filetransfer.cpp:319 +msgid "Transfer accepted." +msgstr "ยอมรับการส่งไฟล์" + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, fuzzy, kde-format msgid "Connecting to %1, port %2" msgstr "การเชื่อมต่อไปยัง %1, พอร์ต %2" -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -#, fuzzy -msgid "The transfer was cancelled" -msgstr "การส่งไฟล์ถูกยกเลิก" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "ยกเลิกการส่งไฟล์" -#: network/applications/filetransfer.cpp:370 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "คุณได้ทำการยกเลิกเซสซั่น" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "คุณได้ทำการยกเลิกเซสซั่น" + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "การเชื่อมต่อได้เริ่มต้น" -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -#, fuzzy -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." msgstr "การส่งไฟล์สำเร็จ" -#: network/applications/filetransfer.cpp:600 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่มีไฟล์ " +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "การส่งไฟล์สำเร็จ" -#: network/applications/filetransfer.cpp:604 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "เกิดการผิดพลาดในการส่งไฟล์ %1 ไฟล์ไม่สามารถอ่านได้" +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่มีไฟล์นี้อยู่" -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -#, fuzzy -msgid "Sending file %1" -msgstr "กำลังส่งไฟล์ %1" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่สามารถอ่านได้" -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 -msgid "Transfer accepted." -msgstr "ยอมรับการส่งไฟล์" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." +msgstr "กำลังส่งไฟล์ %1 (%2)" -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "ยกเลิกการส่งไฟล์" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: network/applications/filetransferp2p.cpp:352 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "การส่งไฟล์ %1 เกิดข้อผิดพลาด ไม่สามารถเปิดไฟล์ได้ " +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "คุณได้ทำการยกเลิกเซสซั่น" -#: network/applications/filetransferp2p.cpp:531 -#, fuzzy -msgid "The contact cancelled the transfer." -msgstr "ยกเลิกการส่งไฟล์" - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:774 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่มีไฟล์นี้อยู่" - -#: network/applications/filetransferp2p.cpp:779 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่สามารถอ่านได้" - -#: network/applications/filetransferp2p.cpp:814 -#, fuzzy -msgid "Sending file %1 (%2)" -msgstr "กำลังส่งไฟล์ %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "" -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "เริ่ม GnomeMeeting เชื่อมต่อไปยัง %1" -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "" -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "" - -#: network/applications/mimeapplication.cpp:119 +#: network/applications/mimeapplication.cpp:154 #, fuzzy -msgid "The invitation was aborted. An internal error occured." +msgid "The invitation was rejected. It is not supported by the other client." msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: network/applications/mimeapplication.cpp:125 +#: network/applications/mimeapplication.cpp:164 #, fuzzy -msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgid "The invitation was aborted. An internal error occured." +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "ผิดพลาด ไม่สามารถสร้างซอคเก็ต" -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "" +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "ผิดพลาด ไม่สามารถสร้างซอคเก็ต" -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "" +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +msgid "The invitation was aborted. The switchboard closed the chat connection." +msgstr "ผิดพลาด ไม่สามารถสร้างซอคเก็ต" -#: network/applications/mimeapplication.cpp:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "" -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this contact's desktop." msgstr "" -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "" -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr ", ยังไม่ได้ทำการอิมพลีเมนต์" -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." +msgstr "การส่งไฟล์ไม่สำเร็จ" + +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "การส่งไฟล์ %1 เกิดข้อผิดพลาด ไม่สามารถเปิดไฟล์ได้ " + +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." msgstr "" -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "การส่งไฟล์ไม่สำเร็จ" + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "รายชื่อได้ถูกยกเลิก" + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:1624 +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "" + +#: network/applications/p2papplication.cpp:3423 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "การเชื้อเชิญถูกยกเลิก หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" + +#: network/applications/p2papplication.cpp:3432 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "การเชื้อเชิญถูกยกเลิก หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "การเชื้อเชิญถูกยกเลิก หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "รายชื่อได้ถูกยกเลิก" + +#: network/applications/p2papplicationbase.cpp:627 #, fuzzy msgid "The transfer failed." msgstr "การส่งไฟล์ไม่สำเร็จ" -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "การส่งไฟล์ไม่สำเร็จ" - -#: network/applications/p2papplication.cpp:2038 -msgid "The invitation was cancelled. Message was not directed to us." -msgstr "" - -#: network/applications/p2papplication.cpp:2584 +#: network/applications/p2papplicationbase.cpp:1028 #, fuzzy -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "การส่งไฟล์ไม่สำเร็จ" - -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 -msgid "Awaiting connection at %1, port %2" -msgstr "" - -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 -msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "" - -#: network/applications/p2papplication.cpp:3274 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." +msgid "The transfer failed. Timeout while waiting for user to accept." msgstr "การส่งไฟล์ผิดพลาด หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "" - -#: network/applications/p2papplication.cpp:3670 +#: network/applications/p2papplicationbase.cpp:1047 #, fuzzy -msgid "The transfer failed. Couldn't open data source." +msgid "The transfer failed. An internal error occured." +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not open data source." msgstr "การส่งไฟล์ไม่สำเร็จ ไม่สามารถติดต่อ data source" -#: network/applications/p2papplication.cpp:4844 -msgid "Waiting for connection" -msgstr "" - -#: network/applications/p2papplication.cpp:5013 -#, fuzzy -msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " -"accept." -msgstr "การเชื้อเชิญถูกยกเลิก หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" - -#: network/applications/p2papplication.cpp:5022 -#, fuzzy -msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " -"succeed or fail." -msgstr "การเชื้อเชิญถูกยกเลิก หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" - -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "" - -#: network/applications/voiceconversation.cpp:77 +#: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "" -#: network/applications/voiceconversation.cpp:82 +#: 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:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "" -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "" -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." msgstr "" -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "" -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -#, fuzzy +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, fuzzy, kde-format msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr ", ยังไม่ได้ทำการอิมพลีเมนต์" -#: network/extra/msnftpconnection.cpp:122 +#: network/applications/webcamtransferp2p.cpp:113 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "การส่งไฟล์ %1 ถูกยกเลิก" +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" -#: network/extra/msnftpconnection.cpp:136 +#: 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 contact's webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "คุณได้ทำการยกเลิกเซสซั่น" + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "ยกเลิกการส่งไฟล์" + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:410 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, fuzzy, kde-format +msgid "Sending file %1" +msgstr "กำลังส่งไฟล์ %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "ผิดพลาด ไม่สามารถเปิดไฟล์ " -#: network/extra/msnftpconnection.cpp:411 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy -msgid "Couldn't open a local port." +msgid "Could not open a local port." msgstr "ผิดพลาด ไม่สามารถเปิดไฟล์ " -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:481 -#, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. A connection could not be made." msgstr "การส่งไฟล์ %1 ไม่สำเร็จ ไม่สามารถทำการเชื่อมต่อได้" -#: network/extra/msnftpconnection.cpp:482 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "ไม่สามารถปิดหน้าต่างการเชื่อมต่อหลักได้" -#: network/extra/msnftpconnection.cpp:586 -#, fuzzy +#: network/extra/msnftpconnection.cpp:574 +#, fuzzy, kde-format msgid "Receiving file %1" msgstr "กำลังรับไฟล์ %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" msgstr "" -#: network/msnconnection.cpp:733 -#, fuzzy -msgid "1 ping lost" -msgstr "กำลังขอรับรายการ" - -#: network/msnconnection.cpp:737 -#, fuzzy -msgid "%1 pings lost" -msgstr "กำลังขอรับรายการ" - -#: network/msnconnection.cpp:752 -#, fuzzy -msgid "The connection to the server was lost." -msgstr "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์" - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "อนุญาต" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "เอาออก" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." -msgstr "" - -#: network/msnnotificationconnection.cpp:740 +#: network/msnconnection.cpp:384 #, fuzzy -msgid "Show MSN Messenger Service status?" -msgstr "แสดงสถานะการบริการของ .NET ?" +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "ใส่อีเมล์ของบุคคลที่ต้องการจะเพิ่ม: " -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์" - -#: network/msnnotificationconnection.cpp:1339 -msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." +#: network/msnconnection.cpp:389 +msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "ทำการซิงโครไนท์" +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "" -#: network/msnnotificationconnection.cpp:1690 +#: network/msnconnection.cpp:396 #, fuzzy -msgid "Authenticating" -msgstr "การขอ Authentication ไม่สำเร็จ" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "ได้รับการข้อมูลยืนยัน" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "ส่งคำขอไปยังเครื่องเซิร์ฟเวอร์" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "" - -#: network/msnnotificationconnection.cpp:2034 -#, fuzzy -msgid "Connecting..." -msgstr "เชื่อมต่อ" - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -#, fuzzy -msgid "There was an internal error in KMess: %1" -msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" - -#: network/msnnotificationconnection.cpp:2252 -#, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "ชื่อผู้ใช้ที่ให้ ไม่ถูกต้อง" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:400 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 #, fuzzy msgid "This contact is already on your list" msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 #, fuzzy msgid "This contact is not on your list" msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2279 +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "" + +#: network/msnconnection.cpp:436 #, 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:2282 +#: network/msnconnection.cpp:440 #, fuzzy -msgid "This group can't be changed" +msgid "This group cannot be changed" msgstr "นี่เป็นกลุ่มพิเศษและไม่สามารถเปลี่ยนแปลงได้" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" msgstr "" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, fuzzy, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" + +#: network/msnconnection.cpp:462 +#, fuzzy +msgid "Invalid Group" +msgstr "เ&ปลี่ยนชื่อกลุ่ม" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "ส่งคำขอไปยังเครื่องเซิร์ฟเวอร์" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" +#: network/msnconnection.cpp:484 +msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" msgstr "" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" +#: network/msnconnection.cpp:497 +msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "ชื่อคุณ" + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "การส่งไฟล์ไม่สำเร็จ" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "" + +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" +msgstr "คุณได้ทำการยกเลิกเซสซั่น" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 #, fuzzy msgid "Bad friend name" msgstr "ชื่อเล่น: " -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr "" - -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "" - -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "" - -#: network/msnnotificationconnection.cpp:2401 +#: network/msnconnection.cpp:547 #, fuzzy -msgid "There was an internal server error" +msgid "Authentication ticket was incorrect" +msgstr "การขอ Authentication ไม่สำเร็จ" + +#: network/msnconnection.cpp:550 +msgid "You cannot start a chat with someone while you are invisible" +msgstr "" + +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "" + +#: network/msnconnection.cpp:558 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "" + +#: network/msnconnection.cpp:561 +msgid "Your Passport account needs to be verified first" +msgstr "" + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" -#: network/msnnotificationconnection.cpp:2411 +#: network/msnconnection.cpp:595 #, fuzzy -msgid "The server is too busy" -msgstr "เซิร์ฟเวอร์กำลังยุ่ง" +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" -#: network/msnnotificationconnection.cpp:2416 -#, fuzzy -msgid "The server is unavailable" -msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" - -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "ระบบเน็ทเวิร์กของเซิร์ฟเวอร์ล่ม" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 #, fuzzy msgid "The server is going down" msgstr "เซิร์ฟเวอร์กำลังจะล่มในไม่ช้า" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 #, fuzzy msgid "The server is going down soon" msgstr "เซิร์ฟเวอร์กำลังจะล่มในไม่ช้า" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 #, fuzzy msgid "The server is not available" msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "การขอ Authentication ไม่สำเร็จ" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr " บุคคลนี้ออฟไลน์ หรือไม่แสดงให้เห็น" - -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1648 +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "ไม่ได้รับ" +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์" -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "" - -#: network/tcpconnectionbase.cpp:223 +#: network/msnnotificationconnection.cpp:1337 #, fuzzy -msgid "Connection timeout" -msgstr "การเชื่อมต่อหมดเวลา" +msgid "Authenticating..." +msgstr "การขอ Authentication ไม่สำเร็จ" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "" - -#: notification/notificationchat.cpp:193 +#: network/msnnotificationconnection.cpp:1361 #, fuzzy -msgid "%1 has sent you a nudge!" -msgstr " ออนไลน์" +msgid "Authenticated" +msgstr "การขอ Authentication ไม่สำเร็จ" -#: notification/notificationchat.cpp:196 +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 #, fuzzy -msgid "%1 has sent you a wink!" -msgstr " ออนไลน์" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:203 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr " ออนไลน์" - -#: notification/notificationchat.cpp:204 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr " ออนไลน์" - -#: notification/notificationchat.cpp:210 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "" -"คุณได้มีการเชื่อมต่อ\n" -"จากเครื่องอื่นแล้ว" - -#: notification/notificationchat.cpp:211 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "" -"คุณได้มีการเชื่อมต่อ\n" -"จากเครื่องอื่นแล้ว" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/notificationchat.cpp:235 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "ส่งต่อ" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "" - -#: notification/notificationcontactstatus.cpp:66 -#, fuzzy -msgid "%1 has gone away" -msgstr " ออนไลน์" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "" - -#: notification/notificationcontactstatus.cpp:68 -#, fuzzy -msgid "%1 is now busy" -msgstr " ออนไลน์" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "" - -#: notification/notificationcontactstatus.cpp:70 -#, fuzzy -msgid "%1 has become invisible" -msgstr " ออนไลน์" - -#: notification/notificationcontactstatus.cpp:71 -#, fuzzy -msgid "%1 has gone idle" -msgstr " ออนไลน์" - -#: notification/notificationcontactstatus.cpp:72 -#, fuzzy -msgid "%1 is out for lunch" -msgstr " ออนไลน์" - -#: notification/notificationcontactstatus.cpp:73 -#, fuzzy -msgid "%1 is on the phone" -msgstr " ออนไลน์" - -#: notification/notificationcontactstatus.cpp:74 -#, fuzzy -msgid "%1 is now online" -msgstr " ออนไลน์" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, fuzzy, no-c-format -msgid "S&end" -msgstr "ส่ง" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, fuzzy, no-c-format -msgid "Ne&w Line" -msgstr "บรรทัดใหม่" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "เพิ่มผู้ติดต่อ" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, fuzzy, no-c-format -msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "ได้มีการเพิ่มคุณเข้าไปยังรายชื่อผู้ติดต่อ คุณต้องการที่จะ " - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, fuzzy, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, fuzzy, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "ไม่เพิ่มผู้ติดต่อ แต่ให้เห็นสถานะออนไลน์" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, fuzzy, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "บล๊อคคนนี้จากผู้ติดต่อที่คุณเห็นในสถานะออนไลน์" - -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "ล้างออก" - -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, fuzzy, no-c-format -msgid "Enter your login information:" -msgstr "หรือใส่ข้อมูลล๊อคอิน" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, fuzzy, no-c-format -msgid "Email address" -msgstr "อีเมล์:" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, fuzzy, no-c-format -msgid "Password" -msgstr "รหัสผ่าน:" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "" - -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, fuzzy, no-c-format -msgid "Remem&ber this profile" -msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" - -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" +msgid "Connecting..." msgstr "เชื่อมต่อ" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" msgstr "" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, fuzzy, no-c-format -msgid "Listening to %1" -msgstr "ส่งไฟล์" +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "นาที" +msgstr[1] "นาที" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, fuzzy, no-c-format -msgid "KMess Notification" -msgstr "อีเมล์แจ้งเตือน" +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/msnnotificationconnection.cpp:2108 +#, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "" + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "การขอ Authentication ไม่สำเร็จ" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" +msgid "" +"

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

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, kde-format +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:2932 +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:2935 +#, kde-format +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:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2956 +#, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์" + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +#, fuzzy +msgid "Connection time limit exceeded" +msgstr "การเชื่อมต่อหมดเวลา" + +#: network/msnsockettcp.cpp:380 +#, fuzzy +msgid "1 ping lost" +msgstr "กำลังขอรับรายการ" + +#: network/msnsockettcp.cpp:384 +#, fuzzy, kde-format +msgid "%1 pings lost" +msgstr "กำลังขอรับรายการ" + +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์" + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +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 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "" + +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:199 +#, fuzzy, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:203 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:207 +#, fuzzy, kde-format +msgid "%1 has sent you a wink!" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +#, fuzzy, kde-format +msgid "%1 is sending you a file!" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:215 +#, fuzzy, kde-format +msgid "%1 has sent you an invitation!" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:222 +#, fuzzy, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: notification/chatnotification.cpp:223 +#, fuzzy, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "" + +#: notification/chatnotification.cpp:231 +#, fuzzy, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: notification/chatnotification.cpp:232 +#, fuzzy, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: notification/chatnotification.cpp:233 +#, fuzzy, kde-format +msgid "%1 has accepted your invitation!" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:240 +#, fuzzy, kde-format +msgid "%1 has ended the webcam session!" +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" +msgstr "ส่งต่อ" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:250 +#, fuzzy, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "ส่งต่อ" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr " ออนไลน์" + +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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/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 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +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 "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +#, fuzzy +msgid "Display Picture" +msgstr "แสดงรูปภาพ" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "การดาวน์โหลดรูปภาพไม่สำเร็จ" + +#: settings/accountpage.cpp:539 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "กำหนดค่า" + +#: settings/accountsettingsdialog.cpp:78 +#, fuzzy +msgid "Account" +msgstr "เอคเค้าท์" + +#: settings/accountsettingsdialog.cpp:79 +#, fuzzy +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 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "สวัสดี สบายดีไม๊" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "เยี่ยม" + +#: settings/chatstylepage.cpp:375 +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, kde-format +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:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "เอคเค้าท์" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, fuzzy, no-c-format -msgid "Your friendly name:" -msgstr "ชื่อเล่น: " +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "อีเมล์แจ้งเตือน" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, fuzzy, no-c-format -msgid "Your email address:" +#: 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "ผู้ติดต่อ" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +#, fuzzy +msgid "S&end" +msgstr "ส่ง" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&สนทนา" + +#. 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: file: chat/contactswidget.ui:107 +#. 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 +#, 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: 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:273 +#, fuzzy +msgid "Email address:" msgstr "อีเมล์:" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format -msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +#. 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 "บันทึกชื่อใหม่สำหรับกลุ่มนี้: " + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, fuzzy, no-c-format -msgid "Your password:" +#. 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." +msgstr "" +"บันทึกข้อความที่ซึ่งจะถูกส่งโดยอัตโนมัติ \n" +"ถึงคนที่พยายามส่งข้อความถึงคุณ" + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "เข้าสู่วงสนทนา" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "เริ่ม หรือ หยุด การสนทนา" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +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 the following groups of your 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, but allow him or her to see your 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 you and seeing your status" +msgstr "บล๊อคคนนี้จากผู้ติดต่อที่คุณเห็นในสถานะออนไลน์" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "เอาออก" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "กลุ่ม" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "เลือกชื่อสำหรับบุคคลนี้" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "แสดงบอกเมื่อผู้ติดต่อออฟไลน์" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "เสียง: " + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "แสดงรูปภาพ" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "แสดงรูปภาพ" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +#, fuzzy +msgid "&Clear Cache" +msgstr "ยกเลิกแท็บ" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "เอาออก" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "&ผู้ติดต่อรับอนุญาต" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "ใส่อีเมล์ของบุคคลที่ต้องการจะเพิ่ม: " + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "ผู้ติดต่อ" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, fuzzy +msgid "Items to export:" +msgstr "การเชื่อมต่อไปยัง %1, พอร์ต %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +#, fuzzy +msgid "Format" +msgstr "แพะ" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "ผู้ติดต่อ" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +#, fuzzy +msgid "Select All" +msgstr "เลือกทั้งหมด" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +#, fuzzy +msgid "Deselect All" +msgstr "เลือกทั้งหมด" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "สับสน" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +#, fuzzy +msgid "Command to Current Tab" +msgstr "ปิดแท็บ" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +#, fuzzy +msgid "Standard" +msgstr "ดาว" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +#, fuzzy +msgid "Send" +msgstr "ส่ง" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" +msgstr "ล้างออก" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "สับสน" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter 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:279 +#, fuzzy +msgid "Password:" msgstr "รหัสผ่าน:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" +msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +#, fuzzy +msgid "R&emember password" +msgstr "รหัสผ่าน:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "&เอคเค้าท์ใหม่" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:321 +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:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&เชื่อมต่อ" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "เ&อคชั่น" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, fuzzy +msgid "Form" +msgstr "แพะ" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "เอคเค้าท์" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +#, fuzzy +msgid "Your Account Information" +msgstr "&ตั้งค่าเอคเค้าท์" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +#, fuzzy +msgid "&Friendly name:" +msgstr "ชื่อเล่น: " + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +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:363 +#, fuzzy +msgid "&Email address:" +msgstr "อีเมล์:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, fuzzy, no-c-format -msgid "Display picture:" -msgstr "รูปภาพ: " +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +#, fuzzy +msgid "&Password:" +msgstr "รหัสผ่าน:" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "รหัสผ่าน:" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +#, fuzzy msgid "C&hange..." +msgstr "เ&ชื้อเชิญ" + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, fuzzy, no-c-format -msgid "Don't show a displa&y picture" -msgstr "รูปภาพ: " - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, fuzzy, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "การเข้าสู่ระบบด้วยเอคเค้าท์นี้ จะทำโดยอัตโนมัติเมื่อเรียกโปรแกรม" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +#, fuzzy +msgid "Re&member the settings of this account" +msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "การเข้าสู่ระบบด้วยเอคเค้าท์นี้ จะทำโดยอัตโนมัติเมื่อเรียกโปรแกรม" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +#, fuzzy +msgid "Login &as" +msgstr "บันทึกทุกการสนทนา" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You cannot change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 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 Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "แจ้งเตือน" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, fuzzy, no-c-format -msgid "Popup notifications" -msgstr "อีเมล์แจ้งเตือน" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 46 -#: rc.cpp:228 -#, fuzzy, no-c-format -msgid "Show notifications when your contacts:" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "เปลี่ยนสถานะเป็น ว่าง - ไม่อยู่หน้าคอมฯ เมื่อไม่แอคทีฟ" + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +#, fuzzy +msgid "Become idle after" +msgstr "เปลี่ยนเป็นว่างหลังจาก " + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "นาที" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" msgstr "แสดงบอกเมื่อผู้ติดต่อออฟไลน์" -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, fuzzy, no-c-format -msgid "&Go online" -msgstr "ออนไลน์" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +#, fuzzy +msgid "Saved accounts:" +msgstr "เอคเค้าท์" -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "เอคเค้าท์" + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +#, fuzzy +msgid "&Remove" +msgstr "เอาออก" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " msgstr "" -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, fuzzy, no-c-format -msgid "S&end you a message" -msgstr "เจาะจงข้อความหากไม่อยู่" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "เข้าสู่วงสนทนา" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "ส่&งไฟล์" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "ส่&งไฟล์" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, fuzzy, no-c-format -msgid "Go o&ffline" -msgstr "ออฟไลน์" +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, fuzzy, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "แสดงการเตือนเมื่อได้รับอีเมล์" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "ซ่อนหน้าต่างหลังจาก" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "วินาที" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 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. " +"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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "บันทึกการสนทนา" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "ปี" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "บันทึกทุกการสนทนาในไดเรคทอรี่หลัก" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "บันทึกทุกการสนทนาในไดเรคทอรี่หลัก" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "บันทึกการสนทนาในไดเรคทอรี่: " + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +#, fuzzy +msgid "&Chat style:" +msgstr "รูปแบบข้อความสนทนา" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +#, fuzzy +msgid "Chat Settings" +msgstr "กำหนดค่า" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +#, fuzzy +msgid "&Show emoticons" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +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:648 +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:654 +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:657 +#, fuzzy +msgid "S&how timestamp" +msgstr "แสดงเวลาบนข้อความ" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +#, fuzzy +msgid "Show &date" +msgstr "ผู้ติดต่อ" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +#, fuzzy +msgid "&Text" +msgstr "ก๊อปปี้ข้อความเท็กซ์" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +#, fuzzy +msgid "Your &message font:" +msgstr "ฟอนต์ของข้อความ: " + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "บังคับข้อความของผู้ติดต่อให้ใช้ฟอนต์: " + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "ยกเลิกแท็บ" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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/alertswidget.ui line 300 -#: rc.cpp:313 -#, fuzzy, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "เปลี่ยนสถานะเป็น ว่าง - ไม่อยู่หน้าคอมฯ เมื่อไม่แอคทีฟ" +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "รูปภาพ: " -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +#, fuzzy +msgid "Always" +msgstr "ไม่อยู่" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +#, fuzzy +msgid "For contacts in the same group" +msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +#, fuzzy +msgid "Never" +msgstr "น่าเบื่อ" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "รูปภาพ: " + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, fuzzy, no-c-format -msgid "Become idle after" -msgstr "เปลี่ยนเป็นว่างหลังจาก " +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." msgstr "" -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "นาที" - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "เข้าสู่วงสนทนา" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, fuzzy, no-c-format -msgid "Log &all chats" -msgstr "บันทึกทุกการสนทนา" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "บันทึกการสนทนาในไดเรคทอรี่: " - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "จัดการแฟ้มสนทนาโดย: " - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" msgstr "" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "ปี" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, fuzzy, no-c-format -msgid "Month" -msgstr "เดือน" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "วัน" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "บันทึกทุกการสนทนาในไดเรคทอรี่หลัก" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "ฟอนต์ของข้อความ: " - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "บังคับข้อความของผู้ติดต่อให้ใช้ฟอนต์: " - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" msgstr "" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, fuzzy, no-c-format -msgid "&Show graphics in chat messages" -msgstr "แสดงเวลาบนข้อความ" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, fuzzy, no-c-format -msgid "S&how time in chat messages" -msgstr "แสดงเวลาบนข้อความ" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "เมล์ไคลเอนต์" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "ใช้ Hotmail " - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "ใช้คำสั่งที่ระบุ: " - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "อีเมล์แจ้งเตือน" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, fuzzy, no-c-format -msgid "Show email information" -msgstr "แสดงข้อมูลอีเมล์ในรายชื่อผู้ติดต่อ" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "" - -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "แสดงการเตือนเมื่อได้รับอีเมล์" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +#, fuzzy msgid "&Emoticon Themes" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, fuzzy, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +#, fuzzy msgid "&Custom Emoticons" msgstr "การ์ตูนไอคอนแสดงอารมณ์" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, fuzzy +msgid "Add Ne&w..." +msgstr "เอคเค้าท์" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, fuzzy, no-c-format -msgid "Click" -msgstr "(บล๊อค)" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +#, fuzzy msgid "Re&name" msgstr "ชื่อคุณ" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" msgstr "" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, fuzzy, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +#, fuzzy msgid "Remo&ve" msgstr "เอาออก" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "" - -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "พูด:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "" - -#: settings/accountswidget.cpp:421 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 #, fuzzy -msgid "Display Picture" -msgstr "แสดงรูปภาพ" +msgid "Web Browser" +msgstr "กุหลาบแดง" -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "การดาวน์โหลดรูปภาพไม่สำเร็จ" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "กำหนดค่า" +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "" -#: settings/settingsdialog.cpp:93 +#. 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:814 rc.cpp:849 +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:817 +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:820 rc.cpp:855 +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:823 rc.cpp:858 #, fuzzy -msgid "Account" -msgstr "เอคเค้าท์" +msgid "&Specify a custom command:" +msgstr "เจาะจงข้อความเมื่อไม่อยู่" -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "กำลังสนทนา" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "สวัสดี สบายดีไม๊" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "เยี่ยม" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "ฉันเพิ่งกลับจากพักร้อนในอิตาลี" - -#: systemtraywidget.cpp:91 +#. 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:827 rc.cpp:862 +#, no-c-format msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." msgstr "" -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +#, fuzzy +msgid "Email Client" +msgstr "เมล์ไคลเอนต์" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +msgid "" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +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:843 +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:846 +msgid "Use the &KDE default email client" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +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:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +#, fuzzy +msgid "and" +msgstr "เสียใจ" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "ไฟล์ส่งออก" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "ชื่อคุณ" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "ชื่อคุณ" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "แสดงเวลาบนข้อความ" + +#, fuzzy +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "แสดงหน้าต่างป๊อปอัพเมื่อบุคคลนี้ออนไลน์หรือออฟไลน์" + +#, fuzzy +#~ msgid "Custom emoticons for this account:" +#~ msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "เพิ่ม&ไอคอนแสดงอารมณ์" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "แสดงรูปภาพ" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "ค้น&หารายชื่อ" + +#~ msgid "Search by &Interest" +#~ msgstr "ค้นหาจากสิ่งที่&สนใจ" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "อีเมล์:" + +#~ msgid "" +#~ "The transfer failed. The contact sent bad data, or KMess doesn't support " +#~ "it." +#~ 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 "&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 "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 "รูปภาพ: " + +#~ msgid "Use a specified command:" +#~ msgstr "ใช้คำสั่งที่ระบุ: " + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "เอคเค้าท์นี้ไม่มีตู้จดหมาย hotmail" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "อีเมล์" + +#, fuzzy +#~ msgid "Remove group" +#~ msgstr "&ลบกลุ่ม" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "แสดงรูปภาพ" + +#, fuzzy +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr " มีอีเมล์ใหม่ในกล่องเมล์" + +#, fuzzy +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr " เมล์ใหม่ในกล่องรับเมล์" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "ผู้ติ&ดต่อใหม่" + +#, fuzzy +#~ msgid "Enter your login information:" +#~ msgstr "หรือใส่ข้อมูลล๊อคอิน" + +#, fuzzy +#~ msgid "Your friendly name:" +#~ msgstr "ชื่อเล่น: " + +#, fuzzy +#~ msgid "Your password:" +#~ msgstr "รหัสผ่าน:" + +#, fuzzy +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "แสดงการเตือนเมื่อได้รับอีเมล์" + +#~ msgid "Organize chat folders by:" +#~ msgstr "จัดการแฟ้มสนทนาโดย: " + +#, fuzzy +#~ msgid "&Show graphics in chat messages" +#~ msgstr "แสดงเวลาบนข้อความ" + +#~ msgid "Use Hotmail" +#~ msgstr "ใช้ Hotmail " + +#~ msgid "says:" +#~ msgstr "พูด:" + +#~ msgid "Current name: " +#~ msgstr "ชื่อปัจจุบัน: " + +#, fuzzy +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "แสดงสถานะการบริการของ .NET ?" + +#~ msgid "Received user confirmation" +#~ msgstr "ได้รับการข้อมูลยืนยัน" + +#~ msgid "Transfer to notification server" +#~ msgstr "ส่งคำขอไปยังเครื่องเซิร์ฟเวอร์" + +#, fuzzy +#~ msgid "The server is too busy" +#~ msgstr "เซิร์ฟเวอร์กำลังยุ่ง" + +#, fuzzy +#~ msgid "The server is unavailable" +#~ msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" + +#~ msgid "Add contact" +#~ msgstr "เพิ่มผู้ติดต่อ" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "อีเมล์แจ้งเตือน" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "ราชันย์ หงษ์ไพโรจน์" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "rachanh@yahoo.com" + +#~ msgid "Away - Idle" +#~ msgstr "(ว่าง - ไม่อยู่หน้าคอมฯ)" + +#, fuzzy +#~ 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 "(กำหนดว่าง - ไม่อยู่หน้าคอมฯ)" + +#, fuzzy +#~ msgid "(Out to Lunch)" +#~ msgstr "(ไปกินข้าว)" + +#~ msgid "(On the Phone)" +#~ msgstr "(กำลังคุยโทรศัพท์)" + #, fuzzy #~ msgid "File transfer dialog message" #~ msgstr "หน้าจอการส่งไฟล์" diff --git a/po/tr.po b/po/tr.po index f00a6e6..114003d 100644 --- a/po/tr.po +++ b/po/tr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: tr\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" "PO-Revision-Date: 2007-11-01 07:01+0200\n" "Last-Translator: Uğur Çetin \n" "Language-Team: Turkish \n" @@ -16,516 +16,1287 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "" -"Barbaros Ulutaş\n" -"Uğur Çetin" - -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "" -"ulutas@gmail.com\n" -"jnmbk@users.sourceforge.net" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "Bilgisayarımdan uzaktayım" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "Sizin adınız" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "siz@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "Oturum açılıyor..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "Bilgisayarımdan uzaktayım" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "&Kişiyi Sil" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "Uykulu" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "Bu daveti başlatamazsınız çünkü bu sohbette birden fazla kişi var." + +#: chat/chat.cpp:138 +#, fuzzy, kde-format +msgid "%1 has joined the chat." +msgstr "%1 sohbete katıldı." + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "Sohbet boşta, %1 sohbetten ayrıldı." + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +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:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 ve %2 - Sohbet" + +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 - Sohbet" + +#: chat/chat.cpp:663 +#, fuzzy, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "(Bu ileti kendiliğinden gönderildi)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "%1 size bir göz kırpması gönderdi" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "%1 size bir göz kırpması gönderdi" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 gizli" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1 size çevrimdışı bir ileti gönderdi:
'%2'" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1 size bir titreme gönderdi!" + +#: chat/chat.cpp:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "Göz kırpması gösterilemiyor. Veri okunamadı." + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "Göz kırpması gösterilemiyor. Veri okunamadı." + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 size bir göz kırpma gönderdi!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 size bir göz kırpma gönderdi!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "" +"Göz kırpması gösterilemiyor. 'cabextract'ın kurulu olduğundan emin olun." + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "" +"Göz kırpması gösterilemiyor. 'cabextract'ın kurulu olduğundan emin olun." + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "" +"Göz kırpması gösterilemiyor. 'cabextract'ın kurulu olduğundan emin olun." + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "" +"Göz kırpması gösterilemiyor. 'cabextract'ın kurulu olduğundan emin olun." + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" 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:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 sohbete katıldı." + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 sohbete katıldı." + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 size bir titreme gönderdi!" + +#: chat/chat.cpp:1463 +#, 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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 sohbete katıldı." + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "\"%1\" mesajı gönderilemedi." + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "%1 titretildi!" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "Bir titreme gönderdiniz!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 bir göz kırpması gönderdi: %2" -#: chat/chatmessagestyle.cpp:296 +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 diyor ki:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "Bu ifadeyi ekle: %1" -#: chat/chatview.cpp:463 +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Bağlan" + +#: chat/chatview.cpp:300 +#, fuzzy, kde-format 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:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, fuzzy, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Dosyanın Üzerine Yaz" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Üzerine &Yaz" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." msgstr "Bu İfadeyi &Ekle" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "Bu İfadeyi &Ekle" + +#: chat/chatview.cpp:834 msgid "Send &Email" msgstr "E-&posta Gönder" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "E-posta'yı &Kopyala" +#: chat/chatview.cpp:838 +#, fuzzy +msgid "Add &Contact" +msgstr "Kişi &Ekle" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-posta adresi" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "Bağlantıya &Git" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "&Adresi Kopyala" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +#, fuzzy +msgid "&Copy Text" msgstr "&Yazıyı Kopyala" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "Tümünü &Seç" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +#, fuzzy +msgid "C&lear Chat" +msgstr "Sekmeyi temizle" + +#: chat/chatview.cpp:872 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Sohbeti &Dosyaya Kaydet" -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "Sohbet" - -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "Bu daveti başlatamazsınız çünkü bu sohbette birden fazla kişi var." - -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 sohbete katıldı." - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "Sohbet boşta, %1 sohbetten ayrıldı." - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 sohbetten ayrıldı." - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - Sohbet" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 ve %2 - Sohbet" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 - Sohbet" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "Kişiler" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "İfadeler" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +#, fuzzy +msgid "My Emoticons" msgstr "İfadelerim" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr "(Bu ileti kendiliğinden gönderildi)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"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 "" -"Göz kırpması gösterilemiyor. 'cabextract'ın kurulu olduğundan emin olun." -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "Göz kırpması gösterilemiyor. Veri okunamadı." +#: chat/chatwindow.cpp:340 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Sekmeyi kapat" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "%1 size bir göz kırpması gönderdi" +#: chat/chatwindow.cpp:341 +#, fuzzy +msgid "Close All Tabs" +msgstr "Sekmeyi kapat" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "\"%1\" mesajı gönderilemedi." +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "Sekmeyi kapat" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "%1 titreme gönderdi" +#: chat/chatwindow.cpp:451 +#, fuzzy +msgid "&Invite..." +msgstr "Da&vet et" -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "%1 titretildi!" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "Bir titreme gönderdiniz!" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 yazıyor." - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 ve %2 yazıyor." - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 ve diğer %3 kişi yazıyor." - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +#: chat/chatwindow.cpp:452 +#, fuzzy +msgid "Send a &File..." msgstr "Bir &Dosya Gönder" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +#, fuzzy +msgid "Webcam Chat" +msgstr "Sohbeti Kaydet" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "Bir &Buluşma Başlat" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 msgid "Send a &Nudge!" msgstr "&Titreme Gönder!" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "Bir &Görüşme başlat veya bitir" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:456 +#, fuzzy +msgid "Save Chat..." msgstr "Sohbeti Kaydet" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "Da&vet et" +#: chat/chatwindow.cpp:457 +#, fuzzy +msgid "Close &All Tabs" +msgstr "Sekmeyi kapat" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "&Sohbet Et" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "&Yazıtipini Değiştir" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "Yazıtipi &Rengini Değiştir" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "Bir ifade kullan" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "İfadelerimi &Göster" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "&Bağlantı Yançubuğunu Göster/Gizle" +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Sohbet mesajlarında &zamanı göster" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "Bağlantı yançubuğunu göster ya da gizle" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" -msgstr "&E-posta gönder" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/chatwindow.cpp:484 +#, fuzzy +msgid "Meeting" +msgstr "Ayarlar" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "Bir &Dosya Gönder" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Kişi listesi alınıyor..." + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kişiler" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Kişi listesi alınıyor..." + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "İfadeler" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "Kişi listesi alınıyor..." + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "İfadelerim" + +#: chat/chatwindow.cpp:533 +#, fuzzy +msgid "&Font" +msgstr "&Bağlan" + +#: chat/chatwindow.cpp:534 +#, fuzzy +msgid "Font &Color" +msgstr "Yazıtipi &Rengini Değiştir" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "Sekmeyi temizle" + +#: chat/chatwindow.cpp:603 +#, fuzzy +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:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +#, fuzzy +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Sohbet" + +#: chat/chatwindow.cpp:1610 +#, fuzzy, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Sohbet" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, fuzzy, kde-format +msgid "%1 is typing..." +msgstr "%1 yazıyor." + +#: chat/chatwindow.cpp:1897 +#, fuzzy, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 ve %2 yazıyor." + +#: chat/chatwindow.cpp:1901 +#, fuzzy, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 ve diğer %3 kişi yazıyor." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Bir &Buluşma Başlat" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "E-&posta Gönder" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "&Profili Göster" -#: chat/contactframe.cpp:234 kmessview.cpp:618 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 +msgid "&Properties" +msgstr "&Özellikler" + +#: chat/contactframe.cpp:303 kmessview.cpp:605 msgid "&Add Contact" msgstr "Kişi &Ekle" -#: chat/contactframe.cpp:235 kmessview.cpp:619 +#: chat/contactframe.cpp:304 kmessview.cpp:606 msgid "A&llow Contact" msgstr "Kişiye İzin &Ver" -#: chat/contactframe.cpp:236 kmessview.cpp:622 +#: chat/contactframe.cpp:305 kmessview.cpp:609 msgid "&Delete Contact" msgstr "&Kişiyi Sil" -#: chat/contactframe.cpp:238 kmessview.cpp:620 +#: chat/contactframe.cpp:307 kmessview.cpp:607 msgid "&Block Contact" msgstr "Kişiyi E&ngelle" -#: chat/contactframe.cpp:239 kmessview.cpp:621 +#: chat/contactframe.cpp:308 kmessview.cpp:608 msgid "&Unblock Contact" msgstr "Kişinin &Engelini Kaldır" -#: chat/contactframe.cpp:241 +#: chat/contactframe.cpp:310 kmessview.cpp:612 msgid "&Friendly Name" msgstr "&Takma ad:" -#: chat/contactframe.cpp:242 +#: chat/contactframe.cpp:311 kmessview.cpp:613 msgid "&Personal Message" msgstr "&Kişisel Mesaj" -#: chat/contactframe.cpp:243 +#: chat/contactframe.cpp:312 kmessview.cpp:614 msgid "&Email Address" msgstr "E-p&osta adresi:" -#: chat/contactframe.cpp:263 -msgid "&Copy..." +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +#, fuzzy +msgid "&Information" +msgstr "E-posta bilgisini göster" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "Görüntü Resmi:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +#, fuzzy +msgid "&Notes" +msgstr "Not" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "İfadeler" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" msgstr "Ko&pyala..." -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 +#: chat/contactframe.cpp:753 msgid "Blocked" msgstr "Engellenmiş" -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "Uzakta" - -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "Döneceğim" - -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "Meşgul" - -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "Bağlı değil" - -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "Boşta" - -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "Yemekte" - -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "Bağlı" - -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "Telefonda" - -#: chat/contactframe.cpp:558 -#, fuzzy +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" msgid "The contact is %1" msgstr "Kişi çevrimdışı" -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "sohbet-stil-yazı" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" msgstr "" -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "Kişi ekle" + +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "&Yeni ekle..." + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +#, fuzzy +msgid "Remove" +msgstr "Silindi" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +#, fuzzy +msgid "Web Messenger" +msgstr "Site tasarımı" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +#, fuzzy +msgid "Windows Media Center" +msgstr "Site tasarımı" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, fuzzy, kde-format +msgid "Windows Live Messenger %1" +msgstr "Site tasarımı" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Site tasarımı" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Bağlı" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Meşgul" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Uzakta" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Kendiliğinden yanıtlamayla Uzakta" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "Boşta" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Döneceğim" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Telefonda" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Yemekte" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 msgid "Invisible" msgstr "Görünmez" -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "Bu hesabın Hotmail gelen kutusu yok!" +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "Bağlı değil" -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "&Durumum" + +#: contact/msnstatus.cpp:218 +#, 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:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "Eklemek istediğiniz kişinin eposta adresini girin:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "Verilen e-posta adresi geçersiz" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 msgid "Add New Emoticon" msgstr "Yeni İfade &Ekle" -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:130 +#, fuzzy +msgid "Edit Emoticon" +msgstr "İfadeler" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "\"%1\" ifadesi zaten var, üzerine yazmak istiyor musunuz?" -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "Uzakta durumu için ileti belirle" -#: dialogs/awaymessagedialog.cpp:37 +#: dialogs/chathistorydialog.cpp:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Sohbet stili:" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +msgctxt "Dialog box text" msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" +"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 "" -"Size ileti göndermek isteyen kişilere\n" -"kendiliğinden gönderilecek iletiyi girin:" -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "Bu kişi için seçimlik bir ad girin" +#: dialogs/chathistorydialog.cpp:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "%1 aktarılamadı. Yerel port açılamadı." -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "Oturum açılıyor..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "Bütün sohbetleri &kaydet" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" msgstr "" -"Bu kişi bağlandığı ya da bağlantısını kopardığı zaman uyarı balonu göster" -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "Resim:" +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "%1
sizi bağlantı listesine ekledi. Ne yapmak istiyorsunuz?:" -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "Ses:" +#: dialogs/contactaddeduserdialog.cpp:65 +#, fuzzy, kde-format +msgid "" +"%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:229 +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format msgid "Contact Properties for %1" msgstr "%1 için Özellikler" -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "Bağlı" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +#, fuzzy +msgid "No messages yet" +msgstr "Sohbet mesajlarında &zamanı göster" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "E-posta adresi:" -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "Geçerli isim: " +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "E-posta istemcisi" -#: dialogs/networkwindow.cpp:50 +#: dialogs/contactpropertiesdialog.cpp:661 +#, 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:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kişiler" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "Davet reddedildi. Karşıdaki istemci bunu desteklemiyor." + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Kişiler" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy, kde-format +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, kde-format +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..." + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 msgid "Network Window" msgstr "Ağ Penceresi" -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" msgstr "Sekmeyi kaydet" -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" msgstr "Sekmeyi temizle" -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" msgstr "Sekmeyi kapat" -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." +#: dialogs/networkwindow.cpp:1086 +#, 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:928 +#: dialogs/networkwindow.cpp:1130 +#, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." +"write in the folder where it is being saved." msgstr "" "Ağ Penceresi kayıtları kaydedilemiyor. Kayıtların yapıldığı dizinde yazma " "izniniz olduğundan emin olun." -#: dialogs/networkwindow.cpp:953 +#: dialogs/networkwindow.cpp:1177 msgid "Cannot close the main connection tab." msgstr "Ana bağlantı sekmesi kapatılamaz" -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +#, 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: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:160 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:202 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Bilgisayar" -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +#, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format msgid "%1 kB" msgstr "%1 KB" -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format msgid "%1 bytes" msgstr "%1 bayt" -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferwindow.cpp:74 +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 msgid "File Transfers" msgstr "Dosya Aktarımları" -#: emoticontheme.cpp:542 +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Kafası karışık" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&Kişiyi Sil" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Görüntü Resmi:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "Gerçekten bu hesabı silmek istiyor musunuz?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "Görüntü Resmi:" + +#: emoticontheme.cpp:627 +#, kde-format msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -533,763 +1304,1467 @@ msgstr "" "İfade teması kaydedilemiyor. Tema dizini olan '%1' dizinine yazma izniniz " "olduğundan emin olun." -#: emoticontheme.cpp:736 +#: emoticontheme.cpp:833 msgid "Smile" msgstr "Gülen surat" -#: emoticontheme.cpp:737 +#: emoticontheme.cpp:834 msgid "Wink" msgstr "Göz kırpan" -#: emoticontheme.cpp:738 +#: emoticontheme.cpp:835 msgid "Tongue out" msgstr "Dil çıkaran" -#: emoticontheme.cpp:739 +#: emoticontheme.cpp:836 msgid "Big smile" msgstr "Kahkaha" -#: emoticontheme.cpp:740 +#: emoticontheme.cpp:837 msgid "Sad" msgstr "Üzgün" -#: emoticontheme.cpp:741 +#: emoticontheme.cpp:838 msgid "Crying" msgstr "Ağlıyor" -#: emoticontheme.cpp:742 +#: emoticontheme.cpp:839 msgid "Angry" msgstr "Kızgın" -#: emoticontheme.cpp:743 +#: emoticontheme.cpp:840 msgid "Confused" msgstr "Kafası karışık" -#: emoticontheme.cpp:744 +#: emoticontheme.cpp:841 msgid "Embarrassed" msgstr "Utanmış" -#: emoticontheme.cpp:745 +#: emoticontheme.cpp:842 msgid "Disappointed" msgstr "Kırgın" -#: emoticontheme.cpp:746 +#: emoticontheme.cpp:843 msgid "Hot" msgstr "Sıcak" -#: emoticontheme.cpp:747 +#: emoticontheme.cpp:844 msgid "Baring teeth" msgstr "Dişleri gösteren" -#: emoticontheme.cpp:748 +#: emoticontheme.cpp:845 msgid "Nerd" msgstr "Gözlüklü" -#: emoticontheme.cpp:749 +#: emoticontheme.cpp:846 msgid "Sick" msgstr "Hasta" -#: emoticontheme.cpp:750 +#: emoticontheme.cpp:847 msgid "Surprised" msgstr "Şaşkın" -#: emoticontheme.cpp:751 +#: emoticontheme.cpp:848 msgid "Party" msgstr "Parti" -#: emoticontheme.cpp:752 +#: emoticontheme.cpp:849 msgid "Sleepy" msgstr "Uykulu" -#: emoticontheme.cpp:753 +#: emoticontheme.cpp:850 msgid "Thinking" msgstr "Düşünen" -#: emoticontheme.cpp:754 +#: emoticontheme.cpp:851 msgid "Don't tell anyone" msgstr "Kimseye söyleme" -#: emoticontheme.cpp:755 +#: emoticontheme.cpp:852 msgid "Secret telling" msgstr "Bu bir sır" -#: emoticontheme.cpp:756 +#: emoticontheme.cpp:853 msgid "Eye-rolling" msgstr "Gözleri yuvarlayan" -#: emoticontheme.cpp:757 +#: emoticontheme.cpp:854 msgid "Sarcastic" msgstr "Alaycı" -#: emoticontheme.cpp:758 +#: emoticontheme.cpp:855 msgid "I don't know" msgstr "Bilmiyorum" -#: emoticontheme.cpp:759 +#: emoticontheme.cpp:856 msgid "Be right back" msgstr "Hemen döneceğim" -#: emoticontheme.cpp:760 +#: emoticontheme.cpp:857 msgid "Angel" msgstr "Melek" -#: emoticontheme.cpp:761 +#: emoticontheme.cpp:858 msgid "Left hug" msgstr "Soldan sarıl" -#: emoticontheme.cpp:762 +#: emoticontheme.cpp:859 msgid "Boy" msgstr "Erkek çocuk" -#: emoticontheme.cpp:763 +#: emoticontheme.cpp:860 msgid "Red heart" msgstr "Kırmızı kalp" -#: emoticontheme.cpp:764 +#: emoticontheme.cpp:861 msgid "Red rose" msgstr "Kırmızı gül" -#: emoticontheme.cpp:765 -msgid "Thumby up" +#: emoticontheme.cpp:862 +#, fuzzy +msgid "Thumbs up" msgstr "Parmaklar yukarı" -#: emoticontheme.cpp:766 +#: emoticontheme.cpp:863 msgid "Dog face" msgstr "Köpek" -#: emoticontheme.cpp:767 +#: emoticontheme.cpp:864 msgid "Sun" msgstr "Güneş" -#: emoticontheme.cpp:768 +#: emoticontheme.cpp:865 msgid "Devil" msgstr "Şeytan" -#: emoticontheme.cpp:769 +#: emoticontheme.cpp:866 msgid "Right hug" msgstr "Sağdan sarıl" -#: emoticontheme.cpp:770 +#: emoticontheme.cpp:867 msgid "Girl" msgstr "Kız çocuk" -#: emoticontheme.cpp:771 +#: emoticontheme.cpp:868 msgid "Broken heart" msgstr "Kırık kalp" -#: emoticontheme.cpp:772 +#: emoticontheme.cpp:869 msgid "Wilted rose" msgstr "Solgun gül" -#: emoticontheme.cpp:773 +#: emoticontheme.cpp:870 msgid "Thumbs down" msgstr "Parmak aşağı" -#: emoticontheme.cpp:774 +#: emoticontheme.cpp:871 msgid "Cat face" msgstr "Kedi" -#: emoticontheme.cpp:775 +#: emoticontheme.cpp:872 msgid "Sleeping half-moon" msgstr "Uykulu ay" -#: emoticontheme.cpp:776 +#: emoticontheme.cpp:873 msgid "Red lips" msgstr "Kırmızı dudaklar" -#: emoticontheme.cpp:777 +#: emoticontheme.cpp:874 msgid "Clapping" msgstr "Alkış" -#: emoticontheme.cpp:778 +#: emoticontheme.cpp:875 msgid "Crossed fingers" msgstr "Şans dile" -#: emoticontheme.cpp:779 +#: emoticontheme.cpp:876 msgid "Auto" msgstr "Otomatik" -#: emoticontheme.cpp:780 +#: emoticontheme.cpp:877 msgid "Airplane" msgstr "Uçak" -#: emoticontheme.cpp:781 +#: emoticontheme.cpp:878 msgid "Turtle" msgstr "Kaplumbağa" -#: emoticontheme.cpp:782 +#: emoticontheme.cpp:879 msgid "Snail" msgstr "Salyangoz" -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "Kara koyun" +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "Uykulu" -#: emoticontheme.cpp:784 +#: emoticontheme.cpp:881 msgid "Goat" msgstr "Keçi" -#: emoticontheme.cpp:785 +#: emoticontheme.cpp:882 msgid "Vampire bat" msgstr "Vampir yarasa" -#: emoticontheme.cpp:786 +#: emoticontheme.cpp:883 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:787 +#: emoticontheme.cpp:884 msgid "Beer mug" msgstr "Bira" -#: emoticontheme.cpp:788 +#: emoticontheme.cpp:885 msgid "Martini glass" msgstr "İçki bardağı" -#: emoticontheme.cpp:789 +#: emoticontheme.cpp:886 msgid "Coffee cup" msgstr "Kahve fincanı" -#: emoticontheme.cpp:790 +#: emoticontheme.cpp:887 msgid "Birthday cake" msgstr "Doğum günü pastası" -#: emoticontheme.cpp:791 +#: emoticontheme.cpp:888 msgid "Plate" msgstr "Tabak" -#: emoticontheme.cpp:792 +#: emoticontheme.cpp:889 msgid "Bowl" msgstr "Tas" -#: emoticontheme.cpp:793 +#: emoticontheme.cpp:890 msgid "Star" msgstr "Yıldız" -#: emoticontheme.cpp:794 +#: emoticontheme.cpp:891 msgid "Rainbow" msgstr "Gökkuşağı" -#: emoticontheme.cpp:795 +#: emoticontheme.cpp:892 msgid "Stormy cloud" msgstr "Şimşekli bulut" -#: emoticontheme.cpp:796 +#: emoticontheme.cpp:893 msgid "Lightning" msgstr "Yıldırım" -#: emoticontheme.cpp:797 +#: emoticontheme.cpp:894 msgid "Umbrella" msgstr "Şemsiye" -#: emoticontheme.cpp:798 +#: emoticontheme.cpp:895 msgid "Island with a palm tree" msgstr "Issız ada" -#: emoticontheme.cpp:799 +#: emoticontheme.cpp:896 msgid "Telephone receiver" msgstr "Ahize" -#: emoticontheme.cpp:800 +#: emoticontheme.cpp:897 msgid "Mobile Phone" msgstr "Cep telefonu" -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 +#: emoticontheme.cpp:898 msgid "Email" msgstr "E-posta" -#: emoticontheme.cpp:802 +#: emoticontheme.cpp:899 msgid "Clock" msgstr "Saat" -#: emoticontheme.cpp:803 +#: emoticontheme.cpp:900 msgid "Camera" msgstr "Fotoğraf Makinesi" -#: emoticontheme.cpp:804 +#: emoticontheme.cpp:901 msgid "Filmstrip" msgstr "Film şeridi" -#: emoticontheme.cpp:805 +#: emoticontheme.cpp:902 msgid "Note" msgstr "Not" -#: emoticontheme.cpp:806 +#: emoticontheme.cpp:903 msgid "Handcuffs" msgstr "Kelepçe" -#: emoticontheme.cpp:807 +#: emoticontheme.cpp:904 msgid "Money" msgstr "Para" -#: emoticontheme.cpp:808 +#: emoticontheme.cpp:905 msgid "Light bulb" msgstr "Ampul" -#: emoticontheme.cpp:809 -msgid "Cigarrette" +#: emoticontheme.cpp:906 +#, fuzzy +msgid "Cigarette" msgstr "Sigara" -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "Futbol topu" +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:908 msgid "Gift with a bow" msgstr "Hediye" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:909 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:910 msgid "Computer" msgstr "Bilgisayar" -#: emoticontheme.cpp:814 -msgid "KMess Icon" +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" msgstr "KMess simgesi" -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "'%1' geçerli bir kişi adresi değil." +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "" -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Sunucu hazır değil" + +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "Sunucu hazır değil" + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Bağlan" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "E-posta adresi" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "E-posta adresi" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "Kişi zaten listenizde bulunuyor" + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "E-posta bilgisini göster" + +#: kmess.cpp:248 +#, fuzzy +msgid "New Group" +msgstr "Yeni &Grup" + +#: kmess.cpp:251 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Grup &Ekle" -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" +#: kmess.cpp:252 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Bu grup için yeni adı girin:" -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "Kendiliğinden yanıtlamayla Uzakta" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "Boşta" - -#: kmess.cpp:715 +#: kmess.cpp:576 +#, kde-format 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:718 -msgid "Remove contact" +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" msgstr "K&işiyi Sil" -#: kmess.cpp:720 -msgid "Remove and block" +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" msgstr "Engeli kaldır" -#: kmess.cpp:760 +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" msgid "" "Are you sure you want to remove the group %1 from your contact " "list?" msgstr "Gerçekten %1 grubunu silmek istiyor musunuz?" -#: kmess.cpp:763 -msgid "Remove group" -msgstr "Grubu &Sil" +#: kmess.cpp:636 +#, fuzzy +msgctxt "dialog button" +msgid "Remove" +msgstr "Silindi" -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." msgstr "Bu özel bir gruptur ve değiştirilemez." -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "&Grubu Yeniden Adlandır" +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "Grubu Y&eniden Adlandır" -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "Bağlı" +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "Bu grup için yeni adı girin:" -#: kmess.cpp:1231 kmessview.cpp:169 +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Kimlik denetimi başarısız" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "Bağlanıyor..." + +#: kmess.cpp:1109 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Bağlı değil" -#: kmess.cpp:1669 +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, fuzzy, kde-format +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 'eventsrc' 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:1673 -msgid "Error with notifications" +#: kmess.cpp:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Bildirimlerde hata" -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "Yeni &Hesap" +#: kmess.cpp:1744 +#, fuzzy, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess" -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "Yeni &Kişi" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "Yeni &Grup" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "&Kişiyi Ara" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "İ&lgiye Göre Ara" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "&Hesap Ayarları" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "&Eylemler" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "Bağla&n" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "Bağlantıyı &Kes" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "&Profilimi Göster" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "&Durumum" - -#: kmessinterface.cpp:220 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 msgid "&Connect" msgstr "&Bağlan" -#: kmessinterface.cpp:275 +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "Bağlantıyı &Kes" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "&Profilimi Göster" + +#: kmessinterface.cpp:167 msgid "Show &Allowed Contacts" msgstr "İ&zin Verilen Kişileri Göster" -#: kmessinterface.cpp:276 +#: kmessinterface.cpp:168 msgid "Show &Offline Contacts" msgstr "Bağlı &olmayanları göster" -#: kmessinterface.cpp:277 +#: kmessinterface.cpp:169 msgid "Show &Removed Contacts" msgstr "&Silinen Kişileri Göster" -#: kmessinterface.cpp:278 +#: kmessinterface.cpp:170 #, fuzzy -msgid "Show &Display Pictures" +msgid "Show &History Box" +msgstr "Sohbet stili:" + +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Kenar Çubuğu" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &Empty Groups" +msgstr "İfadelerimi &Göster" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Display Pictures Size" msgstr "Görüntü Resmi:" -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "&Ağ Penceresini Göster" - -#: kmessinterface.cpp:285 +#: kmessinterface.cpp:174 msgid "&Sort Contacts by" msgstr "&Kişileri şu ölçütle sırala" -#: kmessinterface.cpp:286 kmessview.cpp:1190 +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "&Aktarım Penceresini Göster" + +#: kmessinterface.cpp:180 +#, fuzzy +msgid "New &Contact..." +msgstr "Yeni &Kişi" + +#: kmessinterface.cpp:181 +#, fuzzy +msgid "New &Group..." +msgstr "Yeni &Grup" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "&Export Contact List..." +msgstr "&Kişiyi Ara" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Sohbet stili:" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "New &Account..." +msgstr "Yeni &Hesap" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "Yeni &Hesap" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:191 +#, fuzzy +msgid "Small" +msgstr "Gülen surat" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:197 msgid "Group" msgstr "Grup" -#: kmessinterface.cpp:286 +#: kmessinterface.cpp:198 msgid "Online/Offline" msgstr "Bağlı/Bağlı değil" -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "&Aktarım Penceresini Göster" +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "" -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "Şimdi dinleniyor - %1" +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "&Ağ Penceresini Göster" -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "" +#: kmessview.cpp:318 +#, kde-format +msgid "[%1] Logged in with %2" +msgstr "" -#: kmessview.cpp:613 +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "" + +#: kmessview.cpp:599 msgid "Cha&t" msgstr "&Sohbet" -#: kmessview.cpp:616 -msgid "&Properties" -msgstr "&Özellikler" - -#: kmessview.cpp:623 -msgid "&Remove from group" +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" msgstr "&Gruptan Sil" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "Gruba &Taşı" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" msgstr "Gruba &Kopyala" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "Gruba &Taşı" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "Grubu &Aşağı Taşı" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "Grubu &Yukarı Taşı" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "Grubu &Sil" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "Grubu Y&eniden Adlandır" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "Gelen kutunuzda yeni bir posta var." +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "Bu kişiyi \"Arkadaşlar\" listesine &ekle" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "Gelen kutunuzda %1 yeni posta var." +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-posta adresi" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(Uzakta)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "E-posta istemcisi" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(Döneceğim)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(Meşgul)" +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "Not" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(Görünmez)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Engellenmiş" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(Boş duruyor)" +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(Yemekte)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Sohbet mesajlarında &zamanı göster" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(Telefonda)" +#: kmessview.cpp:1216 +#, fuzzy, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "
%1 (%2)" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "Bu e-posta adresi ile otomatik bağlan" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "Kişi çevrimdışı" +msgstr[1] "Kişi çevrimdışı" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "Kişiler" +msgstr[1] "Kişiler" + +#: kmessview.cpp:1651 +#, 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:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "Daveti reddettiniz." + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "Sohbet stili:" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" +msgstr[1] "" + +#: kmessviewdelegate.cpp:148 +#, fuzzy, kde-format +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, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +#, fuzzy +msgid "Project support" +msgstr "P4-İçerik alanı desteği" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +#, fuzzy +msgid "Current developer" +msgstr "GnomeMeeting geliştiricisi" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 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:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "Site tasarımı" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:73 +#, 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:74 msgid "Cartoon emoticons" msgstr "Çizgi Film İfadeleri" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "Öntanımlı ses teması" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arapça çeviri, uluslararasılaştırma ve dosya kaydetme onarımı" -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "Daha fazla Arapça çeviri" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "Portekizce çeviri" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Portekizce çeviri" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 msgid "Catalan translation" msgstr "Katalanca çeviri" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "Daha fazla İtalyanca çeviri" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 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:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "Daha fazla Basitleştirilmiş Çince çeviri" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "Geleneksel Çince çeviri" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Geleneksel Çince çeviri" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 msgid "Danish translation" msgstr "Danimarkaca çeviri" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 msgid "More Danish translation" msgstr "Daha fazla Danimarkaca çeviri" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "Holandaca çeviri" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" msgstr "Daha fazla Holandaca çeviri" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Daha fazla Arapça çeviri" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "Daha fazla Fransızca çeviri" + +#: main.cpp:111 msgid "Estonian translation" msgstr "Estonyaca çeviri" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 msgid "Finnish translation" msgstr "Fince çeviri" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 msgid "More Finnish translation" msgstr "Daha fazla Fince çeviri" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "Fransızca çeviri" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" msgstr "Daha fazla Fransızca çeviri, MSN6 ifadelerinin tanımları" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" msgstr "Daha fazla Fransızca çeviri" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "Macarca çeviri" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Macarca çeviri" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 msgid "More Italian translation" msgstr "Daha fazla İtalyanca çeviri" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "Korece çeviri" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "Norveç Bokmal çeviri" -#: main.cpp:115 -msgid "Slovenian translation" -msgstr "Slovence çeviri" - -#: main.cpp:116 -msgid "Spanish translation" -msgstr "İspanyolca çeviri" - -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 -msgid "More Spanish translation" -msgstr "Daha fazla İspanyolca çeviri" - -#: main.cpp:121 -msgid "Swedish translation" -msgstr "İspanyolca çeviri" - -#: main.cpp:123 -msgid "Thai translation" -msgstr "Tayca çeviri" - -#: main.cpp:124 -msgid "Turkish translation" -msgstr "Türkçe çeviri" - -#: main.cpp:125 main.cpp:126 -msgid "More Turkish translation" -msgstr "Daha fazla Türkçe çeviri" - -#: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:128 +msgid "Øyvind Sæther" msgstr "" #: main.cpp:130 -msgid "P4-Context field support" -msgstr "P4-İçerik alanı desteği" +#, fuzzy +msgid "Serbian translation" +msgstr "Slovence çeviri" -#: main.cpp:131 -msgid "Xinerama fixes" -msgstr "Xinerama ayarları" +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" #: main.cpp:132 -msgid "Original file receive code" -msgstr "Asıl dosya alım kodu" +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "Slovence çeviri" #: main.cpp:133 -msgid "Various internationalization fixes." -msgstr "Çeşitli uluslararasılaştırma onarımları" +msgid "Matjaž Kaše" +msgstr "" -#: main.cpp:134 -msgid "GnomeMeeting developer" -msgstr "GnomeMeeting geliştiricisi" +#: main.cpp:133 +msgid "Slovenian translation" +msgstr "Slovence çeviri" #: main.cpp:135 -msgid "Guy with a bag over his head" -msgstr "Kafasında kağıt paket olan adam" +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 +msgid "Spanish translation" +msgstr "İspanyolca çeviri" + +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 +msgid "More Spanish translation" +msgstr "Daha fazla İspanyolca çeviri" + +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" #: main.cpp:138 -msgid "Inspiration and assorted code" -msgstr "Esinlenme ve çeşitli kodlar" +msgid "Jaume Corbí" +msgstr "" #: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Eski baloncuk kodu, p2p kodunun ilk hali, msn etkileşimi yöneticisi" +msgid "Christian Kaiser" +msgstr "" #: main.cpp:140 -msgid "Idle timer code" -msgstr "Bekleme zamanlayıcı kodu" +msgid "Juan Pablo González Tognarelli" +msgstr "" #: main.cpp:141 -msgid "Close-to-tray icon screenshot code" +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" msgstr "" #: main.cpp:144 -msgid "Your name here?" -msgstr "Ve siz?" +msgid "Christian Lundgren" +msgstr "" #: main.cpp:144 +msgid "Swedish translation" +msgstr "İspanyolca çeviri" + +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "İspanyolca çeviri" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 +msgid "Thai translation" +msgstr "Tayca çeviri" + +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 +msgid "Turkish translation" +msgstr "Türkçe çeviri" + +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 +msgid "More Turkish translation" +msgstr "Daha fazla Türkçe çeviri" + +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "Çevri&miçi olduklarında" + +#: main.cpp:154 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Dosya Aktarımları" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 +msgid "P4-Context field support" +msgstr "P4-İçerik alanı desteği" + +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 +msgid "Xinerama fixes" +msgstr "Xinerama ayarları" + +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 +msgid "Original file receive code" +msgstr "Asıl dosya alım kodu" + +#: main.cpp:159 +#, fuzzy +msgid "KWallet support" +msgstr "P4-İçerik alanı desteği" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "Sohbet stili:" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "Çeşitli uluslararasılaştırma onarımları" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 +msgid "Various internationalization fixes." +msgstr "Çeşitli uluslararasılaştırma onarımları" + +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 +msgid "GnomeMeeting developer" +msgstr "GnomeMeeting geliştiricisi" + +#: main.cpp:169 +msgid "Guy with a bag over his head" +msgstr "Kafasında kağıt paket olan adam" + +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 +msgid "Inspiration and assorted code" +msgstr "Esinlenme ve çeşitli kodlar" + +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +#, fuzzy +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:174 +msgid "Idle timer code" +msgstr "Bekleme zamanlayıcı kodu" + +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:176 +msgid "Amarok" +msgstr "" + +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 #, fuzzy msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" msgstr "" "KMess yardım forumlarına hata düzeltmeleriniz ve yamalarınızla katılmanızı " @@ -1297,985 +2772,2388 @@ msgstr "" "Bu listede isminizin unutulduğunu düşünüyorsanız lütfen bizimle iletişime " "geçin!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 +#: main.cpp:179 +msgid "Your name here?" +msgstr "Ve siz?" + +#: main.cpp:182 +#, fuzzy +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Sizin adınız" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "E-posta adresi:" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "Kişi listesi alınıyor..." + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "Bu e-posta adresi ile otomatik bağlan" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1826 +msgid "Allowed" +msgstr "İzin verildi" + +#: model/contactlist.cpp:1827 +msgid "Removed" +msgstr "Silindi" + +#: network/applications/application.cpp:294 msgid "The contact cancelled the session." msgstr "Karşıdaki oturumu iptal etti" -#: network/applications/application.cpp:288 +#: network/applications/application.cpp:306 msgid "The contact rejected the invitation." msgstr "Karşıdaki daveti reddetti." -#: network/applications/application.cpp:360 +#: network/applications/application.cpp:378 msgid "You have cancelled the session." msgstr "Oturumu iptal ettiniz." -#: network/applications/application.cpp:372 +#: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Daveti reddettiniz." -#: network/applications/application.cpp:497 +#: network/applications/application.cpp:540 +#, fuzzy, kde-format msgid "Do you want to
accept or cancel?" msgstr "" "Ne yapmak istiyorsunuz? Kabul Et / Reddet" -#: network/applications/application.cpp:533 +#: network/applications/application.cpp:581 +#, fuzzy, kde-format msgid "Click to cancel." msgstr "İptal etmek için tıklayın." -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -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 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +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, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." msgstr "%1 aktarılamadı. Dosya açılamadı." -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "Bağlanıyor %1, port %2" +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "%1 aktarılamadı. Dosya açılamadı." -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "Aktarım iptal edildi." - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "Bağlantı sağlandı" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "Dosya başarıyla aktarıldı: %1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1 aktarılamadı. Dosya bulunamadı." - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 aktarılamadı. Dosya okunamıyor." - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "Dosya gönderiliyor: %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Aktarım kabul edildi." -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "Bağlanıyor %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "Karşıdaki kişi aktarımı iptal etti." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "Oturumu iptal ettiniz." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "Oturumu iptal ettiniz." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Bağlantı sağlandı" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "Dosya başarıyla aktarıldı: %1" + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "Dosya başarıyla aktarıldı: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "%1 dosyası aktarılamadı. Dosya bulunamadı." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "%1 dosyası aktarılamadı. Dosya okunamıyor." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy, kde-format +msgid "Sending file "%1" (%2)." +msgstr "Dosya gönderiliyor: %1 (%2)" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the 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:3217 msgid "Negotiating options to connect" msgstr "" -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 +#: 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 "Dosya aktarımı iptal edildi. Kötü veri aktarımı alındı." -#: network/applications/filetransferp2p.cpp:352 -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ı" +#: network/applications/filetransferp2p.cpp:404 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "Oturumu iptal ettiniz." -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "Karşıdaki kişi aktarımı iptal etti." - -#: network/applications/filetransferp2p.cpp:586 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1 dosyası aktarılamadı. Dosya bulunamadı." - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 dosyası aktarılamadı. Dosya okunamıyor." - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "Dosya gönderiliyor: %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 +#: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Bir buluşmaya davet edildiniz (GnomeMeeting kullanarak)." -#: network/applications/gnomemeeting.cpp:114 +#: network/applications/gnomemeeting.cpp:118 +#, kde-format msgid "Starting GnomeMeeting. Connecting to %1." msgstr "GnomeMeeting Başlatılıyor. %1 kişisine bağlanılıyor." -#: network/applications/gnomemeeting.cpp:156 +#: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." msgstr "Kişi buluşmaya davet ediliyor." -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." msgstr "Davet reddedildi. Karşıdaki istemci bunu desteklemiyor." -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." msgstr "Davet iptal edildi. Bir hata oluştu." -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +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:130 -msgid "The invitation was aborted. Timeout while waiting for file data." +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +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:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +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:141 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Davet iptal edildi." -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." +#: network/applications/msnremotedesktop.cpp:52 +#, fuzzy +msgid "You are invited to share this contact's desktop." msgstr "Bu kişinin masaüstünü paylaşmaya davet edildiniz." -#: network/applications/msnremotedesktop.cpp:155 +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format msgid "Starting KRDC. Connecting to %1." msgstr "KRDC Başlatılıyor. %1 kişisine bağlanılıyor." -#: network/applications/p2papplication.cpp:276 -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:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "Karşıdaki sizi '%1' için davet ediyor. Bu henüz desteklenmiyor." -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"The invitation was cancelled. The contact sent bad data, or KMess does not " "support it." msgstr "" "Davet iptal edildi. Kişiden gelen veriler bozulmuş ya da KMess bunu " "desteklemiyor." -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." msgstr "Aktarım başarısız. Veri hazırlanamadı." -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kişi daveti reddetti. Bir hata oluştu." - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "Aktarım başarısız." - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -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:2038 +#: network/applications/p2papplication.cpp:1192 msgid "The invitation was cancelled. Message was not directed to us." msgstr "Davet iptal edildi. İleti bize gönderilmemiş." -#: network/applications/p2papplication.cpp:2584 +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." +"The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "" "Aktarım başarısız. Kişiden gelen veriler bozulmuş ya da KMess bunu " "desteklemiyor." -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "Kişi daveti reddetti. Bir hata oluştu." + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format msgid "Awaiting connection at %1, port %2" msgstr "Bağlantı bekleniyor %1, port %2" -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "Dolaylı dosya gönderimi deneniyor (bu yavaş olabilir)." -#: network/applications/p2papplication.cpp:3274 -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/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "Aktarım başarısız. Bir hata oluştu." - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "Aktarım başarısız. Veri kaynağı açılamadı." - -#: network/applications/p2papplication.cpp:4844 +#: network/applications/p2papplication.cpp:3169 #, fuzzy msgid "Waiting for connection" msgstr "Kişi listesi alınıyor..." -#: network/applications/p2papplication.cpp:5013 +#: network/applications/p2papplication.cpp:3423 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " +"The invitation was cancelled. A timeout occurred waiting for the contact to " "accept." msgstr "" "Davet iptal edildi. Karşıdakinin kabul etmesi beklenirken zaman aşımı oldu." -#: network/applications/p2papplication.cpp:5022 +#: network/applications/p2papplication.cpp:3432 +#, fuzzy msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " +"The invitation was cancelled. A timeout occurred waiting for a connection to " "succeed or fail." msgstr "Davet iptal edildi. Bağlantıda zaman aşımı oldu." -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." msgstr "Davet iptal edildi. Veri beklenirken zaman aşımı oldu." -#: network/applications/voiceconversation.cpp:77 +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kişi daveti reddetti. Bir hata oluştu." + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "Aktarım başarısız." + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +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:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Aktarım başarısız. Bir hata oluştu." + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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." -#: network/applications/voiceconversation.cpp:82 +#: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "Sesli bir görüşmeye davet edildiniz fakat bunun desteği kurulu değil." -#: network/applications/voiceconversation.cpp:174 +#: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." msgstr "Sesli görüşmeyi iptal ettiniz." -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." +#: network/applications/voiceconversation.cpp:205 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." msgstr "Davet iptal edildi. Ses aygıtı açılamadı." -#: network/applications/voiceconversation.cpp:222 +#: network/applications/voiceconversation.cpp:218 +#, fuzzy, kde-format msgid "Start voice conversation. Connecting to %1." msgstr "Sesli görüşme başlatılıyor. % kişisine bağlanıyor." -#: network/applications/voiceconversation.cpp:228 +#: network/applications/voiceconversation.cpp:224 +#, kde-format msgid "Start voice conversation. Listening on %1." msgstr "Sesli görüşme başlat. %1 dinleniyor." -#: network/applications/voiceconversation.cpp:293 +#: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "Sesli görüşme daveti gönderiliyor." -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format 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/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "%1 aktarımı iptal edildi." +#: 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/extra/msnftpconnection.cpp:136 +#: 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 contact'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:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "Oturumu iptal ettiniz." + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Karşıdaki kişi aktarımı iptal etti." + +#: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "Dosya gönderiliyor: %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." msgstr "%1 aktarılamadı. Yerel port açılamadı." -#: network/extra/msnftpconnection.cpp:411 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy -msgid "Couldn't open a local port." +msgid "Could not open a local port." msgstr "%1 aktarılamadı. Yerel port açılamadı." -#: network/extra/msnftpconnection.cpp:468 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Dosya gönderimi başlatılıyor" -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. A connection could not be made." msgstr "%1 aktarılamadı. Bağlantı kurulamadı" -#: network/extra/msnftpconnection.cpp:482 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "Bağlantı kurulamadı: %1" -#: network/extra/msnftpconnection.cpp:586 +#: network/extra/msnftpconnection.cpp:574 +#, kde-format msgid "Receiving file %1" msgstr "Dosya alınıyor: %1" -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" msgstr "" -"Kmess MSN Messenger servisine bağlanamadı.\n" -"Lütfen İnternet bağlantınızı kontrol edin.\n" -"Sistem hatası: %1 (kod %2)." -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping kayıp" - -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 ping kayıp" - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "Sunucuya bağlantı kaybedildi." - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "Karşıdaki sunucu bağlantıyı kapattı." - -#: network/msnnotificationconnection.cpp:75 -msgid "Allowed" -msgstr "İzin verildi" - -#: network/msnnotificationconnection.cpp:76 -msgid "Removed" -msgstr "Silindi" - -#: network/msnnotificationconnection.cpp:545 -msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" 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:740 -msgid "Show MSN Messenger Service status?" -msgstr "Messenger servisi durumu gösterilsin mi?" +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "Eklemeye çalıştığınız e-postanın MSN Messenger hesabı yok" -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "Sunucu Hatası" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "" -#: network/msnnotificationconnection.cpp:1339 +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:396 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Verilen hesap adı geçersiz" + +#: network/msnconnection.cpp:400 #, fuzzy msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." +"This 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/msnconnection.cpp:403 +msgid "Your contact list is full" +msgstr "Bağlantı listeniz dolu" + +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 +msgid "This contact is already on your list" +msgstr "Kişi zaten listenizde bulunuyor" + +#: network/msnconnection.cpp:415 +msgid "This contact is not on your list" +msgstr "Kişi listenizde yok" + +#: network/msnconnection.cpp:419 +msgid "This contact is not online" +msgstr "Kişi çevrimdışı" + +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "Bu grup adı Messenger veya Hotmail kişi listenizde kullanılıyor." + +#: network/msnconnection.cpp:436 +#, 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/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" +msgstr "Bu özel bir gruptur ve değiştirilemez." + +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "Bağlantı listenizde çok fazla grup var" + +#: network/msnconnection.cpp:449 +msgid "This group is not empty" +msgstr "Bu grup boş değil" + +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" + +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "" + +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "KMess içinde bir hata oluştu: %1" + +#: network/msnconnection.cpp:462 +#, fuzzy +msgid "Invalid Group" +msgstr "Grubu Y&eniden Adlandır" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 +msgid "Switchboard server failed" +msgstr "Pano sunucusu başarısız" + +#: network/msnconnection.cpp:476 +msgid "Transfer to switchboard server failed" +msgstr "Pano sunucusu aktarımı başarısız" + +#: network/msnconnection.cpp:480 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "Direkt bağlantı (MSNSLP) hatası, bağlantı başarısız" + +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "" + +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "" + +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" +msgstr "Hesabınız yasaklanmış." + +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "Aktarım başarısız." + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +#, fuzzy +msgid "You are opening chat sessions too fast" +msgstr "Çok fazla oturum açıyorsunuz" + +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" +msgstr "Çok fazla oturum açık" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 +msgid "Bad friend name" +msgstr "Hatalı isim" + +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:540 +#, 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/msnconnection.cpp:547 +#, fuzzy +msgid "Authentication ticket was incorrect" +msgstr "Kimlik denetimi başarısız" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" +msgstr "Görünmez durumdayken bir sohbet başlatamazsınız." + +#: network/msnconnection.cpp:554 +#, fuzzy +msgid "Not accepting new contacts" +msgstr "Yeni kurallar kabul edilmiyor" + +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"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/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" +msgstr "Hesabınızın doğrulanması gerekiyor." + +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "Kişi listesine ulaşırken hata, daha sonra tekrar deneyin" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "Sunucuda iç hata oluştu" + +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "Sunucuda iç hata oluştu" + +#: network/msnconnection.cpp:599 +msgid "Peer notification server down" +msgstr "Bireysel bildirim sunucusu devre dışı" + +#: network/msnconnection.cpp:603 +msgid "The server is going down" +msgstr "Sunucu kapatılacak" + +#: network/msnconnection.cpp:607 +msgid "The server is going down soon" +msgstr "Sunucu yakında kapatılacak" + +#: network/msnconnection.cpp:612 +msgid "Write is blocking" +msgstr "Yazma engelleniyor" + +#: network/msnconnection.cpp:616 +msgid "Session is overloaded" +msgstr "Oturum aşırı yüklenmiş durumda" + +#: network/msnconnection.cpp:623 +msgid "The server is not available" +msgstr "Sunucu hazır değil" + +#: network/msnconnection.cpp:627 +msgid "Authentication failed" +msgstr "Kimlik denetimi başarısız" + +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "KMess, sunucudan bilinmeyen bir komut aldı: %1" + +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "KMess - MSN hatası" + +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1337 +#, fuzzy +msgid "Authenticating..." +msgstr "Kimlik denetimi yapılıyor" + +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "Kimlik denetimi başarısız" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "Bağlanıyor..." + +#: network/msnnotificationconnection.cpp:1940 +#, fuzzy, kde-format +msgid "Unknown command received from the server: %1" +msgstr "KMess, sunucudan bilinmeyen bir komut aldı: %1" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "dakika" +msgstr[1] "dakika" + +#: network/msnnotificationconnection.cpp:2103 +#, fuzzy, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "Uyarı: Sunucu %1 dakika içinde bakım için kapanacak!" + +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger 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:2309 +#, fuzzy, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" +"KMess çevrimdışı mesajları işleyemedi.\n" +"Ayrıntılar: %1" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "Kimlik denetimi başarısız" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "Kişi listesi alınıyor..." + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "KMess içinde bir hata oluştu: %1" + +#: network/msnnotificationconnection.cpp:2904 +#, fuzzy +msgctxt "Connection error: dialog box" +msgid "" +"

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:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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:1553 -msgid "Got synchronization" -msgstr "Eşzamanlama alındı" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "Kimlik denetimi yapılıyor" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "Kullanıcı onayı alındı" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "Kişi listesi alınıyor..." - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "Bilgilendirme sunucusuna aktarım" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" +#: network/msnnotificationconnection.cpp:2932 +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 "" -"Kimlik doğrulaması başarısız, lütfen hesap adınızı ve şifrenizi kontrol edin" -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "Bağlanıyor..." +#: network/msnnotificationconnection.cpp:2935 +#, fuzzy, kde-format +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:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess, sunucudan bilinmeyen bir komut aldı: %1" +#: network/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "Sunucuya bağlantı kaybedildi." + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" msgstr "KMess içinde bir hata oluştu: %1" -#: network/msnnotificationconnection.cpp:2243 -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:2252 -msgid "The account name given is invalid" -msgstr "Verilen hesap adı geçersiz" - -#: network/msnnotificationconnection.cpp:2255 +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "Verilen hesap adı geçersiz veya henüz aktifleştirilmemiş" - -#: network/msnnotificationconnection.cpp:2258 -msgid "Your contact list is full" -msgstr "Bağlantı listeniz dolu" - -#: network/msnnotificationconnection.cpp:2264 -msgid "This contact is already on your list" -msgstr "Kişi zaten listenizde bulunuyor" - -#: network/msnnotificationconnection.cpp:2267 -msgid "This contact is not on your list" -msgstr "Kişi listenizde yok" - -#: network/msnnotificationconnection.cpp:2270 -msgid "This contact is not online" -msgstr "Kişi çevrimdışı" - -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "Bağlantı listenizde çok fazla grup var" - -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" -msgstr "Bu özel bir gruptur ve değiştirilemez." - -#: network/msnnotificationconnection.cpp:2285 -msgid "This group is not empty" -msgstr "Bu grup boş değil" - -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "Bu grup adı Messenger veya Hotmail kişi listenizde kullanılıyor." - -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "Grup adı çok uzun" - -#: network/msnnotificationconnection.cpp:2300 -msgid "Switchboard server failed" -msgstr "Pano sunucusu başarısız" - -#: network/msnnotificationconnection.cpp:2303 -msgid "Transfer to switchboard server failed" -msgstr "Pano sunucusu aktarımı başarısız" - -#: network/msnnotificationconnection.cpp:2306 -msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "Direkt bağlantı (MSNSLP) hatası, bağlantı başarısız" - -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "Kişi listesine ulaşırken hata, daha sonra tekrar deneyin" - -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "Hesabınız yasaklanmış." - -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "Çok fazla oturum açıyorsunuz" - -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "Çok fazla oturum açık" - -#: network/msnnotificationconnection.cpp:2341 -msgid "Bad friend name" -msgstr "Hatalı isim" - -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "Sunucu KMess'in çok fazla veri göndererek flood yaptığını söylüyor." - -#: network/msnnotificationconnection.cpp:2359 -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:2362 -msgid "You have a kids passport, you need parental consent to chat online." +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" msgstr "" -"Çocuk hesabınız var, İnternette sohbet yapmak için ebeveynlerinizden izin " -"almalısınız." -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "Hesabınızın doğrulanması gerekiyor." - -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN hatası" - -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "Sunucuda iç hata oluştu" - -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "Sunucu çok meşgul" - -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "Sunucuya erişilemiyor" - -#: network/msnnotificationconnection.cpp:2419 -msgid "Peer notification server down" -msgstr "Bireysel bildirim sunucusu devre dışı" - -#: network/msnnotificationconnection.cpp:2423 -msgid "The server is going down" -msgstr "Sunucu kapatılacak" - -#: network/msnnotificationconnection.cpp:2426 -msgid "The server is going down soon" -msgstr "Sunucu yakında kapatılacak" - -#: network/msnnotificationconnection.cpp:2430 -msgid "Write is blocking" -msgstr "Yazma engelleniyor" - -#: network/msnnotificationconnection.cpp:2433 -msgid "Session is overloaded" -msgstr "Oturum aşırı yüklenmiş durumda" - -#: network/msnnotificationconnection.cpp:2438 -msgid "The server is not available" -msgstr "Sunucu hazır değil" - -#: network/msnnotificationconnection.cpp:2441 -msgid "Authentication failed" -msgstr "Kimlik denetimi başarısız" - -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "Yeni kurallar kabul edilmiyor" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess, sunucudan bilinmeyen bir hata mesajı aldı: %1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "Uyarı: 1 dakika içinde sunucu bakım için kapanacak!" - -#: network/msnnotificationconnection.cpp:2596 -msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "MSN Sunucusu bakım nedeniyle 1 dakika içinde kapanacağını bildirdi." - -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "Uyarı: Sunucu %1 dakika içinde bakım için kapanacak!" - -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" -msgstr "" -"KMess çevrimdışı mesajları işleyemedi.\n" -"Ayrıntılar: %1" - -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" -"Doğrulama başarısız, KMess hesabınızla giriş yapamadı.\n" -"Ayrıntılar: %1" - -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" -msgstr "" -"KMess uzaktaki web servisine erişemedi. \n" -"\n" -"Ayrıntılar: %1" - -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "Bu kişi bağlı değil ya da görünmez durumda." - -#: network/msnswitchboardconnection.cpp:1052 -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/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "\"%1\" mesajı alınamadı!" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "Bağlantı kurulamadı: %1" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "Giriş servisi çok fazla yönlendirme yapıyor" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" +#: network/msnsockettcp.cpp:364 +#, fuzzy +msgid "Connection time limit exceeded" msgstr "Bağlantı zaman aşımına uğradı" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping kayıp" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 ping kayıp" + +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "Sunucuya bağlantı kaybedildi." + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy, kde-format +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/soap/addressbookservice.cpp:787 +#, fuzzy, kde-format +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/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Sunucu hazır değil" + +#: network/soap/httpsoapconnection.cpp:479 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Giriş servisi çok fazla yönlendirme yapıyor" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Sunucu hazır değil" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" msgstr "%1 ile sohbette: %2" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" msgstr "%1 diyor ki:
'%2'" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" msgstr "%1 size çevrimdışı bir ileti gönderdi:
'%2'" -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" +#: notification/chatnotification.cpp:187 +#, fuzzy, kde-format +msgid "%1's chat requests attention!" msgstr "%1 ile sohbet ilgi istiyor!" -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" msgstr "%1:
%2" -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" +#: notification/chatnotification.cpp:199 +#, fuzzy, kde-format +msgid "%1 has sent you a handwritten message!" msgstr "%1 size bir titreme gönderdi!" -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" +#: notification/chatnotification.cpp:203 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 size bir titreme gönderdi!" + +#: notification/chatnotification.cpp:207 +#, fuzzy, kde-format +msgid "%1 has sent you a wink!" msgstr "%1 size bir göz kırpma gönderdi!" -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" +#: notification/chatnotification.cpp:213 +#, fuzzy, kde-format +msgid "%1 wants to use the webcam!" msgstr "%1 ağ kamerasını kullanmak istiyor!" -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" +#: notification/chatnotification.cpp:214 +#, fuzzy, kde-format +msgid "%1 is sending you a file!" msgstr "%1 size bir dosya gönderiyor!" -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" +#: notification/chatnotification.cpp:215 +#, fuzzy, kde-format +msgid "%1 has sent you an invitation!" msgstr "%1 size bir davet gönderdi!" -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" +#: notification/chatnotification.cpp:222 +#, fuzzy, kde-format +msgid "%1 has canceled the webcam session!" msgstr "%1 ağ kamerası oturumunu iptal etti!" -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" +#: notification/chatnotification.cpp:223 +#, fuzzy, kde-format +msgid "%1 has canceled the file transfer!" msgstr "%1 dosya aktarımını iptal etti!" -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" +#: notification/chatnotification.cpp:224 +#, fuzzy, kde-format +msgid "%1's activity has been canceled!" msgstr "%1 etkileşimi iptal edildi!" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" +#: notification/chatnotification.cpp:231 +#, fuzzy, kde-format +msgid "%1 has accepted to use the webcam!" msgstr "%1 ağ kamerasını kullanmayı kabul etti!" -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" +#: notification/chatnotification.cpp:232 +#, fuzzy, kde-format +msgid "%1 has accepted the file transfer!" msgstr "%1 dosya aktarımını kabul etti!" -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" +#: notification/chatnotification.cpp:233 +#, fuzzy, kde-format +msgid "%1 has accepted your invitation!" msgstr "%1 davetinizi kabul etti!" -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" +#: notification/chatnotification.cpp:240 +#, fuzzy, kde-format +msgid "%1 has ended the webcam session!" msgstr "%1 ağ kamerası oturumunu bitirdi!" -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" +#: notification/chatnotification.cpp:241 +#, fuzzy, kde-format +msgid "The file transfer with %1 is done!" msgstr "%1 ile olan dosya aktarımı tamamlandı!" -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" +#: notification/chatnotification.cpp:242 +#, fuzzy, kde-format +msgid "%1's activity has ended!" msgstr "%1 ile olan etkileşim bitti!" -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" +#: notification/chatnotification.cpp:249 +#, fuzzy, kde-format +msgid "%1's webcam session has failed!" msgstr "%1 ile ağ kamerası oturumu başarısız oldu!" -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" +#: notification/chatnotification.cpp:250 +#, fuzzy, kde-format +msgid "The file transfer with %1 has failed!" msgstr "%1 ile olan dosya aktarımı başarısız oldu!" -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" +#: notification/chatnotification.cpp:251 +#, fuzzy, kde-format +msgid "%1's activity has ended with an error!" msgstr "%1 ile olan etkileşim hatalı sonlandı!" -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 uzakta" +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr "%1:
%2" -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy, kde-format +msgid "%1
will be right back" msgstr "%1 hemen dönecek" -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 artık meşgul" +#: notification/contactstatusnotification.cpp:94 +#, fuzzy, kde-format +msgid "%1
is now busy" +msgstr "%1:
%2" -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 çevrimdışı" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" +#: notification/contactstatusnotification.cpp:95 +#, fuzzy, kde-format +msgid "%1
has become invisible" msgstr "%1 gizli" -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 artık boşta" +#: notification/contactstatusnotification.cpp:96 +#, fuzzy, kde-format +msgid "%1
has gone idle" +msgstr "%1:
%2" -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 yemeğe gitti" +#: notification/contactstatusnotification.cpp:97 +#, fuzzy, kde-format +msgid "%1
has logged out" +msgstr "%1 çevrimdışı" -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" msgstr "%1 telefonda" -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 çevrimiçi" +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" +msgstr "%1 yemeğe gitti" -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +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'" -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "&Gönder" +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Bir &Buluşma Başlat" -#. i18n: file ./chat/chatviewinterface.ui line 168 +#: 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, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 %2" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "" + +#: settings/accountpage.cpp:81 +#, fuzzy +msgid "Browse and Crop Picture..." +msgstr "Resme gözat ve kırp..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "Görüntü Resmi:" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" +msgstr "Görüntü resmi alınamadı" + +#: settings/accountpage.cpp:539 +#, fuzzy +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"Görüntü resmi değiştirilirken bir hata oluştu.\n" +"Doğru resmi seçtiğinizden emin olun" + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Ayarlar" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Hesap" + +#: settings/accountsettingsdialog.cpp:79 +#, fuzzy +msgid "My Account" +msgstr "Hesap" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Kişiler" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Sohbet ediyor" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Sohbet Günlüğü" + +#: 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, kde-format +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:214 +#, fuzzy, kde-format +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:294 +msgid "Are you sure you want to delete this account?" +msgstr "Gerçekten bu hesabı silmek istiyor musunuz?" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"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:371 +msgid "Hi, how are you doing? :)" +msgstr "Selam, nasıl gidiyor? :)" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "Simge" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "Harika!" + +#: settings/chatstylepage.cpp:375 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Bodrum'daki tatilden /yeni/ döndüm!" + +#: 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 "İfadeler" + +#: settings/emoticonspage.cpp:233 +#, fuzzy, kde-format +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:58 settings/globalsettingsdialog.cpp:59 +msgid "Accounts" +msgstr "Hesaplar" + +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "E-posta bildirimi" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +msgid "Select Files Directory" +msgstr "Sohbetleri bu dizine kaydet:" + +#: 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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "İfadelerimi &Göster" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, fuzzy, kde-format +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:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kişiler" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the 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 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) #: rc.cpp:12 -#, no-c-format +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "&Gönder" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Sohbet Et" + +#. 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/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "Kişi listenizde yok" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." +#. 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: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "Bu kişiye bir e-posta göndermek için tıklayın." +#. i18n: file: chat/contactswidget.ui:107 +#. 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 ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" +#. 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: 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: 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:273 +#, fuzzy +msgid "Email address:" +msgstr "E-posta adresi:" + +#. 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: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format +#. 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: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "Kişi ekle" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 +#, fuzzy msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "%1
sizi bağlantı listesine ekledi. Ne yapmak istiyorsunuz?:" +"Enter a message to be automatically sent to people who try to message you." +msgstr "" +"Size ileti göndermek isteyen kişilere\n" +"kendiliğinden gönderilecek iletiyi girin:" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +msgid "&Specify an automatic away message:" +msgstr "Uzakta durumu için ileti belirle" + +#. 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Sohbet Günlüğü" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "Bir &Görüşme başlat veya bitir" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +msgstr "Otomatik" + +#. 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 the following groups of your contact list:" msgstr "Bu kişiyi \"Arkadaşlar\" listesine &ekle" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person, but allow him or her to see your status" msgstr "" "Bu kişiyi ekle&me, ancak benim İnternet'teki durumunu görmesine izin ver" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" msgstr "" "Bu kişinin benim bağlantı durumumu görmesine ya da benimle bağlantıya " "geçmesine izin verme." -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "Silindi" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "Grup" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "Bu kişi için seçimlik bir ad girin" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "Kişiler bu durumda olduğunda bildirim göster:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "Ses:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "Görüntü Resmi:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, 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:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Görüntü Resmi:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +#, fuzzy +msgid "&Clear Cache" +msgstr "Sekmeyi temizle" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "Silindi" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "Kişiye İzin &Ver" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "Kişi listenizde yok" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "Eklemek istediğiniz kişinin eposta adresini girin:" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +#, fuzzy +msgid "Invited Contacts" +msgstr "Kişiler" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +#, 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:198 +#, fuzzy +msgid "Format" +msgstr "Keçi" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +#, fuzzy +msgid "Contacts:" +msgstr "Kişiler" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +#, fuzzy +msgid "Select All" +msgstr "Tümünü &Seç" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +#, fuzzy +msgid "Deselect All" +msgstr "Tümünü &Seç" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +#, fuzzy +msgid "Close" +msgstr "Kafası karışık" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +#, fuzzy +msgid "Command to Current Tab" +msgstr "Sekmeyi kapat" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +#, fuzzy +msgid "Standard" +msgstr "Yıldız" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +#, fuzzy +msgid "Send" +msgstr "&Gönder" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +#, fuzzy +msgid "C&lean Up" msgstr "&Temizle" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "Giriş bilgilerinizi girin:" +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +#, fuzzy +msgid "&Close" +msgstr "Kafası karışık" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "E-posta adresi" +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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 ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:276 +#, fuzzy +msgid "" +"Enter 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:279 +#, fuzzy +msgid "Password:" msgstr "Parola" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +#, fuzzy +msgid "Status at login:" msgstr "Girişteki durum" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +#, fuzzy +msgid "If enabled, KMess will save your account" +msgstr "Etkinse KMess otomatik olarak bu hesapla giriş yapar." + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +#, fuzzy +msgid "Remem&ber account" msgstr "Bu hesabı &hatırla" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "Bağlan" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "Buraya kişisel bir ileti yazın" +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:303 +#, fuzzy +msgid "R&emember password" +msgstr "Parola" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "Şimdi dinliyor - %1" +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess Bildirimi" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +#, fuzzy +msgid "New Account" +msgstr "Yeni &Hesap" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format -msgid "Accounts" -msgstr "Hesaplar" +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +#, fuzzy +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "Takma adınız:" +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:321 +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 ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:330 +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:333 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Bağlan" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Eylemler" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, fuzzy +msgid "Form" +msgstr "Keçi" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "Hesap" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +#, fuzzy +msgid "Your Account Information" +msgstr "&Hesap Ayarları" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." msgstr "Bağlı olduğunuzda listenizdekilerin görmesini istediğiniz ismi yazın." -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "E-posta adresiniz:" +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +#, fuzzy +msgid "&Friendly name:" +msgstr "&Takma ad:" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +#, 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: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "Parolanız:" +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +#, fuzzy +msgid "&Email address:" +msgstr "E-posta adresi:" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -2283,40 +5161,43 @@ msgstr "" "MSN Passport hesabınızın parolasını girin. http://register.passport.com/ " "adresinden yeni bir hesaba kaydolabilirsiniz." -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "Görünen Resim:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +#, fuzzy +msgid "&Password:" +msgstr "Parola" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +#, fuzzy +msgid "&Remember password" +msgstr "Parola" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." msgstr "&Değiştir..." -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "Resim &gösterme" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "Bu hesabın ayarlarını hatırla" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" "Giriş yapılırken \"Bu hesabı hatırla\" seçili olmadığı için ayarlarınız " "kaydolmayacak. Ayarlarınızın sistem kaydolabilmesi için bunu seçmelisiniz.\n" @@ -2324,222 +5205,661 @@ msgstr "" " Eğer misafir olarak (ör: İnternet kafede) kullanmıyorsanız bunu seçmeniz " "önerilir." -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "Başlangıçta otomatik olarak bu &hesaba bağlan" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +#, fuzzy +msgid "Re&member the settings of this account" +msgstr "Bu hesabın ayarlarını hatırla" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "Etkinse KMess otomatik olarak bu hesapla giriş yapar." -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "Girişte durumu böyle yap:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Başlangıçta otomatik olarak bu &hesaba bağlan" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +#, fuzzy +msgid "Login &as" +msgstr "Bütün sohbetleri &kaydet" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot 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/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 +msgid "Request verification email" +msgstr "Doğrulama e-postası iste" + +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 +msgid "Go to accountservices.passport.net" +msgstr "accountservices.passport.net'e git" + +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, fuzzy 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 a Passport account to connect to the Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail 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: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format -msgid "Request verification email" -msgstr "Doğrulama e-postası iste" - -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format -msgid "https://accountservices.passport.net/" -msgstr "https://accountservices.passport.net/" - -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format -msgid "Go to accountservices.passport.net" -msgstr "accountservices.passport.net'e git" - -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"To connect to the Live 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: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" msgstr "Yeni hesaba kayıt ol" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "register.passport.com'a git" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "Uyarılar" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "Girişteki durum" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "Açılır bildirimler" +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, 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:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "" +"KMess'in kaç dakika sonra \"Uzakta-Boşta\" durumuna geçeceğini belirler." + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "Şu kadar zaman sonra boşta konumuna geç:" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "dakika" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" msgstr "Kişiler bu durumda olduğunda bildirim göster:" -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "Çevri&miçi olduklarında" +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +#, fuzzy +msgid "Saved accounts:" +msgstr "Hesaplar" -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 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: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "Sizinle &sohbet başlatıldığında" - -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Click here to create a new KMess account for an email already associated to " +"a Live account" msgstr "" -"Etkinse, kişileriniz sizinle sohbet başlattığında uyarı penceresi çıkar." -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "Size ileti &gönerildiğinde" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "Hesap" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:491 +msgid "&Edit" msgstr "" -"Etkinse, kişileriniz size her ileti yolladığında uyarı penceresi çıkar." -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "&Durumlarını değiştirdiklerinde" +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +#, 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/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:500 +#, fuzzy +msgid "&Remove" +msgstr "Silindi" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" msgstr "" -"Etkinse, kişileriniz durumlarını değiştirdiklerinde uyarı penceresi çıkar." -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "Çe&vrimdışı olduklarında" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 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." +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "Bir eposta alındığında bildirim göster" +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +#, fuzzy +msgid "Enable chat logging" +msgstr "Sohbet Günlüğü" -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "Uyarı pencerelerini gizleme süresi" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "Uyarı penceresinin ne kadar süre sonra gizleneceğini belirler." - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "saniye" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -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: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 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. " +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "Sohbeti &Dosyaya Kaydet" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "Sohbeti &Dosyaya Kaydet" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Sohbeti Kaydet" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +#, 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:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "Yıl" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +#, 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:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +#, 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:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "Bütün konuşmaları ana dizine kaydet" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, 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:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "Sohbet kayıtlarının duracağı dizini seçin." + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "Sohbetleri bu dizine kaydet:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +#, fuzzy +msgid "&Chat style:" +msgstr "Sohbet stili:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +#, fuzzy +msgid "Chat Settings" +msgstr "Ayarlar" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +#, fuzzy +msgid "&Show emoticons" +msgstr "İfadelerimi &Göster" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "İfadelerimi &Göster" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, 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:648 +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:654 +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:657 +#, 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:663 +#, fuzzy +msgid "Show &date" +msgstr "Kişiler" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "İfadelerimi &Göster" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +#, fuzzy +msgid "&Text" +msgstr "&Yazıyı Kopyala" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +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:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +#, fuzzy +msgid "Your &message font:" +msgstr "İleti yazıtipiniz:" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with 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: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, 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:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Sekmeyi temizle" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +#, 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:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" @@ -2550,445 +5870,1053 @@ msgstr "" "anda sürekli titreme gönderse bile KMess pencereyi bir kez sallayacaktır.
" -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "Kişilerime ne &dinlediğimi göster" +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +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: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"

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 "" -"Etkinse, dinlediğiniz parça kişilerinize gösterilir. Bu bilgi o an çalışan " -"müzik programlarından alınır." -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Boştayken durumumu otomatik olarak \"&Uzakta-Boşta\" olarak değiştir." +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Resim &gösterme" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Bağlantı listenizde çok fazla grup var" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +#, fuzzy +msgid "Always" +msgstr "Uzakta" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Bağlantı listenizde çok fazla grup var" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +#, fuzzy +msgid "Never" +msgstr "Gözlüklü" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "Görünen Resim:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"Etkinse, birkaç dakika bilgisayar kullanılmadığı zaman durumunuz otomatik " -"olarak \"Uzakta-Boşta\" olarak değiştirilir." - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "Şu kadar zaman sonra boşta konumuna geç:" - -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -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/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "dakika" - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "Sohbet Günlüğü" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "Bütün sohbetleri &kaydet" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "Etkinse, sohbetler belirlenmiş olan dizine kaydedilir." - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "Sohbetleri bu dizine kaydet:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format -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/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "Sohbet dizinlerini şu ölçüte göre düzenle:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -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: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "Yıl" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "Ay" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "Gün" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "Bütün konuşmaları ana dizine kaydet" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "İleti yazıtipiniz:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -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/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "Kişinin iletilerinde bu yazı tipinin kullanmasını zorla:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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: file ./settings/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "Sohbet stili:" - -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -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/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "Sohbet mesajlarında &ifadeleri göster" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Sohbetlerde ifadelerin görünmesine izin verir." - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "Sohbet mesajlarında &zamanı göster" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -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/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "" -"Mesajlarda &yazıtipi efektleri kullan, ör: *koyu*, /italik/, ve _altı çizili_" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "Aynı kişiden ard arda gelen mesajları &grupla" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "E-posta istemcisi" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "" -"E-postaları okumak için KMess'in hangi programı çalıştıracağını belirler." - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "Hotmail kullan" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "Belirli bir komut kullan:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "E-posta bildirimi" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "E-posta bilgisini göster" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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." +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail 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: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "\"diğer dizinlerde\" bir eposta alındığında bildirim göster" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" 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." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +#, fuzzy +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media 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: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +#, fuzzy +msgid "Show contacts w&hich song I am listening to" +msgstr "Kişilerime ne &dinlediğimi göster" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" msgstr "İfade &Temaları" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" msgstr "Mümkün olan İfade stilleri:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" msgstr "Ö&zel İfadeler" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "Bu hesap için özel ifadeler:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "Mümkün olan İfade stilleri:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +#, fuzzy +msgid "Click here to add a new custom emoticon" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +#, fuzzy +msgid "Add Ne&w..." msgstr "&Yeni ekle..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "Tıkla" +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +#, fuzzy +msgid "Click here to rename the selected emoticon" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 msgid "Re&name" msgstr "Y&eniden Adlandır" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +#, fuzzy +msgid "Click here to delete the selected emoticon" msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" msgstr "&Sil" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "Bir ifade seçin ve silmek için buraya tıklayın." +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +#, fuzzy +msgid "Web Browser" +msgstr "Solgun gül" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "diyor ki:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "Resme gözat ve kırp..." - -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "Görüntü Resmi:" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "Görüntü resmi alınamadı" - -#: settings/accountswidget.cpp:486 -msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -"Görüntü resmi değiştirilirken bir hata oluştu.\n" -"Doğru resmi seçtiğinizden emin olun" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "Ayarlar" - -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "Hesap" - -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "Sohbet ediyor" - -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "Gerçekten bu hesabı silmek istiyor musunuz?" - -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "Selam, nasıl gidiyor? :)" - -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "Simge" - -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "Harika!" - -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "Bodrum'daki tatilden /yeni/ döndüm!" - -#: systemtraywidget.cpp:91 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" 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:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "Sistem Tepsisine Yerleş" +#. 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:814 rc.cpp:849 +msgid "Select this option to choose from a list of installed browsers." +msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:817 +msgid "&Use an installed browser:" +msgstr "" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#. 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:820 rc.cpp:855 +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:823 rc.cpp:858 +#, fuzzy +msgid "&Specify a custom command:" +msgstr "Uzakta durumu için ileti belirle" + +#. 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:827 rc.cpp:862 +#, 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:831 +#, 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:834 +#, fuzzy +msgid "Email Client" +msgstr "E-posta istemcisi" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +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:843 +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:846 +msgid "Use the &KDE default email client" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +msgid "&Save all received files in one directory:" +msgstr "Sohbetleri bu dizine kaydet:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +#, fuzzy +msgid "and" +msgstr "Üzgün" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "Dosya Aktarımları" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +#, fuzzy +msgid "Your comment:" +msgstr "Sizin adınız" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "Hesabınız yasaklanmış." + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "Sohbet mesajlarında &zamanı göster" + +#, fuzzy +#~ 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" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "Bu hesap için özel ifadeler:" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "Bu İfadeyi &Ekle" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "Görüntü Resmi:" + +#, fuzzy +#~ msgid "Search for C&ontact" +#~ msgstr "&Kişiyi Ara" + +#~ msgid "Search by &Interest" +#~ msgstr "İ&lgiye Göre Ara" + +#, fuzzy +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "E-posta adresiniz:" + +#~ 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." + +#~ 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." + +#, 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 "" +#~ "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 "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." + +#~ msgid "Picture:" +#~ msgstr "Resim:" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "" +#~ "E-postaları okumak için KMess'in hangi programı çalıştıracağını belirler." + +#~ msgid "Use a specified command:" +#~ msgstr "Belirli bir komut kullan:" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "Bu hesabın Hotmail gelen kutusu yok!" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "E-posta" + +#~ msgid "Remove group" +#~ msgstr "Grubu &Sil" + +#, fuzzy +#~ msgid "Show &Display Pictures" +#~ msgstr "Görüntü Resmi:" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "Gelen kutunuzda yeni bir posta var." + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "Gelen kutunuzda %1 yeni posta var." + +#~ 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ı" + +#, fuzzy +#~ msgid "Sidebar" +#~ msgstr "Kenar Çubuğu" + +#, fuzzy +#~ msgid "New contact's group" +#~ msgstr "Yeni &Kişi" + +#~ msgid "Enter your login information:" +#~ msgstr "Giriş bilgilerinizi girin:" + +#~ msgid "Your friendly name:" +#~ msgstr "Takma adınız:" + +#~ msgid "Your password:" +#~ msgstr "Parolanız:" + +#~ msgid "Status to set at login:" +#~ msgstr "Girişte durumu böyle yap:" + +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "Bir eposta alındığında bildirim göster" + +#~ msgid "Organize chat folders by:" +#~ msgstr "Sohbet dizinlerini şu ölçüte göre düzenle:" + +#~ msgid "&Show graphics in chat messages" +#~ msgstr "Sohbet mesajlarında &ifadeleri göster" + +#~ msgid "Use Hotmail" +#~ msgstr "Hotmail kullan" + +#~ msgid "says:" +#~ msgstr "diyor ki:" + +#~ msgid "Current name: " +#~ msgstr "Geçerli isim: " + +#, 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 servisine bağlanamadı.\n" +#~ "Lütfen İnternet bağlantınızı kontrol edin.\n" +#~ "Sistem hatası: %1 (kod %2)." + +#~ msgid "The remote server has closed the connection." +#~ msgstr "Karşıdaki sunucu bağlantıyı kapattı." + +#~ msgid "Show MSN Messenger Service status?" +#~ msgstr "Messenger servisi durumu gösterilsin mi?" + +#~ msgid "Received user confirmation" +#~ msgstr "Kullanıcı onayı alındı" + +#~ msgid "Transfer to notification server" +#~ msgstr "Bilgilendirme sunucusuna aktarım" + +#~ msgid "The server is too busy" +#~ msgstr "Sunucu çok meşgul" + +#~ msgid "The server is unavailable" +#~ msgstr "Sunucuya erişilemiyor" + +#~ msgid "KMess received an unknown error message from the server: %1" +#~ msgstr "KMess, sunucudan bilinmeyen bir hata mesajı aldı: %1" + +#~ msgid "Warning: Server closes for maintenance in 1 minute!" +#~ msgstr "Uyarı: 1 dakika içinde sunucu bakım için kapanacak!" + +#~ msgid "Add contact" +#~ msgstr "Kişi ekle" + +#, fuzzy +#~ msgid "KMess Notification" +#~ msgstr "E-posta bildirimi" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "" +#~ "Barbaros Ulutaş\n" +#~ "Uğur Çetin" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "" +#~ "ulutas@gmail.com\n" +#~ "jnmbk@users.sourceforge.net" + +#~ msgid "Show/Hide &Contact Sidebar" +#~ msgstr "&Bağlantı Yançubuğunu Göster/Gizle" + +#~ msgid "Away - Idle" +#~ msgstr "Boşta" + +#~ msgid "chat-style-text" +#~ msgstr "sohbet-stil-yazı" + +#~ msgid "The e-mail address given was invalid!" +#~ msgstr "Verilen e-posta adresi geçersiz" + +#~ msgid "(Away)" +#~ msgstr "(Uzakta)" + +#~ msgid "(Be Right Back)" +#~ msgstr "(Döneceğim)" + +#~ msgid "(Busy)" +#~ msgstr "(Meşgul)" + +#~ msgid "(Invisible)" +#~ msgstr "(Görünmez)" + +#~ msgid "(Away - Idle)" +#~ msgstr "(Boş duruyor)" + +#~ msgid "(Out to Lunch)" +#~ msgstr "(Yemekte)" + +#~ msgid "(On the Phone)" +#~ msgstr "(Telefonda)" #~ msgid "The current status of your contact." #~ msgstr "Kişinizin o anki durumu." +#, fuzzy +#~ msgid "The contact is listening to music" +#~ msgstr "Kişi listenizde yok" + #~ msgid "File transfer dialog message" #~ msgstr "Dosya aktarım penceresi iletisi" diff --git a/po/zh_CN.po b/po/zh_CN.po index c527af2..cac900f 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: KMess\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" "PO-Revision-Date: 2008-06-01 17:47+0800\n" "Last-Translator: Liu Sizhuang \n" "Language-Team: Chinese/Simplified \n" @@ -22,2929 +22,6790 @@ msgstr "" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" -#: _translatorinfo.cpp:1 -#: main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "林昊翔, 刘思壮" - -#: _translatorinfo.cpp:3 -#: main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "linhaoxiang@hotmail.com, chinatslsz@hotmail.com" - -#: account.cpp:41 -#: account.cpp:716 -msgid "I'm away from my computer" +#: account.cpp:45 +#, fuzzy +msgid "I am away from my computer" msgstr "我已离开电脑" -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" msgstr "您的姓名" -#: account.cpp:60 -#: kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "正在登录..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "我已离开电脑" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." +msgstr "" + +#: accountsmanager.cpp:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:572 +#, fuzzy +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "删除(&D)" + +#: accountsmanager.cpp:575 +#, fuzzy +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "保持" + +#: chat/chat.cpp:112 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "你无法开启这个邀请,因为这个聊天中有多个联系人。" + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 已经加入聊天" + +#: chat/chat.cpp:191 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "对话闲置。%1 已经离开聊天。" + +#: chat/chat.cpp:197 +#, fuzzy, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 已经离开聊天" + +#: chat/chat.cpp:359 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr " %1 和 %2 聊天" + +#: chat/chat.cpp:367 +#, fuzzy, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 ..等 - 聊天" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1(这条消息是自动发送的)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "" + +#: chat/chat.cpp:949 +#, fuzzy +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "你收到了%1发来的传情动漫。" + +#: chat/chat.cpp:954 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "你收到了%1发来的传情动漫。" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "" + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "连接故障" + +#: chat/chat.cpp:1154 +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:1167 +#, fuzzy, kde-format +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." +msgstr "%1给你发送了动作消息, 但KMess目前还不支持" + +#: chat/chat.cpp:1181 +#, fuzzy, kde-format +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:1196 +#, fuzzy, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1给你发送了目前KMess还不支持的MSN特性" + +#: chat/chat.cpp:1222 +#, fuzzy, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "传情动漫无法显示。无法读取数据。" + +#: chat/chat.cpp:1232 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "传情动漫无法显示。无法读取数据。" + +#: chat/chat.cpp:1262 +#, fuzzy, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1给您发送了传情动漫!" + +#: chat/chat.cpp:1269 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1给您发送了传情动漫!" + +#: chat/chat.cpp:1291 +#, fuzzy, kde-format +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." +msgstr "你从%1收到了一个传情动漫, 但无法播放。请确认你安装了'cabextract'。" + +#: chat/chat.cpp:1300 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "你从%1收到了一个传情动漫, 但无法播放。请确认你安装了'cabextract'。" + +#: chat/chat.cpp:1312 +#, fuzzy, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "传情动漫无法播放。请确认你安装了'cabextract'。" + +#: chat/chat.cpp:1321 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "传情动漫无法播放。请确认你安装了'cabextract'。" + +#: chat/chat.cpp:1333 +#, fuzzy, kde-format +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:1342 +#, fuzzy, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "传情动漫无法显示。无法读取数据。" + +#: chat/chat.cpp:1384 +#, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "" + +#: chat/chat.cpp:1389 +#, fuzzy, kde-format +msgid "%1 has gone offline." +msgstr "%1 已经加入聊天" + +#: chat/chat.cpp:1399 +#, fuzzy, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 已经加入聊天" + +#: chat/chat.cpp:1430 +#, fuzzy, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1给您发送了闪屏振动!" + +#: chat/chat.cpp:1463 +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:1476 +#, fuzzy, kde-format +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:1481 +#, fuzzy, kde-format +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:1491 +#, fuzzy, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "%1 已经加入聊天" + +#: chat/chat.cpp:1506 +#, fuzzy, kde-format +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:1589 +#, fuzzy, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "消息 '%1' 无法发送。" + +#: chat/chat.cpp:1626 +#, fuzzy, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "你向%1发送了闪屏震动!" + +#: chat/chat.cpp:1632 +#, fuzzy +msgid "You have sent a nudge!" +msgstr "您发送了闪屏振动!" + +#: chat/chat.cpp:1698 +#, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "" + +#: chat/chatmaster.cpp:1372 +#, fuzzy, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 正在发送传情动漫: %2" -#: chat/chatmessagestyle.cpp:296 +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 说:" -#: chat/chatmessagestyle.cpp:997 -#: chat/chatmessageview.cpp:425 -msgid "Add this emoticon: %1" -msgstr "添加这个图释: %1" +#: chat/chatmessageview.cpp:322 +#, kde-format +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/chatview.cpp:463 -msgid "Could not save chat log. Make sure you have permission to write in the folder where logs are being saved." +#: chat/chatmessageview.cpp:366 +#, kde-format +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:406 +#, fuzzy, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format +msgid "Add this emoticon: %1" +msgstr "添加这个表情: %1" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "重新登录" + +#: chat/chatview.cpp:300 +#, fuzzy, kde-format +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:694 -#: network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:439 +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:458 +#, fuzzy, kde-format 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:695 -#: network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "覆盖文件" -#: chat/chatview.cpp:696 -#: network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "覆盖文件(&w)" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." -msgstr "添加这个图释(&E)…" +msgstr "添加这个表情(&E)…" -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +#, fuzzy +msgid "Hide this &Emoticon" +msgstr "添加这个表情(&E)…" + +#: chat/chatview.cpp:834 msgid "Send &Email" msgstr "发送电子邮件(&E)" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "添加联系人(&A)" + +#: chat/chatview.cpp:842 +#, fuzzy +msgid "Copy E&mail Address" msgstr "复制电子邮件地址(&m)" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "访问链接(&L)" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "复制地址(&A)" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "复制文本(&C)" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "全选(&A)" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "" + +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +#, fuzzy +msgid "C&lear Chat" +msgstr "清除标签" + +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." msgstr "聊天记录保存到文件(&F)" -#: chat/chatwindow.cpp:98 -#: chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "聊天" - -#: chat/chatwindow.cpp:223 -msgid "You can't start this invitation because there are multiple contacts in this chat." -msgstr "你无法开启这个邀请,因为这个聊天中有多个联系人。" - -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 已经加入聊天" - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "对话闲置。%1 已经离开聊天。" - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 已经离开聊天" - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "与 %1 聊天" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "与 %1 和 %2 聊天" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 ..等 - 聊天" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "联系人" -#: chat/chatwindow.cpp:798 -#: settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" -msgstr "图释" +msgstr "表情" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" -msgstr "我的图释" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" +msgstr "我的表情" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr "(这条消息是自动发送的)" +#: chat/chatwindow.cpp:337 +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:1493 -msgid "The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "传情动漫无法播放。请确认你安装了'cabextract'。" +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "关闭聊天标签" -#: chat/chatwindow.cpp:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "传情动漫无法显示。无法读取数据。" +#: chat/chatwindow.cpp:341 +#, fuzzy +msgid "Close All Tabs" +msgstr "关闭所有标签(&A)" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "你接收了%1发来的传情动漫。" +#: chat/chatwindow.cpp:342 +#, fuzzy +msgid "Close Current Tab" +msgstr "关闭这个标签" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "消息 '%1' 无法发送。" +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "邀请(&I)" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "你收到了%1发来的闪屏震动!" - -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "你向%1发送了闪屏震动!" - -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "您发送了闪屏振动!" - -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1正在输入消息" - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 和 %2 正在打字" - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 和 %3 个其他人正在打字" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." msgstr "发送文件(&F)" -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "视频聊天" + +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "开始会议(&M)" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 msgid "Send a &Nudge!" msgstr "发送闪屏(&N)" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "开始或停止一个对话(&C)" - -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." msgstr "保存聊天" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "邀请(&I)" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "关闭所有标签(&A)" -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "聊天(&C)" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "改变字体(&F)" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "改变字体颜色(&C)" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "插入图释" +#: chat/chatwindow.cpp:470 +msgid "Show &Emoticons" +msgstr "显示表情(&E)" -#: chat/chatwindowinterface.cpp:319 +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "在显示消息时间(&h)" + +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "面板(&P)" + +#: chat/chatwindow.cpp:480 msgid "Use &Spell Checking" msgstr "使用拼写检查(&S)" -#: chat/chatwindowinterface.cpp:320 -msgid "Show &Emoticons" -msgstr "显示图释(&E)" +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "会议" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "显示/隐藏联系人侧栏(&C)" +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "闪屏" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "显示或隐藏联系人侧栏" +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "发送文件(&F)" -#: chat/contactframe.cpp:231 -#: kmessview.cpp:614 -msgid "&Send email" -msgstr "发送电子邮件(&S)" +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "" -#: chat/contactframe.cpp:232 -#: kmessview.cpp:615 +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:507 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "等待联系人列表……" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "联系人" + +#: chat/chatwindow.cpp:513 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "等待联系人列表……" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "表情" + +#: chat/chatwindow.cpp:519 +#, fuzzy +msgid "Enable or disable the custom emoticons panel" +msgstr "等待联系人列表……" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "我的表情" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "字体(&F)" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "改变字体颜色(&C)" + +#: chat/chatwindow.cpp:535 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "清除标签" + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "开始或停止一个对话(&C)" + +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "" + +#: chat/chatwindow.cpp:1137 +#, kde-format +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "聊天" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "与 %1 聊天" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1887 +#, kde-format +msgid "%1 is typing..." +msgstr "%1正在输入消息..." + +#: chat/chatwindow.cpp:1897 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 和 %2 正在输入信息..." + +#: chat/chatwindow.cpp:1901 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 和 %3 个其他人正在打字" + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "" + +#: chat/chatwindow.cpp:2376 +#, kde-format +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:297 +#, fuzzy +msgid "&Start Private Chat" +msgstr "开始私聊(&S)" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +#, fuzzy +msgid "&Send Email" +msgstr "发送电子邮件(&E)" + +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "查看档案(&V)" -#: chat/contactframe.cpp:234 -#: kmessview.cpp:618 -msgid "&Add Contact" -msgstr "添加联系人(&A)" - -#: chat/contactframe.cpp:235 -#: kmessview.cpp:619 -msgid "A&llow Contact" -msgstr "允许联系人(&A)" - -#: chat/contactframe.cpp:236 -#: kmessview.cpp:622 -msgid "&Delete Contact" -msgstr "删除联系人(&D)" - -#: chat/contactframe.cpp:238 -#: kmessview.cpp:620 -msgid "&Block Contact" -msgstr "阻止联系人(&B)" - -#: chat/contactframe.cpp:239 -#: kmessview.cpp:621 -msgid "&Unblock Contact" -msgstr "解除阻止联系人(&U)" - -#: chat/contactframe.cpp:241 -msgid "&Friendly Name" -msgstr "昵称(&F)" - -#: chat/contactframe.cpp:242 -msgid "&Personal Message" -msgstr "个人消息(&P)" - -#: chat/contactframe.cpp:243 -msgid "&Email Address" -msgstr "电子邮件地址(&E)" - -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "复制(&C)..." - -#: chat/contactframe.cpp:513 -#: contactlistviewitem.cpp:323 -msgid "Blocked" -msgstr "被阻止" - -#: chat/contactframe.cpp:518 -#: contactlistviewitem.cpp:329 -#: initialview.cpp:76 -#: initialview.cpp:173 -#: kmess.cpp:452 -#: kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 -#: settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "离开" - -#: chat/contactframe.cpp:523 -#: contactlistviewitem.cpp:335 -#: initialview.cpp:77 -#: initialview.cpp:177 -#: kmess.cpp:478 -#: kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 -#: settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "马上回来" - -#: chat/contactframe.cpp:528 -#: contactlistviewitem.cpp:341 -#: initialview.cpp:78 -#: initialview.cpp:181 -#: kmess.cpp:482 -#: kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 -#: settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "忙碌" - -#: chat/contactframe.cpp:533 -#: network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "脱机" - -#: chat/contactframe.cpp:538 -#: contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "离开 - 空闲" - -#: chat/contactframe.cpp:543 -#: contactlistviewitem.cpp:365 -#: initialview.cpp:79 -#: initialview.cpp:189 -#: kmess.cpp:490 -#: kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 -#: settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "外出就餐" - -#: chat/contactframe.cpp:548 -#: initialview.cpp:75 -#: kmess.cpp:494 -#: kmessinterface.cpp:191 -#: network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 -#: systemtraywidget.cpp:259 -msgid "Online" -msgstr "联机" - -#: chat/contactframe.cpp:553 -#: contactlistviewitem.cpp:377 -#: initialview.cpp:80 -#: initialview.cpp:193 -#: kmess.cpp:498 -#: kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 -#: settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "接听电话" - -#: chat/contactframe.cpp:558 -msgid "The contact is %1" -msgstr "联系人%1" - -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "聊天样式文字" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "客户端: %1" - -#: contactlistviewitem.cpp:347 -#: initialview.cpp:81 -#: initialview.cpp:185 -#: kmess.cpp:486 -#: kmessinterface.cpp:199 -#: settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 -#: systemtraywidget.cpp:244 -msgid "Invisible" -msgstr "显示为脱机" - -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "这个帐户没有Hotmail收件箱!" - -#: dialogs/addcontactdialog.cpp:30 -#: kmess.cpp:244 -#: kmess.cpp:248 -msgid "Add a contact" -msgstr "添加联系人" - -#: dialogs/addcontactdialog.cpp:39 -#: kmess.cpp:245 -#: kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "输入您想添加的联系人电子邮件地址:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "此e-mail地址无效!" - -#: dialogs/addemoticondialog.cpp:54 -#: dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 -msgid "Add New Emoticon" -msgstr "添加新的图释" - -#: dialogs/addemoticondialog.cpp:219 -#: settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "图释“%1”已存在,你要覆盖它吗?" - -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "指定处于离开状态时发送的消息" - -#: dialogs/awaymessagedialog.cpp:37 -msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" -msgstr "输入自动回复的内容:" - -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "使用另一个名字" - -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "当此人上线或下线时通知我" - -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "图片:" - -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "声音:" - -#: dialogs/contactpropertiesdialog.cpp:229 -msgid "Contact Properties for %1" -msgstr "联系人%1的属性:" - -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "电子邮件地址:" - -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "当前姓名:" - -#: dialogs/networkwindow.cpp:50 -msgid "Network Window" -msgstr "网络窗口" - -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "保存标签" - -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "清除标签" - -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "关闭标签" - -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "没有网络连接。无法打开网络窗口。" - -#: dialogs/networkwindow.cpp:928 -msgid "Could not save the Network Window log. Make sure you have permission to write for folder where the log is being saved." -msgstr "无法记录网络窗口记录。请确保你对保存记录文件的文件夹有写权限。" - -#: dialogs/networkwindow.cpp:953 -msgid "Cannot close the main connection tab." -msgstr "不能关闭主连接标签。" - -#: dialogs/transferentry.cpp:120 -#: network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 -msgid "Cancelled" -msgstr "已取消" - -#: dialogs/transferentry.cpp:160 -msgid "Failed!" -msgstr "失败!" - -#: dialogs/transferentry.cpp:202 -msgid "Completed" -msgstr "完成" - -#: dialogs/transferentry.cpp:246 -#: network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 -msgid "%1 MB" -msgstr "%1 MB" - -#: dialogs/transferentry.cpp:251 -#: network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 -msgid "%1 kB" -msgstr "%1 kB" - -#: dialogs/transferentry.cpp:255 -#: network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 -msgid "%1 bytes" -msgstr "%1 字节" - -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "已接收 %2 中的 %1" - -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "已发送 %2 中的 %1" - -#: dialogs/transferwindow.cpp:74 -msgid "File Transfers" -msgstr "文件传送" - -#: emoticontheme.cpp:542 -msgid "Could not save the emoticon theme. Make sure you have permission to write to the theme folder '%1'." -msgstr "无法保存图释主题。请确保你对保存图释主题的文件夹 '%1' 有写权限。" - -#: emoticontheme.cpp:736 -msgid "Smile" -msgstr "微笑" - -#: emoticontheme.cpp:737 -msgid "Wink" -msgstr "眨眼" - -#: emoticontheme.cpp:738 -msgid "Tongue out" -msgstr "伸舌头" - -#: emoticontheme.cpp:739 -msgid "Big smile" -msgstr "笑" - -#: emoticontheme.cpp:740 -msgid "Sad" -msgstr "悲伤" - -#: emoticontheme.cpp:741 -msgid "Crying" -msgstr "哭" - -#: emoticontheme.cpp:742 -msgid "Angry" -msgstr "生气" - -#: emoticontheme.cpp:743 -msgid "Confused" -msgstr "疑惑" - -#: emoticontheme.cpp:744 -msgid "Embarrassed" -msgstr "尴尬" - -#: emoticontheme.cpp:745 -msgid "Disappointed" -msgstr "失望" - -#: emoticontheme.cpp:746 -msgid "Hot" -msgstr "好热" - -#: emoticontheme.cpp:747 -msgid "Baring teeth" -msgstr "咧嘴" - -#: emoticontheme.cpp:748 -msgid "Nerd" -msgstr "厌恶" - -#: emoticontheme.cpp:749 -msgid "Sick" -msgstr "生病" - -#: emoticontheme.cpp:750 -msgid "Surprised" -msgstr "惊讶" - -#: emoticontheme.cpp:751 -msgid "Party" -msgstr "聚会" - -#: emoticontheme.cpp:752 -msgid "Sleepy" -msgstr "困" - -#: emoticontheme.cpp:753 -msgid "Thinking" -msgstr "思考" - -#: emoticontheme.cpp:754 -msgid "Don't tell anyone" -msgstr "不要告诉任何人" - -#: emoticontheme.cpp:755 -msgid "Secret telling" -msgstr "偷偷地说" - -#: emoticontheme.cpp:756 -msgid "Eye-rolling" -msgstr "转眼球" - -#: emoticontheme.cpp:757 -msgid "Sarcastic" -msgstr "讽刺" - -#: emoticontheme.cpp:758 -msgid "I don't know" -msgstr "不知道" - -#: emoticontheme.cpp:759 -msgid "Be right back" -msgstr "马上回来" - -#: emoticontheme.cpp:760 -msgid "Angel" -msgstr "天使" - -#: emoticontheme.cpp:761 -msgid "Left hug" -msgstr "拥抱(左)" - -#: emoticontheme.cpp:762 -msgid "Boy" -msgstr "男孩" - -#: emoticontheme.cpp:763 -msgid "Red heart" -msgstr "红心" - -#: emoticontheme.cpp:764 -msgid "Red rose" -msgstr "红玫瑰" - -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "太棒了" - -#: emoticontheme.cpp:766 -msgid "Dog face" -msgstr "狗脸" - -#: emoticontheme.cpp:767 -msgid "Sun" -msgstr "太阳" - -#: emoticontheme.cpp:768 -msgid "Devil" -msgstr "邪恶" - -#: emoticontheme.cpp:769 -msgid "Right hug" -msgstr "拥抱(右)" - -#: emoticontheme.cpp:770 -msgid "Girl" -msgstr "女孩" - -#: emoticontheme.cpp:771 -msgid "Broken heart" -msgstr "心碎" - -#: emoticontheme.cpp:772 -msgid "Wilted rose" -msgstr "枯玫瑰" - -#: emoticontheme.cpp:773 -msgid "Thumbs down" -msgstr "太不好了" - -#: emoticontheme.cpp:774 -msgid "Cat face" -msgstr "猫脸" - -#: emoticontheme.cpp:775 -msgid "Sleeping half-moon" -msgstr "入睡的月牙" - -#: emoticontheme.cpp:776 -msgid "Red lips" -msgstr "红嘴唇" - -#: emoticontheme.cpp:777 -msgid "Clapping" -msgstr "鼓掌" - -#: emoticontheme.cpp:778 -msgid "Crossed fingers" -msgstr "交叉手指" - -#: emoticontheme.cpp:779 -msgid "Auto" -msgstr "汽车" - -#: emoticontheme.cpp:780 -msgid "Airplane" -msgstr "飞机" - -#: emoticontheme.cpp:781 -msgid "Turtle" -msgstr "龟" - -#: emoticontheme.cpp:782 -msgid "Snail" -msgstr "蜗牛" - -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "黑羊(害群之马)" - -#: emoticontheme.cpp:784 -msgid "Goat" -msgstr "羊" - -#: emoticontheme.cpp:785 -msgid "Vampire bat" -msgstr "吸血蝙蝠" - -#: emoticontheme.cpp:786 -msgid "Pizza" -msgstr "比萨" - -#: emoticontheme.cpp:787 -msgid "Beer mug" -msgstr "啤酒杯" - -#: emoticontheme.cpp:788 -msgid "Martini glass" -msgstr "高脚杯" - -#: emoticontheme.cpp:789 -msgid "Coffee cup" -msgstr "咖啡杯" - -#: emoticontheme.cpp:790 -msgid "Birthday cake" -msgstr "生日蛋糕" - -#: emoticontheme.cpp:791 -msgid "Plate" -msgstr "盘子" - -#: emoticontheme.cpp:792 -msgid "Bowl" -msgstr "碗" - -#: emoticontheme.cpp:793 -msgid "Star" -msgstr "星" - -#: emoticontheme.cpp:794 -msgid "Rainbow" -msgstr "彩虹" - -#: emoticontheme.cpp:795 -msgid "Stormy cloud" -msgstr "风暴" - -#: emoticontheme.cpp:796 -msgid "Lightning" -msgstr "闪电" - -#: emoticontheme.cpp:797 -msgid "Umbrella" -msgstr "雨伞" - -#: emoticontheme.cpp:798 -msgid "Island with a palm tree" -msgstr "有棕榈树的岛" - -#: emoticontheme.cpp:799 -msgid "Telephone receiver" -msgstr "电话" - -#: emoticontheme.cpp:800 -msgid "Mobile Phone" -msgstr "移动电话" - -#: emoticontheme.cpp:801 -#: settings/settingsdialog.cpp:98 -msgid "Email" -msgstr "电子邮件" - -#: emoticontheme.cpp:802 -msgid "Clock" -msgstr "表" - -#: emoticontheme.cpp:803 -msgid "Camera" -msgstr "照相机" - -#: emoticontheme.cpp:804 -msgid "Filmstrip" -msgstr "胶卷" - -#: emoticontheme.cpp:805 -msgid "Note" -msgstr "音符" - -#: emoticontheme.cpp:806 -msgid "Handcuffs" -msgstr "手铐" - -#: emoticontheme.cpp:807 -msgid "Money" -msgstr "钱" - -#: emoticontheme.cpp:808 -msgid "Light bulb" -msgstr "灯泡" - -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "香烟" - -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "足球" - -#: emoticontheme.cpp:811 -msgid "Gift with a bow" -msgstr "礼物" - -#: emoticontheme.cpp:812 -msgid "X-Box" -msgstr "X-Box" - -#: emoticontheme.cpp:813 -msgid "Computer" -msgstr "计算机" - -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "KMess 图标" - -#: kmess.cpp:261 -#: kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "你输入的联系人地址不正确:'%1'" - -#: kmess.cpp:288 -#: kmess.cpp:292 -msgid "Add a group" -msgstr "添加组(&A)" - -#: kmess.cpp:289 -#: kmess.cpp:293 -#: kmess.cpp:806 -#: kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "输入新组名:" - -#: kmess.cpp:456 -#: kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "离开后自动回复" - -#: kmess.cpp:473 -#: kmessinterface.cpp:194 -#: systemtraywidget.cpp:249 -msgid "Idle" -msgstr "发呆" - -#: kmess.cpp:715 -msgid "Are you sure you want to remove the contact %1 from your contact list?" -msgstr "你确定要从你的联系人列表中删除 %1 吗?" - -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "删除联系人(&R)" - -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "删除并且屏蔽" - -#: kmess.cpp:760 -msgid "Are you sure you want to remove the group %1 from your contact list?" -msgstr "您确定要从联系人列表中删除 %1 这个组吗?" - -#: kmess.cpp:763 -msgid "Remove group" -msgstr "删除组(&m)" - -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "这是一个特殊组,不能被改变。" - -#: kmess.cpp:805 -#: kmess.cpp:809 -msgid "Rename group" -msgstr "重命名组(&n)" - -#: kmess.cpp:909 -#: network/msnconnection.cpp:744 -msgid "Connected" -msgstr "已连接" - -#: kmess.cpp:1231 -#: kmessview.cpp:169 -msgid "Disconnected" -msgstr "已注销" - -#: kmess.cpp:1669 -msgid "

KMess will not be able to play sounds and notifications.

The KMess file 'eventsrc' 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 "

KMess 将不能播放声音和弹出提示。

在以下文件夹中:%1,KMess 文件 'eventsrc' 无法找到。

请检查你的安装,然后把缺失的文件复制到任何一个列出的文件夹中。

" - -#: kmess.cpp:1673 -msgid "Error with notifications" -msgstr "通知发生错误" - -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "添加新帐号(&A)" - -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "添加联系人(&C)..." - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "添加组(&G)" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "搜索联系人(&e)" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "按兴趣搜索(&I)" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "帐号设置(&S)" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "操作(&A)" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "登录(&n)" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "注销(&D)" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "查看我的档案(&P)" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "我的状态(&M)" - -#: kmessinterface.cpp:220 -msgid "&Connect" -msgstr "登录(&C)" - -#: kmessinterface.cpp:275 -msgid "Show &Allowed Contacts" -msgstr "显示被允许的联系人(&A)" - -#: kmessinterface.cpp:276 -msgid "Show &Offline Contacts" -msgstr "显示脱机的联系人(&A)" - -#: kmessinterface.cpp:277 -msgid "Show &Removed Contacts" -msgstr "显示被删除的联系人(&R)" - -#: kmessinterface.cpp:278 -msgid "Show &Display Pictures" -msgstr "显示头像(&D)" - -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "显示网络窗口(&N)" - -#: kmessinterface.cpp:285 -msgid "&Sort Contacts by" -msgstr "对联系人进行排序(&S)" - -#: kmessinterface.cpp:286 -#: kmessview.cpp:1190 -msgid "Group" -msgstr "组" - -#: kmessinterface.cpp:286 -msgid "Online/Offline" -msgstr "联机/脱机" - -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "显示文件传送窗口(&T)" - -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "正在收听%1" - -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 -#: kmessview.cpp:1570 -#: kmessview.cpp:1588 -#: rc.cpp:120 -#, no-c-format -msgid "" -msgstr "<在此处输入您的个人信息>" - -#: kmessview.cpp:613 -msgid "Cha&t" -msgstr "聊天(&t)" - -#: kmessview.cpp:616 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 msgid "&Properties" msgstr "属性(&P)" -#: kmessview.cpp:623 -msgid "&Remove from group" +#: chat/contactframe.cpp:303 kmessview.cpp:605 +msgid "&Add Contact" +msgstr "添加联系人(&A)" + +#: chat/contactframe.cpp:304 kmessview.cpp:606 +msgid "A&llow Contact" +msgstr "允许联系人(&A)" + +#: chat/contactframe.cpp:305 kmessview.cpp:609 +msgid "&Delete Contact" +msgstr "删除联系人(&D)" + +#: chat/contactframe.cpp:307 kmessview.cpp:607 +msgid "&Block Contact" +msgstr "阻止联系人(&B)" + +#: chat/contactframe.cpp:308 kmessview.cpp:608 +msgid "&Unblock Contact" +msgstr "解除阻止联系人(&U)" + +#: chat/contactframe.cpp:310 kmessview.cpp:612 +msgid "&Friendly Name" +msgstr "昵称(&F)" + +#: chat/contactframe.cpp:311 kmessview.cpp:613 +msgid "&Personal Message" +msgstr "个人消息(&P)" + +#: chat/contactframe.cpp:312 kmessview.cpp:614 +msgid "&Email Address" +msgstr "电子邮件地址(&E)" + +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +#, fuzzy +msgid "&Information" +msgstr "信息" + +#: chat/contactframe.cpp:316 +#, fuzzy +msgid "Display Pictures" +msgstr "显示头像" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "音符(&N)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +#, fuzzy +msgid "&Emoticons" +msgstr "表情" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +#, fuzzy +msgid "&Copy" +msgstr "复制(&C)..." + +#: chat/contactframe.cpp:753 +msgid "Blocked" +msgstr "被阻止" + +#: chat/contactframe.cpp:765 +#, fuzzy, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "联系人 %1" + +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" + +#: chat/emoticonswidget.cpp:451 +#, fuzzy +msgid "Add to Chat" +msgstr "添加到聊天" + +#: chat/emoticonswidget.cpp:452 +#, fuzzy +msgid "Add New" +msgstr "添加(&w)..." + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "编辑" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "删除" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Window Live Messenger %1 兼容" + +#: contact/contactbase.cpp:353 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Window Live Messenger %1 兼容" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "联机" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "忙碌" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "离开" + +#: contact/msnstatus.cpp:162 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "离开后自动回复" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "发呆" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "马上回来" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "接听电话" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "外出就餐" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "显示为脱机" + +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "脱机" + +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "我的状态(&M)" + +#: contact/msnstatus.cpp:218 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "注销(&D)" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "添加联系人" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 +msgid "Add New Emoticon" +msgstr "添加新的表情" + +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "编辑表情" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, fuzzy, kde-format +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "表情“%1”已存在,你要覆盖它吗?" + +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "指定处于离开状态时发送的消息" + +#: dialogs/chathistorydialog.cpp:57 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "聊天主题(&C):" + +#: dialogs/chathistorydialog.cpp:245 +#, kde-format +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:250 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "无法打开本地端口。" + +#: dialogs/chathistorydialog.cpp:567 +#, fuzzy +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "正在登录..." + +#: dialogs/chathistorydialog.cpp:589 +#, fuzzy +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "保存所有聊天记录(&a)" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "你被添加位好友了" + +#: dialogs/contactaddeduserdialog.cpp:60 +#, fuzzy, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"已将您加入他(她)的联系人列表。" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"已将您加入他(她)的联系人列表。" + +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format +msgid "Contact Properties for %1" +msgstr "联系人%1的属性:" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "已连接" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "还没有消息" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "最后登陆: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "最后消息: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "电子邮件地址: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "客户端: %1" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "点击此处恢复联络人的头像" + +#: dialogs/contactpropertiesdialog.cpp:663 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "联系人" + +#: dialogs/contactpropertiesdialog.cpp:716 +#, fuzzy +msgid "The selected filetype is not supported by Phonon." +msgstr "邀请被取消。另一方客户端不支持。" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "邀请联系人" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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 "联系人列表已保存完毕" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 +msgid "Network Window" +msgstr "网络窗口" + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "保存标签" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "清除标签" + +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" +msgstr "关闭所有标签(&A)" + +#: dialogs/networkwindow.cpp:1086 +#, fuzzy +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "没有网络连接。无法打开网络窗口。" + +#: dialogs/networkwindow.cpp:1130 +#, 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:1177 +msgid "Cannot close the main connection tab." +msgstr "不能关闭主连接标签。" + +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +#, fuzzy +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 +#, kde-format +msgid "%1 MB" +msgstr "%1 MB" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format +msgid "%1 kB" +msgstr "%1 kB" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format +msgid "%1 bytes" +msgstr "%1 字节" + +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "已接收 %2 中的 %1" + +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "已发送 %2 中的 %1" + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "无穷大" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 +msgid "File Transfers" +msgstr "文件传送" + +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "使用" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "删除联系人(&D)" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "选择或删除你的头像" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete this display picture?" +msgstr "您确定要删除这个帐号吗?" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "显示头像" + +#: emoticontheme.cpp:627 +#, kde-format +msgid "" +"Could not save the emoticon theme. Make sure you have permission to write to " +"the theme folder '%1'." +msgstr "无法保存表情主题。请确保你对保存表情主题的文件夹 '%1' 有写权限。" + +#: emoticontheme.cpp:833 +msgid "Smile" +msgstr "微笑" + +#: emoticontheme.cpp:834 +msgid "Wink" +msgstr "眨眼" + +#: emoticontheme.cpp:835 +msgid "Tongue out" +msgstr "伸舌头" + +#: emoticontheme.cpp:836 +msgid "Big smile" +msgstr "笑" + +#: emoticontheme.cpp:837 +msgid "Sad" +msgstr "悲伤" + +#: emoticontheme.cpp:838 +msgid "Crying" +msgstr "哭" + +#: emoticontheme.cpp:839 +msgid "Angry" +msgstr "生气" + +#: emoticontheme.cpp:840 +msgid "Confused" +msgstr "疑惑" + +#: emoticontheme.cpp:841 +msgid "Embarrassed" +msgstr "尴尬" + +#: emoticontheme.cpp:842 +msgid "Disappointed" +msgstr "失望" + +#: emoticontheme.cpp:843 +msgid "Hot" +msgstr "好热" + +#: emoticontheme.cpp:844 +msgid "Baring teeth" +msgstr "咧嘴" + +#: emoticontheme.cpp:845 +msgid "Nerd" +msgstr "厌恶" + +#: emoticontheme.cpp:846 +msgid "Sick" +msgstr "生病" + +#: emoticontheme.cpp:847 +msgid "Surprised" +msgstr "惊讶" + +#: emoticontheme.cpp:848 +msgid "Party" +msgstr "聚会" + +#: emoticontheme.cpp:849 +msgid "Sleepy" +msgstr "困" + +#: emoticontheme.cpp:850 +msgid "Thinking" +msgstr "思考" + +#: emoticontheme.cpp:851 +msgid "Don't tell anyone" +msgstr "不要告诉任何人" + +#: emoticontheme.cpp:852 +msgid "Secret telling" +msgstr "偷偷地说" + +#: emoticontheme.cpp:853 +msgid "Eye-rolling" +msgstr "转眼球" + +#: emoticontheme.cpp:854 +msgid "Sarcastic" +msgstr "讽刺" + +#: emoticontheme.cpp:855 +msgid "I don't know" +msgstr "不知道" + +#: emoticontheme.cpp:856 +msgid "Be right back" +msgstr "马上回来" + +#: emoticontheme.cpp:857 +msgid "Angel" +msgstr "天使" + +#: emoticontheme.cpp:858 +msgid "Left hug" +msgstr "拥抱(左)" + +#: emoticontheme.cpp:859 +msgid "Boy" +msgstr "男孩" + +#: emoticontheme.cpp:860 +msgid "Red heart" +msgstr "红心" + +#: emoticontheme.cpp:861 +msgid "Red rose" +msgstr "红玫瑰" + +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "太棒了" + +#: emoticontheme.cpp:863 +msgid "Dog face" +msgstr "狗脸" + +#: emoticontheme.cpp:864 +msgid "Sun" +msgstr "太阳" + +#: emoticontheme.cpp:865 +msgid "Devil" +msgstr "邪恶" + +#: emoticontheme.cpp:866 +msgid "Right hug" +msgstr "拥抱(右)" + +#: emoticontheme.cpp:867 +msgid "Girl" +msgstr "女孩" + +#: emoticontheme.cpp:868 +msgid "Broken heart" +msgstr "心碎" + +#: emoticontheme.cpp:869 +msgid "Wilted rose" +msgstr "枯玫瑰" + +#: emoticontheme.cpp:870 +msgid "Thumbs down" +msgstr "太不好了" + +#: emoticontheme.cpp:871 +msgid "Cat face" +msgstr "猫脸" + +#: emoticontheme.cpp:872 +msgid "Sleeping half-moon" +msgstr "入睡的月牙" + +#: emoticontheme.cpp:873 +msgid "Red lips" +msgstr "红嘴唇" + +#: emoticontheme.cpp:874 +msgid "Clapping" +msgstr "鼓掌" + +#: emoticontheme.cpp:875 +msgid "Crossed fingers" +msgstr "交叉手指" + +#: emoticontheme.cpp:876 +msgid "Auto" +msgstr "汽车" + +#: emoticontheme.cpp:877 +msgid "Airplane" +msgstr "飞机" + +#: emoticontheme.cpp:878 +msgid "Turtle" +msgstr "龟" + +#: emoticontheme.cpp:879 +msgid "Snail" +msgstr "蜗牛" + +#: emoticontheme.cpp:880 +#, fuzzy +msgid "Sheep" +msgstr "困" + +#: emoticontheme.cpp:881 +msgid "Goat" +msgstr "羊" + +#: emoticontheme.cpp:882 +msgid "Vampire bat" +msgstr "吸血蝙蝠" + +#: emoticontheme.cpp:883 +msgid "Pizza" +msgstr "比萨" + +#: emoticontheme.cpp:884 +msgid "Beer mug" +msgstr "啤酒杯" + +#: emoticontheme.cpp:885 +msgid "Martini glass" +msgstr "高脚杯" + +#: emoticontheme.cpp:886 +msgid "Coffee cup" +msgstr "咖啡杯" + +#: emoticontheme.cpp:887 +msgid "Birthday cake" +msgstr "生日蛋糕" + +#: emoticontheme.cpp:888 +msgid "Plate" +msgstr "盘子" + +#: emoticontheme.cpp:889 +msgid "Bowl" +msgstr "碗" + +#: emoticontheme.cpp:890 +msgid "Star" +msgstr "星" + +#: emoticontheme.cpp:891 +msgid "Rainbow" +msgstr "彩虹" + +#: emoticontheme.cpp:892 +msgid "Stormy cloud" +msgstr "风暴" + +#: emoticontheme.cpp:893 +msgid "Lightning" +msgstr "闪电" + +#: emoticontheme.cpp:894 +msgid "Umbrella" +msgstr "雨伞" + +#: emoticontheme.cpp:895 +msgid "Island with a palm tree" +msgstr "有棕榈树的岛" + +#: emoticontheme.cpp:896 +msgid "Telephone receiver" +msgstr "电话" + +#: emoticontheme.cpp:897 +msgid "Mobile Phone" +msgstr "移动电话" + +#: emoticontheme.cpp:898 +msgid "Email" +msgstr "电子邮件" + +#: emoticontheme.cpp:899 +msgid "Clock" +msgstr "表" + +#: emoticontheme.cpp:900 +msgid "Camera" +msgstr "照相机" + +#: emoticontheme.cpp:901 +msgid "Filmstrip" +msgstr "胶卷" + +#: emoticontheme.cpp:902 +msgid "Note" +msgstr "音符" + +#: emoticontheme.cpp:903 +msgid "Handcuffs" +msgstr "手铐" + +#: emoticontheme.cpp:904 +msgid "Money" +msgstr "钱" + +#: emoticontheme.cpp:905 +msgid "Light bulb" +msgstr "灯泡" + +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "香烟" + +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:908 +msgid "Gift with a bow" +msgstr "礼物" + +#: emoticontheme.cpp:909 +msgid "X-Box" +msgstr "X-Box" + +#: emoticontheme.cpp:910 +msgid "Computer" +msgstr "计算机" + +#: emoticontheme.cpp:911 +#, fuzzy +msgid "KMess icon" +msgstr "KMess 图标" + +#: initialview.cpp:239 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found" +msgstr "无法连接:没有找到账户" + +#: initialview.cpp:252 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password" +msgstr "无法连接:没有找到账户" + +#: initialview.cpp:280 initialview.cpp:375 +#, fuzzy, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "正在等待网络重新连接" + +#: initialview.cpp:380 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "互联网连接不可用" + +#: initialview.cpp:401 +#, kde-format +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:596 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "登录(&C)" + +#: initialview.cpp:601 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "取消" + +#: initialview.cpp:661 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "请输入您的电子邮件地址和密码" + +#: initialview.cpp:680 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "不合法的电子邮件地址" + +#: kmess.cpp:218 +#, fuzzy, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "联系人%1已经在您的列表中" + +#: kmess.cpp:218 +#, fuzzy +msgid "Contact Information" +msgstr "联系信息" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "新建组(&G)" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "添加组(&A)" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "输入新组名:" + +#: kmess.cpp:576 +#, kde-format +msgid "" +"Are you sure you want to remove the contact %1 from your contact " +"list?" +msgstr "你确定要从你的联系人列表中删除 %1 吗?" + +#: kmess.cpp:578 +#, fuzzy +msgid "Remove Contact" +msgstr "删除联系人(&R)" + +#: kmess.cpp:580 +#, fuzzy +msgid "Remove and Block" +msgstr "删除并且屏蔽" + +#: kmess.cpp:626 +#, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "" + +#: kmess.cpp:633 +#, fuzzy, kde-format +msgctxt "dialog text" +msgid "" +"Are you sure you want to remove the group %1 from your contact " +"list?" +msgstr "您确定要从联系人列表中删除 %1 这个组吗?" + +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "删除的" + +#: kmess.cpp:665 +#, fuzzy +msgid "This is a special group, which cannot be changed." +msgstr "这是一个特殊组,不能被改变。" + +#: kmess.cpp:676 +#, fuzzy +msgid "Rename Group" +msgstr "重命名组(&n)" + +#: kmess.cpp:677 +#, fuzzy +msgid "Enter a new name for this group:" +msgstr "输入新组名:" + +#: kmess.cpp:753 +#, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "" + +#: kmess.cpp:756 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "自动登陆失败" + +#: kmess.cpp:1039 +#, fuzzy +msgid "Connection could be down..." +msgstr "正在连接……" + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "已注销" + +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, fuzzy, kde-format +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 将不能播放声音和弹出提示。

在以下文件夹中:%1,KMess 文件 " +"'eventsrc' 无法找到。

请检查你的安装,然后把缺失的文件复制到任何一个列" +"出的文件夹中。

" + +#: kmess.cpp:1466 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "通知发生错误" + +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "登录(&C)" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "注销(&D)" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "查看我的档案(&P)" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "显示被允许的联系人(&A)" + +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "显示脱机的联系人(&A)" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "显示被删除的联系人(&R)" + +#: kmessinterface.cpp:170 +#, fuzzy +msgid "Show &History Box" +msgstr "聊天主题(&C):" + +#: kmessinterface.cpp:171 +#, fuzzy +msgid "&Show Search Bar" +msgstr "侧边栏" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "显示空组(&E)" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "头像大小(&D)" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "对联系人进行排序(&S)" + +#: kmessinterface.cpp:175 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "显示文件传送窗口(&T)" + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "添加联系人(&C)..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "添加组(&G)" + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "导出联系人列表(&E)" + +#: kmessinterface.cpp:183 kmessview.cpp:602 +#, fuzzy +msgid "Show Chat &History..." +msgstr "聊天主题(&C):" + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "添加新帐号(&A)" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Configure Account..." +msgstr "添加新帐号(&A)" + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "设置 Kmess(&K)" + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "不显示" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "小" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "中" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "大" + +#: kmessinterface.cpp:197 +msgid "Group" +msgstr "组" + +#: kmessinterface.cpp:198 +msgid "Online/Offline" +msgstr "联机/脱机" + +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "混合" + +#: kmessinterface.cpp:289 +#, fuzzy +msgid "Show &Network Window..." +msgstr "显示网络窗口(&N)" + +#: kmessview.cpp:318 +#, fuzzy, kde-format +msgid "[%1] Logged in with %2" +msgstr "[%1]以 %2 登陆" + +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "[%1] %2上线了" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "[%1]%2离线" + +#: kmessview.cpp:599 +msgid "Cha&t" +msgstr "聊天(&t)" + +#: kmessview.cpp:610 +#, fuzzy +msgid "&Remove From Group" msgstr "从组中删除(&R)" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "将联系人移动到(&M)" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" msgstr "将联系人复制到(&C)" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "将联系人移动到(&M)" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "向下移动组(&D)" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "向上移动组(&U)" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "删除组(&m)" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "重命名组(&n)" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "您的收件箱中有1封新邮件。" +#: kmessview.cpp:1136 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "将这个联系人加入您的列表中(&A)" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "您的收件箱中有%1封新邮件。" +#: kmessview.cpp:1145 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "电子邮件地址" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(离开)" +#: kmessview.cpp:1152 +#, fuzzy +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "客户端: %1" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(马上回来)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(忙碌)" +#: kmessview.cpp:1168 +#, fuzzy +msgid "No" +msgstr "音符" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(显示为脱机)" +#: kmessview.cpp:1171 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "被阻止" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(离开 - 空闲)" +#: kmessview.cpp:1191 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "最后登陆: %1" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(外出就餐)" +#: kmessview.cpp:1206 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "最后消息: %1" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(接听电话)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "组%1 " -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "以给定的邮件地址自动登录" +#: kmessview.cpp:1224 +#, fuzzy, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "联系人离线" -#: main.cpp:54 -#: settings/accountswidget.cpp:443 -#: settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, fuzzy, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "联系人" + +#: kmessview.cpp:1651 +#, fuzzy +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "请在此处输入您的个人信息" + +#: kmessview.cpp:1652 +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:1833 +#, fuzzy +msgid "You have not chatted with this contact yet." +msgstr "您拒绝了邀请。" + +#: kmessview.cpp:1834 +#, fuzzy +msgid "No Chat History found." +msgstr "聊天主题(&C):" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 -msgid "German translation, testing, documentation, web master, project management, etc..." +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +#, fuzzy +msgid "Project support" +msgstr "P4-Context 域的支持" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "当前开发者" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:64 main.cpp:124 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:71 +msgid "" +"German translation, testing, documentation, web master, project management, " +"etc..." msgstr "德语翻译、测试、文档、网站设计、项目主管,等等。" -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:72 msgid "Web design" msgstr "网页设计" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "黄/蓝/紫色图释集和意大利语翻译" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "" -#: main.cpp:81 +#: main.cpp:73 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "黄/蓝/紫色表情集和意大利语翻译" + +#: main.cpp:74 msgid "Cartoon emoticons" -msgstr "卡通图释" +msgstr "卡通表情" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:75 msgid "Default sound theme" msgstr "缺省声音主题" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "阿拉伯语翻译和文件保存国际化的修正" -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "更多阿拉伯语翻译" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "巴西葡萄牙语翻译" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "巴西葡萄牙语翻译" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:90 msgid "Catalan translation" msgstr "加泰罗尼亚语翻译" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "" + +#: main.cpp:91 +#, fuzzy +msgid "More Catalan translation" +msgstr "更多意大利语翻译" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:93 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "简体中文翻译,文件发送的bug修复,连接代理的代码" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "更多简体中文翻译" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "繁体中文翻译" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:97 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "繁体中文翻译" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:99 msgid "Danish translation" msgstr "丹麦语翻译" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:100 msgid "More Danish translation" msgstr "更多丹麦语翻译" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:102 msgid "Dutch translation" msgstr "荷兰语翻译" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" msgstr "更多的荷兰语翻译" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:105 +msgid "Elve" +msgstr "" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:108 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "更多阿拉伯语翻译" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:109 +#, fuzzy +msgid "More Greek translation" +msgstr "更多法语翻译" + +#: main.cpp:111 msgid "Estonian translation" msgstr "爱沙尼亚语翻译" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:112 msgid "Finnish translation" msgstr "芬兰语翻译" -#: main.cpp:102 -#: main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:113 main.cpp:114 msgid "More Finnish translation" msgstr "更多芬兰语翻译" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:116 +msgid "Choplair" +msgstr "" + +#: main.cpp:116 msgid "French translation" msgstr "法语翻译" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" -msgstr "更多法语翻译,MSN6 图释定义" +msgstr "更多法语翻译,MSN6 表情定义" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" msgstr "更多法语翻译" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:120 +msgid "Scias" +msgstr "" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "匈牙利语翻译" -#: main.cpp:110 -#: main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:123 +#, fuzzy +msgid "More Hungarian translation" +msgstr "匈牙利语翻译" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:124 main.cpp:125 msgid "More Italian translation" msgstr "更多意大利语翻译" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:127 msgid "Korean translation" msgstr "韩文翻译" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "挪威语翻译" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:130 +#, fuzzy +msgid "Serbian translation" +msgstr "斯洛文尼亚语翻译" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:132 +#, fuzzy +msgid "Slovak translation" +msgstr "斯洛文尼亚语翻译" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "" + +#: main.cpp:133 msgid "Slovenian translation" msgstr "斯洛文尼亚语翻译" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:135 msgid "Spanish translation" msgstr "西班牙语翻译" -#: main.cpp:117 -#: main.cpp:118 -#: main.cpp:119 -#: main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 msgid "More Spanish translation" msgstr "更多西班牙语翻译" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:144 msgid "Swedish translation" msgstr "瑞典语翻译" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:145 +#, fuzzy +msgid "More Swedish translation" +msgstr "瑞典语翻译" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:147 msgid "Thai translation" msgstr "泰语翻译" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:148 msgid "Turkish translation" msgstr "土耳其语翻译" -#: main.cpp:125 -#: main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "更多土耳其语翻译" -#: main.cpp:129 +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Guido Solinas" +msgstr "上线(&G)" + +#: main.cpp:154 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "联系人列表中的图片代码,联系人客户端信息,聊天字体缩放" -#: main.cpp:130 +#: main.cpp:155 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "文件传送" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "P4-Context 域的支持" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Xinerama 的修正" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:158 msgid "Original file receive code" msgstr "最初文件接收的代码" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "KWallet的支持" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:162 +#, fuzzy +msgid "Chat history dialog" +msgstr "聊天主题(&C):" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:165 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "各种国际化问题的修正" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "各种国际化问题的修正" -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "GnomeMeeting 开发者" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" msgstr "头上罩着袋子的人" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:172 msgid "Inspiration and assorted code" msgstr "灵感和多项代码" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:173 +#, fuzzy +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" msgstr "旧的弹出气泡代码、最初的 p2p 代码和处理 msn challenge" -#: main.cpp:140 +#: main.cpp:174 msgid "Idle timer code" msgstr "空闲定时器的代码" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:175 +msgid "BasKet" +msgstr "" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" msgstr "“截屏时收缩到托盘”代码" -#: main.cpp:144 -msgid "Your name here?" -msgstr "将您的名字写在这里?" +#: main.cpp:176 +msgid "Amarok" +msgstr "" -#: main.cpp:144 +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:179 +#, fuzzy msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" msgstr "" "我们欢迎您到 KMess 帮助论坛去修补漏洞和提交补丁!\n" "如果您认为这里漏下了您的名字,也请联系我们!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 -msgid "The contact cancelled the session." -msgstr "联系人取消了邀请。" - -#: network/applications/application.cpp:288 -msgid "The contact rejected the invitation." -msgstr "联系人拒绝了邀请。" - -#: network/applications/application.cpp:360 -msgid "You have cancelled the session." -msgstr "您取消了邀请。" - -#: network/applications/application.cpp:372 -msgid "You have rejected the invitation." -msgstr "您拒绝了邀请。" - -#: network/applications/application.cpp:497 -msgid "Do you want to
accept or cancel?" -msgstr "你想接受还是取消?" - -#: network/applications/application.cpp:533 -msgid "Click to cancel." -msgstr "单击这里取消" - -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "您要接收这个文件吗:%1 (%2 )" - -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "文件传送失败,无法打开文件%1。" - -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "正在连接到 %1, %2 端口" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "文件传送被取消" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "连接已建立" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "成功传送文件:%1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "文件传送失败,文件%1不存在。" - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "文件传送失败,无法读取 %1。" - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "正在发送文件 %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 -msgid "Transfer accepted." -msgstr "传送被接受。" - -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 -msgid "Negotiating options to connect" -msgstr "协定连接参数" - -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 -msgid "The file transfer invitation was cancelled. Bad data was received." -msgstr "文件传送邀请被取消。接收的数据已损坏。" - -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "文件传送失败,无法打开文件%1。" - -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "联系人取消了文件传送。" - -#: network/applications/filetransferp2p.cpp:586 -msgid "File could not be written" -msgstr "文件无法写入" - -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "文件传送失败,文件%1不存在。" - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "文件传送失败,无法读取 %1。" - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "正在发送文件 %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 -msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "您被邀请参加会议(使用 GnomeMeeting)。" - -#: network/applications/gnomemeeting.cpp:114 -msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "启动 GnomeMeeting…… 正在连接到 %1。" - -#: network/applications/gnomemeeting.cpp:156 -msgid "Inviting the contact to a meeting." -msgstr "正在邀请联系人参加会议。" - -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "邀请被取消。另一方客户端不支持。" - -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "邀请被终止。发生了内部错误。" - -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "邀请被终止。等待用户接受超时。" - -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "邀请被终止。等待文件数据超时。" - -#: network/applications/mimeapplication.cpp:135 -msgid "The invitation was aborted. The switchboard closed the chat connection." -msgstr "邀请被终止。切换板关闭了聊天连接。" - -#: network/applications/mimeapplication.cpp:141 -msgid "The invitation was aborted." -msgstr "邀请被终止。" - -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "您被邀请共享此人的桌面。" - -#: network/applications/msnremotedesktop.cpp:155 -msgid "Starting KRDC. Connecting to %1." -msgstr "启动 KRDC。正在连接到 %1。" - -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "联系人启动了一项 KMess 不支持的 MSN6 功能。" - -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 -msgid "The invitation was cancelled. The contact sent bad data, or KMess doesn't support it." -msgstr "邀请被取消。联系人发送了损坏的数据,或者KMess不支持它。" - -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "文件传送失败。数据准备失败" - -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "联系人拒绝了邀请。发生了内部错误。" - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "传输失败。" - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "文件传送失败。联系人发送了损坏的数据,或者KMess不支持。" - -#: network/applications/p2papplication.cpp:2038 -msgid "The invitation was cancelled. Message was not directed to us." -msgstr "邀请被取消。消息不是针对我们的。" - -#: network/applications/p2papplication.cpp:2584 -msgid "The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "文件传送失败。联系人发送了损坏的数据,或者KMess不支持。" - -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 -msgid "Awaiting connection at %1, port %2" -msgstr "等候到主机 %1 端口 %2 的连接。" - -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 -msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "转换到间接传输模式(这可能很慢)" - -#: network/applications/p2papplication.cpp:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "文件传送失败。等待用户接受超时。" - -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "文件传送失败。发生了内部错误。" - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "文件传送失败。无法打开数据源。" - -#: network/applications/p2papplication.cpp:4844 -msgid "Waiting for connection" -msgstr "等待连接" - -#: network/applications/p2papplication.cpp:5013 -msgid "The invitation was cancelled. A timeout occured waiting for the contact to accept." -msgstr "邀请被取消。等待用户接受超时。" - -#: network/applications/p2papplication.cpp:5022 -msgid "The invitation was cancelled. A timeout occured waiting for a connection to succeed or fail." -msgstr "邀请被取消。等待确认连接是否成功超时。" - -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "邀请被取消。等待数据超时。" - -#: network/applications/voiceconversation.cpp:77 -msgid "You are invited to start a voice conversation." -msgstr "您被邀请与此人语音聊天。" - -#: network/applications/voiceconversation.cpp:82 -msgid "You are invited to start a voice conversation but support for this was not installed" -msgstr "您被邀请参加语音聊天,但是这项支持没有安装。" - -#: network/applications/voiceconversation.cpp:174 -msgid "You have cancelled the voice conversation." -msgstr "您取消了语音聊天。" - -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "邀请被取消。音频设备无法打开。" - -#: network/applications/voiceconversation.cpp:222 -msgid "Start voice conversation. Connecting to %1." -msgstr "启动语音对话。正在连接到%1" - -#: network/applications/voiceconversation.cpp:228 -msgid "Start voice conversation. Listening on %1." -msgstr "启动语音对话。接听%1" - -#: network/applications/voiceconversation.cpp:293 -msgid "Inviting the contact to a voice conversation." -msgstr "正在邀请联系人参加语音会议。" - -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -msgid "The contact is inviting you for '%1', but this is not implemented yet." -msgstr "联系人邀请您使用“%1”,但是现在KMess还没有开发此功能。" - -#: network/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "文件 %1 的传送被取消。" - -#: network/extra/msnftpconnection.cpp:136 -msgid "Failed" -msgstr "失败" - -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "%1的传送失败,无法打开本地端口。" - -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." -msgstr "无法打开本地端口。" - -#: network/extra/msnftpconnection.cpp:468 -msgid "Initiating file transfer" -msgstr "初始化文件传送" - -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "%1的传送失败,无法建立连接。" - -#: network/extra/msnftpconnection.cpp:482 -msgid "Unable to make a connection." -msgstr "无法建立连接。" - -#: network/extra/msnftpconnection.cpp:586 -msgid "Receiving file %1" -msgstr "发送文件 %1" - -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." +#: main.cpp:179 +msgid "Your name here?" +msgstr "将您的名字写在这里?" + +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "您的姓名" + +#: main.cpp:183 +#, fuzzy +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "电子邮件地址" + +#: main.cpp:189 +#, fuzzy +msgid "Do not show the contact list window initially" +msgstr "联系人列表已保存完毕" + +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "以给定的邮件地址自动登录" + +#: main.cpp:195 +msgid "Run a debug test (developer build only)" msgstr "" -"KMess 无法连接到 MSN Messenger 服务器。\n" -"请确认连接到了因特网。\n" -"系统错误:%1 (代码 %2)。" -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "丢失了1个 ping 数据包" +#: model/contactlist.cpp:1823 +#, fuzzy +msgid "Individuals" +msgstr "个人" -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "丢失了%1个 ping 数据包" - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "到服务器的连接丢失。" - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "远程用户关闭了连接。" - -#: network/msnnotificationconnection.cpp:75 +#: model/contactlist.cpp:1826 msgid "Allowed" msgstr "允许的" -#: network/msnnotificationconnection.cpp:76 +#: model/contactlist.cpp:1827 msgid "Removed" msgstr "删除的" -#: network/msnnotificationconnection.cpp:545 -msgid "KMess could not connect the the MSN Messenger servers. The MSN Messenger servers could be temporary unavailable or there is a problem with your Internet connection." -msgstr "KMess 无法连接到 MSN Messenger 服务器。MSN Messenger服务器可能暂时无法工作或者你的网络连接有问题。" +#: network/applications/application.cpp:294 +msgid "The contact cancelled the session." +msgstr "联系人取消了邀请。" -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "显示 MSN Messenger 服务状态?" +#: network/applications/application.cpp:306 +msgid "The contact rejected the invitation." +msgstr "联系人拒绝了邀请。" -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "服务器错误" +#: network/applications/application.cpp:378 +msgid "You have cancelled the session." +msgstr "您取消了邀请。" -#: network/msnnotificationconnection.cpp:1339 -msgid "You have been disconnected because you connected from another MSN Messenger client or from another location." -msgstr "您已经失去连接,因为您使用了另一个MSN Messenger客户端程序或在另一个地方登录。" +#: network/applications/application.cpp:390 +msgid "You have rejected the invitation." +msgstr "您拒绝了邀请。" -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "已同步" +#: network/applications/application.cpp:540 +#, fuzzy, kde-format +msgid "Do you want to accept or cancel?" +msgstr "你想接受还是取消?" -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "正在验证" +#: network/applications/application.cpp:581 +#, fuzzy, kde-format +msgid "Click to cancel." +msgstr "单击这里取消" -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "获得用户确认" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "等待联系人列表……" +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy, kde-format +msgid "" +"The file "%1" already exists.\n" +"Do you want to overwrite it?" +msgstr "" +"文件“%1”已存在。\n" +"您要覆盖它吗?" -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "与通知服务器进行传输" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "文件传送失败,无法打开文件%1。" -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "验证失败,请检查你的用户名和密码。" +#: network/applications/filetransfer.cpp:295 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "文件传送失败,无法打开文件%1。" -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "正在连接……" +#: network/applications/filetransfer.cpp:319 +msgid "Transfer accepted." +msgstr "传送被接受。" -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess从服务器接到了一个未知命令:%1" +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "正在连接到 %1, %2 端口" -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "KMess内部错误: %1" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "联系人取消了文件传送。" -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "您取消了邀请。" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "您取消了邀请。" + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "连接已建立" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy, kde-format +msgid "Successfully sent the file "%1"." +msgstr "成功传送文件:%1" + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy, kde-format +msgid "Successfully received the file "%1"." +msgstr "成功收到文件:%1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "文件传送失败,文件%1不存在。" + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "文件传送失败,无法读取 %1。" + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "正在发送文件 %1 (%2)" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "联系人接受了文件传送。" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +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 +#, fuzzy, kde-format +msgid "You have accepted the transfer of the 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 "您被邀请参加会议(使用 GnomeMeeting)。" + +#: network/applications/gnomemeeting.cpp:118 +#, kde-format +msgid "Starting GnomeMeeting. Connecting to %1." +msgstr "启动 GnomeMeeting…… 正在连接到 %1。" + +#: network/applications/gnomemeeting.cpp:161 +msgid "Inviting the contact to a meeting." +msgstr "正在邀请联系人参加会议。" + +#: network/applications/mimeapplication.cpp:154 +#, fuzzy +msgid "The invitation was rejected. It is not supported by the other client." +msgstr "邀请被取消。另一方客户端不支持。" + +#: network/applications/mimeapplication.cpp:164 +#, fuzzy +msgid "The invitation was aborted. An internal error occured." +msgstr "邀请被终止。发生了内部错误。" + +#: network/applications/mimeapplication.cpp:170 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "邀请被终止。等待用户接受超时。" + +#: network/applications/mimeapplication.cpp:175 +#, fuzzy +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "邀请被终止。等待文件数据超时。" + +#: network/applications/mimeapplication.cpp:180 +#, fuzzy +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 +#, fuzzy +msgid "You are invited to share this contact's desktop." +msgstr "您被邀请共享此人的桌面。" + +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format +msgid "Starting KRDC. Connecting to %1." +msgstr "启动 KRDC。正在连接到 %1。" + +#: network/applications/p2papplication.cpp:215 +#, fuzzy +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "联系人邀请您使用“%1”,但是现在KMess还没有开发此功能。" + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +#, fuzzy +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess does not " +"support it." +msgstr "邀请被取消。联系人发送了损坏的数据,或者KMess不支持它。" + +#: network/applications/p2papplication.cpp:1085 +#, fuzzy +msgid "The transfer failed. Data preparation failed." +msgstr "文件传送失败。数据准备失败" + +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "邀请被取消。消息不是针对我们的。" + +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +#, fuzzy +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "文件传送失败。联系人发送了损坏的数据,或者KMess不支持。" + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "联系人拒绝了邀请。发生了内部错误。" + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "等候到主机 %1 端口 %2 的连接。" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "转换到间接传输模式(这可能很慢)" + +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "等待连接" + +#: network/applications/p2papplication.cpp:3423 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "邀请被取消。等待用户接受超时。" + +#: network/applications/p2papplication.cpp:3432 +#, fuzzy +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "邀请被取消。等待确认连接是否成功超时。" + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +#, fuzzy +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "邀请被取消。等待数据超时。" + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "联系人拒绝了邀请。发生了内部错误。" + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "传输失败。" + +#: network/applications/p2papplicationbase.cpp:1028 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "文件传送失败。等待用户接受超时。" + +#: network/applications/p2papplicationbase.cpp:1047 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "文件传送失败。发生了内部错误。" + +#: network/applications/p2papplicationbase.cpp:1208 +#, fuzzy +msgid "The transfer failed. Could not 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 +#, fuzzy +msgid "The invitation was cancelled. The audio device could not be opened." +msgstr "邀请被取消。音频设备无法打开。" + +#: network/applications/voiceconversation.cpp:218 +#, kde-format +msgid "Start voice conversation. Connecting to %1." +msgstr "启动语音对话。正在连接到%1" + +#: network/applications/voiceconversation.cpp:224 +#, kde-format +msgid "Start voice conversation. Listening on %1." +msgstr "启动语音对话。接听%1" + +#: network/applications/voiceconversation.cpp:289 +msgid "Inviting the contact to a voice conversation." +msgstr "正在邀请联系人参加语音会议。" + +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +#, kde-format +msgid "The contact is inviting you for '%1', but this is not implemented yet." +msgstr "联系人邀请您使用“%1”,但是现在KMess还没有开发此功能。" + +#: 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 contact's webcam." +msgstr "您被邀请共享此人的桌面。" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "您取消了邀请。" + +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "联系人取消了文件传送。" + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "失败" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "正在发送文件 %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "%1的传送失败,无法打开本地端口。" + +#: network/extra/msnftpconnection.cpp:399 +#, fuzzy +msgid "Could not open a local port." +msgstr "无法打开本地端口。" + +#: network/extra/msnftpconnection.cpp:456 +msgid "Initiating file transfer" +msgstr "初始化文件传送" + +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "%1的传送失败,无法建立连接。" + +#: network/extra/msnftpconnection.cpp:470 +msgid "Unable to make a connection." +msgstr "无法建立连接。" + +#: network/extra/msnftpconnection.cpp:574 +#, kde-format +msgid "Receiving file %1" +msgstr "接受文件 %1" + +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "" + +#: network/msnconnection.cpp:384 +#, fuzzy +msgid "The email address you have tried to add is not a Live Messenger account" msgstr "你试图添加的email地址不是MSN Messenger帐号" -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" msgstr "用户名无效" -#: network/msnnotificationconnection.cpp:2255 -msgid "That account name is invalid, or your passport has not been confirmed yet" +#: network/msnconnection.cpp:400 +#, fuzzy +msgid "" +"This account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "帐号无效,或者你的passport还没有确认。" -#: network/msnnotificationconnection.cpp:2258 +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "您的联系人列表已满" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:411 msgid "This contact is already on your list" msgstr "这个联系人已经在您的列表中" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 msgid "This contact is not on your list" msgstr "这个联系人不在您的列表中" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "联系人离线" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "" + +#: network/msnconnection.cpp:432 +#, fuzzy +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "在你的MSN Messenger或者Hotmail联系人列表中已经使用了这个组名" + +#: network/msnconnection.cpp:436 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30" msgstr "您的联系人列表中分组太多了" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" +#: network/msnconnection.cpp:440 +#, fuzzy +msgid "This group cannot be changed" msgstr "这个组不能被改变。" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:445 +#, fuzzy +msgid "Contact is not added to this group" +msgstr "您的联系人列表中分组太多了" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "组非空" -#: network/msnnotificationconnection.cpp:2288 -msgid "The group name is already in use by your Messenger or Hotmail contact list" -msgstr "在你的MSN Messenger或者Hotmail联系人列表中已经使用了这个组名" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "组名过长" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "KMess内部错误: %1" + +#: network/msnconnection.cpp:462 +#, fuzzy +msgid "Invalid Group" +msgstr "重命名组(&n)" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "切换板服务器失败。" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" msgstr "到切换板服务器的文件传送失败" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "直接连接(MSNSLP)错误,连接失败" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "访问联系人列表时发生错误,稍后再试" +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "" + +#: network/msnconnection.cpp:492 +#, fuzzy +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "如果选中,将会使用代理服务器连接到MSN Messenger服务器。" + +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:500 +#, fuzzy +msgid "Your account is banned" msgstr "您的账户被停用。" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" +#: network/msnconnection.cpp:504 +#, fuzzy +msgid "Challenge response failed" +msgstr "传输失败。" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:513 +#, fuzzy +msgid "You are opening chat sessions too fast" msgstr "你开启会话太快了" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" +#: network/msnconnection.cpp:517 +#, fuzzy +msgid "You have too many open chat sessions" msgstr "你已开启的会话太多了" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" msgstr "错误的联系人名字" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:540 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" msgstr "服务器报告,KMess发送的数据太多了,造成泛滥" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." +#: network/msnconnection.cpp:547 +#, fuzzy +msgid "Authentication ticket was incorrect" +msgstr "验证失败" + +#: network/msnconnection.cpp:550 +#, fuzzy +msgid "You cannot start a chat with someone while you are invisible" msgstr "您不能在隐身的状态下进行聊天。" -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." +#: network/msnconnection.cpp:554 +#, fuzzy +msgid "Not accepting new contacts" +msgstr "不接受新的规则" + +#: network/msnconnection.cpp:558 +#, fuzzy +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" msgstr "你的passport是儿童型的,聊天时需要父母的同意。" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." +#: network/msnconnection.cpp:561 +#, fuzzy +msgid "Your Passport account needs to be verified first" msgstr "你的passport需要先验证。" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN 错误" +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "访问联系人列表时发生错误,稍后再试" + +#: network/msnconnection.cpp:584 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" msgstr "服务器内部错误" -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "服务器繁忙" +#: network/msnconnection.cpp:595 +#, fuzzy +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "服务器内部错误" -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "服务器不可用" - -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "点对点服务器已关闭" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" msgstr "服务器即将关闭" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" msgstr "服务器马上就要关闭" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "禁止写操作" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "会话超载" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" msgstr "服务器不可用" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "验证失败" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "不接受新的规则" +#: network/msnconnection.cpp:634 +#, fuzzy, kde-format +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "KMess从服务器接到了一个未知命令:%1" -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess从服务器收到了未知错误信息:%1" +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "KMess - MSN 错误" -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "警告:服务器1分钟后因维护而关闭!" +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "" -#: network/msnnotificationconnection.cpp:2596 -msgid "The MSN Server has reported it will be going down in one minute for maintenance." -msgstr "MSN服务器报告,它1分钟后将会关闭进行维护。" +#: network/msnnotificationconnection.cpp:1337 +#, fuzzy +msgid "Authenticating..." +msgstr "正在验证" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" +#: network/msnnotificationconnection.cpp:1361 +#, fuzzy +msgid "Authenticated" +msgstr "验证失败" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "正在连接……" + +#: network/msnnotificationconnection.cpp:1940 +#, fuzzy, kde-format +msgid "Unknown command received from the server: %1" +msgstr "KMess从服务器接到了一个未知命令:%1" + +#: network/msnnotificationconnection.cpp:2100 +#, fuzzy, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "分钟后" + +#: network/msnnotificationconnection.cpp:2103 +#, fuzzy, kde-format +msgid "Server closes for maintenance in %1!" msgstr "警告:服务器%1分钟后因维护而关闭!" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 -msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +#: network/msnnotificationconnection.cpp:2108 +#, fuzzy, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "MSN服务器报告,它1分钟后将会关闭进行维护。" + +#: network/msnnotificationconnection.cpp:2309 +#, fuzzy, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" "KMess不能处理离线消息。\n" "\n" "细节:%1" -#: network/msnnotificationconnection.cpp:3163 -msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." msgstr "" -"验证失败。KMess无法再次登录这个passport。\n" -"\n" -"细节:%1" -#: network/msnnotificationconnection.cpp:3170 -msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"Details: %1" +#: network/msnnotificationconnection.cpp:2580 +#, fuzzy +msgid "Authentication time limit exceeded" +msgstr "验证失败" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "等待联系人列表……" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" msgstr "" -"KMess无法访问远程web服务。\n" -"\n" -"细节:%1" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "此人已经下线或隐身。" +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "联系人启动了一项KMess不能处理的MSN7功能。" +#: network/msnnotificationconnection.cpp:2869 +#, fuzzy, kde-format +msgid "
Internal error reason: %1" +msgstr "KMess内部错误: %1" -#: network/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "消息\"%1\"没有收到!" +#: network/msnnotificationconnection.cpp:2904 +#, fuzzy +msgctxt "Connection error: dialog box" +msgid "" +"

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

" +msgstr "验证失败,请检查你的用户名和密码。" -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "无法建立连接: %1" +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "登录服务器的重定向过多" +#: network/msnnotificationconnection.cpp:2920 +#, fuzzy, kde-format +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/tcpconnectionbase.cpp:223 -msgid "Connection timeout" +#: network/msnnotificationconnection.cpp:2932 +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:2935 +#, fuzzy, kde-format +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:2954 +#, fuzzy +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "如果选中,将会使用代理服务器连接到MSN Messenger服务器。" + +#: network/msnnotificationconnection.cpp:2956 +#, fuzzy, kde-format +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:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

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

The Live Messenger server has reported an error:

%1

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

Messenger Service Error: %1

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

The Live Messenger server has reported an error:

%1

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

KMess Error: %1

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

KMess has encountered an internal error:

%1

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

Network connection lost.

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

Connection to the Live Messenger server has been lost.

" +msgstr "到服务器的连接丢失。" + +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +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:686 +#, fuzzy, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "KMess内部错误: %1" + +#: network/msnsockethttp.cpp:696 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:364 +#, fuzzy +msgid "Connection time limit exceeded" msgstr "连接超时" -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "丢失了1个 ping 数据包" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "丢失了%1个 ping 数据包" + +#: network/msnsockettcp.cpp:400 +#, fuzzy +msgid "The connection to the server was lost" +msgstr "到服务器的连接丢失。" + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "你试图添加的email地址不是MSN Messenger帐号" + +#: network/soap/addressbookservice.cpp:787 +#, fuzzy, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "你试图添加的email地址不是MSN Messenger帐号" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:408 +#, fuzzy, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "服务器不可用" + +#: network/soap/httpsoapconnection.cpp:479 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "登录服务器的重定向过多" + +#: network/soap/httpsoapconnection.cpp:523 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "服务器不可用" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:172 +#, fuzzy, kde-format +msgid "In %1's chat:
%2" msgstr "在%1的聊天中: %2" -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" +#: notification/chatnotification.cpp:176 +#, fuzzy, kde-format +msgid "%1 says:
'%2'" msgstr "%1 说:
'%2'" -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" +#: notification/chatnotification.cpp:180 +#, fuzzy, kde-format +msgid "%1 has sent you an offline message:
'%2'" msgstr "%1给你发送了离线消息:
'%2'" -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" +#: notification/chatnotification.cpp:187 +#, fuzzy, kde-format +msgid "%1's chat requests attention!" msgstr "%1的聊天请求注意!" -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" +#: notification/chatnotification.cpp:192 +#, fuzzy, kde-format +msgid "%1:
%2" msgstr "%1:
%2" -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1给您发送了闪屏振动!" +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1给你发送了手写消息:
'" -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1给您发送了传情动漫!" +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1给您发送了闪屏振动!" -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1想使用摄像头!" +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1给您发送了传情动漫!" -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1给您发送了文件!" +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1想使用摄像头!" -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1给您发送了邀请!" +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1给您发送了文件!" -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1取消了摄像头邀请!" +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1给您发送了邀请!" -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1取消了文件传送!" +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1取消了摄像头邀请!" -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "%1的活动已被取消!" +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1取消了文件传送!" -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1同意了使用摄像头!" +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1的活动已被取消!" -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1接受了文件传送!" +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1同意了使用摄像头!" -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1接受了你的邀请!" +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1接受了文件传送!" -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1结束了摄像头邀请!" +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1接受了你的邀请!" -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "和%1的文件传输完成!" +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1结束了摄像头邀请!" -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "%1的活动已经结束!" +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "和%1的文件传输完成!" -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "%1的视频会话失败!" +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1的活动已经结束!" -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "和%1的文件传送失败!" +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1的视频会话失败!" -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "%1的活动因有错误而结束!" +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "和%1的文件传送失败!" -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1走了" +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1的活动因有错误而结束!" -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1马上回来" +#: notification/contactstatusnotification.cpp:91 +#, fuzzy, kde-format +msgid "%1
is now online" +msgstr "%1正在线" -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1繁忙" +#: notification/contactstatusnotification.cpp:92 +#, fuzzy, kde-format +msgid "%1
has gone away" +msgstr "%1离开" -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1已登出" +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1马上回来" -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1脱机了" +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1忙碌 " -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1发起了呆" +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1脱机了" -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1空闲" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1已登出" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy, kde-format +msgid "%1
is on the phone" +msgstr "%1在电话上 " + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy, kde-format +msgid "%1
is out for lunch" msgstr "%1出去吃饭了" -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1在电话上 " - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1现在联机了" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" +#: notification/newemailnotification.cpp:90 +#, fuzzy, kde-format +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" msgstr "新电子邮件:
来自'%2'的
%1" -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "发送(&e)" +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "开始会议(&M)" -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "换行(&w)" +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "个人消息(&P)" -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "侧边栏" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, no-c-format -msgid "The contact is listening to music" -msgstr "这个联系人在听音乐" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "点击此处显示联系人的档案。" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "点击这里给这个联系人发送 email" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "输入这个图释的快捷键:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "选择图片文件: " - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "添加联系人" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format -msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" -msgstr "" -"%1\n" -"已将您加入他(她)的联系人列表。 您想:" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "将这个联系人加入您的列表中(&A)" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "不添加这个联系人,但让他看到您的状态(&N)" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "阻止此人与你联系或者看到你的联机状态(&y)" - -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, no-c-format -msgid "Cl&ean up" -msgstr "清除(&E)" - -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "输入您的登录信息:" - -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "电子邮件地址" - -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "密码" - -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "登录时的状态" - -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "记住这个帐号(&b)" - -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "登录" - -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "请在此处输入您的个人信息" - -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "正在收听 %1" - -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess 通知" - -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format -msgid "Accounts" -msgstr "帐号" - -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "您的昵称:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "输入你在线时其他联系人将看到的名字。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "您的电子邮件地址:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format -msgid "Enter the e-mail 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 注册新帐号。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "您的密码:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format -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 注册新帐号。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "头像:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format -msgid "C&hange..." -msgstr "更改(&h)..." - -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "禁止显示头像(&y)" - -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "记住这个帐号的设置" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format -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" -"\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" -"建议选中这个选项,除非你是以客人身份使用KMess或者你在使用公共计算机系统(比如网吧)。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "启动时自动登录此帐号(&w)" - -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format -msgid "If enabled, KMess automatically logs in with this account." -msgstr "如果选中,KMess自动保存这个帐号的记录。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "登录时的状态:" - -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format -msgid "You can't change your friendly name because your passport e-mail address is not verified." -msgstr "你无法改变你的昵称,因为你还没有确认你的passport email地址。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 -#: rc.cpp:210 -#, no-c-format -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." -msgstr "你需要一个 passport 帐号来连接到 MSN Messenger 网络。你可以在 https://accountservices.passport.net/reg.srf?ns=msn.com&lc=2052 注册你目前的 e-mail,或使用 Hotmail 帐号来连接。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format -msgid "Request verification email" -msgstr "需要验证电子邮件" - -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format -msgid "https://accountservices.passport.net/" -msgstr "https://accountservices.passport.net/" - -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format -msgid "Go to accountservices.passport.net" -msgstr "访问 accountservices.passport.net" - -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format -msgid "To connect to the MSN Messenger service, you will need to register an e-mail address as Passport account." -msgstr "连接到 MSN Messenger 服务,你需要注册一个 e-mail 来当作 Passport 帐号。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format -msgid "Register new account" -msgstr "注册新账户" - -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format -msgid "http://register.passport.com/" -msgstr "https://accountservices.passport.net/reg.srf?ns=msn.com&lc=2052" - -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format -msgid "Go to register.passport.com" -msgstr "连接到 https://accountservices.passport.net/reg.srf?ns=msn.com&lc=2052" - -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 -#: settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "提醒" - -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "弹出通知" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "当联系人有如下动作时通知你:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "上线(&G)" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format -msgid "If enabled, a popup message is shown when one of your contacts connects to MSN." -msgstr "如果选中,当你的联系人连接到MSN时会弹出消息。" - -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "开始了与您的聊天(&c)" - -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -msgid "If enabled, a popup message is shown when one of your contacts starts a conversation with you." -msgstr "如果选中,当你的联系人开始与你谈话时会弹出消息。" - -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" msgstr "给您发送了消息(&e)" -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "If enabled, a popup message is shown every time one of your contacts sends you a message." -msgstr "如果选中,每当你的联系人给你发消息时会弹出消息。" +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "邪恶" -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "更改状态(&s)" +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "发送电子邮件(&E)" -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "If enabled, a popup message is also shown when your contacts change their MSN status." -msgstr "如果选中,当你的联系人改变MSN状态时也会弹出消息。" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "下线(&f)" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 -#: rc.cpp:282 -#, no-c-format -msgid "If enabled, a popup message is also shown when one of your contacts goes offline." -msgstr "如果选中,每当你的联系人下线时也会弹出消息。" - -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "当接到电子邮件时通知我" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "通知停留" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "控制弹出气泡隐藏前的显示时间。" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "秒" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "当发送或者接到闪屏震动时窗口会摇晃(%w)" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format +#: notification/systemtraywidget.cpp:78 +#, fuzzy 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.

" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" -"

当联系人想要引起你的注意时,他们会发出闪屏震动。默认状态下当收到或发出闪屏震动时,窗口会摇晃。当药晃效果太打扰你时,可以关闭此选项。

\n" -"

当开启此选项时,KMess 依然限制摇晃效果。联系人可能会一次发出许多个闪屏震动,但是 KMess 只会摇晃窗口一次。

" +"关闭主窗口后 KMess 将在系统托盘中继续运行。可用文件菜单中的退出来退出程序。" -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "通知我的联系人我在听哪一首歌。(&h)" +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "使用系统托盘" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format -msgid "If enabled, KMess informs contacts what you're listening to. This information is retrieved from the currently active audio player applications." -msgstr "如果选中,KMess 会通知你的联系人你正在收听什么。这个信息是从当前运行的音频播放软件中获取的。" +#: notification/systemtraywidget.cpp:240 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "不活跃时将状态改为\"离开-空闲\" (&y)" +#: notification/systemtraywidget.cpp:246 +#, fuzzy, kde-format +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 %2" -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "If enabled, your status will be changed automatically to \"Away-Idle\" when you're not using the computer for a few minutes." -msgstr "如果选中,当你几分钟不是用电脑时,你的状态会自动切换到\"离开 - 发呆\"。" - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format -msgid "Become idle after" -msgstr "开启定时器" - -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "Controls the number of minutes before KMess changes the status to \"Away-Idle\"." -msgstr "控制 KMess 转变状态为 \"离开 - 发呆\" 前的分钟数。" - -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format -msgid "minutes" -msgstr "分钟后" - -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 -#: settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "聊天记录" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "保存所有聊天记录(&a)" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "如果选中,聊天记录会保存在指定的目录下。" - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "在此目录中保存聊天记录:" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format -msgid "Choose the directory on your system where you'd like to save the chat logs." -msgstr "选择一个你想要保存聊天记录的文件夹。" - -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "按日期在不同子目录中保存聊天记录:" - -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format -msgid "KMess automatically creates subdirectories when you choose the organize the chat folder by year, month or day." -msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" - -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format -msgid "Year" -msgstr "年" - -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "月" - -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "日" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "在顶级目录中保存所有聊天记录" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "消息所用字体:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "这是你的聊天信息的字体、字型和颜色。" - -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "强制所有联系人的消息使用此字体:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format -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/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "聊天主题:" - -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "允许你改变 KMess 用来显示聊天信息的主题。" - -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "在聊天信息中显示图片(&S)" - -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "在聊天内容中使用图释。" - -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "在消息中显示时间信息(&h)" - -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "在每一条聊天内容中显示时间标记。" - -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "在消息中使用字体效果,例如*粗体*、/斜体/和_下划线_。" - -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format -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: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format -msgid "&Group follow-up messages from the same contact" -msgstr "把同一个联系人发来的消息放在一起(&G)" - -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format -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." +#: settings/accountpage.cpp:80 +msgid "Browse..." msgstr "" -"这个选项使同一个联系人的信息组合在一起。当联系人输入多个信息来解释某事时,KMess 把这些信息组合成单个的信息。具体的外观则依主题的不同而不同。\n" -"当你使用小i的MSN群时,此功能可能会引起显示混乱。" -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "电子邮件客户程序" - -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format -msgid "Allows you to choose which e-mail program KMess should open to view e-mail messages." -msgstr "允许你选择 KMess 使用哪一个 e-mail 软件来查看 e-mail 消息。" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "使用Hotmail" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "使用指定的命令:" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 -#: settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "邮件通知" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "显示email信息" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 "如果选中,当你在收件箱中收到邮件时,会弹出气泡。未读邮件的数目会在联系人列表的上方出现。此选项仅适用于 Hotmail 帐户。" - -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "当电子邮件到达\"其他文件夹\"时通知我" - -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format -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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format -msgid "&Emoticon Themes" -msgstr "表情主题(&E)" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "可用的图释主题:" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format -msgid "&Custom Emoticons" -msgstr "自定义图释(&C)" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "这个帐号的自定义图释:" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "添加(&w)..." - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 -#: rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "单击这里" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "单击这里添加一个新的自定义图释。" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format -msgid "Re&name" -msgstr "重命名(&n)" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "单击这里重命名选中的图释。" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format -msgid "Remo&ve" -msgstr "删除(&v)" - -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 -#, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "选择一个图释然后单击这里删除。" - -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 -#: rc.cpp:509 -#, no-c-format -msgid "says:" -msgstr "说:" - -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." +#: settings/accountpage.cpp:81 +#, fuzzy +msgid "Browse and Crop Picture..." msgstr "浏览并裁剪图片……" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "头像" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "显示头像" + +#: settings/accountpage.cpp:480 +#, fuzzy +msgid "Downloading of display picture failed" msgstr "下载显示图像失败" -#: settings/accountswidget.cpp:486 +#: settings/accountpage.cpp:539 +#, fuzzy msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." msgstr "" "试图改变头像时发生了错误。\n" "确定你选择了正确的图像文件" -#: settings/settingsdialog.cpp:74 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "设置" -#: settings/settingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "帐号" -#: settings/settingsdialog.cpp:96 +#: settings/accountsettingsdialog.cpp:79 +#, fuzzy +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/settingsdialog.cpp:747 +#: 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 +#, fuzzy, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "你输入的联系人地址不正确:'%1'" + +#: settings/accountsettingsdialog.cpp:214 +#, fuzzy, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "你输入的联系人地址不正确:'%1'" + +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "您确定要删除这个帐号吗?" -#: settings/settingsdialog.cpp:780 +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "您确定要删除这个帐号吗?" + +#: settings/chatstylepage.cpp:371 msgid "Hi, how are you doing? :)" msgstr "Hi, 你最近怎么样? :)" -#: settings/settingsdialog.cpp:781 +#: settings/chatstylepage.cpp:372 msgid "Stacy" msgstr "小鱼儿" -#: settings/settingsdialog.cpp:782 +#: settings/chatstylepage.cpp:373 msgid "Great!" msgstr "太棒了!" -#: settings/settingsdialog.cpp:784 +#: settings/chatstylepage.cpp:375 msgid "I /just/ got back from my vacation in Italy!" msgstr "我 /刚刚/ 从意大利度假回来!" -#: systemtraywidget.cpp:91 -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 将在系统托盘中继续运行。可用文件菜单中的退出来退出程序。" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "" -#: systemtraywidget.cpp:102 -#: systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "使用系统托盘" +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid Emoticon Name" +msgstr "" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "编辑表情" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: settings/emoticonspage.cpp:233 +#, fuzzy, kde-format +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:58 settings/globalsettingsdialog.cpp:59 +msgid "Accounts" +msgstr "帐号" + +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +#, fuzzy +msgid "Notifications" +msgstr "KMess 通知" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web 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 web browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom web 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 emails 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 +#, fuzzy +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:242 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:251 +#, fuzzy +msgid "Show &Feedback Icons" +msgstr "显示表情(&S)" + +#: utils/likeback/likeback.cpp:319 +#, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:324 +#, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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:146 +#, kde-format +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:159 +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:168 +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:174 +#, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:216 +#, fuzzy, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "你输入的联系人地址不正确:'%1'" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "联系人" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#. 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 the standard text mode." +msgstr "点击此处恢复联络人的头像" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "发送(&e)" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "聊天(&C)" + +#. 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: file: chat/contactswidget.ui:107 +#. 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 +#, 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 +msgid "" +"Enter here the email address of the person you wish to add to your contact " +"list" +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:273 +msgid "Email address:" +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: 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 "指定处于离开状态时发送的消息(&S)" + +#. 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:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "聊天记录" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +#, fuzzy +msgid "Filter by &chat" +msgstr "开始或停止一个对话(&C)" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +#, fuzzy +msgid "to" +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 the following groups of your 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, but allow him or her to see your status" +msgstr "不添加这个联系人,但让他看到您的状态(&N)" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting you and seeing your status" +msgstr "阻止此人与你联系或者看到你的联机状态(&y)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "恢复(&R)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "组(&G)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this contact" +msgstr "使用另一个名字(&a)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Disable notifications for this contact" +msgstr "当联系人有如下动作时通知你:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "声音(&S):" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +#, fuzzy +msgid "&Display Pictures" +msgstr "显示头像" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "单击这里删除选中的表情。" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Use As Display Picture" +msgstr "显示头像" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "清除缓存(&C)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +#, fuzzy +msgid "Click here to restore the selected emoticon" +msgstr "单击这里删除选中的表情。" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +#, fuzzy +msgid "Resto&re" +msgstr "恢复(&R)" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +#, fuzzy +msgid "Available Contacts" +msgstr "允许联系人(&A)" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +#, fuzzy +msgid "Invite a person not on your contact list:" +msgstr "邀请一个不在您的列表中的联系人" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +#, fuzzy +msgid "Enter the email address of a person to invite" +msgstr "输入你想邀请的联系人的电子邮件" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +msgid "Invited Contacts" +msgstr "邀请的联系人" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "输出的项目" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "格式" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "联系人" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "全选" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "全不选" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "导出..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "关闭" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "关闭标签" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "命令" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "类型:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "标准" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "发送(&e)" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +#, fuzzy +msgid "Command payload (can be empty):" +msgstr "命令附加(可以为空)" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "打开" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "取消" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "下载(&D)" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "上传(&U)" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "清除(&l)" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "关闭(&C)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +#, fuzzy +msgid "" +"Enter here the email address of your registered Passport or Live account" +msgstr "请输入您的Passport或者Live账号的邮件地址:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:279 +msgid "Password:" +msgstr "密码:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +#, fuzzy +msgid "Enter here your account's password" +msgstr "输入您的账号密码" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "登录时的状态" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +#, fuzzy +msgid "Choose a status to set when successfully connected." +msgstr "选择成功登陆后的状态" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "如果选中,KMess自动保存这个帐号的记录。" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +msgid "Remem&ber account" +msgstr "记住帐号(&b)" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +msgid "R&emember password" +msgstr "记住密码(&e)" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "添加新帐号" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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:324 +msgid "Password forgotten?" +msgstr "忘记密码?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +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:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "登录(&C)" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "查看(&V)" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "操作(&A)" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +#, fuzzy +msgid "Form" +msgstr "格式" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +#, fuzzy +msgid "Account &Info" +msgstr "帐号" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "您的账号信息:" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +#, fuzzy +msgid "Enter a name other contacts should see when you are connected." +msgstr "输入你在线时其他联系人将看到的名字。" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "昵称(&F)" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +msgid "" +"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://register.passport.com" +"注册新帐号。" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:363 +msgid "&Email address:" +msgstr "电子邮件地址(&E):" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 +msgid "" +"Enter the password of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"输入你的MSN Passport帐号的密码。你可以在 https://register.passport.com注册新" +"帐号。" + +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "密码(&P):" + +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "记住密码(&R)" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 +msgid "C&hange..." +msgstr "更改(&h)..." + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +#, fuzzy +msgid "&Do not use" +msgstr "不启用(&D)" + +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy +msgid "" +"The option \"Remember account\" was left unchecked while logging in, " +"so your settings will not be saved by default. Enable this option if you " +"want to save your account settings permanently on this system.\n" +"\n" +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." +msgstr "" +"登录时选项\"记住这个档案\"被留空,所以默认情况下不会保存你的设置。如果你想要" +"把你的帐号设置永久地保存在这里的话,请选中这个选项。\n" +"\n" +"建议选中这个选项,除非你是以客人身份使用KMess或者你在使用公共计算机系统(比如" +"网吧)。" + +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "记住这个帐号的设置(&m)" + +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 +msgid "If enabled, KMess automatically logs in with this account." +msgstr "如果选中,KMess自动保存这个帐号的记录。" + +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "自动登录此帐号(&w)" + +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "登陆状态(&a)" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +#, fuzzy +msgid "" +"You cannot change your friendly name because your Passport email address is " +"not verified." +msgstr "你无法改变你的昵称,因为你的passport email地址尚未验证。" + +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 +msgid "Request verification email" +msgstr "需要验证电子邮件" + +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 +msgid "Go to accountservices.passport.net" +msgstr "访问 accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 +#, fuzzy +msgid "" +"You need a Passport account to connect to the Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." +msgstr "" +"你需要一个 passport 帐号来连接到 MSN Messenger 网络。你可以在 https://" +"register.passport.com 注册你目前的 e-mail,或使用 Hotmail 帐号来连接。" + +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +#, fuzzy +msgid "" +"To connect to the Live Messenger service, you will need to register an email " +"address as Passport account." +msgstr "" +"连接到 MSN Messenger 服务,你需要注册一个 e-mail 来当作 Passport 帐号。" + +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 +msgid "Register new account" +msgstr "注册新账户" + +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 +msgid "http://register.passport.com/" +msgstr "https://register.passport.com" + +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 +msgid "Go to register.passport.com" +msgstr "连接到 https://register.passport.com" + +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +#, fuzzy +msgid "&Status Options" +msgstr "登录时的状态" + +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are 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:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "不活跃时将状态改为\"离开-空闲\" (&y)" + +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 +#, fuzzy +msgid "" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "控制 KMess 转变状态为 \"离开 - 发呆\" 前的分钟数。" + +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 +msgid "Become idle after" +msgstr "开启定时器" + +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 +msgid "minutes" +msgstr "分钟后" + +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 +msgid "" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +#, fuzzy +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "当我的状态(&H)" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "已保存的帐号" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +#, fuzzy +msgid "&Add Account..." +msgstr "添加联系人(&A)..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +#, 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:491 +msgid "&Edit" +msgstr "编辑(&E)" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +msgid "&Remove" +msgstr "删除(&R)" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "启用聊天记录" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +#, fuzzy +msgid "Additionally save chat logs to file" +msgstr "将聊天记录保存到文件" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +#, fuzzy +msgid "Save chat logs as:" +msgstr "将聊天记录保存到文件" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "纯文本" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "保存聊天" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +#, fuzzy +msgid "Create a directory to organize chats by year" +msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 +msgid "Year" +msgstr "年" + +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +#, fuzzy +msgid "Create directories to organize chats by year then by month" +msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +#, fuzzy +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +#, fuzzy +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "在顶级目录中保存所有聊天记录" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "单击这里重命名选中的表情。" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +#, fuzzy +msgid "Choose a directory where you would like to save your chat logs." +msgstr "选择一个你想要保存聊天记录的文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +#, fuzzy +msgid "Save chat logs in the following directory:" +msgstr "在此目录中保存聊天记录:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 +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:624 +#, fuzzy +msgid "&Chat style:" +msgstr "聊天主题(&C):" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "聊天设置" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +#, 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:636 +msgid "&Show emoticons" +msgstr "显示表情(&S)" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +#, fuzzy +msgid "Show &winks" +msgstr "显示表情(&E)" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 +#, 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:648 +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:654 +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:657 +#, fuzzy +msgid "S&how timestamp" +msgstr "在显示消息时间(&h)" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +#, fuzzy +msgid "Show &date" +msgstr "联系人" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +#, fuzzy +msgid "Show s&econds" +msgstr "显示表情(&S)" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +#, fuzzy +msgid "&Text" +msgstr "文字(&T)" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "这是你的聊天信息的字体、字型和颜色。" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "消息所用字体(&m):" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 +#, fuzzy +msgid "" +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "" +"允许用以下已选的字型、形式和颜色来覆盖你的联系人的聊天信息中的字型、形式和颜" +"色。" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "强制所有联系人的消息使用此字体:" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "清除标签" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +#, 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 "" +"使用字体效果。输入 *粗体*,/斜体/ 和 _下划线_,可使字呈现相应的粗体、斜体和下" +"划线样式。" + +#. i18n: file: settings/chatstylepage.ui:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "在消息中使用字体效果,例如*粗体*、/斜体/和_下划线_。" + +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 +#, fuzzy +msgid "" +"

When contacts would like to have your attention they can send you 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" +"

Even if 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 "" +"

当联系人想要引起你的注意时,他们会发出闪屏震动。默认状态下当收到或发出" +"闪屏震动时,窗口会摇晃。当药晃效果太打扰你时,可以关闭此选项。

\n" +"

当开启此选项时,KMess 依然限制摇晃效果。联系人可能会一次发出许多个闪屏震" +"动,但是 KMess 只会摇晃窗口一次。

" + +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "当发送或者接到闪屏震动时窗口会摇晃(&w)" + +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 +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:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "禁止显示头像(&y)" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "在同一个窗口中显示所有的聊天" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "总是" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "同一组的联系人" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "从不" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +#, fuzzy +msgid "Display Options" +msgstr "头像:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +#, fuzzy +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." +msgstr "" +"如果选中,当你在收件箱中收到邮件时,会弹出气泡。未读邮件的数目会在联系人列表" +"的上方出现。此选项仅适用于 Hotmail 帐户。" + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +#, fuzzy +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." +msgstr "" +"如果选中,KMess 会通知你的联系人你正在收听什么。这个信息是从当前运行的音频播" +"放软件中获取的。" + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +#, fuzzy +msgid "Show contacts w&hich song I am listening to" +msgstr "通知我的联系人我在听哪一首歌。(&h)" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 +msgid "&Emoticon Themes" +msgstr "表情主题(&E)" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +#, fuzzy +msgid "Available emoticon themes:" +msgstr "可用的表情主题:" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 +msgid "&Custom Emoticons" +msgstr "自定义表情(&C)" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +#, fuzzy +msgid "Available custom emoticons:" +msgstr "可用的表情主题:" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +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:781 +msgid "Add Ne&w..." +msgstr "添加(&w)..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" +msgstr "单击这里重命名选中的表情" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 +msgid "Re&name" +msgstr "重命名(&n)" + +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "单击这里删除选中的表情。" + +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 +msgid "Remo&ve" +msgstr "删除(&v)" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "浏览器" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +#, fuzzy +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "选中这个选项来使用KDE所使用的浏览器" + +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "使用KDE默认浏览器(&U)" + +#. 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:814 rc.cpp:849 +#, fuzzy +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:817 +msgid "&Use an installed browser:" +msgstr "使用已安装的浏览器(&U)" + +#. 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:820 rc.cpp:855 +#, fuzzy +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:823 rc.cpp:858 +msgid "&Specify a custom command:" +msgstr "指定一个自定义命令(&S)" + +#. 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:827 rc.cpp:862 +#, 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:831 +#, 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:834 +#, fuzzy +msgid "Email Client" +msgstr "电子邮件客户程序" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 +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:840 +msgid "Use &Live Mail if the account supports it" +msgstr "如果账号支持,使用Live Mail(&L)" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +#, fuzzy +msgid "Choose this option to use the email client used by the rest of KDE." +msgstr "选中这个选项来使用KDE所使用的浏览器" + +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" +msgstr "使用KDE默认电子邮件客户端(&K)" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "使用已安装的电子邮件客户端(&i)" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +#, fuzzy +msgid "&Save all received files in one directory:" +msgstr "将所有接受的文件保存在同一目录(&S):" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +#, fuzzy +msgid "&Use ports between" +msgstr "使用以下端口" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +#, fuzzy +msgid "and" +msgstr "和" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +#, fuzzy +msgid "for file transfers" +msgstr "文件传送" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +#, fuzzy +msgid "Click here to tell the developers about something you liked" +msgstr "单击这里重命名选中的表情" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 +msgid "" +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +#, fuzzy +msgid "Click here to tell the developers about a problem in the application" +msgstr "单击这里删除选中的表情。" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "你的注释" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +#, fuzzy +msgid "Your comment is about:" +msgstr "您的注释关于" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +#, fuzzy +msgid "Something you like" +msgstr "你喜欢的" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +#, fuzzy +msgid "Something you dislike" +msgstr "你不喜欢的" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +#, fuzzy +msgid "An improper behavior of the application" +msgstr "本程序不切当的表现" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "你希望的新特性" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +#, fuzzy +msgid "Specify an email address to be contacted back:" +msgstr "请输入您希望被联系的email地址" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." +msgstr "" + +#~ msgid "I&mages" +#~ msgstr "图像(&m)" + +#, fuzzy +#~ msgid "Ink message" +#~ msgstr "还没有消息" + +#, fuzzy +#~ msgid "&Do not filter" +#~ msgstr "不启用(&D)" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "当此人上线或下线时通知我(&p)" + +#, fuzzy +#~ msgid "File format used for saving:" +#~ msgstr "用于保存的文件格式" + +#~ msgid "Custom emoticons for this account:" +#~ msgstr "这个帐号的自定义表情:" + +#, fuzzy +#~ msgid "Ignore this &Emoticon" +#~ msgstr "添加这个表情(&E)…" + +#~ msgid "Ed&it Notes" +#~ msgstr "编辑备注(&i)" + +#, fuzzy +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "显示头像" + +#~ msgid "Search for C&ontact" +#~ msgstr "搜索联系人(&o)" + +#~ msgid "Search by &Interest" +#~ msgstr "按兴趣搜索(&I)" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "您的电子邮件地址:" + +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "联系人启动了一项 KMess 不支持的 MSN6 功能。" + +#~ msgid "" +#~ "The transfer failed. The contact sent bad data, or KMess doesn't support " +#~ "it." +#~ msgstr "文件传送失败。联系人发送了损坏的数据,或者KMess不支持。" + +#~ 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: 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 "" +#~ "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 "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" + +#~ msgid "Picture:" +#~ msgstr "图片:" + +#, fuzzy +#~ msgid "Speed:" +#~ msgstr "服务器:" + +#~ msgid "" +#~ "Allows you to choose which e-mail program KMess should open to view e-" +#~ "mail messages." +#~ msgstr "允许你选择 KMess 使用哪一个 e-mail 软件来查看 e-mail 消息。" + +#~ msgid "Use a specified command:" +#~ msgstr "使用指定的命令:" + +#~ msgid "This account does not have an Hotmail inbox!" +#~ msgstr "这个帐户没有Hotmail收件箱!" + +#, fuzzy +#~ msgid "Email: " +#~ msgstr "电子邮件" + +#~ msgid "Remove group" +#~ msgstr "删除组(&m)" + +#~ msgid "Show &Display Pictures" +#~ msgstr "显示头像(&D)" + +#~ msgid "You have 1 new e-mail in your inbox." +#~ msgstr "您的收件箱中有1封新邮件。" + +#~ msgid "You have %1 new emails in your inbox." +#~ msgstr "您的收件箱中有%1封新邮件。" + +#~ msgid "The transfer of %1 failed. Couldn't open file" +#~ msgstr "文件传送失败,无法打开文件%1。" + +#~ msgid "" +#~ "_: NAME OF TRANSLATORS\n" +#~ "Your names" +#~ msgstr "林昊翔, 刘思壮" + +#~ msgid "" +#~ "_: EMAIL OF TRANSLATORS\n" +#~ "Your emails" +#~ msgstr "linhaoxiang@hotmail.com, chinatslsz@hotmail.com" + +#~ 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 "此e-mail地址无效!" + +#~ msgid "Current name: " +#~ msgstr "当前姓名:" + +#~ msgid "" +#~ 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 "" +#~ "KMess could not connect to the MSN Messenger service.\n" +#~ "Please, be sure to be connected to the internet.\n" +#~ "System error: %1 (code %2)." +#~ 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 "警告:服务器1分钟后因维护而关闭!" + +#~ msgid "The contact is listening to music" +#~ msgstr "这个联系人在听音乐" + +#~ msgid "Add contact" +#~ msgstr "添加联系人" + +#~ msgid "Your friendly name:" +#~ msgstr "您的昵称:" + +#~ msgid "Your password:" +#~ msgstr "您的密码:" + +#~ msgid "Status to set at login:" +#~ msgstr "登录时的状态:" + +#~ msgid "Show notifications when you recei&ve an email" +#~ msgstr "当接到电子邮件时通知我" + +#~ msgid "Organize chat folders by:" +#~ msgstr "按日期在不同子目录中保存聊天记录:" + +#~ msgid "&Show graphics in chat messages" +#~ msgstr "在聊天信息中显示图片(&S)" + +#~ msgid "Use Hotmail" +#~ msgstr "使用Hotmail" + +#~ msgid "Email Notification" +#~ msgstr "邮件通知" + +#~ msgid "says:" +#~ msgstr "说:" #~ msgid "The current status of your contact." #~ msgstr "联系人当前状态" + #~ msgid "File transfer dialog message" #~ msgstr "文件传送消息" + #~ msgid "The file transfer invitation was cancelled. Bad data was received." #~ msgstr "文件传送邀请被取消。接收的数据已损坏。" + #~ msgid "..." #~ msgstr "..." + #~ 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 "端口:" -#~ msgid "Type:" -#~ msgstr "类型:" + #~ msgid "User ID:" #~ msgstr "用户名:" + #~ msgid "HTTP Proxy" #~ msgstr "HTTP 代理" + #~ msgid "SOCKS4 Proxy" #~ msgstr "SOCKS4 代理" + #~ msgid "SOCKS5 Proxy" #~ msgstr "SOCKS5 代理" -#~ msgid "Password:" -#~ msgstr "密码:" -#~ msgid "Server:" -#~ msgstr "服务器:" + #~ msgid "Add this emoticon" -#~ msgstr "添加这个图释" +#~ msgstr "添加这个表情" + #~ msgid "" #~ "Continue closing the chat window?\n" #~ "Active transfers will be aborted!" #~ msgstr "" #~ "关闭这个聊天窗口吗?\n" #~ "正在进行的文件传送将被中止!" + #~ msgid "Norsk Bokmal translation" #~ msgstr "挪威语翻译" - diff --git a/po/zh_TW.po b/po/zh_TW.po index c34ca19..e510da9 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -4,2939 +4,6091 @@ # Yen-chou Chen , 2005. # Milton , 2006. # Yenchou Chen , 2007. +# Frank Weng (a.k.a. Franklin) , 2009. msgid "" msgstr "" "Project-Id-Version: zh_TW\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-12 22:13+0100\n" -"PO-Revision-Date: 2008-02-06 18:57+0800\n" -"Last-Translator: Yenchou Chen\n" -"Language-Team: \n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-04-21 00:17+0200\n" +"PO-Revision-Date: 2009-04-24 15:32+0800\n" +"Last-Translator: Frank Weng (a.k.a. Franklin) \n" +"Language-Team: Chinese Traditional \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" +"X-Generator: Lokalize 0.3\n" -#: _translatorinfo.cpp:1 main.cpp:147 -msgid "" -"_: NAME OF TRANSLATORS\n" -"Your names" -msgstr "" -"%1_:譯者姓名\n" -"你的大名" +#: account.cpp:45 +msgid "I am away from my computer" +msgstr "我不在電腦前" -#: _translatorinfo.cpp:3 main.cpp:147 -msgid "" -"_: EMAIL OF TRANSLATORS\n" -"Your emails" -msgstr "" -"_:譯者的電子郵件\n" -"你的電子郵件" - -#: account.cpp:41 account.cpp:716 -msgid "I'm away from my computer" -msgstr "我正離開電腦" - -#: account.cpp:57 +#: account.cpp:54 msgid "Your name" -msgstr "你的名稱" +msgstr "您的名稱" -#: account.cpp:60 kmess.cpp:334 +#: account.cpp:57 settings/accountpage.cpp:209 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" -msgstr "你的.Net Passport" +msgstr "you@hotmail.com" -#: autologinview.cpp:65 -msgid "Logging in..." -msgstr "登入中..." +#: account.cpp:744 +msgid "I'm away from my computer" +msgstr "我不在電腦前" -#: chat/chatmaster.cpp:1053 -msgid "%1 is sending a wink: %2" +#: accountsmanager.cpp:559 +#, kde-format +msgid "" +"Some insecurely stored account passwords have been found.
Do you " +"want to import the passwords to the KDE Wallet named '%1', keep the " +"insecurely stored passwords, or delete them permanently?

Note: " +"it is not recommended to keep insecurely stored 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:567 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "安全密碼儲存" + +#: accountsmanager.cpp:569 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "匯入" + +#: accountsmanager.cpp:572 +msgctxt "Dialog button: Delete insecurely stored passwords" +msgid "Delete" +msgstr "刪除" + +#: accountsmanager.cpp:575 +msgctxt "Dialog button: Keep insecurely stored passwords" +msgid "Keep" +msgstr "保持" + +#: chat/chat.cpp:112 +msgctxt "Error dialog box text" +msgid "" +"You cannot send invitations when there are multiple contacts in a chat. " +"Please start a separate chat with the contact you wanted to send the " +"invitation to." +msgstr "" +"當聊天室裡有多個聯絡人時,您不能傳送邀請。請分別開啟與接收者的聊天視窗,並重" +"新傳送您的邀請。" + +#: chat/chat.cpp:138 +#, kde-format +msgid "%1 has joined the chat." +msgstr "%1 已加入聊天室。" + +#: chat/chat.cpp:191 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left it." +msgstr "對話已閒置,%1 已離開交談。" + +#: chat/chat.cpp:197 +#, kde-format +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 已離開交談。" + +#: chat/chat.cpp:359 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 與 %2" + +#: chat/chat.cpp:367 +#, kde-format +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 等人" + +#: chat/chat.cpp:663 +#, kde-format +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1(此訊息為自動回覆之訊息)" + +#: chat/chat.cpp:829 +#, kde-format +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, "%1", does not exist." +msgstr "KMess 無法儲存此聊天紀錄。
因為聊天紀錄目錄 %1 不存在。" + +#: chat/chat.cpp:949 +msgctxt "Message shown in the chat window (when the wink name is unknown)" +msgid "You have sent a wink!" +msgstr "您送出了動畫快遞。" + +#: chat/chat.cpp:954 +#, kde-format +msgctxt "Message shown in the chat window, %1 is the wink name" +msgid "You have sent the "%1" wink!" +msgstr "您送出了動畫快遞 %1。" + +#: chat/chat.cpp:987 +msgid "" +"The chat has been disabled because you are no longer connected to the Live " +"Messenger server." +msgstr "此聊天室已關閉,因為您目前並未連線到 Live Messenger 伺服器。" + +#: chat/chat.cpp:1144 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "發生了連線問題。" + +#: chat/chat.cpp:1154 +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:1167 +#, kde-format +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." +msgstr "" +"%1 送給您一段錄音,但是 KMess 目前無法支援語音功能,所以您無法聽取。" + +#: chat/chat.cpp:1181 +#, kde-format +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:1196 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a Live Messenger feature that KMess does not support " +"yet." +msgstr "%1 送給您一個 MSN 的特殊功能,但 KMess 尚未支援。" + +#: chat/chat.cpp:1222 +#, kde-format +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. " +"You can re-enable it in the account " +"settings." +msgstr "" +"您收到 %1 傳送來的動畫快遞,但是帳號的選項中關閉了動畫快遞的顯示功能。您可以" +"在帳號設定中開啟。" + +#: chat/chat.cpp:1232, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but displaying winks has " +"been disabled. You can re-enable it in the account settings." +msgstr "" +"您收到 %1 傳送來的動畫快遞,但是帳號的選項中關閉了動畫快遞的顯示功能。您可以" +"在帳號設定中開啟。" + +#: chat/chat.cpp:1262, kde-format +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "%1 has sent you a wink!" +msgstr "%1 傳送了一個動畫快遞給您!" + +#: chat/chat.cpp:1269, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "%1 has sent you a wink: "%2"!" +msgstr "%1 傳送了一個動畫快遞:%2 給您!" + +#: chat/chat.cpp:1291, kde-format +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." +msgstr "您已從 %1 接收到動畫快遞,但無法顯示。請確定您已安裝 cabextract。" + +#: chat/chat.cpp:1300, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Make sure you have the "cabextract" program installed." +msgstr "您已從 %1 接收到動畫快遞:%2,但無法顯示。請確定您已安裝 cabextract。" + +#: chat/chat.cpp:1312, kde-format +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. Extracting " +"the wink package with "cabextract" has failed." +msgstr "您從 %1 收到動畫快遞,但無法顯示。以 cabextract 解開動畫快遞時發生錯誤。" + +#: chat/chat.cpp:1321, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. Extracting the wink package with "cabextract" has " +"failed." +msgstr "您從 %1 收到動畫快遞:%2,但無法顯示。以 cabextract 解開動畫快遞時發生錯誤。" + +#: chat/chat.cpp:1333, kde-format +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:1342, kde-format +msgctxt "" +"Message shown in the chat window, %1 is the contact's friendly name, %2 is " +"the wink name" +msgid "" +"You received the "%2" wink from %1, but it could not be " +"displayed. The data could not be read." +msgstr "您收到 %1 送來的動畫快遞:%2,但無法顯示。資料無法讀取。" + +#: chat/chat.cpp:1384, kde-format +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she logs in." +msgstr "%1 已離線。任何新送的訊息都會在下次他們登入時傳送。" + +#: chat/chat.cpp:1389 +#, kde-format +msgid "%1 has gone offline." +msgstr "%1 已離線。" + +#: chat/chat.cpp:1399, kde-format +msgid "%1 has changed his or her status to "%2"" +msgstr "%1 的狀態已變更為 %2。" + +#: chat/chat.cpp:1430 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1 傳送了一個來電振動給您。" + +#: chat/chat.cpp:1463 +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:1476 +#, kde-format +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:1481, kde-format +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:1491, kde-format +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the handwritten message to %1." +msgstr "傳送手寫訊息給 %1 時失敗。" + +#: chat/chat.cpp:1506 +#, kde-format +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 "傳送訊息給 %2 時失敗:
%1" + +#: chat/chat.cpp:1589, kde-format +msgid "" +"The file "%1" could not be found on your computer, and the " +"download failed." +msgstr "在電腦中找不到檔案 '%1',下載也失敗。" + +#: chat/chat.cpp:1626, kde-format +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You have sent a nudge to %1!" +msgstr "您傳送了來電振動給 %1!" + +#: chat/chat.cpp:1632 +msgid "You have sent a nudge!" +msgstr "您傳送了一個來電振動。" + +#: chat/chat.cpp:1698, kde-format +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she logs in." +msgstr "%1 目前離線中。任何您送的訊息都會在下次他們登入時傳送。" + +#: chat/chatmaster.cpp:1372, kde-format +msgid "%1 is sending a wink: "%2"" msgstr "%1 正傳送一個動畫快遞: %2" -#: chat/chatmessagestyle.cpp:296 +#: chat/chatmessagestyle.cpp:382 +#, kde-format msgid "%1 says:" msgstr "%1 說:" -#: chat/chatmessagestyle.cpp:997 chat/chatmessageview.cpp:425 +#: chat/chatmessageview.cpp:322 +#, kde-format +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:366 +#, kde-format +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:406 +#, kde-format +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:1065 utils/richtextparser.cpp:653 +#, kde-format msgid "Add this emoticon: %1" msgstr "加入這個表情符號:%1" -#: chat/chatview.cpp:463 -msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." -msgstr "無法儲存聊天紀錄。請確認儲存紀錄的資料夾你有寫入的權限。" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "重新連線" -#: chat/chatview.cpp:694 network/applications/filetransfer.cpp:187 -#: network/applications/filetransferp2p.cpp:323 +#: chat/chatview.cpp:300 +#, kde-format +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 "" +"無法將聊天紀錄儲存在目錄 %1。\n" +"請確定您有寫入儲存紀錄的資料夾的權限。" + +#: chat/chatview.cpp:439 +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:458 +#, kde-format 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:695 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "覆寫檔案" -#: chat/chatview.cpp:696 network/applications/filetransfer.cpp:188 -#: network/applications/filetransferp2p.cpp:324 +#: chat/chatview.cpp:460 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "複寫(&w)" +msgstr "覆寫(&W)" -#: chat/chatview.cpp:919 +#: chat/chatview.cpp:825 msgid "Add this &Emoticon..." -msgstr "加入這個表情符號(&E)" +msgstr "加入這個表情符號(&E)..." -#: chat/chatview.cpp:924 +#: chat/chatview.cpp:828 +msgid "Hide this &Emoticon" +msgstr "隱藏這個表情符號(&E)" + +#: chat/chatview.cpp:834 msgid "Send &Email" msgstr "傳送電子郵件(&E)" -#: chat/chatview.cpp:926 -msgid "Copy E&mail" -msgstr "複製Email(&m)" +#: chat/chatview.cpp:838 +msgid "Add &Contact" +msgstr "新增聯絡人(&C)" -#: chat/chatview.cpp:931 +#: chat/chatview.cpp:842 +msgid "Copy E&mail Address" +msgstr "複製電子郵件位址(&m)" + +#: chat/chatview.cpp:848 msgid "Visit &Link" msgstr "造訪連結(&L)" -#: chat/chatview.cpp:933 +#: chat/chatview.cpp:852 msgid "Copy &Address" msgstr "複製地址(&A)" -#: chat/chatview.cpp:946 -msgid "&Copy text" +#: chat/chatview.cpp:868 +msgid "&Copy Text" msgstr "複製文字(&C)" -#: chat/chatview.cpp:947 +#: chat/chatview.cpp:869 msgid "Select &All" msgstr "全選(&A)" -#: chat/chatview.cpp:948 -msgid "Save chat to &File" -msgstr "儲存交談成檔案(&F)" +#: chat/chatview.cpp:870 +msgid "Find &Text..." +msgstr "尋找文字(&T)..." -#: chat/chatwindow.cpp:98 chat/chatwindow.cpp:570 -msgid "Chat" -msgstr "交談" +#: chat/chatview.cpp:871 chat/chatwindow.cpp:536 +msgid "C&lear Chat" +msgstr "清除聊天紀錄(&L)" -#: chat/chatwindow.cpp:223 -msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "你不能開始這個邀請,因為在這個交談裡有多重的聯絡人" +#: chat/chatview.cpp:872 +msgid "Save Chat to &File..." +msgstr "將聊天內容存到檔案(&F)..." -#: chat/chatwindow.cpp:260 -msgid "%1 has joined the chat." -msgstr "%1 已加入交談" - -#: chat/chatwindow.cpp:311 -msgid "The conversation went idle, %1 has left the chat." -msgstr "交談闲置太久。%1 已離開交談" - -#: chat/chatwindow.cpp:315 -msgid "%1 has left the chat." -msgstr "%1 已離開交談" - -#: chat/chatwindow.cpp:575 -msgid "%1 - Chat" -msgstr "%1 - 交談" - -#: chat/chatwindow.cpp:581 -msgid "%1 and %2 - Chat" -msgstr "%1 和 %2 - 交談" - -#: chat/chatwindow.cpp:588 -msgid "%1 et al. - Chat" -msgstr "%1 ...等 - 交談" - -#: chat/chatwindow.cpp:737 +#: chat/chatwindow.cpp:115 msgid "Contacts" msgstr "聯絡人" -#: chat/chatwindow.cpp:798 settings/settingsdialog.cpp:95 +#: chat/chatwindow.cpp:121 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "表情符號" -#: chat/chatwindow.cpp:799 -msgid "My emoticons" +#: chat/chatwindow.cpp:128 +msgid "My Emoticons" msgstr "我的表情符號" -#: chat/chatwindow.cpp:1165 -msgid " (This message was sent automatically)" -msgstr " (這個訊息將會被自動傳送)" - -#: chat/chatwindow.cpp:1493 +#: chat/chatwindow.cpp:337 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "動畫快遞不能顯示。請確認你有安裝 'cabextract' 套件。" +"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:1502 -msgid "The wink could not be displayed. The data could not be read." -msgstr "動畫快遞不能顯示。資料無法讀取。" +#: chat/chatwindow.cpp:340 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "關閉聊天分頁" -#: chat/chatwindow.cpp:1603 -msgid "You have received a wink from %1" -msgstr "你從 %1 收到一個動畫快遞" +#: chat/chatwindow.cpp:341 +msgid "Close All Tabs" +msgstr "關閉所有分頁" -#: chat/chatwindow.cpp:1791 -msgid "The message '%1' could not be sent." -msgstr "訊息 \"%1\" 无法传送" +#: chat/chatwindow.cpp:342 +msgid "Close Current Tab" +msgstr "關閉目前的分頁" -#: chat/chatwindow.cpp:1856 -msgid "You received a nudge from %1!" -msgstr "你從 %1 收到一個來電振動。" +#: chat/chatwindow.cpp:451 +msgid "&Invite..." +msgstr "邀請(&I)..." -#: chat/chatwindow.cpp:1882 -msgid "You've sent a nudge to %1!" -msgstr "你傳送來電振動給 %1" +#: chat/chatwindow.cpp:452 +msgid "Send a &File..." +msgstr "傳送檔案(&F)..." -#: chat/chatwindow.cpp:1888 -msgid "You've sent a nudge!" -msgstr "你傳送了一個來電振動" +#: chat/chatwindow.cpp:453 +msgid "Webcam Chat" +msgstr "網路視訊聊天" -#: chat/chatwindow.cpp:1976 -msgid "%1 is typing." -msgstr "%1 正在輸入" - -#: chat/chatwindow.cpp:1985 -msgid "%1 and %2 are typing." -msgstr "%1 和 %2 正在输入" - -#: chat/chatwindow.cpp:1989 -msgid "%1, %2 and %3 others are typing." -msgstr "%1 %2 和 %3 其他人正在输入" - -#: chat/chatwindowinterface.cpp:173 -msgid "Send a &File" -msgstr "傳送檔案(&F)" - -#: chat/chatwindowinterface.cpp:174 +#: chat/chatwindow.cpp:454 msgid "Start a &Meeting" msgstr "開始會議(&M)" -#: chat/chatwindowinterface.cpp:175 +#: chat/chatwindow.cpp:455 msgid "Send a &Nudge!" msgstr "傳送來電振動(&N)" -#: chat/chatwindowinterface.cpp:177 -msgid "Start or Stop a &Conversation" -msgstr "開始或結束一個對話(&C)" +#: chat/chatwindow.cpp:456 +msgid "Save Chat..." +msgstr "儲存聊天內容..." -#: chat/chatwindowinterface.cpp:182 -msgid "Save chat" -msgstr "儲存交談內容" +#: chat/chatwindow.cpp:457 +msgid "Close &All Tabs" +msgstr "關閉所有分頁(&A)" -#: chat/chatwindowinterface.cpp:186 -msgid "&Invite" -msgstr "邀請(&I)" - -#: chat/chatwindowinterface.cpp:205 -msgid "&Chat" -msgstr "交談(&C)" - -#: chat/chatwindowinterface.cpp:221 +#: chat/chatwindow.cpp:462 msgid "Change &Font" msgstr "改變字型(&F)" -#: chat/chatwindowinterface.cpp:222 +#: chat/chatwindow.cpp:463 msgid "Change Font &Color" msgstr "改變字體顏色(&C)" -#: chat/chatwindowinterface.cpp:301 -msgid "Insert an emoticon" -msgstr "插入表情符號" - -#: chat/chatwindowinterface.cpp:319 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindowinterface.cpp:320 +#: chat/chatwindow.cpp:470 msgid "Show &Emoticons" msgstr "顯示表情符號(&E)" -#: chat/chatwindowinterface.cpp:321 -msgid "Show/Hide &Contact Sidebar" -msgstr "顯示/隱藏 聯絡人狀態列(&C)" +#: chat/chatwindow.cpp:471 +msgid "Show S&tatus Messages" +msgstr "顯示狀態訊息(&T)" -#: chat/chatwindowinterface.cpp:333 -msgid "Show or hide the contact sidebar" -msgstr "顯示或隱藏聯絡人狀態列" +#: chat/chatwindow.cpp:477 +msgid "&Panels" +msgstr "面板(&P)" -#: chat/contactframe.cpp:231 kmessview.cpp:614 -msgid "&Send email" +#: chat/chatwindow.cpp:480 +msgid "Use &Spell Checking" +msgstr "使用拼字檢查(&S)" + +#: chat/chatwindow.cpp:484 +msgid "Meeting" +msgstr "會議" + +#: chat/chatwindow.cpp:485 +msgid "Nudge" +msgstr "來電振動" + +#: chat/chatwindow.cpp:486 +msgid "Send a &File" +msgstr "傳送檔案(&F)" + +#: chat/chatwindow.cpp:489 chat/chatwindow.cpp:490 +msgid "P&revious Tab" +msgstr "前一個分頁(&r)" + +#: chat/chatwindow.cpp:491 chat/chatwindow.cpp:492 +msgid "Ne&xt Tab" +msgstr "下一個分頁(&x)" + +#: chat/chatwindow.cpp:507 +msgid "Enable or disable the contacts panel" +msgstr "開啟或關閉聯絡人面板" + +#: chat/chatwindow.cpp:508 chat/chatwindow.cpp:509 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "聯絡人" + +#: chat/chatwindow.cpp:513 +msgid "Enable or disable the standard emoticons panel" +msgstr "開啟或關閉標準表情符號面板" + +#: chat/chatwindow.cpp:514 chat/chatwindow.cpp:515 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "表情符號" + +#: chat/chatwindow.cpp:519 +msgid "Enable or disable the custom emoticons panel" +msgstr "開啟或關閉自定表情符號面板" + +#: chat/chatwindow.cpp:520 chat/chatwindow.cpp:521 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "我的表情符號" + +#: chat/chatwindow.cpp:533 +msgid "&Font" +msgstr "字型(&F)" + +#: chat/chatwindow.cpp:534 +msgid "Font &Color" +msgstr "字型顏色(&C)" + +#: chat/chatwindow.cpp:535 +msgid "C&lear Chat Window" +msgstr "清除聊天視窗(&L)" + +#: chat/chatwindow.cpp:603 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "開始或結束一段對話(&C)" + +#: chat/chatwindow.cpp:1026 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
You can also use shortcuts like /online or /phone." +msgstr "" +"您的 /status 指令用了不正確的語法。正確的語法為:/status online|" +"away|idle|brb|busy|lunch|phone|invisible
您也可以直接使用 /" +"online/phone 等。" + +#: chat/chatwindow.cpp:1029 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status Syntax" +msgstr "不正確的 /status 語法" + +#: chat/chatwindow.cpp:1092 +msgid "You cannot use the /block command in a group chat." +msgstr "您不能在群組對話中使用 /block 指令。" + +#: chat/chatwindow.cpp:1094 +msgctxt "Caption when trying to block someone in a group chat" +msgid "Cannot use /block command" +msgstr "無法使用 /block 指令" + +#: chat/chatwindow.cpp:1105 +msgid "You cannot use the /unblock command in a group chat." +msgstr "您不能在群組對話中使用 /unblock 指令。" + +#: chat/chatwindow.cpp:1107 +msgctxt "Caption when trying to unblock someone in a group chat" +msgid "Cannot use /unblock command!" +msgstr "無法使用 /unblock 指令" + +#: chat/chatwindow.cpp:1137 +#, kde-format +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:1140 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "未知的指令" + +#: chat/chatwindow.cpp:1606 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "聊天" + +#: chat/chatwindow.cpp:1610 +#, kde-format +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 ─ 聊天" + +#: chat/chatwindow.cpp:1630 kmessinterface.cpp:674 +#, kde-format +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:1634 kmessinterface.cpp:678 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "隱藏選單" + +#: chat/chatwindow.cpp:1887 +#, kde-format +msgid "%1 is typing..." +msgstr "%1 正在輸入..." + +#: chat/chatwindow.cpp:1897 +#, kde-format +msgid "%1 and %2 are typing..." +msgstr "%1 與 %2 正在輸入..." + +#: chat/chatwindow.cpp:1901 +#, kde-format +msgid "%1, %2 and %3 others are typing..." +msgstr "%1,%2 和其他 %3 個人正在輸入..." + +#: chat/chatwindow.cpp:2063 +#, kde-format +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"It is currently not possible to send a handwritten message to %1, due " +"to an incompatibility with Windows Live Messenger 8.5." +msgstr "目前無法傳送手寫訊息給 %1,因為對方使用不相容的 Windows Live Messenger 8.5。" + +#: chat/chatwindow.cpp:2376 +#, kde-format +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:297 +msgid "&Start Private Chat" +msgstr "開始私密聊天(&S)" + +#: chat/contactframe.cpp:298 kmessview.cpp:600 +msgid "&Send Email" msgstr "傳送電子郵件(&S)" -#: chat/contactframe.cpp:232 kmessview.cpp:615 +#: chat/contactframe.cpp:299 kmessview.cpp:601 msgid "&View Profile" msgstr "檢視帳號(&V)" -#: chat/contactframe.cpp:234 kmessview.cpp:618 -msgid "&Add Contact" -msgstr "新增聯絡人(&A)" - -#: chat/contactframe.cpp:235 kmessview.cpp:619 -msgid "A&llow Contact" -msgstr "允許此聯絡人(&l)" - -#: chat/contactframe.cpp:236 kmessview.cpp:622 -msgid "&Delete Contact" -msgstr "刪除此聯絡人(&D)" - -#: chat/contactframe.cpp:238 kmessview.cpp:620 -msgid "&Block Contact" -msgstr "封鎖此聯絡人(&B)" - -#: chat/contactframe.cpp:239 kmessview.cpp:621 -msgid "&Unblock Contact" -msgstr "解除此聯絡人的封鎖(&U)" - -#: chat/contactframe.cpp:241 -msgid "&Friendly Name" -msgstr "昵稱" - -#: chat/contactframe.cpp:242 -msgid "&Personal Message" -msgstr "個人訊息(&P)" - -#: chat/contactframe.cpp:243 -msgid "&Email Address" -msgstr "電子郵件位址(&E)" - -#: chat/contactframe.cpp:263 -msgid "&Copy..." -msgstr "複製...(&C)" - -#: chat/contactframe.cpp:513 contactlistviewitem.cpp:323 -msgid "Blocked" -msgstr "被封鎖" - -#: chat/contactframe.cpp:518 contactlistviewitem.cpp:329 initialview.cpp:76 -#: initialview.cpp:173 kmess.cpp:452 kmessinterface.cpp:192 -#: settings/accountswidget.cpp:93 settings/accountswidget.cpp:313 -#: systemtraywidget.cpp:224 -msgid "Away" -msgstr "離開" - -#: chat/contactframe.cpp:523 contactlistviewitem.cpp:335 initialview.cpp:77 -#: initialview.cpp:177 kmess.cpp:478 kmessinterface.cpp:195 -#: settings/accountswidget.cpp:94 settings/accountswidget.cpp:317 -#: systemtraywidget.cpp:229 -msgid "Be Right Back" -msgstr "馬上回來" - -#: chat/contactframe.cpp:528 contactlistviewitem.cpp:341 initialview.cpp:78 -#: initialview.cpp:181 kmess.cpp:482 kmessinterface.cpp:196 -#: settings/accountswidget.cpp:95 settings/accountswidget.cpp:321 -#: systemtraywidget.cpp:234 -msgid "Busy" -msgstr "忙啦" - -#: chat/contactframe.cpp:533 network/msnnotificationconnection.cpp:74 -#: systemtraywidget.cpp:239 -msgid "Offline" -msgstr "離線" - -#: chat/contactframe.cpp:538 contactlistviewitem.cpp:359 -msgid "Away - Idle" -msgstr "離開-發呆" - -#: chat/contactframe.cpp:543 contactlistviewitem.cpp:365 initialview.cpp:79 -#: initialview.cpp:189 kmess.cpp:490 kmessinterface.cpp:197 -#: settings/accountswidget.cpp:96 settings/accountswidget.cpp:329 -#: systemtraywidget.cpp:254 -msgid "Out to Lunch" -msgstr "外出午餐" - -#: chat/contactframe.cpp:548 initialview.cpp:75 kmess.cpp:494 -#: kmessinterface.cpp:191 network/msnnotificationconnection.cpp:73 -#: settings/accountswidget.cpp:92 systemtraywidget.cpp:259 -msgid "Online" -msgstr "上線" - -#: chat/contactframe.cpp:553 contactlistviewitem.cpp:377 initialview.cpp:80 -#: initialview.cpp:193 kmess.cpp:498 kmessinterface.cpp:198 -#: settings/accountswidget.cpp:97 settings/accountswidget.cpp:333 -#: systemtraywidget.cpp:264 -msgid "On the Phone" -msgstr "請等等...電話中" - -#: chat/contactframe.cpp:558 -#, fuzzy -msgid "The contact is %1" -msgstr "此聯絡人未上線" - -#: chat/xsltransformation.cpp:364 -msgid "chat-style-text" -msgstr "交談形式文字" - -#: contactlistviewitem.cpp:214 -msgid "Client: %1" -msgstr "" - -#: contactlistviewitem.cpp:347 initialview.cpp:81 initialview.cpp:185 -#: kmess.cpp:486 kmessinterface.cpp:199 settings/accountswidget.cpp:98 -#: settings/accountswidget.cpp:325 systemtraywidget.cpp:244 -msgid "Invisible" -msgstr "隱形" - -#: currentaccount.cpp:339 -msgid "This account does not have an Hotmail inbox!" -msgstr "這個帳號並沒有 Hotmail" - -#: dialogs/addcontactdialog.cpp:30 kmess.cpp:244 kmess.cpp:248 -msgid "Add a contact" -msgstr "新增一個聯絡人" - -#: dialogs/addcontactdialog.cpp:39 kmess.cpp:245 kmess.cpp:249 -msgid "Enter the email address of the person you wish to add:" -msgstr "請輸入欲加入聯絡人的電子郵件:" - -#: dialogs/addcontactdialog.cpp:88 -msgid "The e-mail address given was invalid!" -msgstr "此電子郵件無效" - -#: dialogs/addemoticondialog.cpp:54 dialogs/addemoticondialog.cpp:220 -#: settings/emoticonwidget.cpp:119 -msgid "Add New Emoticon" -msgstr "加入新的表情符號" - -#: dialogs/addemoticondialog.cpp:219 settings/emoticonwidget.cpp:117 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "表情 \"%1\" 已經存在,你想要取代它嗎?" - -#: dialogs/awaymessagedialog.cpp:28 -msgid "Specify an Away message" -msgstr "指定一個離開訊息" - -#: dialogs/awaymessagedialog.cpp:37 -msgid "" -"Enter the message that will automatically be\n" -"sent to people who try to message you:" -msgstr "" -"輸入一個訊息,\n" -"讓嘗試傳訊息給你的人會被自動回覆:" - -#: dialogs/contactpropertiesdialog.cpp:67 -msgid "Use an alternative name for this person" -msgstr "對此人使用替代名稱" - -#: dialogs/contactpropertiesdialog.cpp:75 -msgid "Show a popup balloon when this person goes online or offline" -msgstr "當使用者上線或離線時,跳出氣球提示" - -#: dialogs/contactpropertiesdialog.cpp:82 -msgid "Picture:" -msgstr "圖片:" - -#: dialogs/contactpropertiesdialog.cpp:93 -msgid "Sound:" -msgstr "音效:" - -#: dialogs/contactpropertiesdialog.cpp:229 -msgid "Contact Properties for %1" -msgstr "%1 的聯絡人特性" - -#: dialogs/contactpropertiesdialog.cpp:261 -msgid "Email address: " -msgstr "電子郵件:" - -#: dialogs/contactpropertiesdialog.cpp:262 -msgid "Current name: " -msgstr "目前的名稱" - -#: dialogs/networkwindow.cpp:50 -msgid "Network Window" -msgstr "網絡視窗" - -#: dialogs/networkwindow.cpp:54 -msgid "Save tab" -msgstr "儲存標籤" - -#: dialogs/networkwindow.cpp:55 -msgid "Clear tab" -msgstr "清除標籤" - -#: dialogs/networkwindow.cpp:56 -msgid "Close tab" -msgstr "關閉標籤" - -#: dialogs/networkwindow.cpp:882 -msgid "No connections are present. Cannot open the Network Window." -msgstr "沒有任何連接呈現。無法開啟網路視窗。" - -#: dialogs/networkwindow.cpp:928 -msgid "" -"Could not save the Network Window log. Make sure you have permission to " -"write for folder where the log is being saved." -msgstr "無法儲存網路視窗紀錄。請確認儲存紀錄的資料夾你有權限寫入。" - -#: dialogs/networkwindow.cpp:953 -msgid "Cannot close the main connection tab." -msgstr "無法關閉主連結標籤" - -#: dialogs/transferentry.cpp:120 network/applications/filetransfer.cpp:515 -#: network/applications/filetransferp2p.cpp:97 -#: network/applications/filetransferp2p.cpp:729 -#: network/extra/msnftpconnection.cpp:123 -msgid "Cancelled" -msgstr "取消" - -#: dialogs/transferentry.cpp:160 -msgid "Failed!" -msgstr "失敗!" - -#: dialogs/transferentry.cpp:202 -msgid "Completed" -msgstr "完成" - -#: dialogs/transferentry.cpp:246 network/applications/filetransfer.cpp:492 -#: network/applications/filetransferp2p.cpp:704 -msgid "%1 MB" -msgstr "%1 MB" - -#: dialogs/transferentry.cpp:251 network/applications/filetransfer.cpp:497 -#: network/applications/filetransferp2p.cpp:709 -msgid "%1 kB" -msgstr "%1 kB" - -#: dialogs/transferentry.cpp:255 network/applications/filetransfer.cpp:501 -#: network/applications/filetransferp2p.cpp:713 -msgid "%1 bytes" -msgstr "%1 bytes" - -#: dialogs/transferentry.cpp:322 -msgid "%1 of %2 received" -msgstr "%2 的 %1 已接收" - -#: dialogs/transferentry.cpp:326 -msgid "%1 of %2 sent" -msgstr "%2 的 %1 已傳送" - -#: dialogs/transferwindow.cpp:74 -msgid "File Transfers" -msgstr "檔案傳輸" - -#: emoticontheme.cpp:542 -msgid "" -"Could not save the emoticon theme. Make sure you have permission to write to " -"the theme folder '%1'." -msgstr "無法儲存表情符號主題。請確認主題資料夾 %1 你有權限寫入。" - -#: emoticontheme.cpp:736 -msgid "Smile" -msgstr "微笑" - -#: emoticontheme.cpp:737 -msgid "Wink" -msgstr "眨眼" - -#: emoticontheme.cpp:738 -msgid "Tongue out" -msgstr "吐舌" - -#: emoticontheme.cpp:739 -msgid "Big smile" -msgstr "大笑" - -#: emoticontheme.cpp:740 -msgid "Sad" -msgstr "傷心" - -#: emoticontheme.cpp:741 -msgid "Crying" -msgstr "哭泣" - -#: emoticontheme.cpp:742 -msgid "Angry" -msgstr "生氣" - -#: emoticontheme.cpp:743 -msgid "Confused" -msgstr "困惑" - -#: emoticontheme.cpp:744 -msgid "Embarrassed" -msgstr "害羞" - -#: emoticontheme.cpp:745 -msgid "Disappointed" -msgstr "失望" - -#: emoticontheme.cpp:746 -msgid "Hot" -msgstr "好熱" - -#: emoticontheme.cpp:747 -msgid "Baring teeth" -msgstr "露牙" - -#: emoticontheme.cpp:748 -msgid "Nerd" -msgstr "厭惡" - -#: emoticontheme.cpp:749 -msgid "Sick" -msgstr "生病" - -#: emoticontheme.cpp:750 -msgid "Surprised" -msgstr "驚喜" - -#: emoticontheme.cpp:751 -msgid "Party" -msgstr "派對" - -#: emoticontheme.cpp:752 -msgid "Sleepy" -msgstr "想睡" - -#: emoticontheme.cpp:753 -msgid "Thinking" -msgstr "思考" - -#: emoticontheme.cpp:754 -msgid "Don't tell anyone" -msgstr "封口" - -#: emoticontheme.cpp:755 -msgid "Secret telling" -msgstr "秘密" - -#: emoticontheme.cpp:756 -msgid "Eye-rolling" -msgstr "轉眼" - -#: emoticontheme.cpp:757 -msgid "Sarcastic" -msgstr "諷刺" - -#: emoticontheme.cpp:758 -msgid "I don't know" -msgstr "不知" - -#: emoticontheme.cpp:759 -msgid "Be right back" -msgstr "速回" - -#: emoticontheme.cpp:760 -msgid "Angel" -msgstr "天使" - -#: emoticontheme.cpp:761 -msgid "Left hug" -msgstr "左擁" - -#: emoticontheme.cpp:762 -msgid "Boy" -msgstr "男孩" - -#: emoticontheme.cpp:763 -msgid "Red heart" -msgstr "紅心" - -#: emoticontheme.cpp:764 -msgid "Red rose" -msgstr "紅玫瑰" - -#: emoticontheme.cpp:765 -msgid "Thumby up" -msgstr "讚啦" - -#: emoticontheme.cpp:766 -msgid "Dog face" -msgstr "汪汪" - -#: emoticontheme.cpp:767 -msgid "Sun" -msgstr "太陽" - -#: emoticontheme.cpp:768 -msgid "Devil" -msgstr "邪惡" - -#: emoticontheme.cpp:769 -msgid "Right hug" -msgstr "右抱" - -#: emoticontheme.cpp:770 -msgid "Girl" -msgstr "女孩" - -#: emoticontheme.cpp:771 -msgid "Broken heart" -msgstr "心碎" - -#: emoticontheme.cpp:772 -msgid "Wilted rose" -msgstr "枯玫瑰" - -#: emoticontheme.cpp:773 -msgid "Thumbs down" -msgstr "遜斃" - -#: emoticontheme.cpp:774 -msgid "Cat face" -msgstr "喵喵" - -#: emoticontheme.cpp:775 -msgid "Sleeping half-moon" -msgstr "月眠" - -#: emoticontheme.cpp:776 -msgid "Red lips" -msgstr "紅唇" - -#: emoticontheme.cpp:777 -msgid "Clapping" -msgstr "鼓掌" - -#: emoticontheme.cpp:778 -msgid "Crossed fingers" -msgstr "指叉" - -#: emoticontheme.cpp:779 -msgid "Auto" -msgstr "自動" - -#: emoticontheme.cpp:780 -msgid "Airplane" -msgstr "飛機" - -#: emoticontheme.cpp:781 -msgid "Turtle" -msgstr "烏龜" - -#: emoticontheme.cpp:782 -msgid "Snail" -msgstr "蝸牛" - -#: emoticontheme.cpp:783 -msgid "Black sheep" -msgstr "害群之馬" - -#: emoticontheme.cpp:784 -msgid "Goat" -msgstr "山羊" - -#: emoticontheme.cpp:785 -msgid "Vampire bat" -msgstr "蝙蝠" - -#: emoticontheme.cpp:786 -msgid "Pizza" -msgstr "比薩" - -#: emoticontheme.cpp:787 -msgid "Beer mug" -msgstr "啤酒杯" - -#: emoticontheme.cpp:788 -msgid "Martini glass" -msgstr "高腳杯" - -#: emoticontheme.cpp:789 -msgid "Coffee cup" -msgstr "咖啡杯" - -#: emoticontheme.cpp:790 -msgid "Birthday cake" -msgstr "蛋糕" - -#: emoticontheme.cpp:791 -msgid "Plate" -msgstr "盤子" - -#: emoticontheme.cpp:792 -msgid "Bowl" -msgstr "碗公" - -#: emoticontheme.cpp:793 -msgid "Star" -msgstr "星星" - -#: emoticontheme.cpp:794 -msgid "Rainbow" -msgstr "彩虹" - -#: emoticontheme.cpp:795 -msgid "Stormy cloud" -msgstr "烏雲" - -#: emoticontheme.cpp:796 -msgid "Lightning" -msgstr "閃電" - -#: emoticontheme.cpp:797 -msgid "Umbrella" -msgstr "雨傘" - -#: emoticontheme.cpp:798 -msgid "Island with a palm tree" -msgstr "棕櫚樹" - -#: emoticontheme.cpp:799 -msgid "Telephone receiver" -msgstr "電話" - -#: emoticontheme.cpp:800 -msgid "Mobile Phone" -msgstr "手機" - -#: emoticontheme.cpp:801 settings/settingsdialog.cpp:98 -msgid "Email" -msgstr "Email" - -#: emoticontheme.cpp:802 -msgid "Clock" -msgstr "時鐘" - -#: emoticontheme.cpp:803 -msgid "Camera" -msgstr "相機" - -#: emoticontheme.cpp:804 -msgid "Filmstrip" -msgstr "膠捲" - -#: emoticontheme.cpp:805 -msgid "Note" -msgstr "音符" - -#: emoticontheme.cpp:806 -msgid "Handcuffs" -msgstr "手銬" - -#: emoticontheme.cpp:807 -msgid "Money" -msgstr "它不是萬能,但沒有它萬萬不能" - -#: emoticontheme.cpp:808 -msgid "Light bulb" -msgstr "燈泡" - -#: emoticontheme.cpp:809 -msgid "Cigarrette" -msgstr "雪茄" - -#: emoticontheme.cpp:810 -msgid "Soccer ball" -msgstr "足球" - -#: emoticontheme.cpp:811 -msgid "Gift with a bow" -msgstr "禮物" - -#: emoticontheme.cpp:812 -msgid "X-Box" -msgstr "X-Box" - -#: emoticontheme.cpp:813 -msgid "Computer" -msgstr "電腦" - -#: emoticontheme.cpp:814 -msgid "KMess Icon" -msgstr "KMess" - -#: kmess.cpp:261 kmess.cpp:346 -msgid "The contact address you have entered is not valid: '%1'" -msgstr "你輸入的連絡位址不合法:%1" - -#: kmess.cpp:288 kmess.cpp:292 -msgid "Add a group" -msgstr "新增一個群組" - -#: kmess.cpp:289 kmess.cpp:293 kmess.cpp:806 kmess.cpp:810 -msgid "Enter the new name for this group:" -msgstr "請輸入此群組的名稱:" - -#: kmess.cpp:456 kmessinterface.cpp:193 -msgid "Away with auto-reply" -msgstr "離開,並自動回覆" - -#: kmess.cpp:473 kmessinterface.cpp:194 systemtraywidget.cpp:249 -msgid "Idle" -msgstr "發呆" - -#: kmess.cpp:715 -msgid "" -"Are you sure you want to remove the contact %1 from your contact " -"list?" -msgstr "你確定要將%1從聯絡人名單中刪除嗎?" - -#: kmess.cpp:718 -msgid "Remove contact" -msgstr "刪除聯絡人" - -#: kmess.cpp:720 -msgid "Remove and block" -msgstr "移除並封鎖" - -#: kmess.cpp:760 -msgid "" -"Are you sure you want to remove the group %1 from your contact " -"list?" -msgstr "你確定要將%1群組從聯絡人清單中刪除嗎?" - -#: kmess.cpp:763 -msgid "Remove group" -msgstr "刪除群組" - -#: kmess.cpp:795 -msgid "This is a special group and can't be changed." -msgstr "這是一個不可變更的特殊群組" - -#: kmess.cpp:805 kmess.cpp:809 -msgid "Rename group" -msgstr "重新命名群組" - -#: kmess.cpp:909 network/msnconnection.cpp:744 -msgid "Connected" -msgstr "已連線" - -#: kmess.cpp:1231 kmessview.cpp:169 -msgid "Disconnected" -msgstr "已斷線" - -#: kmess.cpp:1669 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'eventsrc' 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 "" -"

KMess 將不會播放音效與提示。

KMess 檔案 'eventrc' 無法在下列任何" -"一個資料夾被找到:%1

請確認你的安裝,並複製失去的檔案至以下任何一個資料" -"夾。

" - -#: kmess.cpp:1673 -msgid "Error with notifications" -msgstr "提示錯誤" - -#: kmessinterface.cpp:151 -msgid "New &Account" -msgstr "新增帳號(&A)" - -#: kmessinterface.cpp:152 -msgid "New &Contact" -msgstr "新增聯絡人(&C)" - -#: kmessinterface.cpp:153 -msgid "New &Group" -msgstr "新增群組(&G)" - -#: kmessinterface.cpp:154 -msgid "S&earch for Contact" -msgstr "搜尋聯絡人(&e)" - -#: kmessinterface.cpp:155 -msgid "Search by &Interest" -msgstr "依興趣搜尋(&I)" - -#: kmessinterface.cpp:156 -msgid "Account &Settings" -msgstr "帳號設定(&S)" - -#: kmessinterface.cpp:171 -msgid "&Actions" -msgstr "操作(&A)" - -#: kmessinterface.cpp:187 -msgid "Co&nnect" -msgstr "連線(&n)" - -#: kmessinterface.cpp:188 -msgid "&Disconnect" -msgstr "斷線(&D)" - -#: kmessinterface.cpp:189 -msgid "Show My &Profile" -msgstr "顯示我的帳號(&P)" - -#: kmessinterface.cpp:190 -msgid "&My Status" -msgstr "我的狀態(&M)" - -#: kmessinterface.cpp:220 -msgid "&Connect" -msgstr "連線(&C)" - -#: kmessinterface.cpp:275 -msgid "Show &Allowed Contacts" -msgstr "顯示所有被允許的聯絡人(&A)" - -#: kmessinterface.cpp:276 -msgid "Show &Offline Contacts" -msgstr "顯示離線的聯絡人(&O)" - -#: kmessinterface.cpp:277 -msgid "Show &Removed Contacts" -msgstr "顯示被刪除的聯絡人(&R)" - -#: kmessinterface.cpp:278 -#, fuzzy -msgid "Show &Display Pictures" -msgstr "顯示圖片" - -#: kmessinterface.cpp:281 -msgid "Show &Network Window" -msgstr "顯示網絡視窗(&N)" - -#: kmessinterface.cpp:285 -msgid "&Sort Contacts by" -msgstr "以聯絡人的狀態排列(&S)" - -#: kmessinterface.cpp:286 kmessview.cpp:1190 -msgid "Group" -msgstr "群組" - -#: kmessinterface.cpp:286 -msgid "Online/Offline" -msgstr "上線/離線" - -#: kmessinterface.cpp:290 -msgid "Show &Transfer Window" -msgstr "顯示檔案傳輸視窗(&T)" - -#: kmessview.cpp:113 -msgid "Now listening to %1" -msgstr "正在聽 %1" - -#. i18n: file ./kmessviewinterface.ui line 131 -#: kmessview.cpp:151 kmessview.cpp:1570 kmessview.cpp:1588 rc.cpp:120 -#, no-c-format -msgid "" -msgstr "<在此輸入你的個人訊息>" - -#: kmessview.cpp:613 -msgid "Cha&t" -msgstr "交談(&t)" - -#: kmessview.cpp:616 +#: chat/contactframe.cpp:301 chat/contactframe.cpp:354 kmessview.cpp:603 msgid "&Properties" msgstr "特性(&P)" -#: kmessview.cpp:623 -msgid "&Remove from group" +#: chat/contactframe.cpp:303 kmessview.cpp:605 +msgid "&Add Contact" +msgstr "新增聯絡人(&A)" + +#: chat/contactframe.cpp:304 kmessview.cpp:606 +msgid "A&llow Contact" +msgstr "允許此聯絡人(&l)" + +#: chat/contactframe.cpp:305 kmessview.cpp:609 +msgid "&Delete Contact" +msgstr "刪除此聯絡人(&D)" + +#: chat/contactframe.cpp:307 kmessview.cpp:607 +msgid "&Block Contact" +msgstr "封鎖此聯絡人(&B)" + +#: chat/contactframe.cpp:308 kmessview.cpp:608 +msgid "&Unblock Contact" +msgstr "解除此聯絡人的封鎖(&U)" + +#: chat/contactframe.cpp:310 kmessview.cpp:612 +msgid "&Friendly Name" +msgstr "暱稱(&F)" + +#: chat/contactframe.cpp:311 kmessview.cpp:613 +msgid "&Personal Message" +msgstr "個人訊息(&P)" + +#: chat/contactframe.cpp:312 kmessview.cpp:614 +msgid "&Email Address" +msgstr "電子郵件位址(&E)" + +#: chat/contactframe.cpp:313 kmessview.cpp:615 +msgid "Song &Name" +msgstr "歌曲名稱(&N)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: chat/contactframe.cpp:315 rc.cpp:126 +msgid "&Information" +msgstr "資訊(&I)" + +#: chat/contactframe.cpp:316 +msgid "Display Pictures" +msgstr "顯示圖片" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:342 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: chat/contactframe.cpp:317 rc.cpp:159 +msgid "&Notes" +msgstr "備忘(&N)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:352 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: chat/contactframe.cpp:318 rc.cpp:162 +msgid "&Emoticons" +msgstr "表情符號(&E)" + +#: chat/contactframe.cpp:347 kmessview.cpp:650 +msgid "&Copy" +msgstr "複製(&C)" + +#: chat/contactframe.cpp:753 +msgid "Blocked" +msgstr "被封鎖" + +#: chat/contactframe.cpp:765, kde-format +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " +"like 'Online'" +msgid "The contact is %1" +msgstr "此聯絡人的狀態為%1" + +#: chat/emoticonswidget.cpp:289 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You have not added any custom emoticons yet.

To add " +"new emoticons, click here!

" +msgstr "" +"

您尚未加入任何自訂的表情符號。

要新增表情符號,請點選這裡

" + +#: chat/emoticonswidget.cpp:451 +msgid "Add to Chat" +msgstr "新增到聊天室" + +#: chat/emoticonswidget.cpp:452 +msgid "Add New" +msgstr "新增" + +#: chat/emoticonswidget.cpp:453 +msgid "Edit" +msgstr "編輯" + +#: chat/emoticonswidget.cpp:454 kmess.cpp:579 +msgid "Remove" +msgstr "移除" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You do not have any winks yet.

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

" +msgstr "

您尚未加入任何動畫快遞。

要新增動畫快遞,請您的聯絡人送一些給您!

" + +#: contact/contactbase.cpp:290 +msgid "Windows Mobile" +msgstr "Windows 車用" + +#: contact/contactbase.cpp:294 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:298 +msgid "Office Communicator" +msgstr "辦公室通訊" + +#: contact/contactbase.cpp:302 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:306 +msgid "Windows Media Center" +msgstr "Windows 媒體中心" + +#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#, kde-format +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 相容" + +#: contact/contactbase.cpp:335 +#, kde-format +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:340 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:347 +#, kde-format +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 相容" + +#: contact/contactbase.cpp:353 +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger 相容" + +#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 +#: model/contactlist.cpp:1824 settings/accountpage.cpp:98 +msgid "Online" +msgstr "上線" + +#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "忙啦" + +#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "離開" + +#: contact/msnstatus.cpp:162 +msgid "Away with Auto-Reply" +msgstr "離開,並自動回覆" + +#: contact/msnstatus.cpp:163 +msgid "Idle" +msgstr "閒置" + +#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "馬上回來" + +#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "請等等...電話中" + +#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "外出午餐" + +#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "隱形" + +#: contact/msnstatus.cpp:168 model/contactlist.cpp:1825 +msgid "Offline" +msgstr "離線" + +#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +msgid "&My Status" +msgstr "我的狀態(&M)" + +#: contact/msnstatus.cpp:218 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "斷線" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "新增聯絡人" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:276 +msgid "Add New Emoticon" +msgstr "新增表情符號" + +#: dialogs/addemoticondialog.cpp:130 +msgid "Edit Emoticon" +msgstr "編輯表情符號" + +#: dialogs/addemoticondialog.cpp:275 settings/emoticonspage.cpp:135 +#, kde-format +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:57 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "聊天紀錄" + +#: dialogs/chathistorydialog.cpp:245, kde-format +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 "" +"當開啟你的紀錄時出現了一個錯誤。通常這是權限問題,請檢查您是否有讀取/寫入資" +"料夾\"%1\"的權限。若不是權限問題,可能是您的紀錄已損毀。" + +#: dialogs/chathistorydialog.cpp:250 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "無法開啟聊天紀錄" + +#: dialogs/chathistorydialog.cpp:567 +msgctxt "Combo box default item" +msgid "Loading..." +msgstr "載入中..." + +#: dialogs/chathistorydialog.cpp:589 +msgctxt "Combo box default item" +msgid "No logged chats" +msgstr "沒有聊天紀錄" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "您已被某人加入" + +#: dialogs/contactaddeduserdialog.cpp:60, kde-format +msgid "" +"%1\n" +"has added you to his or her contact list." +msgstr "" +"%1\n" +"已將您加入聯絡人清單中。" + +#: dialogs/contactaddeduserdialog.cpp:65 +#, kde-format +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1(%2)\n" +"已將您加入聯絡人清單中。" + +#: dialogs/contactpropertiesdialog.cpp:282 +#, kde-format +msgid "Contact Properties for %1" +msgstr "%1 的聯絡人特性" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:812 kmessview.cpp:1180 +#: network/msnsockethttp.cpp:195 network/msnsockettcp.cpp:391 +msgid "Connected" +msgstr "已連線" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1184 +msgid "Not seen yet" +msgstr "尚未看到" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1199 +msgid "No messages yet" +msgstr "尚未有訊息" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "上次看到:%1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "上個訊息:%1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "電子郵件地址:%1" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, kde-format +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "客戶端程式:%1" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "您確定要使用此聯絡人的顯示圖片嗎?" + +#: dialogs/contactpropertiesdialog.cpp:663 +msgid "Copy Contact Picture" +msgstr "複製聯絡人圖片" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "The selected filetype is not supported by Phonon." +msgstr "選擇的檔案型態未被 Phonon 支援。" + +#: dialogs/contactpropertiesdialog.cpp:716 +msgid "Unsupported filetype" +msgstr "未支援的檔案型態" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "邀請聯絡人" + +#: dialogs/listexportdialog.cpp:83 +#, kde-format +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 +#, kde-format +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 "聯絡人清單的輸出已經完成" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1279 +#: dialogs/networkwindow.cpp:1306 rc.cpp:222 +msgid "Network Window" +msgstr "網路視窗" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "儲存分頁(&a)" + +#: dialogs/networkwindow.cpp:79 +msgid "C&lear Tab" +msgstr "清除分頁(&l)" + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "關閉所有分頁(&l)" + +#: dialogs/networkwindow.cpp:1086 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"目前沒有任何連線。\n" +"無法開啟網路視窗。" + +#: dialogs/networkwindow.cpp:1130 +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:1177 +msgid "Cannot close the main connection tab." +msgstr "無法關閉主連結標籤" + +#: dialogs/networkwindow.cpp:1273 +msgid "" +"Sending commands to the server is a risky operation.
If you do not 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:1303 +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:1379 +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 +#, kde-format +msgid "%1 MB" +msgstr "%1 MB" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +#, kde-format +msgid "%1 kB" +msgstr "%1 kB" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +#, kde-format +msgid "%1 bytes" +msgstr "%1 bytes" + +#: dialogs/transferentry.cpp:343 +#, kde-format +msgid "%1 of %2 received." +msgstr "%1 已接收,共 %2。" + +#: dialogs/transferentry.cpp:347 +#, kde-format +msgid "%1 of %2 sent." +msgstr "%1 已傳送,共 %2。" + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "無窮" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: dialogs/transferwindow.cpp:52 rc.cpp:869 +msgid "File Transfers" +msgstr "檔案傳輸" + +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "使用(&U)" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "刪除(&D)" + +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" +msgstr "選擇或移除您的顯示圖片" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete this display picture?" +msgstr "您確定要刪除此顯示圖片?" + +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Display Picture" +msgstr "刪除顯示圖片" + +#: emoticontheme.cpp:627 +#, kde-format +msgid "" +"Could not save the emoticon theme. Make sure you have permission to write to " +"the theme folder '%1'." +msgstr "無法儲存此表情符號主題。請確定您有寫入主題資料夾 %1 的權限。" + +#: emoticontheme.cpp:833 +msgid "Smile" +msgstr "微笑" + +#: emoticontheme.cpp:834 +msgid "Wink" +msgstr "眨眼" + +#: emoticontheme.cpp:835 +msgid "Tongue out" +msgstr "吐舌" + +#: emoticontheme.cpp:836 +msgid "Big smile" +msgstr "大笑" + +#: emoticontheme.cpp:837 +msgid "Sad" +msgstr "傷心" + +#: emoticontheme.cpp:838 +msgid "Crying" +msgstr "哭泣" + +#: emoticontheme.cpp:839 +msgid "Angry" +msgstr "生氣" + +#: emoticontheme.cpp:840 +msgid "Confused" +msgstr "困惑" + +#: emoticontheme.cpp:841 +msgid "Embarrassed" +msgstr "害羞" + +#: emoticontheme.cpp:842 +msgid "Disappointed" +msgstr "失望" + +#: emoticontheme.cpp:843 +msgid "Hot" +msgstr "熱情" + +#: emoticontheme.cpp:844 +msgid "Baring teeth" +msgstr "露牙" + +#: emoticontheme.cpp:845 +msgid "Nerd" +msgstr "厭惡" + +#: emoticontheme.cpp:846 +msgid "Sick" +msgstr "生病" + +#: emoticontheme.cpp:847 +msgid "Surprised" +msgstr "驚喜" + +#: emoticontheme.cpp:848 +msgid "Party" +msgstr "派對" + +#: emoticontheme.cpp:849 +msgid "Sleepy" +msgstr "想睡" + +#: emoticontheme.cpp:850 +msgid "Thinking" +msgstr "思考" + +#: emoticontheme.cpp:851 +msgid "Don't tell anyone" +msgstr "封口" + +#: emoticontheme.cpp:852 +msgid "Secret telling" +msgstr "秘密" + +#: emoticontheme.cpp:853 +msgid "Eye-rolling" +msgstr "轉眼" + +#: emoticontheme.cpp:854 +msgid "Sarcastic" +msgstr "諷刺" + +#: emoticontheme.cpp:855 +msgid "I don't know" +msgstr "不知" + +#: emoticontheme.cpp:856 +msgid "Be right back" +msgstr "速回" + +#: emoticontheme.cpp:857 +msgid "Angel" +msgstr "天使" + +#: emoticontheme.cpp:858 +msgid "Left hug" +msgstr "左擁" + +#: emoticontheme.cpp:859 +msgid "Boy" +msgstr "男孩" + +#: emoticontheme.cpp:860 +msgid "Red heart" +msgstr "紅心" + +#: emoticontheme.cpp:861 +msgid "Red rose" +msgstr "紅玫瑰" + +#: emoticontheme.cpp:862 +msgid "Thumbs up" +msgstr "讚啦" + +#: emoticontheme.cpp:863 +msgid "Dog face" +msgstr "汪汪" + +#: emoticontheme.cpp:864 +msgid "Sun" +msgstr "太陽" + +#: emoticontheme.cpp:865 +msgid "Devil" +msgstr "邪惡" + +#: emoticontheme.cpp:866 +msgid "Right hug" +msgstr "右抱" + +#: emoticontheme.cpp:867 +msgid "Girl" +msgstr "女孩" + +#: emoticontheme.cpp:868 +msgid "Broken heart" +msgstr "心碎" + +#: emoticontheme.cpp:869 +msgid "Wilted rose" +msgstr "枯玫瑰" + +#: emoticontheme.cpp:870 +msgid "Thumbs down" +msgstr "遜斃" + +#: emoticontheme.cpp:871 +msgid "Cat face" +msgstr "喵喵" + +#: emoticontheme.cpp:872 +msgid "Sleeping half-moon" +msgstr "月眠" + +#: emoticontheme.cpp:873 +msgid "Red lips" +msgstr "紅唇" + +#: emoticontheme.cpp:874 +msgid "Clapping" +msgstr "鼓掌" + +#: emoticontheme.cpp:875 +msgid "Crossed fingers" +msgstr "指叉" + +#: emoticontheme.cpp:876 +msgid "Auto" +msgstr "自動" + +#: emoticontheme.cpp:877 +msgid "Airplane" +msgstr "飛機" + +#: emoticontheme.cpp:878 +msgid "Turtle" +msgstr "烏龜" + +#: emoticontheme.cpp:879 +msgid "Snail" +msgstr "蝸牛" + +#: emoticontheme.cpp:880 +msgid "Sheep" +msgstr "綿羊" + +#: emoticontheme.cpp:881 +msgid "Goat" +msgstr "山羊" + +#: emoticontheme.cpp:882 +msgid "Vampire bat" +msgstr "蝙蝠" + +#: emoticontheme.cpp:883 +msgid "Pizza" +msgstr "比薩" + +#: emoticontheme.cpp:884 +msgid "Beer mug" +msgstr "啤酒杯" + +#: emoticontheme.cpp:885 +msgid "Martini glass" +msgstr "高腳杯" + +#: emoticontheme.cpp:886 +msgid "Coffee cup" +msgstr "咖啡杯" + +#: emoticontheme.cpp:887 +msgid "Birthday cake" +msgstr "蛋糕" + +#: emoticontheme.cpp:888 +msgid "Plate" +msgstr "盤子" + +#: emoticontheme.cpp:889 +msgid "Bowl" +msgstr "碗公" + +#: emoticontheme.cpp:890 +msgid "Star" +msgstr "星星" + +#: emoticontheme.cpp:891 +msgid "Rainbow" +msgstr "彩虹" + +#: emoticontheme.cpp:892 +msgid "Stormy cloud" +msgstr "烏雲" + +#: emoticontheme.cpp:893 +msgid "Lightning" +msgstr "閃電" + +#: emoticontheme.cpp:894 +msgid "Umbrella" +msgstr "雨傘" + +#: emoticontheme.cpp:895 +msgid "Island with a palm tree" +msgstr "棕櫚樹" + +#: emoticontheme.cpp:896 +msgid "Telephone receiver" +msgstr "電話" + +#: emoticontheme.cpp:897 +msgid "Mobile Phone" +msgstr "手機" + +#: emoticontheme.cpp:898 +msgid "Email" +msgstr "Email" + +#: emoticontheme.cpp:899 +msgid "Clock" +msgstr "時鐘" + +#: emoticontheme.cpp:900 +msgid "Camera" +msgstr "相機" + +#: emoticontheme.cpp:901 +msgid "Filmstrip" +msgstr "膠捲" + +#: emoticontheme.cpp:902 +msgid "Note" +msgstr "音符" + +#: emoticontheme.cpp:903 +msgid "Handcuffs" +msgstr "手銬" + +#: emoticontheme.cpp:904 +msgid "Money" +msgstr "錢錢" + +#: emoticontheme.cpp:905 +msgid "Light bulb" +msgstr "燈泡" + +#: emoticontheme.cpp:906 +msgid "Cigarette" +msgstr "香煙" + +#: emoticontheme.cpp:907 +msgid "Football ball" +msgstr "足球" + +#: emoticontheme.cpp:908 +msgid "Gift with a bow" +msgstr "禮物" + +#: emoticontheme.cpp:909 +msgid "X-Box" +msgstr "X-Box" + +#: emoticontheme.cpp:910 +msgid "Computer" +msgstr "電腦" + +#: emoticontheme.cpp:911 +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:375 +#, kde-format +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "等待網際網路連線來重新連線...
現在重新連線!" + +#: initialview.cpp:380 +msgctxt "Status message on login screen" +msgid "Internet connection not available" +msgstr "網際網路無法連線。" + +#: initialview.cpp:401 +#, kde-format +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:596 +msgctxt "Button label" +msgid "&Connect" +msgstr "連線(&C)" + +#: initialview.cpp:601 +msgctxt "Button label" +msgid "&Cancel" +msgstr "取消(&C)" + +#: initialview.cpp:661 +msgctxt "Status message on login screen" +msgid "Please enter both your email address and password" +msgstr "請填入您的電子郵件地址以及密碼。" + +#: initialview.cpp:680 +msgctxt "Status message on login screen" +msgid "Please enter a valid email address" +msgstr "請輸入正確的的電子郵件位址。" + +#: kmess.cpp:218, kde-format +msgid "The contact %1 is already in your contact list." +msgstr "聯絡人 %1 已經在您的清單中了。" + +#: kmess.cpp:218 +msgid "Contact Information" +msgstr "聯絡人資訊" + +#: kmess.cpp:248 +msgid "New Group" +msgstr "新增群組" + +#: kmess.cpp:251 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "新增群組" + +#: kmess.cpp:252 +msgid "Enter a name for the new group:" +msgstr "輸入新群組的名稱:" + +#: kmess.cpp:576 +#, kde-format +msgid "" +"Are you sure you want to remove the contact %1 from your contact " +"list?" +msgstr "您確定要將聯絡人 %1 從清單中移除嗎?" + +#: kmess.cpp:578 +msgid "Remove Contact" +msgstr "移除聯絡人" + +#: kmess.cpp:580 +msgid "Remove and Block" +msgstr "移除並封鎖" + +#: kmess.cpp:626, kde-format +msgctxt "dialog text" +msgid "" +"The group %1 is not empty! First remove all contacts from it, then " +"try again!" +msgstr "群組 %1 不是空的:請先將所有聯絡人從群組中移走,然後再試一次。" + +#: kmess.cpp:628 kmess.cpp:635 +msgctxt "dialog title" +msgid "Group Removal" +msgstr "群組移除" + +#: kmess.cpp:633 +#, kde-format +msgctxt "dialog text" +msgid "" +"Are you sure you want to remove the group %1 from your contact " +"list?" +msgstr "您確定要將群組 %1 從聯絡人清單中移除嗎?" + +#: kmess.cpp:636 +msgctxt "dialog button" +msgid "Remove" +msgstr "移除" + +#: kmess.cpp:665 +msgid "This is a special group, which cannot be changed." +msgstr "這是一個不可變更的特殊群組" + +#: kmess.cpp:676 +msgid "Rename Group" +msgstr "重新命名群組" + +#: kmess.cpp:677 +msgid "Enter a new name for this group:" +msgstr "請輸入此群組的名稱:" + +#: kmess.cpp:753, kde-format +msgctxt "dialog text" +msgid "" +"

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

" +msgstr "

無法自動以帳號 %1 登入:
您必須先儲存密碼。

" + +#: kmess.cpp:756 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "自動登入失敗" + +#: kmess.cpp:1039 +msgid "Connection could be down..." +msgstr "連線可能已中斷..." + +#: kmess.cpp:1109 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "已斷線" + +#: kmess.cpp:1448 +#, kde-format +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:1460 +#, kde-format +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 無法播放音效或顯示通知。

因為在以下的路徑中找不到需要的" +"設定檔 kmess.notifyrc。

%1

請檢查您的安裝。

" + +#: kmess.cpp:1466 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "通知的錯誤" + +#: kmess.cpp:1744 +#, kde-format +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess ─ %1" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: kmessinterface.cpp:160 rc.cpp:312 +msgid "&Connect" +msgstr "連線(&C)" + +#: kmessinterface.cpp:161 +msgid "&Disconnect" +msgstr "斷線(&D)" + +#: kmessinterface.cpp:162 +msgid "Show My &Profile" +msgstr "顯示我的帳號(&P)" + +#: kmessinterface.cpp:167 +msgid "Show &Allowed Contacts" +msgstr "顯示所有被允許的聯絡人(&A)" + +#: kmessinterface.cpp:168 +msgid "Show &Offline Contacts" +msgstr "顯示離線的聯絡人(&O)" + +#: kmessinterface.cpp:169 +msgid "Show &Removed Contacts" +msgstr "顯示被刪除的聯絡人(&R)" + +#: kmessinterface.cpp:170 +msgid "Show &History Box" +msgstr "顯示歷史紀錄(&H)" + +#: kmessinterface.cpp:171 +msgid "&Show Search Bar" +msgstr "顯示搜尋列(&S)" + +#: kmessinterface.cpp:172 +msgid "Show &Empty Groups" +msgstr "顯示空白的群組(&E)" + +#: kmessinterface.cpp:173 +msgid "&Display Pictures Size" +msgstr "顯示圖片大小(&D)" + +#: kmessinterface.cpp:174 +msgid "&Sort Contacts by" +msgstr "以聯絡人的狀態排列(&S)" + +#: kmessinterface.cpp:175 +msgid "Show &Transfer Window..." +msgstr "顯示檔案傳輸視窗(&T)..." + +#: kmessinterface.cpp:180 +msgid "New &Contact..." +msgstr "新增聯絡人(&C)..." + +#: kmessinterface.cpp:181 +msgid "New &Group..." +msgstr "新增群組(&G)..." + +#: kmessinterface.cpp:182 +msgid "&Export Contact List..." +msgstr "匯出聯絡人清單(&E)..." + +#: kmessinterface.cpp:183 kmessview.cpp:602 +msgid "Show Chat &History..." +msgstr "顯示聊天紀錄(H)..." + +#: kmessinterface.cpp:184 +msgid "New &Account..." +msgstr "新增帳號(&A)..." + +#: kmessinterface.cpp:185 +msgid "Configure Account..." +msgstr "設定帳號..." + +#: kmessinterface.cpp:186 +msgid "Configure &KMess..." +msgstr "設定 KMess(&K)..." + +#: kmessinterface.cpp:187 +msgid "Show Selection &Menu" +msgstr "顯示選取選單(&M)" + +#: kmessinterface.cpp:190 +msgid "Do Not Display" +msgstr "不要顯示" + +#: kmessinterface.cpp:191 +msgid "Small" +msgstr "小" + +#: kmessinterface.cpp:192 +msgid "Medium" +msgstr "中" + +#: kmessinterface.cpp:193 +msgid "Large" +msgstr "大" + +#: kmessinterface.cpp:197 +msgid "Group" +msgstr "群組" + +#: kmessinterface.cpp:198 +msgid "Online/Offline" +msgstr "上線/離線" + +#: kmessinterface.cpp:199 +msgid "Mixed" +msgstr "混合" + +#: kmessinterface.cpp:289 +msgid "Show &Network Window..." +msgstr "顯示網路視窗(&N)..." + +#: kmessview.cpp:318, kde-format +msgid "[%1] Logged in with %2" +msgstr "【%1】登入為 %2" + +#: kmessview.cpp:355 +#, kde-format +msgid "[%1] %2 goes online" +msgstr "【%1】%2 上線了" + +#: kmessview.cpp:360 +#, kde-format +msgid "[%1] %2 goes offline" +msgstr "【%1】%2 離線了" + +#: kmessview.cpp:599 +msgid "Cha&t" +msgstr "交談(&t)" + +#: kmessview.cpp:610 +msgid "&Remove From Group" msgstr "從群組中刪除(&R)" -#: kmessview.cpp:640 -msgid "&Move to Group" -msgstr "移至群組(&M)" - -#: kmessview.cpp:641 +#: kmessview.cpp:643 msgid "&Copy to Group" msgstr "複製至群組(&C)" -#: kmessview.cpp:674 +#: kmessview.cpp:644 +msgid "&Move to Group" +msgstr "移至群組(&M)" + +#: kmessview.cpp:695 msgid "Move Group &Down" msgstr "群組向下移(&D)" -#: kmessview.cpp:675 +#: kmessview.cpp:696 msgid "Move Group &Up" msgstr "群組向上移(&U)" -#: kmessview.cpp:676 +#: kmessview.cpp:697 msgid "Re&move Group" msgstr "移除此群組(&m)" -#: kmessview.cpp:677 +#: kmessview.cpp:698 msgid "Re&name Group" msgstr "重新命名此群組(&n)" -#: kmessview.cpp:1723 -msgid "You have 1 new e-mail in your inbox." -msgstr "你有一封新郵件在收件夾裡" +#: kmessview.cpp:1136 +msgctxt "Message in list tooltip" +msgid "This contact does not have you in his or her contact list." +msgstr "此人並未將您加入聯絡人清單。" -#: kmessview.cpp:1727 -msgid "You have %1 new emails in your inbox." -msgstr "你有 %1 封新郵件在收件夾裡" +#: kmessview.cpp:1145 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "電子郵件地址" -#: kmessview.cpp:1756 -msgid "(Away)" -msgstr "(離開)" +#: kmessview.cpp:1152 +msgctxt "Contact Live Messenger client label in list tooltip" +msgid "Client" +msgstr "客戶端程式" -#: kmessview.cpp:1761 -msgid "(Be Right Back)" -msgstr "(馬上回來)" +#: kmessview.cpp:1164 +msgid "Yes" +msgstr "是" -#: kmessview.cpp:1766 -msgid "(Busy)" -msgstr "(忙啦)" +#: kmessview.cpp:1168 +msgid "No" +msgstr "否" -#: kmessview.cpp:1776 -msgid "(Invisible)" -msgstr "(隱形)" +#: kmessview.cpp:1171 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "被封鎖" -#: kmessview.cpp:1781 -msgid "(Away - Idle)" -msgstr "(離開-發呆)" +#: kmessview.cpp:1191 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "上次看到" -#: kmessview.cpp:1786 -msgid "(Out to Lunch)" -msgstr "(外出午餐)" +#: kmessview.cpp:1206 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "上次發送訊息" -#: kmessview.cpp:1796 -msgid "(On the Phone)" -msgstr "(噓...電話中)" +#: kmessview.cpp:1216 +#, kde-format +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "群組 %1" -#: main.cpp:44 -msgid "Autologin with the given email address" -msgstr "以給定的電子郵件自動登入" +#: kmessview.cpp:1224 +#, kde-format +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 個聯絡人,%2 個正在線上" -#: main.cpp:54 settings/accountswidget.cpp:443 settings/accountswidget.cpp:488 -#: systemtraywidget.cpp:278 +#: kmessview.cpp:1231 +#, kde-format +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 個聯絡人" + +#: kmessview.cpp:1651 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "【請在此輸入您的個人訊息】" + +#: kmessview.cpp:1652 +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:1833 +msgid "You have not chatted with this contact yet." +msgstr "您尚未與此聯絡人交談過。" + +#: kmessview.cpp:1834 +msgid "No Chat History found." +msgstr "找不到聊天紀錄" + +#: kmessview.cpp:2020 +#, kde-format +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 封新信件" + +#: kmessviewdelegate.cpp:148 +#, kde-format +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 +#, kde-format +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:480 settings/accountpage.cpp:541 msgid "KMess" msgstr "KMess" -#: main.cpp:78 +#: main.cpp:44 +msgid "A Live Messenger client for KDE" +msgstr "KDE 上的 Live Messenger 客戶端程式" + +#: main.cpp:46 +msgid "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2009, Mike K. Bennett\n" +"(c) 2005-2009, Diederik van der Boor\n" +"(c) 2007-2009, Valerio Pilo\n" +"(c) 2008-2009, Antonio Nastasi\n" +"(c) 2008-2009, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "開發者與專案發起者" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:61 +msgid "Developer" +msgstr "開發者" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:62 main.cpp:71 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "專案支援" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 main.cpp:67 main.cpp:68 +msgid "Current developer" +msgstr "目前開發者" + +#: main.cpp:63 main.cpp:103 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:64 main.cpp:124 +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:67 main.cpp:161 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:68 main.cpp:160 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:71 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "德文翻譯,測試,文件和網站設計,計劃主持、、、等" -#: main.cpp:79 +#: main.cpp:72 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:72 msgid "Web design" msgstr "網頁設計" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "黃/藍/紫 色表情符號集和義大利文翻譯" +#: main.cpp:73 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:73 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "主要的,以及黃/藍/紫色表情符號集,義大利文翻譯" + +#: main.cpp:74 msgid "Cartoon emoticons" msgstr "卡通表情符號" -#: main.cpp:82 +#: main.cpp:74 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:75 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:75 msgid "Default sound theme" msgstr "預設的音效主題" -#: main.cpp:86 +#: main.cpp:76 +msgid "KMess icon in Oxygen style" +msgstr "Oxygen 風格的 KMess 圖示" + +#: main.cpp:76 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:80 main.cpp:108 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:80 +msgid "Translations Maintainer" +msgstr "翻譯維護者" + +#: main.cpp:82 msgid "Arabic translation, internationalization of file saving fix." msgstr "阿拉伯文翻譯和文件保存國際化的修正" -#: main.cpp:87 +#: main.cpp:82 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:83 msgid "More Arabic translation" msgstr "更多阿拉伯文翻譯" -#: main.cpp:88 +#: main.cpp:83 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:85 msgid "Brazilian Portuguese translation" msgstr "巴西葡萄牙文翻譯" -#: main.cpp:89 +#: main.cpp:85 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:86 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:86 main.cpp:87 main.cpp:88 +msgid "More Brazilian Portuguese translation" +msgstr "更多巴西、葡萄牙文翻譯" + +#: main.cpp:87 +msgid "Sergio Rafael Lemke" +msgstr "Sergio Rafael Lemke" + +#: main.cpp:88 +msgid "Maurício Arozi Moraes" +msgstr "Maurício Arozi Moraes" + +#: main.cpp:90 msgid "Catalan translation" msgstr "加泰隆尼亞文翻譯" +#: main.cpp:90 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + #: main.cpp:91 +msgid "Adrià Arrufat" +msgstr "Adrià Arrufat" + +#: main.cpp:91 +msgid "More Catalan translation" +msgstr "更多的加泰隆尼亞文翻譯" + +#: main.cpp:93 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:93 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "簡體中文翻譯,文件傳送臭蟲修復,代理連結程式。" -#: main.cpp:92 +#: main.cpp:94 main.cpp:156 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:94 main.cpp:95 msgid "More Simplified Chinese translation" msgstr "更多的簡體中文翻譯" -#: main.cpp:93 +#: main.cpp:95 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:96 msgid "Traditional Chinese translation" msgstr "繁體中文翻譯" -#: main.cpp:95 +#: main.cpp:96 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:97 +msgid "More Traditional Chinese translation" +msgstr "更多的繁體中文翻譯" + +#: main.cpp:97 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-中文" + +#: main.cpp:99 msgid "Danish translation" msgstr "丹麥文翻譯" -#: main.cpp:96 +#: main.cpp:99 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:100 msgid "More Danish translation" msgstr "更多的丹麥文翻譯" -#: main.cpp:97 +#: main.cpp:100 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:102 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:102 msgid "Dutch translation" msgstr "荷蘭文翻譯" -#: main.cpp:98 +#: main.cpp:103 main.cpp:104 main.cpp:105 main.cpp:106 msgid "More Dutch translation" msgstr "更多的荷蘭文翻譯" -#: main.cpp:100 +#: main.cpp:104 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:105 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:106 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:108 +msgid "More German translation, Greek translation" +msgstr "更多德文翻譯、希臘文翻譯" + +#: main.cpp:109 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:109 +msgid "More Greek translation" +msgstr "更多的希臘文翻譯" + +#: main.cpp:111 msgid "Estonian translation" msgstr "愛沙尼亞文翻譯" -#: main.cpp:101 +#: main.cpp:111 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:112 msgid "Finnish translation" msgstr "芬蘭文翻譯" -#: main.cpp:102 main.cpp:103 +#: main.cpp:112 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:113 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:113 main.cpp:114 msgid "More Finnish translation" msgstr "更多的芬蘭文翻譯" -#: main.cpp:105 +#: main.cpp:114 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:116 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:116 msgid "French translation" msgstr "法文翻譯" -#: main.cpp:106 +#: main.cpp:117 msgid "More French translation, MSN6 emoticon definitions" -msgstr "更多法文翻譯,MSN6 表情圖示定義" +msgstr "更多法文翻譯,MSN6 表情符號定義" -#: main.cpp:107 +#: main.cpp:117 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:118 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:118 main.cpp:119 main.cpp:120 msgid "More French translation" msgstr "法文翻譯" -#: main.cpp:109 +#: main.cpp:119 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:120 +msgid "Scias" +msgstr "Scias" + +#: main.cpp:122 msgid "Hungarian translation" msgstr "匈牙利文翻譯" -#: main.cpp:110 main.cpp:111 +#: main.cpp:122 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:123 +msgid "More Hungarian translation" +msgstr "更多匈牙利文翻譯" + +#: main.cpp:123 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:124 main.cpp:125 msgid "More Italian translation" msgstr "更多的義大利文翻譯" -#: main.cpp:112 +#: main.cpp:125 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:126 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:126 +msgid "" +"More Italian translation, Group selection in 'contact added user' dialog" +msgstr "更多的義大利文翻譯,在「聯絡人新增使用者」對話框中加入群組選擇" + +#: main.cpp:127 msgid "Korean translation" msgstr "韓文翻譯" -#: main.cpp:113 +#: main.cpp:127 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:128 msgid "Norsk Bokmål translation" msgstr "挪威文翻譯" -#: main.cpp:115 +#: main.cpp:128 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:130 +msgid "Serbian translation" +msgstr "塞餌維亞文翻譯" + +#: main.cpp:130 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:132 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:132 +msgid "Slovak translation" +msgstr "斯洛伐克文翻譯" + +#: main.cpp:133 +msgid "Matjaž Kaše" +msgstr "Matjaž Kaše" + +#: main.cpp:133 msgid "Slovenian translation" msgstr "斯洛維尼亞文翻譯" -#: main.cpp:116 +#: main.cpp:135 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:135 msgid "Spanish translation" msgstr "西班牙文翻譯" -#: main.cpp:117 main.cpp:118 main.cpp:119 main.cpp:120 +#: main.cpp:136 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:136 main.cpp:137 main.cpp:138 main.cpp:139 main.cpp:140 +#: main.cpp:141 main.cpp:142 msgid "More Spanish translation" msgstr "更多的西班牙文翻譯" -#: main.cpp:121 +#: main.cpp:137 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:138 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:139 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:140 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:141 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:142 +msgid "Manuel Ramírez" +msgstr "Manuel Ramírez" + +#: main.cpp:144 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:144 msgid "Swedish translation" msgstr "瑞典文翻譯" -#: main.cpp:123 +#: main.cpp:145 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:145 +msgid "More Swedish translation" +msgstr "更多的瑞典文翻譯" + +#: main.cpp:147 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:147 msgid "Thai translation" msgstr "泰文翻譯" -#: main.cpp:124 +#: main.cpp:148 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:148 msgid "Turkish translation" msgstr "土耳其文翻譯" -#: main.cpp:125 main.cpp:126 +#: main.cpp:149 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:149 main.cpp:150 msgid "More Turkish translation" msgstr "更多土耳其文翻譯" -#: main.cpp:129 -msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "" +#: main.cpp:150 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" -#: main.cpp:130 +#: main.cpp:153 +msgid "MSNP12 support, various patches" +msgstr "MSNP12 支援,多個程式修補" + +#: main.cpp:153 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:154 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:154 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "顯示聯絡人清單中的圖片的程式碼,聯絡人客戶端資訊,聊天室字體縮放" + +#: main.cpp:155 +msgid "File transfer thumbnails" +msgstr "檔案傳輸縮圖" + +#: main.cpp:155 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:156 msgid "P4-Context field support" msgstr "P4 內容文件支援" -#: main.cpp:131 +#: main.cpp:157 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:157 msgid "Xinerama fixes" msgstr "Xinerama的修正" -#: main.cpp:132 +#: main.cpp:158 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:158 msgid "Original file receive code" msgstr "原始的檔案接收程式碼" -#: main.cpp:133 +#: main.cpp:159 +msgid "KWallet support" +msgstr "KWallet 支援" + +#: main.cpp:159 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:160 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "通知阻擋選項,動畫快遞關閉選項,上次訊息日期功能" + +#: main.cpp:161 +msgid "IRC-like commands in the chat window" +msgstr "在聊天視窗中加入類似 IRC 指令的功能" + +#: main.cpp:162 +msgid "Chat history dialog" +msgstr "聊天歷史紀錄" + +#: main.cpp:162 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:165 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:165 +msgid "Various internationalization fixes" +msgstr "多種國際化的修正" + +#: main.cpp:166 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:166 msgid "Various internationalization fixes." msgstr "各國際化的修正" -#: main.cpp:134 +#: main.cpp:168 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:168 msgid "GnomeMeeting developer" msgstr "GnomeMeeting 開發者" -#: main.cpp:135 +#: main.cpp:169 msgid "Guy with a bag over his head" -msgstr "一個頭上有袋子的人(?)" +msgstr "頭上頂著個包包的人" -#: main.cpp:138 +#: main.cpp:169 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:172 msgid "Inspiration and assorted code" -msgstr "整理程式碼與鼓舞(?)" +msgstr "整理程式碼,給大家打氣" -#: main.cpp:139 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "就彈出氣泡程式碼,最初的 p2p 程式碼,msn 挑戰領頭者" +#: main.cpp:172 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" -#: main.cpp:140 +#: main.cpp:173 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:173 +msgid "Old popup balloons code, initial p2p code, MSN challenge handler" +msgstr "舊的彈出式泡泡程式碼,初始的 p2p 程式碼,MSN 挑戰處理器" + +#: main.cpp:174 msgid "Idle timer code" msgstr "閒置計時器程式碼" -#: main.cpp:141 +#: main.cpp:174 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:175 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:175 msgid "Close-to-tray icon screenshot code" -msgstr "" +msgstr "關閉到系統匣的圖示快照程式碼" -#: main.cpp:144 -msgid "Your name here?" -msgstr "你的名稱?" +#: main.cpp:176 +msgid "Amarok" +msgstr "Amarok" -#: main.cpp:144 -#, fuzzy +#: main.cpp:176 +msgid "Custom crash handler implementation" +msgstr "自訂的程式錯誤處理器實作" + +#: main.cpp:179 msgid "" -"You are welcome to sent bugfixes and patches to the KMess help forums!\n" +"You are welcome to send bugfixes and patches to the KMess help forum!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -"很歡迎你的臭蟲修復與補丁至 KMess 幫助討論區!\n" -"如果你覺得你的名字遺漏了,也請連絡我們!" +"我們歡迎您傳送錯誤修正到 KMess 討論區!\n" +"若您希望將您的名字列在這裡,歡迎與我們聯絡!" -#: network/applications/application.cpp:276 -#: network/extra/msnftpconnection.cpp:129 -#: network/extra/msnftpconnection.cpp:130 -msgid "The contact cancelled the session." -msgstr "聯絡人取消了程序" +#: main.cpp:179 +msgid "Your name here?" +msgstr "還有您!" -#: network/applications/application.cpp:288 -msgid "The contact rejected the invitation." -msgstr "聯絡人拒絕了邀請" +#: main.cpp:182 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Tryneeds-Chinese 翻譯平台 http://tryneeds.westart.tw/" -#: network/applications/application.cpp:360 -msgid "You have cancelled the session." -msgstr "你取消了程序" +#: main.cpp:183 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your email addresses" +msgstr "tryneeds@gmail.com" -#: network/applications/application.cpp:372 -msgid "You have rejected the invitation." -msgstr "你拒絕了邀請" +#: main.cpp:189 +msgid "Do not show the contact list window initially" +msgstr "不要在初始時顯示聯絡人清單視窗" -#: network/applications/application.cpp:497 -msgid "Do you want to accept or cancel?" -msgstr "你想要 接受取消?" +#: main.cpp:190 +msgid "Autologin with the given email address" +msgstr "以給定的電子郵件自動登入" -#: network/applications/application.cpp:533 -msgid "Click to cancel." -msgstr "點選 以取消" +#: main.cpp:195 +msgid "Run a debug test (developer build only)" +msgstr "執行除錯測試〈只在開發者模式〉" -#: network/applications/filetransfer.cpp:124 -#: network/applications/filetransferp2p.cpp:239 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "你想要接收此檔案:%1 (%2)" +#: model/contactlist.cpp:1823 +msgid "Individuals" +msgstr "個人" -#: network/applications/filetransfer.cpp:209 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "%1 的傳輸失敗。無法開啟檔案。" - -#: network/applications/filetransfer.cpp:303 -#: network/applications/p2papplication.cpp:3194 -#: network/applications/p2papplication.cpp:3215 -msgid "Connecting to %1, port %2" -msgstr "連線到 %1,port %2" - -#: network/applications/filetransfer.cpp:323 -#: network/applications/filetransferp2p.cpp:542 -msgid "The transfer was cancelled" -msgstr "傳輸取消" - -#: network/applications/filetransfer.cpp:370 -msgid "Connection established" -msgstr "連線已建立" - -#: network/applications/filetransfer.cpp:439 -#: network/applications/filetransferp2p.cpp:641 -msgid "Successfully transferred file: %1" -msgstr "成功地傳送了檔案:%1" - -#: network/applications/filetransfer.cpp:600 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1傳輸失敗。檔案不存在。" - -#: network/applications/filetransfer.cpp:604 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 的傳輸失敗。無法讀取檔案。" - -#: network/applications/filetransfer.cpp:629 -#: network/extra/msnftpconnection.cpp:207 -msgid "Sending file %1" -msgstr "傳送檔案 %1" - -#: network/applications/filetransfer.cpp:649 -#: network/applications/filetransferp2p.cpp:849 -msgid "Transfer accepted." -msgstr "傳送被接受" - -#: network/applications/filetransfer.cpp:666 -#: network/applications/filetransferp2p.cpp:367 -#: network/applications/p2papplication.cpp:4889 -msgid "Negotiating options to connect" -msgstr "談判連結的選項" - -#: network/applications/filetransferp2p.cpp:127 -#: network/applications/filetransferp2p.cpp:144 -#: network/applications/filetransferp2p.cpp:161 -#: network/extra/msnftpconnection.cpp:135 -msgid "The file transfer invitation was cancelled. Bad data was received." -msgstr "檔案傳輸的邀請被取消。收到了不好的資料。" - -#: network/applications/filetransferp2p.cpp:352 -msgid "The transfer of %1 failed. Couldn't open file" -msgstr "%1 的傳輸失敗。無法開啟檔案" - -#: network/applications/filetransferp2p.cpp:531 -msgid "The contact cancelled the transfer." -msgstr "聯絡人取消了傳輸" - -#: network/applications/filetransferp2p.cpp:586 -msgid "File could not be written" -msgstr "無法寫入檔案" - -#: network/applications/filetransferp2p.cpp:774 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1傳輸失敗。檔案不存在。" - -#: network/applications/filetransferp2p.cpp:779 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 的傳輸失敗。無法讀取檔案。" - -#: network/applications/filetransferp2p.cpp:814 -msgid "Sending file %1 (%2)" -msgstr "傳送檔案 %1 (%2)" - -#: network/applications/gnomemeeting.cpp:55 -msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "有人邀請你加入一個會談(使用 GnomeMeeting)" - -#: network/applications/gnomemeeting.cpp:114 -msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "啟動 GnomeMeeting。連線到 %1" - -#: network/applications/gnomemeeting.cpp:156 -msgid "Inviting the contact to a meeting." -msgstr "邀請此聯絡人加入會談" - -#: network/applications/mimeapplication.cpp:109 -msgid "The invitation was rejected. It's not supported by the other client." -msgstr "邀請被拒絕。這不被其他用戶端軟體支援。" - -#: network/applications/mimeapplication.cpp:119 -msgid "The invitation was aborted. An internal error occured." -msgstr "邀請取消。發生一個內部錯誤" - -#: network/applications/mimeapplication.cpp:125 -msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "邀請取消。等候使用者接受逾時" - -#: network/applications/mimeapplication.cpp:130 -msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "邀請取消。等候檔案資料逾時" - -#: network/applications/mimeapplication.cpp:135 -msgid "" -"The invitation was aborted. The switchboard closed the chat connection." -msgstr "邀請取消。交換器關閉此連線。" - -#: network/applications/mimeapplication.cpp:141 -msgid "The invitation was aborted." -msgstr "邀請取消" - -#: network/applications/msnremotedesktop.cpp:51 -msgid "You are invited to share this person's desktop." -msgstr "有人邀請你分享他的桌面" - -#: network/applications/msnremotedesktop.cpp:155 -msgid "Starting KRDC. Connecting to %1." -msgstr "啟動 KRDC。連線到 %1" - -#: network/applications/p2papplication.cpp:276 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "此聯絡人使用了一個 KMess 無法處理的 MSN6 特色" - -#: network/applications/p2papplication.cpp:796 -#: network/applications/p2papplication.cpp:991 -#: network/applications/p2papplication.cpp:1699 -#: network/applications/p2papplication.cpp:2088 -#: network/applications/p2papplication.cpp:2484 -#: network/applications/p2papplication.cpp:2604 -#: network/applications/p2papplication.cpp:2737 -msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " -"support it." -msgstr "邀請被取消。聯絡人傳送了錯誤的資料,或 KMess 不支援它" - -#: network/applications/p2papplication.cpp:1501 -msgid "The transfer failed. Data preparation failed." -msgstr "傳輸失敗。資料準備失敗" - -#: network/applications/p2papplication.cpp:1617 -#: network/applications/p2papplication.cpp:2656 -#: network/applications/p2papplication.cpp:2676 -#: network/applications/p2papplication.cpp:2708 -#: network/applications/p2papplication.cpp:3289 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "聯絡人拒絕邀請。發生一個內部錯誤。" - -#: network/applications/p2papplication.cpp:1624 -msgid "The transfer failed." -msgstr "傳輸失敗" - -#: network/applications/p2papplication.cpp:1823 -#: network/applications/p2papplication.cpp:1888 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援" - -#: network/applications/p2papplication.cpp:2038 -msgid "The invitation was cancelled. Message was not directed to us." -msgstr "邀請被取消。訊息並不指向我們。" - -#: network/applications/p2papplication.cpp:2584 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援" - -#: network/applications/p2papplication.cpp:2938 -#: network/extra/msnftpconnection.cpp:403 -msgid "Awaiting connection at %1, port %2" -msgstr "等候%1 port %2 的連線" - -#: network/applications/p2papplication.cpp:2966 -#: network/applications/p2papplication.cpp:5291 -msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "轉回成非直接傳輸(這有可能會慢)" - -#: network/applications/p2papplication.cpp:3274 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "傳輸失敗。等候使用者接受逾時" - -#: network/applications/p2papplication.cpp:3293 -msgid "The transfer failed. An internal error occured." -msgstr "傳輸失敗。發生一個內部錯誤" - -#: network/applications/p2papplication.cpp:3670 -msgid "The transfer failed. Couldn't open data source." -msgstr "傳輸失敗。無法開啟資料來源。" - -#: network/applications/p2papplication.cpp:4844 -msgid "Waiting for connection" -msgstr "等候連線" - -#: network/applications/p2papplication.cpp:5013 -msgid "" -"The invitation was cancelled. A timeout occured waiting for the contact to " -"accept." -msgstr "邀請取消。等候聯絡人接受逾時。" - -#: network/applications/p2papplication.cpp:5022 -msgid "" -"The invitation was cancelled. A timeout occured waiting for a connection to " -"succeed or fail." -msgstr "邀請取消。等候連線 成功/失敗 逾時。" - -#: network/applications/p2papplication.cpp:5089 -#: network/applications/p2papplication.cpp:5173 -msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "邀請取消。等候資料逾時。" - -#: network/applications/voiceconversation.cpp:77 -msgid "You are invited to start a voice conversation." -msgstr "你被邀請一個語音交談" - -#: network/applications/voiceconversation.cpp:82 -msgid "" -"You are invited to start a voice conversation but support for this was not " -"installed" -msgstr "你被邀請了語音交談,但是此支援並未被安裝" - -#: network/applications/voiceconversation.cpp:174 -msgid "You have cancelled the voice conversation." -msgstr "你取消了語音交談。" - -#: network/applications/voiceconversation.cpp:211 -msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "邀請被取消。無法開啟音效裝置" - -#: network/applications/voiceconversation.cpp:222 -msgid "Start voice conversation. Connecting to %1." -msgstr "啟動語音交談。連線到 %1" - -#: network/applications/voiceconversation.cpp:228 -msgid "Start voice conversation. Listening on %1." -msgstr "啟動語音交談。聆聽 %1" - -#: network/applications/voiceconversation.cpp:293 -msgid "Inviting the contact to a voice conversation." -msgstr "邀請聯絡人至語音交談" - -#: network/applications/webapplicationp2p.cpp:105 -#: network/applications/webcamtransferp2p.cpp:89 -msgid "The contact is inviting you for '%1', but this is not implemented yet." -msgstr "聯絡人邀請你 '%'1,但此功能還未被開發" - -#: network/extra/msnftpconnection.cpp:122 -msgid "The transfer of %1 was cancelled." -msgstr "%1 的傳輸取消" - -#: network/extra/msnftpconnection.cpp:136 -msgid "Failed" -msgstr "失敗" - -#: network/extra/msnftpconnection.cpp:410 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "%1 的傳輸失敗。無法開啟本地端 port。" - -#: network/extra/msnftpconnection.cpp:411 -msgid "Couldn't open a local port." -msgstr "無法開啟本地端 port。" - -#: network/extra/msnftpconnection.cpp:468 -msgid "Initiating file transfer" -msgstr "初始化檔案傳輸" - -#: network/extra/msnftpconnection.cpp:481 -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "%1 的傳輸失敗。無法建立連線。" - -#: network/extra/msnftpconnection.cpp:482 -msgid "Unable to make a connection." -msgstr "無法建立連結" - -#: network/extra/msnftpconnection.cpp:586 -msgid "Receiving file %1" -msgstr "正接收檔案 %1" - -#: network/msnconnection.cpp:140 -msgid "" -"KMess could not connect to the MSN Messenger service.\n" -"Please, be sure to be connected to the internet.\n" -"System error: %1 (code %2)." -msgstr "" -"KMess 無法連結到 MSN Messenger 服務。\n" -"請確認有連接到網際網路。\n" -"系統錯誤:%1 (錯誤碼 %2)" - -#: network/msnconnection.cpp:733 -msgid "1 ping lost" -msgstr "1 ping lost" - -#: network/msnconnection.cpp:737 -msgid "%1 pings lost" -msgstr "%1 pings lost" - -#: network/msnconnection.cpp:752 -msgid "The connection to the server was lost." -msgstr "失去至伺服器的連線" - -#: network/msnconnection.cpp:803 -msgid "The remote server has closed the connection." -msgstr "遠端伺服器已關閉連線" - -#: network/msnnotificationconnection.cpp:75 +#: model/contactlist.cpp:1826 msgid "Allowed" msgstr "被允許" -#: network/msnnotificationconnection.cpp:76 +#: model/contactlist.cpp:1827 msgid "Removed" msgstr "被移除" -#: network/msnnotificationconnection.cpp:545 +#: 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 +#, kde-format +msgid "Do you want to accept or cancel?" +msgstr "您要接受取消?" + +#: network/applications/application.cpp:581 +#, kde-format +msgid "Click to cancel." +msgstr "點選此處以取消。" + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +#, kde-format +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "此聯絡人打算傳送一個檔案給您:%1(%2)" + +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346, kde-format msgid "" -"KMess could not connect the the MSN Messenger servers. The MSN Messenger " -"servers could be temporary unavailable or there is a problem with your " -"Internet connection." +"The file "%1" already exists.\n" +"Do you want to overwrite it?" msgstr "" -"KMess 無法連線到 MSN Messenger 伺服器。MSN Messenger 伺服器可能暫時關閉,或者" -"你的網際網路連線有問題。" +"檔案 %1 已存在。\n" +"您要覆寫它嗎?" -#: network/msnnotificationconnection.cpp:740 -msgid "Show MSN Messenger Service status?" -msgstr "顯示 MSN Messenger 服務狀態?" - -#: network/msnnotificationconnection.cpp:741 -msgid "Server Error" -msgstr "伺服器錯誤" - -#: network/msnnotificationconnection.cpp:1339 -#, fuzzy +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376, kde-format msgid "" -"You have been disconnected because you connected from another MSN Messenger " -"client or from another location." -msgstr "" -"你已經被斷線了,\n" -"因為你已經用另一個 MSN Messenger \n" -"或從另一個地方登入" +"The transfer of the file "%1" failed. Could not save the file." +msgstr "檔案 %1 傳輸失敗。無法儲存檔案。" -#: network/msnnotificationconnection.cpp:1553 -msgid "Got synchronization" -msgstr "已同步" - -#: network/msnnotificationconnection.cpp:1690 -msgid "Authenticating" -msgstr "認證中" - -#: network/msnnotificationconnection.cpp:1732 -msgid "Received user confirmation" -msgstr "取得使用者確認" - -#: network/msnnotificationconnection.cpp:1743 -msgid "Waiting for contact list..." -msgstr "等候使用者名單" - -#: network/msnnotificationconnection.cpp:1811 -msgid "Transfer to notification server" -msgstr "傳送到通知伺服器" - -#: network/msnnotificationconnection.cpp:1919 -msgid "Authentication failed, please verify your account name and password" -msgstr "認證失敗,請確認您的帳號和密碼" - -#: network/msnnotificationconnection.cpp:2034 -msgid "Connecting..." -msgstr "連線中..." - -#: network/msnnotificationconnection.cpp:2216 -msgid "KMess received an unknown command from the server: %1" -msgstr "KMess 從伺服器收到一個未知的錯誤訊息:%1" - -#: network/msnnotificationconnection.cpp:2237 -#: network/msnnotificationconnection.cpp:2240 -#: network/msnnotificationconnection.cpp:2246 -#: network/msnnotificationconnection.cpp:2249 -#: network/msnnotificationconnection.cpp:2261 -#: network/msnnotificationconnection.cpp:2273 -#: network/msnnotificationconnection.cpp:2276 -#: network/msnnotificationconnection.cpp:2294 -#: network/msnnotificationconnection.cpp:2297 -#: network/msnnotificationconnection.cpp:2309 -#: network/msnnotificationconnection.cpp:2312 -#: network/msnnotificationconnection.cpp:2319 -#: network/msnnotificationconnection.cpp:2326 -#: network/msnnotificationconnection.cpp:2338 -#: network/msnnotificationconnection.cpp:2345 -#: network/msnnotificationconnection.cpp:2355 -#: network/msnnotificationconnection.cpp:2370 -#: network/soap/httpsoapconnection.cpp:136 -#: network/soap/httpsoapconnection.cpp:145 -#: network/soap/httpsoapconnection.cpp:639 -#: network/soap/httpsoapconnection.cpp:684 -#: network/soap/httpsoapconnection.cpp:707 -#: network/soap/httpsoapconnection.cpp:771 -#: network/soap/httpsoapconnection.cpp:804 -msgid "There was an internal error in KMess: %1" -msgstr "KMess 有一個內部錯誤:%1" - -#: network/msnnotificationconnection.cpp:2243 -msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "你加入的 email 不是一個 MSN Messenger 帳號" - -#: network/msnnotificationconnection.cpp:2252 -msgid "The account name given is invalid" -msgstr "帳號無效" - -#: network/msnnotificationconnection.cpp:2255 +#: network/applications/filetransfer.cpp:295, kde-format msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "帳號無效,或您的 passport 還未認證過" +"The transfer of the file "%1" failed. Could not open the " +"destination file." +msgstr "%1 的傳輸失敗。無法開啟目的檔。" -#: network/msnnotificationconnection.cpp:2258 +#: network/applications/filetransfer.cpp:319 +msgid "Transfer accepted." +msgstr "傳送被接受" + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2373 +#: network/applications/p2papplication.cpp:2394 +#, kde-format +msgid "Connecting to %1, port %2" +msgstr "連線到 %1,連接埠 %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549, kde-format +msgid "The contact has cancelled the transfer of the file "%1"." +msgstr "聯絡人已取消檔案 %1 的傳輸。" + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560, kde-format +msgid "You have cancelled the transfer of the file "%1"." +msgstr "您已取消檔案 %1 的傳輸。" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571, kde-format +msgid "You have rejected the transfer of the file "%1"." +msgstr "您拒絕了檔案 %1 的傳輸。" + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "連線已建立" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675, kde-format +msgid "Successfully sent the file "%1"." +msgstr "成功地傳送了檔案 %1。" + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679, kde-format +msgid "Successfully received the file "%1"." +msgstr "成功地接收了檔案 %1。" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812, kde-format +msgid "" +"The transfer of the file "%1" failed. The file does not exist." +msgstr "檔案 %1 傳輸失敗。檔案不存在。" + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817, kde-format +msgid "" +"The transfer of the file "%1" failed. The file could not be read." +msgstr "檔案 %1 的傳輸失敗。無法讀取檔案。" + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, kde-format +msgid "Sending file "%1" (%2)." +msgstr "傳送檔案 %1 中(%2)。" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889, kde-format +msgid "The contact has accepted the transfer of the file "%1"." +msgstr "聯絡人接受了檔案 %1 的傳輸。" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3217 +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, kde-format +msgid "You have accepted the transfer of the file "%1"." +msgstr "您接受了檔案 %1 的傳輸。" + +#: 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 "您被邀請參加一個會議(使用 GnomeMeeting)" + +#: network/applications/gnomemeeting.cpp:118 +#, kde-format +msgid "Starting GnomeMeeting. Connecting to %1." +msgstr "啟動 GnomeMeeting。連線到 %1" + +#: network/applications/gnomemeeting.cpp:161 +msgid "Inviting the contact to a meeting." +msgstr "邀請此聯絡人加入會談" + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It is 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 contact's desktop." +msgstr "您被邀請分享此人的桌面。" + +#: network/applications/msnremotedesktop.cpp:159 +#, kde-format +msgid "Starting KRDC. Connecting to %1." +msgstr "啟動 KRDC。連線到 %1" + +#: network/applications/p2papplication.cpp:215 +msgid "The contact has invited you to an activity not yet supported by KMess." +msgstr "聯絡人邀請您參與某個活動,但此功能還未被開發。" + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:687 +#: network/applications/p2papplication.cpp:1242 +#: network/applications/p2papplication.cpp:1637 +#: network/applications/p2papplication.cpp:1763 +#: network/applications/p2papplication.cpp:1887 +#: network/applications/p2papplicationbase.cpp:704 +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess does not " +"support it." +msgstr "邀請被取消。聯絡人傳送了錯誤的資料,或 KMess 不支援它" + +#: network/applications/p2papplication.cpp:1085 +msgid "The transfer failed. Data preparation failed." +msgstr "傳輸失敗。資料準備失敗。" + +#: network/applications/p2papplication.cpp:1192 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "邀請被取消。訊息並未導向到我們。" + +#: network/applications/p2papplication.cpp:1744 +#: network/applications/p2papplicationbase.cpp:853 +#: network/applications/p2papplicationbase.cpp:933 +msgid "" +"The transfer failed. The contact sent bad data, or KMess does not support it." +msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援。" + +#: network/applications/p2papplication.cpp:1810 +#: network/applications/p2papplication.cpp:1828 +#: network/applications/p2papplication.cpp:1860 +msgid "The contact rejected the invitation. An internal error occurred." +msgstr "聯絡人拒絕邀請。發生一個內部錯誤。" + +#: network/applications/p2papplication.cpp:2101 +#: network/extra/msnftpconnection.cpp:389 +#, kde-format +msgid "Awaiting connection at %1, port %2" +msgstr "等待 %1,連接埠 %2 的連結" + +#: network/applications/p2papplication.cpp:2144 +#: network/applications/p2papplication.cpp:3378 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "轉回成非直接傳輸(這有可能會慢)" + +#: network/applications/p2papplication.cpp:3169 +msgid "Waiting for connection" +msgstr "等候連線" + +#: network/applications/p2papplication.cpp:3423 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for the contact to " +"accept." +msgstr "邀請取消。等候聯絡人接受逾時。" + +#: network/applications/p2papplication.cpp:3432 +msgid "" +"The invitation was cancelled. A timeout occurred waiting for a connection to " +"succeed or fail." +msgstr "邀請取消。等候連線 成功/失敗 逾時。" + +#: network/applications/p2papplication.cpp:3499 +#: network/applications/p2papplication.cpp:3583 +msgid "The invitation was cancelled. A timeout occurred waiting for data." +msgstr "邀請取消。等候資料逾時。" + +#: network/applications/p2papplicationbase.cpp:620 +#: network/applications/p2papplicationbase.cpp:1043 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "聯絡人拒絕邀請。發生一個內部錯誤。" + +#: network/applications/p2papplicationbase.cpp:627 +msgid "The transfer failed." +msgstr "傳輸失敗" + +#: network/applications/p2papplicationbase.cpp:1028 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "傳輸失敗。等候使用者接受逾時" + +#: network/applications/p2papplicationbase.cpp:1047 +msgid "The transfer failed. An internal error occured." +msgstr "傳輸失敗。發生一個內部錯誤。" + +#: network/applications/p2papplicationbase.cpp:1208 +msgid "The transfer failed. Could not 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 could not be opened." +msgstr "邀請被取消。無法開啟音效裝置。" + +#: network/applications/voiceconversation.cpp:218 +#, kde-format +msgid "Start voice conversation. Connecting to %1." +msgstr "啟動語音交談。連線到 %1" + +#: network/applications/voiceconversation.cpp:224 +#, kde-format +msgid "Start voice conversation. Listening on %1." +msgstr "啟動語音交談。聆聽 %1" + +#: network/applications/voiceconversation.cpp:289 +msgid "Inviting the contact to a voice conversation." +msgstr "邀請聯絡人至語音交談" + +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146, kde-format +msgid "The contact is inviting you for '%1', but this is not implemented yet." +msgstr "聯絡人邀請您 '%1',但此功能還未被開發。" + +#: 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 contact's webcam." +msgstr "有人邀請您分享他的視訊。" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "網路攝影機" + +#: network/extra/msnftpconnection.cpp:120 +#, kde-format +msgid "You have cancelled the transfer of file "%1"." +msgstr "您取消的檔案 %1 的傳輸。" + +#: network/extra/msnftpconnection.cpp:126 +#, kde-format +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "聯絡人取消的檔案 %1 的傳輸。" + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "失敗" + +#: network/extra/msnftpconnection.cpp:204 +#, kde-format +msgid "Sending file %1" +msgstr "傳送檔案 %1" + +#: network/extra/msnftpconnection.cpp:398, kde-format +msgid "The transfer of %1 failed. Could not open a local port." +msgstr "%1 的傳輸失敗。無法開啟本地端連接埠。" + +#: network/extra/msnftpconnection.cpp:399 +msgid "Could not open a local port." +msgstr "無法開啟本地端連接埠。" + +#: network/extra/msnftpconnection.cpp:456 +msgid "Initiating file transfer" +msgstr "初始化檔案傳輸" + +#: network/extra/msnftpconnection.cpp:469 +#, kde-format +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "%1 的傳輸失敗。無法建立連線。" + +#: network/extra/msnftpconnection.cpp:470 +msgid "Unable to make a connection." +msgstr "無法建立連結" + +#: network/extra/msnftpconnection.cpp:574 +#, kde-format +msgid "Receiving file %1" +msgstr "正接收檔案 %1" + +#: network/msnconnection.cpp:377 +msgid "Invalid command syntax" +msgstr "不合法的指令語法" + +#: network/msnconnection.cpp:381 +msgid "Invalid command parameter" +msgstr "不合法的指令參數" + +#: network/msnconnection.cpp:384 +msgid "The email address you have tried to add is not a Live Messenger account" +msgstr "您試著加入的電子郵件地址不是 Live Messenger 的帳號" + +#: network/msnconnection.cpp:389 +msgid "Domain name missing" +msgstr "沒有網域名稱" + +#: network/msnconnection.cpp:393 +msgid "Already logged in" +msgstr "已登入" + +#: network/msnconnection.cpp:396 +msgid "The given account name is invalid" +msgstr "給定的帳號不合法" + +#: network/msnconnection.cpp:400 +msgid "" +"This account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "帳號名稱不合法,或是您的 Passport 帳號尚未確認。" + +#: network/msnconnection.cpp:403 msgid "Your contact list is full" msgstr "您的使用者名單已滿" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:408 +msgid "Invalid SBP parameter" +msgstr "不合法的 SBP 參數" + +#: network/msnconnection.cpp:411 msgid "This contact is already on your list" msgstr "此聯絡人已存在於您的聯絡人名單裡了" -#: network/msnnotificationconnection.cpp:2267 +#: network/msnconnection.cpp:415 msgid "This contact is not on your list" msgstr "此聯絡人並不在您的聯絡人名單裡" -#: network/msnnotificationconnection.cpp:2270 +#: network/msnconnection.cpp:419 msgid "This contact is not online" msgstr "此聯絡人未上線" -#: network/msnnotificationconnection.cpp:2279 -msgid "Your contact list has too many groups" -msgstr "您的聯絡人名單有太多的群組" +#: network/msnconnection.cpp:424 +msgid "Already in this mode" +msgstr "已經在此模式" -#: network/msnnotificationconnection.cpp:2282 -msgid "This group can't be changed" +#: network/msnconnection.cpp:428 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list" +msgstr "此聯絡人無法同時被加入允許與阻擋的清單中。" + +#: network/msnconnection.cpp:432 +msgid "" +"The group name is already present in your contact list. Please use a " +"different name" +msgstr "此群組名稱已經在您的聯絡人清單中。請使用其他的名稱。" + +#: network/msnconnection.cpp:436 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30" +msgstr "您的聯絡人清單中的群組過多。您最多只能有三十個群組。" + +#: network/msnconnection.cpp:440 +msgid "This group cannot be changed" msgstr "此群組無法變更" -#: network/msnnotificationconnection.cpp:2285 +#: network/msnconnection.cpp:445 +msgid "Contact is not added to this group" +msgstr "聯絡人尚未加入此群組" + +#: network/msnconnection.cpp:449 msgid "This group is not empty" msgstr "此群組不是空的" -#: network/msnnotificationconnection.cpp:2288 -msgid "" -"The group name is already in use by your Messenger or Hotmail contact list" -msgstr "此群組名稱已被您的 Messenger 或 Hotmail 聯絡人名單所使用" +#: network/msnconnection.cpp:453 +msgid "The group name is too long; it cannot be longer than 61 bytes" +msgstr "群組名稱太長;不能大於 61 個位元。" -#: network/msnnotificationconnection.cpp:2291 -msgid "The group name is too long" -msgstr "此群組名稱太長" +#: network/msnconnection.cpp:458 +msgid "Attempted to change group \"0\"" +msgstr "嘗試變更群組 \"0\"" -#: network/msnnotificationconnection.cpp:2300 +#: network/msnconnection.cpp:458 +#, kde-format +msgid "There was an internal error in KMess: %1" +msgstr "KMess 有一個內部錯誤:%1" + +#: network/msnconnection.cpp:462 +msgid "Invalid Group" +msgstr "不合法的群組" + +#: network/msnconnection.cpp:466 +msgid "Empty domain" +msgstr "空白的網域" + +#: network/msnconnection.cpp:470 +msgid "Wrong ADL command format" +msgstr "錯誤的 ADL 指令格式" + +#: network/msnconnection.cpp:473 msgid "Switchboard server failed" msgstr "交換伺服器錯誤" -#: network/msnnotificationconnection.cpp:2303 +#: network/msnconnection.cpp:476 msgid "Transfer to switchboard server failed" msgstr "傳送到交換伺服器發生錯誤" -#: network/msnnotificationconnection.cpp:2306 +#: network/msnconnection.cpp:480 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "直接連結 (MSNSLP) 錯誤,連結失敗" -#: network/msnnotificationconnection.cpp:2316 -msgid "Error accessing contact list, try again later" -msgstr "存取連絡人清單錯誤。過會兒再試。" +#: network/msnconnection.cpp:484 +msgid "Required field missing" +msgstr "需要的欄位遺失" -#: network/msnnotificationconnection.cpp:2322 -msgid "Your account is banned." -msgstr "你的帳號被禁止了。" +#: network/msnconnection.cpp:488 +msgid "Not logged in" +msgstr "未登入" -#: network/msnnotificationconnection.cpp:2330 -msgid "You're opening sessions too rapidly" -msgstr "您開啟程序太過頻繁" +#: network/msnconnection.cpp:492 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the Live Messenger service" +msgstr "此帳號被拒絕使用 Live Messenger 服務。" -#: network/msnnotificationconnection.cpp:2333 -msgid "You have too many sessions opened" -msgstr "您開啟太多程序" +#: network/msnconnection.cpp:497 +msgid "Command is disabled" +msgstr "指令已關閉" -#: network/msnnotificationconnection.cpp:2341 +#: network/msnconnection.cpp:500 +msgid "Your account is banned" +msgstr "您的帳號被列入黑名單了。" + +#: network/msnconnection.cpp:504 +msgid "Challenge response failed" +msgstr "挑戰回應失敗" + +#: network/msnconnection.cpp:509 +msgid "Bad command data" +msgstr "錯誤的指令資料" + +#: network/msnconnection.cpp:513 +msgid "You are opening chat sessions too fast" +msgstr "您開啟聊天階段太過頻繁" + +#: network/msnconnection.cpp:517 +msgid "You have too many open chat sessions" +msgstr "您開啟太多的聊天階段" + +#: network/msnconnection.cpp:524 +msgid "Unexpected command sequence" +msgstr "非預期的指令順序" + +#: network/msnconnection.cpp:528 msgid "Bad friend name" msgstr "壞朋友的名稱" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:534 +msgid "Bad CVR data" +msgstr "錯誤的 CVR 資料" + +#: network/msnconnection.cpp:540 +msgid "The server reports KMess is flooding it with too much data" msgstr "伺服器回報 KMess 湧入太多資料" -#: network/msnnotificationconnection.cpp:2359 -msgid "You can't start a chat with someone while you are invisible." +#: network/msnconnection.cpp:547 +msgid "Authentication ticket was incorrect" +msgstr "認證資料不正確" + +#: network/msnconnection.cpp:550 +msgid "You cannot start a chat with someone while you are invisible" msgstr "您不能以隱形的狀態開啟交談" -#: network/msnnotificationconnection.cpp:2362 -msgid "You have a kids passport, you need parental consent to chat online." -msgstr "您有一個受限的 passport ,您需要家長的允許來上線聊天。" +#: network/msnconnection.cpp:554 +msgid "Not accepting new contacts" +msgstr "不接受新的聯絡人" -#: network/msnnotificationconnection.cpp:2366 -msgid "Your passport needs to be verified first." -msgstr "您的 passport 需要先經過確認" +#: network/msnconnection.cpp:558 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online" +msgstr "您有一個兒童 Passport 帳號,您需要家長的同意才能上線聊天。" -#: network/msnnotificationconnection.cpp:2388 -msgid "KMess - MSN error" -msgstr "KMess - MSN 錯誤" +#: network/msnconnection.cpp:561 +msgid "Your Passport account needs to be verified first" +msgstr "您的 Passport 帳號需要先經過認證。" -#: network/msnnotificationconnection.cpp:2401 -msgid "There was an internal server error" -msgstr "內部伺服器發生錯誤" +#: network/msnconnection.cpp:565 +msgid "Bad USR ticket" +msgstr "錯誤的 USR 票" -#: network/msnnotificationconnection.cpp:2411 -msgid "The server is too busy" -msgstr "伺服器忙碌" +#: network/msnconnection.cpp:575 +msgid "Error accessing contact list, try again later" +msgstr "存取連絡人清單錯誤。過會兒再試。" -#: network/msnnotificationconnection.cpp:2416 -msgid "The server is unavailable" -msgstr "伺服器不可用" +#: network/msnconnection.cpp:584 +msgid "" +"The Live Messenger service is temporarily unavailable. There was an internal " +"server error" +msgstr "Live Messenger 服務暫時無法使用,因為發生內部錯誤。" -#: network/msnnotificationconnection.cpp:2419 +#: network/msnconnection.cpp:595 +msgid "" +"The Live Messenger service is temporarily unavailable. The server is too busy" +msgstr "Live Messenger 服務暫時無法使用,因為伺服器過於忙碌" + +#: network/msnconnection.cpp:599 msgid "Peer notification server down" msgstr "通知伺服器已關機" -#: network/msnnotificationconnection.cpp:2423 +#: network/msnconnection.cpp:603 msgid "The server is going down" msgstr "伺服器將關機" -#: network/msnnotificationconnection.cpp:2426 +#: network/msnconnection.cpp:607 msgid "The server is going down soon" msgstr "伺服器即將關機" -#: network/msnnotificationconnection.cpp:2430 +#: network/msnconnection.cpp:612 msgid "Write is blocking" msgstr "Write is blocking" -#: network/msnnotificationconnection.cpp:2433 +#: network/msnconnection.cpp:616 msgid "Session is overloaded" msgstr "程序過載" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:623 msgid "The server is not available" msgstr "伺服器不可用" -#: network/msnnotificationconnection.cpp:2441 +#: network/msnconnection.cpp:627 msgid "Authentication failed" msgstr "認證失敗" -#: network/msnnotificationconnection.cpp:2444 -msgid "Not accepting new principals" -msgstr "不接受新的規則" - -#: network/msnnotificationconnection.cpp:2453 -msgid "KMess received an unknown error message from the server: %1" -msgstr "KMess 從伺服器收到一個未知的錯誤訊息:%1" - -#: network/msnnotificationconnection.cpp:2594 -msgid "Warning: Server closes for maintenance in 1 minute!" -msgstr "警告:伺服器在一分鐘後將關閉維護!" - -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:634 +#, kde-format msgid "" -"The MSN Server has reported it will be going down in one minute for " -"maintenance." -msgstr "MSN 伺服器報告說將在一分鐘後關閉維護。" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "從伺服器收到一個不明的錯誤代碼:%1
技術詳情:%2" -#: network/msnnotificationconnection.cpp:2601 -msgid "Warning: Server closes for maintenance in %1 minutes!" -msgstr "警告:伺服器將在 %1 分鐘後關閉維護!" +#: network/msnconnection.cpp:651 network/msnnotificationconnection.cpp:2906 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN 錯誤" -#: network/msnnotificationconnection.cpp:2896 -#: network/msnnotificationconnection.cpp:3155 +#: network/msnconnection.cpp:956 +msgid "Trying the HTTP fallback..." +msgstr "嘗試 HTTP 的預設值..." + +#: network/msnnotificationconnection.cpp:1337 +msgid "Authenticating..." +msgstr "認證中..." + +#: network/msnnotificationconnection.cpp:1361 +msgid "Authenticated" +msgstr "已認證" + +#: network/msnnotificationconnection.cpp:1431 +msgid "Switching to another server..." +msgstr "切換到其它伺服器..." + +#: network/msnnotificationconnection.cpp:1795 +msgid "Connecting..." +msgstr "連線中..." + +#: network/msnnotificationconnection.cpp:1940 +#, kde-format +msgid "Unknown command received from the server: %1" +msgstr "從伺服器收到不明的指令:%1" + +#: network/msnnotificationconnection.cpp:2100 +#, kde-format +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 分鐘" + +#: network/msnnotificationconnection.cpp:2103 +#, kde-format +msgid "Server closes for maintenance in %1!" +msgstr "伺服器將在 %1 內關閉維護!" + +#: network/msnnotificationconnection.cpp:2108, kde-format +msgctxt "Server maintenance dialog box text" +msgid "The Live Messenger server will be going down in %1 for maintenance." +msgstr "Live Messenger 伺服器將在 %1 內關閉維護。" + +#: network/msnnotificationconnection.cpp:2309 +#, kde-format +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess 無法處理離線訊息。
詳情:%1" + +#: network/msnnotificationconnection.cpp:2310 +msgid "SOAP client is no longer valid." +msgstr "SOAP 客戶端程式已經不能再使用了。" + +#: network/msnnotificationconnection.cpp:2580 +msgid "Authentication time limit exceeded" +msgstr "超過認證時間限制" + +#: network/msnnotificationconnection.cpp:2750 +msgid "Waiting for contact list..." +msgstr "等候使用者名單" + +#: network/msnnotificationconnection.cpp:2796 +#, kde-format +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

警告:%1

" + +#: network/msnnotificationconnection.cpp:2797 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "MSN 警告" + +#: network/msnnotificationconnection.cpp:2869 +#, kde-format +msgid "
Internal error reason: %1" +msgstr "
內部錯誤理由:%1" + +#: network/msnnotificationconnection.cpp:2904 +msgctxt "Connection error: dialog box" msgid "" -"KMess could not process Offline-IM messages.\n" -"\n" -"Details: %1" +"

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

" +msgstr "

認證失敗,請核對您的電子信箱帳號和密碼。

" + +#: network/msnnotificationconnection.cpp:2917 +#, kde-format +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

帳號 %1 從另一個位置連線。

" + +#: network/msnnotificationconnection.cpp:2920 +#, kde-format +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 "" -"KMess 無法進行離線即時通訊訊息。\n" -"\n" -"細節:%1" +"

您被斷線了:您使用其他的 Messenger 軟體或從氣他地方以此帳號 %1 連" +"線。

" -#: network/msnnotificationconnection.cpp:3163 +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: passive notification message" msgid "" -"Authentication failed, KMess could not process the passport login.\n" -"\n" -"Details: %1" -msgstr "" -"認證失敗。KMess 無法進行passport 登入。\n" -"\n" -"細節:%1" +"

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

" +msgstr "

無法連線到 Live Messenger 服務。
或許您在存取網路之前需要認證?

" -#: network/msnnotificationconnection.cpp:3170 +#: network/msnnotificationconnection.cpp:2935 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"KMess could not access the remote webservice.\n" -"\n" -"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.
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" -"\n" -"細節:%1" +"

KMess 無法連線到 Live Messenger 伺服器。
可能是您的網際網路連線有問" +"題,或是 Live Messenger 伺服器暫時關閉。
也有可能是到網頁或代理伺服器需要" +"存取網路的認證。

點選這裡來造訪 Messenger 服務狀態頁" +"面。

" -#: network/msnswitchboardconnection.cpp:982 -msgid "This person is offline or invisible." -msgstr "此人離線或隱形" +#: network/msnnotificationconnection.cpp:2954 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

無法連線到 Live Messenger 服務。

" -#: network/msnswitchboardconnection.cpp:1052 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "此聯絡人使用了一個 KMess 無法處理的 MSN7 特色" - -#: network/msnswitchboardconnection.cpp:1648 -msgid "The message \"%1\" was not received!" -msgstr "訊息 \"%1\" 沒有被收到" - -#: network/soap/httpsoapconnection.cpp:594 -msgid "Unable to make a connection: %1" -msgstr "無法對 %1 連結" - -#: network/soap/passportloginservice.cpp:221 -msgid "Too many redirects by login service" -msgstr "登入服務有太多重新導向" - -#: network/tcpconnectionbase.cpp:223 -msgid "Connection timeout" -msgstr "連線逾時" - -#: notification/notificationchat.cpp:169 -msgid "In %1's chat: %2" -msgstr "在 %1 的交談:%2" - -#: notification/notificationchat.cpp:172 -msgid "%1 says:
'%2'" -msgstr "%1說:
'%2'" - -#: notification/notificationchat.cpp:175 -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 傳送一個離線訊息:
'%2'" - -#: notification/notificationchat.cpp:181 -msgid "%1's chat requests attention!" -msgstr "%1 的交談需要注意!" - -#: notification/notificationchat.cpp:186 -msgid "%1:
%2" -msgstr "%1
%2" - -#: notification/notificationchat.cpp:193 -msgid "%1 has sent you a nudge!" -msgstr "%1傳送了一個來電振動給你" - -#: notification/notificationchat.cpp:196 -msgid "%1 has sent you a wink!" -msgstr "%1傳送了一個動畫圖示給你!" - -#: notification/notificationchat.cpp:202 -msgid "%1 wants to use the webcam!" -msgstr "%1想要使用網路攝影機!" - -#: notification/notificationchat.cpp:203 -msgid "%1 is sending you a file!" -msgstr "%1 傳送給你一個檔案!" - -#: notification/notificationchat.cpp:204 -msgid "%1 has sent you an invitation!" -msgstr "%1 傳送給你一個邀請!" - -#: notification/notificationchat.cpp:210 -msgid "%1 has canceled the webcam session!" -msgstr "%1 取消了網路攝影機程序" - -#: notification/notificationchat.cpp:211 -msgid "%1 has canceled the file transfer!" -msgstr "%1取消了檔案傳輸!" - -#: notification/notificationchat.cpp:212 -msgid "%1's activity has been canceled!" -msgstr "%1 的行動被取消!" - -#: notification/notificationchat.cpp:218 -msgid "%1 has accepted to use the webcam!" -msgstr "%1 接受使用網路攝影機!" - -#: notification/notificationchat.cpp:219 -msgid "%1 has accepted the file transfer!" -msgstr "%1 接受檔案傳輸!" - -#: notification/notificationchat.cpp:220 -msgid "%1 has accepted your invitation!" -msgstr "%1 接受你的邀請!" - -#: notification/notificationchat.cpp:226 -msgid "%1 has ended the webcam session!" -msgstr "%1結束了網路攝影機程序!" - -#: notification/notificationchat.cpp:227 -msgid "The file transfer with %1 is done!" -msgstr "與%1的檔案傳輸完成!" - -#: notification/notificationchat.cpp:228 -msgid "%1's activity has ended!" -msgstr "%1的行動已結束!" - -#: notification/notificationchat.cpp:234 -msgid "%1's webcam session has failed!" -msgstr "%1的網路攝影機程序失敗!" - -#: notification/notificationchat.cpp:235 -msgid "The file transfer with %1 has failed!" -msgstr "與%1 的檔案傳輸失敗!" - -#: notification/notificationchat.cpp:236 -msgid "%1's activity has ended with an error!" -msgstr "%1的行動錯誤結束!" - -#: notification/notificationcontactstatus.cpp:66 -msgid "%1 has gone away" -msgstr "%1 已經走了" - -#: notification/notificationcontactstatus.cpp:67 -msgid "%1 will be right back" -msgstr "%1 馬上回來" - -#: notification/notificationcontactstatus.cpp:68 -msgid "%1 is now busy" -msgstr "%1 現在正忙" - -#: notification/notificationcontactstatus.cpp:69 -msgid "%1 has logged out" -msgstr "%1 已經登出" - -#: notification/notificationcontactstatus.cpp:70 -msgid "%1 has become invisible" -msgstr "%1 已經隱身" - -#: notification/notificationcontactstatus.cpp:71 -msgid "%1 has gone idle" -msgstr "%1 發呆" - -#: notification/notificationcontactstatus.cpp:72 -msgid "%1 is out for lunch" -msgstr "%1 外出用餐" - -#: notification/notificationcontactstatus.cpp:73 -msgid "%1 is on the phone" -msgstr "%1 正在講電話" - -#: notification/notificationcontactstatus.cpp:74 -msgid "%1 is now online" -msgstr "%1 正在線上" - -#: notification/notificationnewemail.cpp:72 -msgid "New email:
'%1'
by '%2'" -msgstr "新 email
'%2' 來的
'%1'" - -#. i18n: file ./chat/chatviewinterface.ui line 143 -#: rc.cpp:6 -#, no-c-format -msgid "S&end" -msgstr "傳送(&e)" - -#. i18n: file ./chat/chatviewinterface.ui line 168 -#: rc.cpp:12 -#, no-c-format -msgid "Ne&w Line" -msgstr "新一行(&w)" - -#. i18n: file ./chat/chatviewinterface.ui line 264 -#: rc.cpp:18 -#, no-c-format -msgid "Sidebar" -msgstr "側邊列" - -#. i18n: file ./chat/contactframeinterface.ui line 132 -#: rc.cpp:25 -#, fuzzy, no-c-format -msgid "The contact is listening to music" -msgstr "此聯絡人並不在您的聯絡人名單裡" - -#. i18n: file ./chat/contactframeinterface.ui line 205 -#: rc.cpp:29 -#, no-c-format -msgid "Click here to display this contact's profile." -msgstr "按這裡來顯示連絡人資訊" - -#. i18n: file ./chat/contactframeinterface.ui line 261 -#: rc.cpp:32 -#, no-c-format -msgid "Click to send an email to this contact." -msgstr "按這裡來傳送 email 給這個連絡人" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 122 -#: rc.cpp:39 -#, no-c-format -msgid "Enter a shortcut for this emoticon:" -msgstr "給這個表情輸入一個快捷鍵:" - -#. i18n: file ./dialogs/addemoticondialoginterface.ui line 155 -#: rc.cpp:42 -#, no-c-format -msgid "Select an image file:" -msgstr "選擇一個影像檔案" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 16 -#: rc.cpp:49 -#, no-c-format -msgid "Add contact" -msgstr "新增聯絡人" - -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 28 -#: rc.cpp:52 -#, no-c-format +#: network/msnnotificationconnection.cpp:2956 +#, kde-format +msgctxt "Connection error: detailed message" msgid "" -"%1\n" -"has added you to his or her contact list. Do you want to:" +"

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 "" -"%1\n" -"已經將你加入 他/她 的聯絡人清單。你想要:" +"

KMess 無法連線到 Live Messenger 伺服器。
可能是您的網際網路連線有問" +"題,或是 Live Messenger 伺服器暫時關閉。

點選這裡來造" +"訪 Messenger 服務狀態頁面。

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 39 -#: rc.cpp:56 -#, no-c-format -msgid "&Add this contact to your \"Friends\" list" -msgstr "將此加入你的朋友清單(&A)" +#: network/msnnotificationconnection.cpp:2967 +#, kde-format +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

錯誤:%1

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 47 -#: rc.cpp:59 -#, no-c-format -msgid "&Not add this contact, but let them see your online state" -msgstr "不新加此聯絡人,但是讓他能看見你的狀態(&N)" +#: network/msnnotificationconnection.cpp:2969 +#, kde-format +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Live Messenger 伺服器回報一個錯誤:

%1

" -#. i18n: file ./dialogs/contactaddeduserdialoginterface.ui line 55 -#: rc.cpp:62 -#, no-c-format -msgid "Block this person from contacting &you or seeing your online state" -msgstr "封鎖此人,使他不能聯絡你,或瞧見你的上線狀態(&y)" +#: network/msnnotificationconnection.cpp:2980 +#, kde-format +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Messeenger 服務錯誤:%1

" -#. i18n: file ./dialogs/transferwindowinterface.ui line 79 -#: rc.cpp:80 -#, fuzzy, no-c-format -msgid "Cl&ean up" -msgstr "清除(&u)" +#: network/msnnotificationconnection.cpp:2982 +#, kde-format +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Live Messenger 伺服器回報一個錯誤:

%1

" -#. i18n: file ./initialviewinterface.ui line 183 -#: rc.cpp:95 -#, no-c-format -msgid "Enter your login information:" -msgstr "請輸入你的登入訊息:" +#: network/msnnotificationconnection.cpp:2990 +#, kde-format +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

KMess 錯誤:%1

" -#. i18n: file ./initialviewinterface.ui line 215 -#: rc.cpp:98 -#, no-c-format -msgid "Email address" -msgstr "電子郵件位址" +#: network/msnnotificationconnection.cpp:2992 +#, kde-format +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess 遭遇一個內部錯誤:

%1

" -#. i18n: file ./initialviewinterface.ui line 491 -#: rc.cpp:101 -#, no-c-format -msgid "Password" -msgstr "密碼" +#: network/msnnotificationconnection.cpp:3003 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

失去網路連線。

" -#. i18n: file ./initialviewinterface.ui line 788 -#: rc.cpp:104 -#, no-c-format -msgid "Status at login" -msgstr "登入時的狀態" +#: network/msnnotificationconnection.cpp:3005 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

失去與 Live Messenger 伺服器的連線。%1

" -#. i18n: file ./initialviewinterface.ui line 1065 -#: rc.cpp:107 -#, no-c-format -msgid "Remem&ber this profile" -msgstr "記住這個帳號 (&b)" +#: network/msnnotificationconnection.cpp:3061 +#, kde-format +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

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

" +msgstr "

開發者資訊:
錯誤號碼: %1
錯誤字串: %2

" -#. i18n: file ./initialviewinterface.ui line 1387 -#: rc.cpp:114 -#, no-c-format -msgid "Connect" -msgstr "連線" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "請輸入您在網路代理伺服器上的的帳號與密碼。" -#. i18n: file ./kmessviewinterface.ui line 146 -#: rc.cpp:123 -#, no-c-format -msgid "Enter your personal message here" -msgstr "請在此輸入你的個人訊息" +#: network/msnsockethttp.cpp:686 +#, kde-format +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1(內部錯誤代碼:%2)" -#. i18n: file ./kmessviewinterface.ui line 322 -#: rc.cpp:126 -#, no-c-format -msgid "Listening to %1" -msgstr "正聆聽 %1" +#: network/msnsockethttp.cpp:696 +#, kde-format +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" -#. i18n: file ./notification/passivepopupinterface.ui line 45 -#: rc.cpp:130 -#, no-c-format -msgid "KMess Notification" -msgstr "KMess 提示" +#: network/msnsockettcp.cpp:364 +msgid "Connection time limit exceeded" +msgstr "超過連線時間限制" -#. i18n: file ./settings/accountswidgetinterface.ui line 16 -#: rc.cpp:136 -#, no-c-format +#: network/msnsockettcp.cpp:380 +msgid "1 ping lost" +msgstr "1 ping lost" + +#: network/msnsockettcp.cpp:384 +#, kde-format +msgid "%1 pings lost" +msgstr "%1 pings lost" + +#: network/msnsockettcp.cpp:400 +msgid "The connection to the server was lost" +msgstr "失去與伺服器的連線" + +#: network/soap/addressbookservice.cpp:777 +#, kde-format +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "特定的電子郵件,\"%1\",不是一個正確的郵件位址!" + +#: network/soap/addressbookservice.cpp:787 +#, kde-format +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "特定的電子郵件,\"%1\",不屬於 Live Messenger 帳號!" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "不合法的網路服務要求 (%1)" + +#: network/soap/httpsoapconnection.cpp:408 +#, kde-format +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "這個網路服務是不能存取的 (%1)" + +#: network/soap/httpsoapconnection.cpp:479 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "網頁服務發出太多重新導向" + +#: network/soap/httpsoapconnection.cpp:523 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "離線訊息網頁伺服器目前無法使用" + +#: network/soap/httpsoapconnection.cpp:529 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "Live Messenter 網頁伺服器目前發生問題" + +#: network/soap/httpsoapconnection.cpp:543 +#, kde-format +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "不合法的網路服務回應 %1 (%2)" + +#: network/soap/httpsoapconnection.cpp:582 +msgctxt "Error message" +msgid "No response from web service" +msgstr "沒有從網路服務來的回應" + +#: network/soap/passportloginservice.cpp:208 +#, kde-format +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "從伺服器來的未預期回應 (%1)" + +#: notification/chatnotification.cpp:172 +#, kde-format +msgid "In %1's chat:
%2" +msgstr "在 %1 的聊天室:
%2" + +#: notification/chatnotification.cpp:176 +#, kde-format +msgid "%1 says:
'%2'" +msgstr "%1 說:
「%2」" + +#: notification/chatnotification.cpp:180 +#, kde-format +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 傳送一個離線訊息給您:
%2" + +#: notification/chatnotification.cpp:187 +#, kde-format +msgid "%1's chat requests attention!" +msgstr "與 %1 的聊天需要注意!" + +#: notification/chatnotification.cpp:192 +#, kde-format +msgid "%1:
%2" +msgstr "%1
%2" + +#: notification/chatnotification.cpp:199 +#, kde-format +msgid "%1 has sent you a handwritten message!" +msgstr "%1 送了一個手寫的訊息給您。" + +#: notification/chatnotification.cpp:203 +#, kde-format +msgid "%1 has sent you a nudge!" +msgstr "%1傳送了一個來電振動給您。" + +#: notification/chatnotification.cpp:207 +#, kde-format +msgid "%1 has sent you a wink!" +msgstr "%1傳送了一個動畫快遞給您!" + +#: notification/chatnotification.cpp:213 +#, kde-format +msgid "%1 wants to use the webcam!" +msgstr "%1想要使用網路攝影機!" + +#: notification/chatnotification.cpp:214 +#, kde-format +msgid "%1 is sending you a file!" +msgstr "%1 正傳送一個檔案給您!" + +#: notification/chatnotification.cpp:215 +#, kde-format +msgid "%1 has sent you an invitation!" +msgstr "%1 已傳送一個邀請給您!" + +#: notification/chatnotification.cpp:222 +#, kde-format +msgid "%1 has canceled the webcam session!" +msgstr "%1 取消了網路視訊階段。" + +#: notification/chatnotification.cpp:223 +#, kde-format +msgid "%1 has canceled the file transfer!" +msgstr "%1 取消了檔案傳輸!" + +#: notification/chatnotification.cpp:224 +#, kde-format +msgid "%1's activity has been canceled!" +msgstr "%1 的活動已被取消。" + +#: notification/chatnotification.cpp:231 +#, kde-format +msgid "%1 has accepted to use the webcam!" +msgstr "%1 已接受使用網路攝影機。" + +#: notification/chatnotification.cpp:232 +#, kde-format +msgid "%1 has accepted the file transfer!" +msgstr "%1 已接受檔案傳輸!" + +#: notification/chatnotification.cpp:233 +#, kde-format +msgid "%1 has accepted your invitation!" +msgstr "%1已接受您的邀請。" + +#: notification/chatnotification.cpp:240 +#, kde-format +msgid "%1 has ended the webcam session!" +msgstr "%1 結束了網路視訊工作階段。" + +#: notification/chatnotification.cpp:241 +#, kde-format +msgid "The file transfer with %1 is done!" +msgstr "與 %1 的檔案傳輸完成!" + +#: notification/chatnotification.cpp:242 +#, kde-format +msgid "%1's activity has ended!" +msgstr "%1 的活動已結束!" + +#: notification/chatnotification.cpp:249 +#, kde-format +msgid "%1's webcam session has failed!" +msgstr "%1 的網路視訊工作階段已失敗!" + +#: notification/chatnotification.cpp:250 +#, kde-format +msgid "The file transfer with %1 has failed!" +msgstr "與 %1 的檔案傳輸已失敗!" + +#: notification/chatnotification.cpp:251 +#, kde-format +msgid "%1's activity has ended with an error!" +msgstr "%1 的活動因為發生錯誤結束!" + +#: notification/contactstatusnotification.cpp:91 +#, kde-format +msgid "%1
is now online" +msgstr "%1
上線了。" + +#: notification/contactstatusnotification.cpp:92 +#, kde-format +msgid "%1
has gone away" +msgstr "%1
已經離開。" + +#: notification/contactstatusnotification.cpp:93 +#, kde-format +msgid "%1
will be right back" +msgstr "%1
馬上回來" + +#: notification/contactstatusnotification.cpp:94 +#, kde-format +msgid "%1
is now busy" +msgstr "%1
現在忙碌中。" + +#: notification/contactstatusnotification.cpp:95 +#, kde-format +msgid "%1
has become invisible" +msgstr "%1
隱身了。" + +#: notification/contactstatusnotification.cpp:96 +#, kde-format +msgid "%1
has gone idle" +msgstr "%1
變閒置了。" + +#: notification/contactstatusnotification.cpp:97 +#, kde-format +msgid "%1
has logged out" +msgstr "%1
已經登出。" + +#: notification/contactstatusnotification.cpp:98 +#, kde-format +msgid "%1
is on the phone" +msgstr "%1
正在講電話。" + +#: notification/contactstatusnotification.cpp:99 +#, kde-format +msgid "%1
is out for lunch" +msgstr "%1
外出用餐。" + +#: notification/newemailnotification.cpp:90 +#, kde-format +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 +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 保持在系統列執行。使用「連線」中的「結束」選單來結束程" +"式。" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "嵌入系統匣" + +#: notification/systemtraywidget.cpp:240 +#, kde-format +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, kde-format +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 "設定前一個影像..." + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: settings/accountpage.cpp:450 rc.cpp:375 +msgid "Display Picture" +msgstr "顯示圖片" + +#: settings/accountpage.cpp:480 +msgid "Downloading of display picture failed" +msgstr "下載顯示圖片失敗" + +#: settings/accountpage.cpp:539 +msgid "" +"An error occurred while trying to change the display picture.\n" +"Make sure that you have selected an existing image file." +msgstr "" +"嘗試改變顯示圖片時發生錯誤。\n" +"請確定您選擇了存在的圖片檔案。" + +#: 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 +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 "" +"點擊此處以從註冊帳號清單中刪除此帳號。\n" +"您不能刪除目前連線中的帳號,或是訪客帳號。訪客帳號在您離線時即會被刪除。" + +#: settings/accountsettingsdialog.cpp:206 +#, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "您輸入的電子郵件地址不合法,無法做為帳號:%1" + +#: settings/accountsettingsdialog.cpp:214 +#, kde-format +msgid "The email address you have entered is already in use: '%1'" +msgstr "您輸入的電子郵件地址已經在使用中:%1" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "您確定要刪除此帳號?" + +#: settings/accountsmanagerpage.cpp:160 +#, kde-format +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "您確定您要刪除帳號 %1 嗎?
所有此帳號的設定都將消失。" + +#: settings/chatstylepage.cpp:371 +msgid "Hi, how are you doing? :)" +msgstr "嗨!您好嗎?" + +#: settings/chatstylepage.cpp:372 +msgid "Stacy" +msgstr "跳舞俠" + +#: settings/chatstylepage.cpp:373 +msgid "Great!" +msgstr "好啊!" + +#: settings/chatstylepage.cpp:375 +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 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "取代已存在的表情符號" + +#: settings/emoticonspage.cpp:233 +#, kde-format +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 "KMess 設定" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "帳號" -#. i18n: file ./settings/accountswidgetinterface.ui line 27 -#: rc.cpp:139 -#, no-c-format -msgid "Your friendly name:" -msgstr "你的名稱" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "通知" -#. i18n: file ./settings/accountswidgetinterface.ui line 30 -#: rc.cpp:142 -#, no-c-format -msgid "Enter the name other contacts should see when you're online." -msgstr "請輸入當你上線時給其他使用者看的名稱" +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable web browsers detected." +msgstr "沒有偵測到任何可選取的瀏覽器。" -#. i18n: file ./settings/accountswidgetinterface.ui line 43 -#: rc.cpp:145 -#, no-c-format -msgid "Your email address:" -msgstr "您的電子郵件:" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "沒有偵測到任何可選取的電子郵件客戶端程式。" -#. i18n: file ./settings/accountswidgetinterface.ui line 46 -#: rc.cpp:148 -#, no-c-format +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom web browser!" +msgstr "您必須輸入命令列指令來啟動自訂的瀏覽器。" + +#: settings/miscellaneouspage.cpp:291, c-format msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"The console command you have specified to launch a custom web 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 "" -"輸入你的 MSN Passport 帳號。你可以在 http://register.passport.com/ 註冊一個新" -"帳號。" +"您輸入的指令中沒有 '%u' 參數。這樣無法連結到您要去的網址。
您確定" +"要這樣嗎?" -#. i18n: file ./settings/accountswidgetinterface.ui line 59 -#: rc.cpp:151 -#, no-c-format -msgid "Your password:" -msgstr "你的密碼" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "您必須輸入命令列指令來啟動自訂的郵件客戶端程式。" -#. i18n: file ./settings/accountswidgetinterface.ui line 62 -#: rc.cpp:154 -#, no-c-format +#: 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 emails will not work." +"
Do you want KMess to add it for you?" +msgstr "" +"您輸入的指令並未包含 '%u' 參數。這樣您無法發送信件。
您確定要這樣" +"做嗎?" + +#: 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 "以 KMess 傳送" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess 無法存取設定檔!

" + +#: utils/likeback/likeback.cpp:242 +msgid "&Send a Comment to the Developers" +msgstr "傳送意見給開發者" + +#: utils/likeback/likeback.cpp:251 +msgid "Show &Feedback Icons" +msgstr "顯示回饋圖示(&F)" + +#: utils/likeback/likeback.cpp:319, kde-format +msgctxt "Welcome dialog text, header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "歡迎使用 %1 的測試版本。" + +#: utils/likeback/likeback.cpp:324, kde-format +msgctxt "Welcome dialog text, header text for released apps" +msgid "Welcome to %1." +msgstr "歡迎使用 %1。" + +#: utils/likeback/likeback.cpp:332 +msgctxt "" +"Welcome dialog text, explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click on the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click on 'Send'." +msgstr "" +"當您有好的或不好的經驗,請點選視窗標題列底下的臉,表達您喜歡或不喜歡,然後按" +"「傳送」。" + +#: utils/likeback/likeback.cpp:339 +msgctxt "Welcome dialog text, explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click on the smiling face " +"below the window title-bar, briefly describe what you like and click on " +"'Send'." +msgstr "當您有好的經驗時,請點選視窗標題列底下的笑臉,表示您喜歡,然後按「傳送」。" + +#: utils/likeback/likeback.cpp:346 +msgctxt "Welcome dialog text, explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click on the frowning " +"face below the window title-bar, briefly describe what you dislike and click " +"on 'Send'." +msgstr "" +"當年有不好的經驗的時候,您可以點選視窗標題列下的皺眉頭的臉,表示您不喜歡,然" +"後按「傳送」。" + +#: utils/likeback/likeback.cpp:356 +msgctxt "Welcome dialog text, explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click on the " +"broken-object icon in the top-right corner of the window, describe the " +"behavior and click on 'Send'." +msgstr "" +"若您覺得應用程式中某些行為不恰當,只要點選視窗右上角的「破碎」圖示,描述一" +"下,然後按「傳送」。" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text, usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "我喜歡新的美工圖案,非常好看。" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text, usage example" +msgid "" +"I dislike the welcome page of this assistant. Too time consuming." +msgstr "我不喜歡小助手的歡迎頁面。太浪費時間。" + +#: utils/likeback/likeback.cpp:381 +msgctxt "Welcome dialog text, usage example" +msgid "" +"The application shows an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "點擊「新增」按鍵時,它的行為不正確。沒有任何作用。" + +#: utils/likeback/likeback.cpp:388 +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:401 +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:404 +msgctxt "Welcome dialog text, header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "範例" + +#: utils/likeback/likeback.cpp:410 +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:139 +#, kde-format +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(您可以用 線上翻譯工具)。
" + +#: utils/likeback/likebackdialog.cpp:146 +#, kde-format +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(您可以用線上翻譯工具)。
" + +#: utils/likeback/likebackdialog.cpp:159 +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:168 +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:174, kde-format +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 the developers a brief description of your opinions about " +"%1.
%2 %3%4

" +msgstr "

您可以提供開發者關於 %1 的您的意見的簡短描述。
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:216, kde-format +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "您輸入的電子郵件地址不合法,因此無法使用:%1" + +#: utils/likeback/likebackdialog.cpp:290 +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:293 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "意見已傳送" + +#: utils/likeback/likebackdialog.cpp:304 +msgctxt "Dialog box text" +msgid "" +"

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

Please, " +"try again later.

" +msgstr "

傳送報告時發生錯誤。

請稍後再試一次。

" + +#: utils/likeback/likebackdialog.cpp:306 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "意見傳送錯誤" + +#. 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 the standard text mode." +msgstr "點擊此按鍵切換到標準文字模式。" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Handwriting mode" +msgstr "手寫模式" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to the handwriting mode, so you can write or " +"paint a handwritten 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 Live Messenger emoticons, so you can " +"easily insert them in your messages." +msgstr "點擊此按鍵會顯示所有預設的 Live Messenger 表情圖示,您可以將它們加入訊息中。" + +#. 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 "" +"Click this button to show all custom emoticons, 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: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "聊天(&C)" + +#. 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 +msgid "Click here to display the menu for this contact" +msgstr "點擊此處以顯示此聯絡人的選單" + +#. i18n: file: chat/contactswidget.ui:107 +#. 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: 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:273 +msgid "Email address:" +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: 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 +msgid "Search through contacts..." +msgstr "在聯絡人間搜尋..." + +#. i18n: file: dialogs/chathistorydialog.ui:70 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" +msgstr "交談紀錄過濾器" + +#. i18n: file: dialogs/chathistorydialog.ui:84 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:99 +msgid "Filter by &chat" +msgstr "以聊天內容過濾(&C)" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (icons), widget (KAnimatedButton, loadingLabel_) +#: rc.cpp:102 +msgctxt "Do not translate: icon file name" +msgid "process-working" +msgstr "處理-工作中" + +#. i18n: file: dialogs/chathistorydialog.ui:149 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:105 +msgid "Filter by &date" +msgstr "以日期過濾(&d)" + +#. i18n: file: dialogs/chathistorydialog.ui:164 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:108 +msgid "from" +msgstr "從" + +#. i18n: file: dialogs/chathistorydialog.ui:181 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:111 +msgid "to" +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 the following groups of your contact list:" +msgstr "將此人加入您的聯絡人清單中的這些群組(&A):" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +msgid "&Do not add this person, but allow him or her to see your status" +msgstr "不要加入此人,只讓他們能看見我的上線狀態(&D)" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +msgid "&Block this person from contacting you and seeing your status" +msgstr "封鎖此人,他將無法聯繫您,也無法看到您的狀態(&B)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:65 +#. 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:68 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "回復(&R)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:179 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "群組(&G):" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:217 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this contact" +msgstr "對此人使用替代名稱(&A)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:227 +#. i18n: ectx: property (text), widget (QCheckBox, disableNotificationsCheckBox_) +#: rc.cpp:141 +msgid "Disable notifications for this contact" +msgstr "關閉此聯絡人的通知" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:236 +#. i18n: ectx: property (text), widget (QLabel, soundSelectLabel_) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "音效(&S):" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:273 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:147 +msgid "&Display Pictures" +msgstr "顯示圖片(&D)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:322 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:150 +msgid "Click here to use the selected picture as your display picture" +msgstr "點擊此處以使用選取的圖片做為顯示圖片" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:325 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Use As Display Picture" +msgstr "做為顯示圖片" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:332 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:156 +msgid "&Clear Cache" +msgstr "清除快取(&C)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:358 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:165 +msgid "" +"You can choose to hide any emoticon received from this contact. Just " +"right-click on a received emoticon and choose \"Hide this Emoticon\". With " +"this page, you can restore the hidden emoticons." +msgstr "" +"您可以選擇隱藏任何從聯絡人傳來的表情符號。只要在表情符號上點選右鍵,並選擇 " +"「隱藏這個表情符號」。您可以在此頁面回復隱藏的表情符號。" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:432 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:168 +msgid "Click here to restore the selected emoticon" +msgstr "點擊此處以回覆選取的表情符號" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:435 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:171 +msgid "Resto&re" +msgstr "回復(&R)" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:177 +msgid "Available Contacts" +msgstr "可用的聯絡人" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:180 +msgid "Invite a person not on your contact list:" +msgstr "邀請不在您清單中的聯絡人:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:183 +msgid "Enter the email address of a person to invite" +msgstr "請輸入要邀請的聯絡人的電子郵件地址" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:186 +msgid "Invited Contacts" +msgstr "已邀請的聯絡人" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:195 +msgid "Items to export:" +msgstr "要匯出的項目:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:198 +msgid "Format" +msgstr "格式" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:201 +msgid "CSV" +msgstr "CSV(逗號分隔)" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:204 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:207 +msgid "Contacts:" +msgstr "聯絡人:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:210 +msgid "Select All" +msgstr "全部選取" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:213 +msgid "Deselect All" +msgstr "全部取消選取" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:216 +msgid "Export..." +msgstr "匯出..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:219 +msgid "Close" +msgstr "關閉" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:225 +msgid "Command to Current Tab" +msgstr "對目前分頁下指令" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:228 +msgid "Command:" +msgstr "指令:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:231 +msgid "Type:" +msgstr "型態:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:234 +msgid "Standard" +msgstr "標準" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:237 +msgid "MIME" +msgstr "MIME協定" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:240 +msgid "Send" +msgstr "傳送" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:243 +msgid "Command payload (can be empty):" +msgstr "指令資料(可為空):" + +#. i18n: file: dialogs/transferentry.ui:135 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, filenameLabel_) +#. i18n: file: dialogs/transferentry.ui:160 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, statusLabel_) +#. i18n: file: kmessview.ui:379 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, nowListeningLabel_) +#: rc.cpp:246 rc.cpp:249 rc.cpp:342 +msgctxt "" +"Do not translate: undeletable default name, will be overwritten in the code" +msgid "KSqueezedTextLabel" +msgstr "KSqueezedTextLabel" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:252 +msgid "Open" +msgstr "開啟" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:255 +msgid "Cancel" +msgstr "取消" + +#. i18n: file: dialogs/transferwindow.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:258 +msgid "&Download" +msgstr "下載(&D)" + +#. i18n: file: dialogs/transferwindow.ui:108 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:261 +msgid "&Upload" +msgstr "上傳(&U)" + +#. i18n: file: dialogs/transferwindow.ui:134 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:264 +msgid "C&lean Up" +msgstr "清除(&L)" + +#. i18n: file: dialogs/transferwindow.ui:141 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:267 +msgid "&Close" +msgstr "關閉(&C)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:270 +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:276 +msgid "" +"Enter 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:279 +msgid "Password:" +msgstr "密碼:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:282 +msgid "Enter here your account's password" +msgstr "請輸入您的密碼" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:285 +msgid "Status at login:" +msgstr "登入時的狀態:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:288 +msgid "Choose a status to set when successfully connected." +msgstr "請選擇連線成功後要設定成哪一種狀態。" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:291 +msgid "If enabled, KMess will save your account" +msgstr "若開啟此選項,KMess 會儲存您的帳號設定" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:294 +msgid "Remem&ber account" +msgstr "記住帳號(&B)" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:300 +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:303 +msgid "R&emember password" +msgstr "記住密碼(&E)" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:309 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "點擊此按鍵開始使用 KMess,或是取消連線嘗試" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:315 +msgid "New Account" +msgstr "新增帳號" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:318 +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:321 +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 "" +"點擊此處以註冊新的 Live 帳號,以便連線到 MSN。
您可以使用您現有的電" +"子郵件地址。" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:324 +msgid "Password forgotten?" +msgstr "忘記密碼?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:327 +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:330 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "請點擊此處連線到 Live 網站,您可以重設您的密碼。" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:333 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "連線(&C)" + +#. i18n: file: kmessinterfaceui.rc:16 +#. i18n: ectx: Menu (view) +#: rc.cpp:336 +msgctxt "@title:menu" +msgid "&View" +msgstr "檢視(&V)" + +#. i18n: file: kmessinterfaceui.rc:34 +#. i18n: ectx: Menu (settings) +#: rc.cpp:339 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "動作(&A)" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:345 +msgid "Form" +msgstr "表單" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:348 +msgid "Account &Info" +msgstr "帳號資訊(&I)" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:351 +msgid "Your Account Information" +msgstr "您的帳號資訊" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:354 +msgid "Enter a name other contacts should see when you are connected." +msgstr "請輸入您要顯示給別人看的名稱。" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:357 +msgid "&Friendly name:" +msgstr "暱稱(&F):" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:360 +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:363 +msgid "&Email address:" +msgstr "電子郵件地址(&E):" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:366 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: file ./settings/accountswidgetinterface.ui line 89 -#: rc.cpp:157 -#, no-c-format -msgid "Display picture:" -msgstr "顯示圖片:" +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:369 +msgid "&Password:" +msgstr "密碼(&P):" -#. i18n: file ./settings/accountswidgetinterface.ui line 189 -#: rc.cpp:160 -#, no-c-format +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:372 +msgid "&Remember password" +msgstr "記住密碼(&R)" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:378 msgid "C&hange..." msgstr "改變...(&h)" -#. i18n: file ./settings/accountswidgetinterface.ui line 221 -#: rc.cpp:166 -#, no-c-format -msgid "Don't show a displa&y picture" -msgstr "不顯示圖片(&y)" +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:384 +msgid "&Do not use" +msgstr "不要使用(&D)" -#. i18n: file ./settings/accountswidgetinterface.ui line 232 -#: rc.cpp:172 -#, no-c-format -msgid "Remember the settings of this account" -msgstr "記住這個帳號的設定" - -#. i18n: file ./settings/accountswidgetinterface.ui line 237 -#: rc.cpp:175 -#, no-c-format +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 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 will not 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)." +"It is recommended to enable this option, unless you are using KMess as guest " +"or you are using a public system (e.g. Internet cafe)." msgstr "" -"「記得這個帳號」選項在登入時是不勾選的。所以預設裡,你的設定不會被保存。當你" -"想在系統裡保存這個帳號,請開啟這個選項。\n" +"「記住帳號」選項在登入時並未勾選,所以您的設定將不會被保留。若您希望保留您的" +"帳號設定,請開啟此選項。\n" "\n" -"建議你開啟此功能,除非你使用 guest 帳號登入,或你正在使用公共系統(例如:網咖)" +"除非您使用的是公共系統(例如:網咖的電腦)上的 KMess,否則建議您開啟此選項。" -#. i18n: file ./settings/accountswidgetinterface.ui line 245 -#: rc.cpp:180 -#, no-c-format -msgid "Login &with this account automatically at start-up" -msgstr "在啟動時,以此帳號自動登入(&w)" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:395 +msgid "Re&member the settings of this account" +msgstr "記住這個帳號的設定(&M)" -#. i18n: file ./settings/accountswidgetinterface.ui line 251 -#: rc.cpp:186 -#, no-c-format +#. i18n: file: settings/accountpage.ui:298 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:398 msgid "If enabled, KMess automatically logs in with this account." msgstr "如果開啟,KMess 會自動以此帳號登入" -#. i18n: file ./settings/accountswidgetinterface.ui line 259 -#: rc.cpp:189 -#, no-c-format -msgid "Status to set at login:" -msgstr "登入時設定的狀態:" +#. i18n: file: settings/accountpage.ui:301 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:401 +msgid "Log in &with this account automatically" +msgstr "自動以此帳號登入(&W)" -#. i18n: file ./settings/accountswidgetinterface.ui line 324 -#: rc.cpp:192 -#, no-c-format +#. i18n: file: settings/accountpage.ui:313 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:407 +msgid "Login &as" +msgstr "登入為(&A)" + +#. i18n: file: settings/accountpage.ui:366 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:410 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "您必須連線到微軟護照認證網站來確認您的電子郵件地址是否存在。" + +#. i18n: file: settings/accountpage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:413 +msgid "" +"You cannot change your friendly name because your Passport email address is " "not verified." -msgstr "你不能更該你的名稱,因為你的 passport e-mail 尚未認證" +msgstr "您無法變更您的暱稱,因為您的 Passport 帳號尚未認證。" -#. i18n: file ./settings/accountswidgetinterface.ui line 330 -#. i18n: file ./settings/accountswidgetinterface.ui line 415 -#: rc.cpp:195 rc.cpp:210 -#, no-c-format -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." -msgstr "" -"你需要一個 passport 帳號來連接到 MSN Messenger 網路。你可以在 register." -"passport.com 註冊你目前的 e-mail,或使用 Hotmail 帳號來連線。" - -#. i18n: file ./settings/accountswidgetinterface.ui line 374 -#: rc.cpp:198 -#, no-c-format +#. i18n: file: settings/accountpage.ui:409 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:416 msgid "Request verification email" -msgstr "要求確認 email" +msgstr "要求確認電子郵件地址" -#. i18n: file ./settings/accountswidgetinterface.ui line 380 -#: rc.cpp:201 -#, no-c-format +#. i18n: file: settings/accountpage.ui:412 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:419 msgid "https://accountservices.passport.net/" -msgstr "http://accountservuces.passport.net/" +msgstr "https://accountservices.passport.net/" -#. i18n: file ./settings/accountswidgetinterface.ui line 383 -#: rc.cpp:204 -#, no-c-format +#. i18n: file: settings/accountpage.ui:415 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:422 msgid "Go to accountservices.passport.net" -msgstr "連至 accountservices.passport.net" +msgstr "連到 accountservices.passport.net" -#. i18n: file ./settings/accountswidgetinterface.ui line 409 -#: rc.cpp:207 -#, no-c-format +#. i18n: file: settings/accountpage.ui:434 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:425 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " -"address as Passport account." +"You need a Passport account to connect to the Live Messenger network. " +"You can register your current email address at register.passport.com or use " +"a Live Mail account to connect." msgstr "" -"連線到 MSN Messenger 服務,你需要註冊一個 e-mail 來當作 Passport 帳號。" +"您需要一個 Passport 的帳號才能連線到 Live Messenger 網路。您可以用您的電子郵件地址到 register." +"passport.com 註冊一個帳號,或是用 Live Mail 帳號來連線。" -#. i18n: file ./settings/accountswidgetinterface.ui line 459 -#: rc.cpp:213 -#, no-c-format +#. i18n: file: settings/accountpage.ui:437 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:428 +msgid "" +"To connect to the Live Messenger service, you will need to register an email " +"address as Passport account." +msgstr "要連線到 Live Messenger 服務,您必須用電子郵件地址註冊 Passport 帳號。" + +#. i18n: file: settings/accountpage.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:431 msgid "Register new account" msgstr "註冊一個新帳號" -#. i18n: file ./settings/accountswidgetinterface.ui line 465 -#: rc.cpp:216 -#, no-c-format +#. i18n: file: settings/accountpage.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:434 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: file ./settings/accountswidgetinterface.ui line 468 -#: rc.cpp:219 -#, no-c-format +#. i18n: file: settings/accountpage.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:437 msgid "Go to register.passport.com" msgstr "連至 register.passport.com" -#. i18n: file ./settings/alertswidget.ui line 16 -#: rc.cpp:222 settings/settingsdialog.cpp:94 -#, no-c-format -msgid "Alerts" -msgstr "警告" +#. i18n: file: settings/accountpage.ui:501 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:440 +msgid "&Status Options" +msgstr "狀態選項(&S)" -#. i18n: file ./settings/alertswidget.ui line 35 -#: rc.cpp:225 -#, no-c-format -msgid "Popup notifications" -msgstr "彈出示提示" - -#. i18n: file ./settings/alertswidget.ui line 46 -#: rc.cpp:228 -#, no-c-format -msgid "Show notifications when your contacts:" -msgstr "顯示通知,當你的連絡人:" - -#. i18n: file ./settings/alertswidget.ui line 54 -#: rc.cpp:231 -#, no-c-format -msgid "&Go online" -msgstr "上線(&G)" - -#. i18n: file ./settings/alertswidget.ui line 63 -#: rc.cpp:237 -#, no-c-format +#. i18n: file: settings/accountpage.ui:507 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:443 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "如果開啟,當有聯絡人連上 MSN 時,彈出訊息會顯示。" - -#. i18n: file ./settings/alertswidget.ui line 71 -#: rc.cpp:240 -#, no-c-format -msgid "Start a &chat with you" -msgstr "與你開始交談(&c)" - -#. i18n: file ./settings/alertswidget.ui line 80 -#: rc.cpp:246 -#, no-c-format -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "如果開啟,當有聯絡人與你開始交談時,彈出訊息會顯示。" - -#. i18n: file ./settings/alertswidget.ui line 88 -#: rc.cpp:249 -#, no-c-format -msgid "S&end you a message" -msgstr "傳送給你一個訊息(&e)" - -#. i18n: file ./settings/alertswidget.ui line 94 -#: rc.cpp:255 -#, no-c-format -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "如果開啟,每當有聯絡人傳送訊息給你時,彈出訊息會顯示。" - -#. i18n: file ./settings/alertswidget.ui line 102 -#: rc.cpp:258 -#, no-c-format -msgid "Change their &status" -msgstr "改變他們的狀態(&s)" - -#. i18n: file ./settings/alertswidget.ui line 108 -#: rc.cpp:264 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "如果開啟,當有聯絡人改變狀態時,彈出訊息會顯示。" - -#. i18n: file ./settings/alertswidget.ui line 116 -#: rc.cpp:267 -#, no-c-format -msgid "Go o&ffline" -msgstr "離線(&f)" - -#. i18n: file ./settings/alertswidget.ui line 122 -#. i18n: file ./settings/alertswidget.ui line 156 -#: rc.cpp:273 rc.cpp:282 -#, no-c-format -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "如果開啟,當有聯絡人離線時,彈出訊息也會顯示。" - -#. i18n: file ./settings/alertswidget.ui line 147 -#: rc.cpp:276 -#, no-c-format -msgid "Show notifications when you recei&ve an email" -msgstr "當你收到一封 email 時,顯示通知" - -#. i18n: file ./settings/alertswidget.ui line 189 -#: rc.cpp:285 -#, no-c-format -msgid "Hide popups after" -msgstr "隱藏彈出氣泡,在多久之後:" - -#. i18n: file ./settings/alertswidget.ui line 195 -#: rc.cpp:288 -#, no-c-format -msgid "Controls the number of seconds before popups are hidden." -msgstr "控制彈出氣泡後至隱藏前的時間。" - -#. i18n: file ./settings/alertswidget.ui line 208 -#: rc.cpp:291 -#, no-c-format -msgid "seconds" -msgstr "秒" - -#. i18n: file ./settings/alertswidget.ui line 254 -#: rc.cpp:294 -#, no-c-format -msgid "Shake the chat &window when a nudge is received or sent" -msgstr "當送出或接收來電振動時搖晃視窗(&w)" - -#. i18n: file ./settings/alertswidget.ui line 261 -#: rc.cpp:300 -#, no-c-format -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.

" +"If enabled, your status will be changed automatically to \"Idle\" when " +"you are not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." msgstr "" -"

當聯絡人想要引起你的注意時,他們可以送出來電振動。預設中當收到或送出來" -"電振動時,視窗會搖晃。當搖晃效果太惱人時,可關閉此選項。

\n" -"

當此選項開啟時,KMess 依然限制搖晃效果。聯絡人可能會一次送出許多個來電振" -"動,但是 KMess 只會搖晃視窗一次。

" +"若開啟此選項,當您未使用電腦數分鐘後,會自動將您的狀態切換為「離開─閒置」。若" +"此選項無法選取,則表示 KMess 未將此功能支援編譯進來。" -#. i18n: file ./settings/alertswidget.ui line 269 -#: rc.cpp:304 -#, no-c-format -msgid "Inform contacts w&hich song I am listening to." -msgstr "提示聯絡人我正在聽什麼(&h)" +#. i18n: file: settings/accountpage.ui:510 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:446 +msgid "Change status to \"&Idle\" when inactive" +msgstr "當不活動時,將狀態改變為「閒置」(&I)" -#. i18n: file ./settings/alertswidget.ui line 275 -#: rc.cpp:310 -#, no-c-format +#. i18n: file: settings/accountpage.ui:541 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:560 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:567 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:452 rc.cpp:458 rc.cpp:461 msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" -"如果開啟,KMess 提示聯絡人你正在聽什麼這個訊息是從正在播放的音訊軟體中取回" -"的。" +"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgstr "控制 KMess 經過多久後會轉變狀態為「離開─閒置」" -#. i18n: file ./settings/alertswidget.ui line 300 -#: rc.cpp:313 -#, no-c-format -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "在不活動時,改變狀態為\"離開-發呆(&y)\"" - -#. i18n: file ./settings/alertswidget.ui line 306 -#: rc.cpp:319 -#, no-c-format -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes." -msgstr "" -"如果開啟,當你幾分鐘內都沒有使用電腦,你的狀態將會自動變為 \"離開-發呆\"。" - -#. i18n: file ./settings/alertswidget.ui line 339 -#: rc.cpp:322 -#, no-c-format +#. i18n: file: settings/accountpage.ui:544 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:455 msgid "Become idle after" -msgstr "改變為發呆狀態,在多久之後:" +msgstr "多久之後變為閒置狀態:" -#. i18n: file ./settings/alertswidget.ui line 345 -#: rc.cpp:325 -#, no-c-format -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "控制 KMess 轉變狀態為 \"離開-發呆\" 前的分鐘數" - -#. i18n: file ./settings/alertswidget.ui line 358 -#: rc.cpp:328 -#, no-c-format +#. i18n: file: settings/accountpage.ui:570 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:464 msgid "minutes" msgstr "分鐘" -#. i18n: file ./settings/chatloggingwidget.ui line 16 -#: rc.cpp:331 settings/settingsdialog.cpp:97 -#, no-c-format -msgid "Chat Logging" -msgstr "交談紀錄" - -#. i18n: file ./settings/chatloggingwidget.ui line 35 -#: rc.cpp:334 -#, no-c-format -msgid "Log &all chats" -msgstr "紀錄所有交談內容(&a)" - -#. i18n: file ./settings/chatloggingwidget.ui line 38 -#: rc.cpp:337 -#, no-c-format -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "如果開啟,交談紀錄將會被保存在一個特定的資料夾裡。" - -#. i18n: file ./settings/chatloggingwidget.ui line 85 -#: rc.cpp:340 -#, no-c-format -msgid "Save chat files in this parent directory:" -msgstr "儲存聊天內容至上一層目錄" - -#. i18n: file ./settings/chatloggingwidget.ui line 88 -#: rc.cpp:343 -#, no-c-format +#. i18n: file: settings/accountpage.ui:603 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:467 msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "選擇一個你想要保存交談紀錄的資料夾。" +"This happens because KMess was built without support for the " +"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " +"Refer to your package manager for more details." +msgstr "" +"KMess 編譯時並未加入 \"XScreenSaver\" 的 Xorg " +"延伸功能,此功能是用於偵測使用者活動用的。詳情請詢問您的套件供應商。" -#. i18n: file ./settings/chatloggingwidget.ui line 122 -#: rc.cpp:349 -#, no-c-format -msgid "Organize chat folders by:" -msgstr "以何種方式排列聊天紀錄資料夾:" +#. i18n: file: settings/accountpage.ui:606 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:470 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "無法啟動自動閒置功能:KMess 編譯時未加入偵測活動功能。" -#. i18n: file ./settings/chatloggingwidget.ui line 128 -#: rc.cpp:352 -#, no-c-format +#. i18n: file: settings/accountpage.ui:632 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:473 +msgid "&Disable notifications when your status is set to \"Busy\"" +msgstr "當您的狀態設定為忙碌時,隱藏所有通知(&D)" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:476 +msgid "Saved accounts:" +msgstr "已儲存帳號:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:479 msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "當你選擇「以年、月、日組織交談紀錄」選項時,KMess 會自動建立次資料夾。" +"Click here to create a new KMess account for an email already associated to " +"a Live account" +msgstr "點擊此處以可用您現有已註冊為 Live 帳號的電子郵件地址建立一個新的 KMess 帳號" -#. i18n: file ./settings/chatloggingwidget.ui line 139 -#: rc.cpp:355 -#, no-c-format +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:482 +msgid "&Add Account..." +msgstr "新增帳號(&A)..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:488 +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:491 +msgid "&Edit" +msgstr "編輯(&E)" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:497 +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:500 +msgid "&Remove" +msgstr "移除(&R)" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:506 +msgid "Enable this check box to save your chats for later viewing" +msgstr "勾選此選項以儲存您的聊天紀錄,稍後可以檢視" + +#. i18n: file: settings/chatloggingpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:509 +msgid "" +"

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

\n" +"

The chat logs 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!" +"

\n" +" " +msgstr "" +"

若您開啟聊天紀錄功能,每次您的聊天內容都會儲存在一個特定的地方(您可" +"以在下方指定)。

\n" +"

儲存的聊天內容可以讓您在過去的討論中尋找東西,或是紀錄您在特定狀況下對某人" +"說了什麼話。

\n" +"

不過這樣做也可能產生一些隱私上的問題,因為某個未經允許就使用您帳號的人也可" +"以看到這些內容。

\n" +"

請確定在公用電腦中關閉此選項!

\n" +" " + +#. i18n: file: settings/chatloggingpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:516 +msgid "Enable chat logging" +msgstr "開啟聊天紀錄" + +#. i18n: file: settings/chatloggingpage.ui:36 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:519 +msgid "" +"If enabled, KMess additionaly saves your chat logs as HTML or plain text " +"files" +msgstr "開啟此選項的話,KMess 可以將您的聊天內容存成 HTML 檔或文字檔。" + +#. i18n: file: settings/chatloggingpage.ui:39 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:522 +msgid "Additionally save chat logs to file" +msgstr "將聊天內容存到檔案" + +#. i18n: file: settings/chatloggingpage.ui:51 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:525 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "在此選項,您可以決定如何儲存您的聊天紀錄。" + +#. i18n: file: settings/chatloggingpage.ui:54 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:528 +msgid "Save chat logs as:" +msgstr "將聊天內容存到:" + +#. i18n: file: settings/chatloggingpage.ui:86 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:531 +msgid "" +"\n" +"

The file format you choose here is important.

\n" +"

Chat logs saved in the HTML format can be easily read in any web browser, " +"but if they are opened on another computer, display pictures and emoticons " +"cannot not be displayed.

\n" +"

Chat logs saved as plain text, on the other side, can be perfectly read " +"everywhere, but they will not contain any text formatting, display pictures, " +"or emoticons.

\n" +"" +msgstr "" +"\n" +"

您使用的檔案格式是很重要的。

\n" +"

HTML 格式的紀錄檔可以在任何瀏覽器中開啟,但通常在其他電腦上可能無法正確顯" +"示。

\n" +"

相對的,文字檔可以在任何地方讀取,但本身沒有排版、顯示圖片與表情符號等功" +"能。

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:90 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:538 +msgid "Web Pages (HTML)" +msgstr "網頁格式(HTML)" + +#. i18n: file: settings/chatloggingpage.ui:95 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:541 +msgid "Plain Text" +msgstr "純文字" + +#. i18n: file: settings/chatloggingpage.ui:134 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:544 +msgid "" +"These options allow you to choose how KMess will organize your chat logs " +"within the directory specified below." +msgstr "這些選項讓您選擇 KMess 要如何存放您的聊天紀錄。" + +#. i18n: file: settings/chatloggingpage.ui:138 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:547 +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.\n" +" " +msgstr "" +"根據您選取的選項,KMess 會建立目錄來存放您的聊天紀錄。詳情請參考每個選項的" +"「這是什麼?」功能。\n" +" " + +#. i18n: file: settings/chatloggingpage.ui:141 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:551 +msgid "Separate logged chats by:" +msgstr "聊天紀錄分組依據:" + +#. i18n: file: settings/chatloggingpage.ui:157 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:554 +msgid "Create a directory to organize chats by year" +msgstr "以年份為依據建立目錄存放紀錄" + +#. i18n: file: settings/chatloggingpage.ui:164 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:557 +msgid "" +"This option tells KMess to divide your chat logs 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 chat logs directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" +"這個選項讓 KMess 將您的聊天紀錄依年份來分組。\n" +"也就是說,您的存放目錄下,每一年會開一個目錄,裡面是您整年份的聊天紀錄。\n" +"\n" +"2009 年 1 月 1 日的聊天紀錄會存放在:\n" +"<您指定的目錄>/2009/<日期與聯絡人名稱>.html" + +#. i18n: file: settings/chatloggingpage.ui:167 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:564 msgid "Year" msgstr "年" -#. i18n: file ./settings/chatloggingwidget.ui line 150 -#: rc.cpp:358 -#, no-c-format -msgid "Month" -msgstr "月" +#. i18n: file: settings/chatloggingpage.ui:183 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:567 +msgid "Create directories to organize chats by year then by month" +msgstr "以年份與月份為依據建立目錄存放紀錄 " -#. i18n: file ./settings/chatloggingwidget.ui line 158 -#: rc.cpp:361 -#, no-c-format -msgid "Day" -msgstr "日" - -#. i18n: file ./settings/chatloggingwidget.ui line 169 -#: rc.cpp:364 -#, no-c-format -msgid "Save all chats in the parent directory" -msgstr "儲存所有聊天內容至上一層目錄" - -#. i18n: file ./settings/chattingwidget.ui line 35 -#: rc.cpp:370 -#, no-c-format -msgid "Your message font:" -msgstr "你的訊息字型:" - -#. i18n: file ./settings/chattingwidget.ui line 38 -#: rc.cpp:373 -#, no-c-format -msgid "This is the font style and color used in your chat messages." -msgstr "這是你交談訊息的字型、顏色和形式。" - -#. i18n: file ./settings/chattingwidget.ui line 126 -#: rc.cpp:378 -#, no-c-format -msgid "Force contacts' messages to use this font:" -msgstr "強制聯絡人的訊息使用此字型:" - -#. i18n: file ./settings/chattingwidget.ui line 129 -#: rc.cpp:381 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:190 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:570 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"This option tells KMess to divide your chat logs 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 chat logs 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/chattingwidget.ui line 225 -#: rc.cpp:386 -#, no-c-format -msgid "Chat style:" -msgstr "交談形式:" +#. i18n: file: settings/chatloggingpage.ui:193 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:577 +msgid "Year then Month" +msgstr "依年份與月份" -#. i18n: file ./settings/chattingwidget.ui line 228 -#: rc.cpp:389 -#, no-c-format +#. i18n: file: settings/chatloggingpage.ui:206 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:580 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "以每一天為依據建立目錄存放紀錄" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:583 +msgid "" +"This option tells KMess to divide your chat logs by year, then by " +"month,\n" +" 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 chat logs 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:217 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:591 +msgid "Year, Month then Day" +msgstr "依每一天" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:594 +msgid "Place all saved chat logs directly in the directory specified below" +msgstr "將所有儲存的聊天內容紀錄檔都放到以下指定的目錄中" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:597 +msgid "" +"This option tells KMess to save all your chat logs in the same folder, " +"without organizing them at all." +msgstr "這個選項讓 KMess 將您的聊天紀錄不分組,通通放在同一個目錄之下。" + +#. i18n: file: settings/chatloggingpage.ui:233 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:600 +msgid "Do not organize files" +msgstr "不分組" + +#. i18n: file: settings/chatloggingpage.ui:276 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:603 +msgid "Click here to choose a directory" +msgstr "點擊這裡選取目錄" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:609 +msgid "The directory where all your chat logs will be saved" +msgstr "您要儲存聊天紀錄的目錄" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:612 +msgid "Choose a directory where you would like to save your chat logs." +msgstr "請選擇您要將聊天紀錄保存在哪個目錄中。" + +#. i18n: file: settings/chatloggingpage.ui:311 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:615 +msgid "Save chat logs in the following directory:" +msgstr "將聊天內容存在此目錄:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:618 +msgid "St&yle" +msgstr "樣式(&Y)" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#: rc.cpp:621 msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "允許你改變 KMess 用來顯示交談訊息的佈置主景。" +msgstr "讓您可以變更 KMess 用於顯示聊天訊息的佈景主題。" -#. i18n: file ./settings/chattingwidget.ui line 302 -#: rc.cpp:392 -#, no-c-format -msgid "&Show graphics in chat messages" -msgstr "在聊天訊息中顯示圖示(&S)" +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:624 +msgid "&Chat style:" +msgstr "聊天樣式(&C):" -#. i18n: file ./settings/chattingwidget.ui line 308 -#: rc.cpp:398 -#, no-c-format -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "可以在交談內容中使用表情符號。" +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:627 +msgid "Get &New Styles..." +msgstr "取得新樣式(&N)" -#. i18n: file ./settings/chattingwidget.ui line 419 -#: rc.cpp:401 -#, no-c-format -msgid "S&how time in chat messages" -msgstr "在聊天訊息中顯示時間(&h)" +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:630 +msgid "Chat Settings" +msgstr "聊天設定" -#. i18n: file ./settings/chattingwidget.ui line 425 -#: rc.cpp:407 -#, no-c-format -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "可以在交談訊息中顯示時間標記。" +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:633 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "在聊天室中開啟顯示表情符號。" -#. i18n: file ./settings/chattingwidget.ui line 433 -#: rc.cpp:410 -#, no-c-format -msgid "Use font &effects in messages, i.e. *bold*, /italic/, and _underline_" -msgstr "使用字體效果(&e),如: *粗體* 、 /斜體/ 、 _底線_" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:636 +msgid "&Show emoticons" +msgstr "顯示表情符號(&S)" -#. i18n: file ./settings/chattingwidget.ui line 439 -#: rc.cpp:416 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:642 +msgid "Show &winks" +msgstr "顯示動畫快遞(&W)" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:645 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"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 "" -"可以使用字型效果。輸入 *bold*,/italic/ 和 _underline_,可使字呈現粗體、斜" -"體、底線字型。" +"此選項會將來自同一個聯絡人的訊息集合在一起。當同一個聯絡人傳送多個訊息給您的" +"時候,KMess 會將它組合成單一的訊息。實際顯示出來的樣子會依聊天室樣式不同而不" +"同。" -#. i18n: file ./settings/chattingwidget.ui line 447 -#: rc.cpp:419 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:648 msgid "&Group follow-up messages from the same contact" msgstr "集合從同一個聯絡人來的訊息(&G)" -#. i18n: file ./settings/chattingwidget.ui line 453 -#: rc.cpp:425 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:654 +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:657 +msgid "S&how timestamp" +msgstr "顯示訊息時間(&H)" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:663 +msgid "Show &date" +msgstr "顯示日期(&D)" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:666 +msgid "Show s&econds" +msgstr "顯示秒(&E)" + +#. i18n: file: settings/chatstylepage.ui:356 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:669 +msgid "&Text" +msgstr "文字(&T)" + +#. i18n: file: settings/chatstylepage.ui:368 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:672 +msgid "This is the font style and color used in your chat messages." +msgstr "這是您聊天訊息使用的字型樣式與顏色。" + +#. i18n: file: settings/chatstylepage.ui:371 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:675 +msgid "Your &message font:" +msgstr "您的訊息字型(&M):" + +#. i18n: file: settings/chatstylepage.ui:452 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:678 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." +"This option allows you to override the font style and color of your " +"contacts' messages with the chosen font style and color below." +msgstr "允許您使用底下選取的字型樣式與顏色來覆蓋聯絡人訊息使用的字型樣式與顏色。" + +#. i18n: file: settings/chatstylepage.ui:455 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:681 +msgid "&Force messages from your contacts to use this font:" +msgstr "強制聯絡人的訊息使用此字型(&F):" + +#. i18n: file: settings/chatstylepage.ui:530 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:684 +msgid "Chat Window Formatting" +msgstr "聊天視窗格式" + +#. i18n: file: settings/chatstylepage.ui:536 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:687 +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 "" -"這個功能能夠讓同一個聯絡人傳來的訊息集合在一起。當聯絡人傳送多個訊息來解釋事" -"情時, KMess 聚集這些訊息成一單個訊息。呈現的結果則依形式的不同而不同。" +"開啟使用字型效果。輸入時用星號夾住(如 *bold*)、斜線夾住(如 /italic/),與用底線夾住(如 " +"_underline_),被夾住的文字內容可呈現粗體、斜體與底線的效果。" -#. i18n: file ./settings/emailwidget.ui line 46 -#: rc.cpp:431 -#, no-c-format -msgid "Mail Client" -msgstr "電子郵件客戶端軟體" +#. i18n: file: settings/chatstylepage.ui:539 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:690 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "在訊息中使用字體效果,如*粗體*,/斜體/,_底線_ 等(&E)" -#. i18n: file ./settings/emailwidget.ui line 52 -#: rc.cpp:434 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:549 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:696 +msgid "Enable \"Messenger Plus!\" formatting" +msgstr "開啟 \"Messenger Plus!\" 加強格式化" + +#. i18n: file: settings/chatstylepage.ui:573 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:699 +msgid "&Behavior" +msgstr "行為(&B)" + +#. i18n: file: settings/chatstylepage.ui:580 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:702 msgid "" -"Allows you to choose which e-mail program KMess should open to view e-mail " -"messages." -msgstr "允許你選擇 KMess 該開啟的 e-mail 軟體來檢視 e-mail" - -#. i18n: file ./settings/emailwidget.ui line 63 -#: rc.cpp:437 -#, no-c-format -msgid "Use Hotmail" -msgstr "使用 Hotmail" - -#. i18n: file ./settings/emailwidget.ui line 71 -#: rc.cpp:440 -#, no-c-format -msgid "Use a specified command:" -msgstr "使用特定的指令" - -#. i18n: file ./settings/emailwidget.ui line 124 -#: rc.cpp:443 settings/settingsdialog.cpp:98 -#, no-c-format -msgid "Email Notification" -msgstr "電子郵件提示" - -#. i18n: file ./settings/emailwidget.ui line 138 -#: rc.cpp:446 -#, no-c-format -msgid "Show email information" -msgstr "顯示電子郵件資訊" - -#. i18n: file ./settings/emailwidget.ui line 141 -#: rc.cpp:449 -#, no-c-format -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 contacts would like to have your attention they can send you 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" +"

Even if 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 "" -"如果開啟,當接收到 e-mail 時會顯示彈出氣泡。未讀郵件的數量會顯示在聯絡人列表" -"之上。這個選項只有使用 Hotmail 帳號才能作用。" +"

當聯絡人要引起您的注意時,他們可以對您送出來電振動。預設收到或送出來電" +"振動時,聊天視窗會搖晃。關閉此選項可以關閉搖晃的效果。

\n" +"

開啟此選項時,KMess 依然會限制搖晃的效果。聯絡人可能會一次送出許多個來電振" +"動,但是 KMess 只會搖晃視窗一次。

" -#. i18n: file ./settings/emailwidget.ui line 149 -#: rc.cpp:452 -#, no-c-format -msgid "Show a notification when email is received in \"other folders\"" -msgstr "當電子郵件被接收至 \"其他資料夾\" 時,顯示通知" +#. i18n: file: settings/chatstylepage.ui:583 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:706 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "當收到或送出來電振動時搖晃視窗(&W)" -#. i18n: file ./settings/emailwidget.ui line 152 -#: rc.cpp:455 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:593 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:712 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. 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: file ./settings/emoticonwidgetinterface.ui line 37 -#: rc.cpp:461 -#, no-c-format +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:715 +msgid "Display your own &display picture in the chat window" +msgstr "在聊天視窗中也顯示您自己的圖片(&D)" + +#. i18n: file: settings/chatstylepage.ui:621 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:718 +msgid "G&roup chats in the same window:" +msgstr "將聊天集合在同一個視窗(&R):" + +#. i18n: file: settings/chatstylepage.ui:641 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:721 +msgid "Always" +msgstr "總是" + +#. i18n: file: settings/chatstylepage.ui:646 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:724 +msgid "For contacts in the same group" +msgstr "針對同一個群組中的聯絡人" + +#. i18n: file: settings/chatstylepage.ui:651 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:727 +msgid "Never" +msgstr "絕不" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:730 +msgid "Display Options" +msgstr "顯示選項" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:733 +msgid "" +"If enabled, a notification is shown when an email message is received " +"in your inbox. The number of unread email messages is shown above the " +"contact list. This option is only available for Live Mail accounts." +msgstr "" +"若開啟此選項,則當您的電子郵件地址收到一封新郵件時,會彈出視窗來提醒。在聯絡" +"人清單上方會顯示有多少未讀郵件。此選項只對 Live Mail 帳號有作用。" + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:736 +msgid "Display a count of &unread mail" +msgstr "顯示未讀郵件數量(&U)" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:739 +msgid "" +"If enabled, your contacts can see which song you are listening to. " +"This information is retrieved from the currently active media player." +msgstr "" +"若開啟此選項,KMess 會將您正在收聽的音樂顯示給其他聯絡人看。此資訊會從目前使" +"用的音樂播放器取得。" + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:742 +msgid "Show contacts w&hich song I am listening to" +msgstr "顯示「正在收聽」(&H)" + +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:748 +msgid "" +"If enabled, the KMess logo will be displayed in the background of the " +"contact list." +msgstr "若開啟此選項,KMess 圖標會在聯絡人清單中的背景顯示。" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:751 +msgid "Show background &image" +msgstr "顯示背景影像(&I)" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:757 +msgid "List Formatting" +msgstr "清單格式" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:760 +msgid "Enable \"Messenger &Plus!\" formatting" +msgstr "開啟 \"Messenger Plus!\" 加強格式化(&P)" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:763 +msgid "Show the &email address of contacts instead of their friendly name" +msgstr "顯示聯絡人的電子郵件地址而不是暱稱(&E)" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:766 msgid "&Emoticon Themes" msgstr "表情符號主題(&E)" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 56 -#: rc.cpp:464 -#, no-c-format -msgid "Available emoticon styles:" -msgstr "可用的表情符號形式" +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:769 +msgid "Available emoticon themes:" +msgstr "可用的表情符號主題:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 96 -#: rc.cpp:467 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:772 msgid "&Custom Emoticons" -msgstr "自訂的表情符號(&C)" +msgstr "自訂表情符號(&C)" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 107 -#: rc.cpp:470 -#, no-c-format -msgid "Custom emoticons for this account:" -msgstr "給這個帳號用的自訂表情符號:" +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:775 +msgid "Available custom emoticons:" +msgstr "可用的自訂表情符號:" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 169 -#: rc.cpp:473 -#, no-c-format -msgid "Add ne&w..." -msgstr "加入新的...(&w)" +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:778 +msgid "Click here to add a new custom emoticon" +msgstr "點擊此處以新增自訂表情符號" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 175 -#. i18n: file ./settings/emoticonwidgetinterface.ui line 212 -#: rc.cpp:479 rc.cpp:491 -#, no-c-format -msgid "Click" -msgstr "點選" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:781 +msgid "Add Ne&w..." +msgstr "新增(&W)..." -#. i18n: file ./settings/emoticonwidgetinterface.ui line 178 -#: rc.cpp:482 -#, no-c-format -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "點選這裡來加入一個新的自訂表情來傳送給你的連絡人" +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:787 +msgid "Click here to rename the selected emoticon" +msgstr "點選此處以重新命名選取的表情符號" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 206 -#: rc.cpp:485 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:790 msgid "Re&name" -msgstr "重新命名(&n)" +msgstr "重新命名(&N)" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 215 -#: rc.cpp:494 -#, no-c-format -msgid "Click here to rename the selected emoticon." -msgstr "點選這裡來重新命名選擇的表情" +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:796 +msgid "Click here to delete the selected emoticon" +msgstr "點擊此處以刪除選取的表情符號" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 226 -#: rc.cpp:497 -#, no-c-format +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:799 msgid "Remo&ve" -msgstr "移除(&v)" +msgstr "移除(&V)" -#. i18n: file ./settings/emoticonwidgetinterface.ui line 232 -#: rc.cpp:503 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:805 +msgid "Web Browser" +msgstr "網頁瀏覽器" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:808 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "選擇此選項使用其他 KDE 程式使用的瀏覽器" + +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:811 +msgid "&Use the KDE default browser" +msgstr "使用預設瀏覽器(&U)" + +#. 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:814 rc.cpp:849 +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:817 +msgid "&Use an installed browser:" +msgstr "使用已安裝的瀏覽器(&U):" + +#. 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:820 rc.cpp:855 +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:823 rc.cpp:858 +msgid "&Specify a custom command:" +msgstr "指定自訂指令(&S):" + +#. 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:827 rc.cpp:862 #, no-c-format -msgid "Select an emoticon and click here to delete it." -msgstr "選擇一個表情並點選這裡來刪除它。" +msgid "" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." +msgstr "指定用於開啟連結的程式路徑;'%u' 會被取代為連結的網址。" -#. i18n: file ./styles/Classic/Classic.xsl line 0 -#: rc.cpp:506 rc.cpp:509 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:831 #, no-c-format -msgid "says:" -msgstr "說:" +msgid "Use '%u' to insert the URL in the command line." +msgstr "在命令列中用 '%u' 取代網址。" -#: settings/accountswidget.cpp:77 -msgid "Browse and crop image..." -msgstr "瀏覽並剪裁影像..." +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:834 +msgid "Email Client" +msgstr "郵件客戶端軟體" -#: settings/accountswidget.cpp:421 -msgid "Display Picture" -msgstr "顯示圖片" - -#: settings/accountswidget.cpp:443 -msgid "Downloading of display image failed" -msgstr "下載圖片失敗" - -#: settings/accountswidget.cpp:486 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:837 msgid "" -"An error occurred when trying to change the display picture.\n" -"Make sure that you have selected a correct image file" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." msgstr "" -"嘗試改變圖片時發生錯誤。\n" -"請確定您選擇了正確的圖片檔案。" +"勾選此選項的話,當您使用與 Live Mail 相容的帳號連線時,可以使用 Live Mail 網" +"路郵局。" -#: settings/settingsdialog.cpp:74 -msgid "Settings" -msgstr "設定" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:840 +msgid "Use &Live Mail if the account supports it" +msgstr "若帳號支援則使用 Live Mail(&L)" -#: settings/settingsdialog.cpp:93 -msgid "Account" -msgstr "帳號" +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:843 +msgid "Choose this option to use the email client used by the rest of KDE." +msgstr "選取此選項的話,您會使用 KDE 預設的郵件客戶端程式。" -#: settings/settingsdialog.cpp:96 -msgid "Chatting" -msgstr "交談" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:846 +msgid "Use the &KDE default email client" +msgstr "使用 KDE 預設的郵件客戶端程式(&K)" -#: settings/settingsdialog.cpp:747 -msgid "Are you sure you want to delete this account?" -msgstr "您確定要刪除此帳號?" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:852 +msgid "Use an &installed email client:" +msgstr "使用已安裝的郵件客戶端程式(&I):" -#: settings/settingsdialog.cpp:780 -msgid "Hi, how are you doing? :)" -msgstr "嗨!你好嗎?" +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:866 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "在命令列中,用 '%u' 表示電子郵件地址。" -#: settings/settingsdialog.cpp:781 -msgid "Stacy" -msgstr "跳舞俠" +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:872 +msgid "&Save all received files in one directory:" +msgstr "將所有接收的檔案儲存在同一個目錄(&S):" -#: settings/settingsdialog.cpp:782 -msgid "Great!" -msgstr "好啊!" +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:878 +msgid "&Use ports between" +msgstr "使用連接埠範圍(&U):" -#: settings/settingsdialog.cpp:784 -msgid "I /just/ got back from my vacation in Italy!" -msgstr "我才 /剛從/ 義大利渡假回來!" +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:881 +msgid "and" +msgstr "與" -#: systemtraywidget.cpp:91 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:884 +msgid "for file transfers" +msgstr "針對檔案傳輸" + +#. i18n: file: utils/likeback/likebackbar.ui:32 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_likeButton) +#: rc.cpp:887 +msgid "Click here to tell the developers about something you liked" +msgstr "點選此處告訴開發團隊您喜歡哪些" + +#. i18n: file: utils/likeback/likebackbar.ui:36 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_likeButton) +#. i18n: file: utils/likeback/likebackbar.ui:53 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_dislikeButton) +#. i18n: file: utils/likeback/likebackbar.ui:70 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_bugButton) +#. i18n: file: utils/likeback/likebackbar.ui:87 +#. i18n: ectx: property (whatsThis), widget (QToolButton, m_featureButton) +#: rc.cpp:890 rc.cpp:897 rc.cpp:904 rc.cpp:911 msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Click on one of these icons to send your feedback to the developers of " +"this application. You can disable the icons with the \"Show Feedback Icons\" " +"checkbox in the Help menu.\n" +" " +msgstr "點擊這些圖示中的一個,將您的意見傳送給開發者。您可以說明選單中關閉「顯示回饋圖示」的選項。\n" +" " + +#. i18n: file: utils/likeback/likebackbar.ui:49 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_dislikeButton) +#: rc.cpp:894 +msgid "Click here to tell the developers about something you did not like" +msgstr "點選此處告訴開發團隊您不喜歡哪些" + +#. i18n: file: utils/likeback/likebackbar.ui:66 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_bugButton) +#: rc.cpp:901 +msgid "Click here to tell the developers about a problem in the application" +msgstr "點選此處告訴開發團隊此應用程式的問題" + +#. i18n: file: utils/likeback/likebackbar.ui:83 +#. i18n: ectx: property (toolTip), widget (QToolButton, m_featureButton) +#: rc.cpp:908 +msgid "" +"Click here to tell the developers about new features you would like to have " +"in this application" +msgstr "點選此處告訴開發團隊您喜歡哪些新功能" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:915 +msgid "Your comment:" +msgstr "您的意見:" + +#. i18n: file: utils/likeback/likebackdialog.ui:74 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:918 +msgid "Your comment is about:" +msgstr "您的意見是關於:" + +#. i18n: file: utils/likeback/likebackdialog.ui:86 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:921 +msgid "Something you like" +msgstr "您喜歡的事物" + +#. i18n: file: utils/likeback/likebackdialog.ui:99 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:924 +msgid "Something you dislike" +msgstr "您不喜歡的事物" + +#. i18n: file: utils/likeback/likebackdialog.ui:112 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:927 +msgid "An improper behavior of the application" +msgstr "此應用程式的不合適的行為" + +#. i18n: file: utils/likeback/likebackdialog.ui:125 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:930 +msgid "A new feature you desire" +msgstr "您想要的新功能" + +#. i18n: file: utils/likeback/likebackdialog.ui:141 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:933 +msgid "Specify an email address to be contacted back:" +msgstr "指定電子郵件地址以便對方回覆:" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:936 +msgid "" +"Specifying an email address will allow the developers to ask you for " +"more information on your report, or to tell you when your feature will be " +"implemented.
\n" +" Your email address will not be used for anything else but " +"this report." msgstr "" -"關閉主視窗,KMess 將會在系統列繼續執行。使用「檔案」中的「結束」來結束程式。" +"指定電子郵件地址可以讓開發團隊詢問您關於您回報的事項,或是告訴您何時會有此功能。
\n" +"您的電子郵件地址將不會用在其它地方。" -#: systemtraywidget.cpp:102 systemtraywidget.cpp:160 -msgid "Docking in System Tray" -msgstr "縮小到系統列" +#~ msgid "I&mages" +#~ msgstr "影像(&M)" -#: systemtraywidget.cpp:278 -msgid "%1 %2" -msgstr "%1 %2" +#~ msgid "Ink message" +#~ msgstr "手寫訊息" -#: systemtraywidget.cpp:282 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#~ msgid "" +#~ "If you have added any custom emoticons, click this button to view them, " +#~ "so you can easily insert them in your messages." +#~ msgstr "若您已加入任何自訂的表情圖示,點擊此按鍵可以檢視,讓您加入訊息中。" -#~ msgid "The current status of your contact." -#~ msgstr "你連絡人目前的狀態。" +#~ msgid "&Do not filter" +#~ msgstr "不要過濾(&D)" + +#~ msgid "Show a &popup when the contact goes online/offline" +#~ msgstr "當聯絡人上線或離線時,顯示彈出訊息(&P)" + +#~ msgid "File format used for saving:" +#~ msgstr "儲存的檔案格式:" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "

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

" + +#~ msgid "Show the feedback buttons bar on the windows" +#~ msgstr "在視窗上顯示回饋按鍵列" + +#~ msgid "Ignore this &Emoticon" +#~ msgstr "忽略這個表情符號(&E)" + +#~ msgctxt "Caption when trying to block someone when in a group chat" +#~ msgid "Can't Block Right Now!" +#~ msgstr "現在不能阻檔!" + +#~ msgid "Ed&it Notes" +#~ msgstr "編輯備忘(&I)" + +#~ 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 產生" +#~ "的" + +#~ 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 可以試著將您的紀錄格式" +#~ "升級。您要現在進行嗎?" + +#~ 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 個項目無法升級。" + +#~ msgid "Alpha logs migration" +#~ msgstr "Alpha 紀錄升級" + +#~ msgctxt "Dialog box title" +#~ msgid "Delete Picture" +#~ msgstr "刪除圖片" + +#~ msgid "Search for C&ontact" +#~ msgstr "搜尋聯絡人(&O)" + +#~ msgid "Search by &Interest" +#~ msgstr "依興趣搜尋(&I)" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "tryneeds@gmail.com" + +#~ msgid "The contact initiated a MSN6 feature KMess can't handle yet." +#~ msgstr "此聯絡人使用了一個 KMess 無法處理的 MSN6 特色" + +#~ msgid "" +#~ "The transfer failed. The contact sent bad data, or KMess doesn't support " +#~ "it." +#~ msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援" + +#~ msgid "Conversations Filter" +#~ msgstr "對話過濾器" + +#~ msgid "Filter by &conversation" +#~ msgstr "以對話過濾(&c)" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "請選擇您要變更的帳號,然後按這裡" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "給 %1 的來電振動無法傳送。" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "給 %1 的動畫快遞無法傳送。" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "給 %1 的手繪圖案無法傳送。" + +#~ 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 new file mode 100644 index 0000000..4a4d272 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,236 @@ + +INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${QCA2_INCLUDE_DIR} ) + +########### next target ############### + +SET(kmess_SOURCES + chat/chatmaster.cpp + chat/chatmessagestyle.cpp + chat/chatmessageview.cpp + chat/chatview.cpp + chat/chat.cpp + chat/chatwindow.cpp + chat/contactframe.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/group.cpp + contact/invitedcontact.cpp + contact/msnobject.cpp + contact/msnstatus.cpp + 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 + network/msnchallengehandler.cpp + network/msnsocketbase.cpp + network/msnsockettcp.cpp + network/msnsockethttp.cpp + network/msnconnection.cpp + network/msnnotificationconnection.cpp + network/msnswitchboardconnection.cpp + network/multipacketmessage.cpp + network/p2pmessage.cpp + network/applications/application.cpp + network/applications/applicationlist.cpp + network/applications/filetransfer.cpp + network/applications/filetransferp2p.cpp + network/applications/gnomemeeting.cpp + network/applications/inktransferp2p.cpp + network/applications/mimeapplication.cpp + network/applications/msnremotedesktop.cpp + network/applications/p2papplicationbase.cpp + network/applications/p2papplication.cpp + network/applications/msnobjecttransferp2p.cpp + network/applications/sipconnection.cpp + network/applications/voiceconversation.cpp + network/applications/webapplicationp2p.cpp + network/applications/webcamtransferp2p.cpp + network/extra/directconnectionbase.cpp + 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 + network/upnp/manager.cpp + network/upnp/rootservice.cpp + network/upnp/service.cpp + network/upnp/ssdpconnection.cpp + network/upnp/wanconnectionservice.cpp + notification/chatnotification.cpp + notification/contactstatusnotification.cpp + notification/notificationmanager.cpp + notification/newemailnotification.cpp + notification/systemtraywidget.cpp + settings/accountpage.cpp + settings/accountsettingsdialog.cpp + settings/accountsmanagerpage.cpp + settings/contactlistpage.cpp + settings/chatloggingpage.cpp + settings/chatstylepage.cpp + settings/emoticonspage.cpp + settings/globalsettingsdialog.cpp + settings/miscellaneouspage.cpp + utils/crashhandler.cpp + utils/idletimer.cpp + utils/kmessconfig.cpp + utils/kmessdbus.cpp + utils/kmessdbusadaptor.cpp + utils/kmessdbusdatatypes.cpp + utils/kmessshared.cpp + utils/nowlisteningclient.cpp + utils/richtextparser.cpp + utils/thumbnailprovider.cpp + utils/xautolock.cpp + utils/xmlfunctions.cpp + account.cpp + accountaction.cpp + accountsmanager.cpp + currentaccount.cpp + emoticon.cpp + emoticonmanager.cpp + emoticontheme.cpp + initialview.cpp + kmessapplication.cpp + kmess.cpp + kmessdebug.cpp + kmessinterface.cpp + kmessview.cpp + kmessviewdelegate.cpp + main.cpp +) + +SET(kmess_UI_FILES + initialview.ui + kmessview.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 + settings/accountpage.ui + settings/accountsmanagerpage.ui + settings/contactlistpage.ui + settings/chatloggingpage.ui + settings/chatstylepage.ui + settings/emoticonspage.ui + settings/miscellaneouspage.ui +) + +SET(kmess_LIBS + ${KDE4_KDECORE_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KHTML_LIBS} + ${KDE4_KNOTIFYCONFIG_LIBS} + ${KDE4_KNEWSTUFF2_LIBS} + ${KDE4_PHONON_LIBS} + ${KDE4_SOLID_LIBS} + ${LIBXML2_LIBRARIES} + ${LIBXSLT_LIBRARIES} + ${QCA2_LIBRARIES} + ${QT_QTTEST_LIBRARY} +) + +IF( ${GIF_FOUND} ) + INCLUDE_DIRECTORIES( ${GIF_INCLUDE_DIR} ) + SET( kmess_LIBS ${kmess_LIBS} ${GIF_LIBRARIES} ) +ENDIF( ${GIF_FOUND} ) + +# If LikeBack is enabled, compile it +IF( NOT ${KMESS_DISABLE_LIKEBACK} EQUAL 1 ) + # 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( NOT ${KMESS_DISABLE_LIKEBACK} EQUAL 1 ) + +# If we're compiling in debug mode: +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 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} EQUAL 1 ) + +# Enable BinReloc for Autopackage support. Also requires libpthread +IF( UNIX AND KMESS_ENABLE_BINRELOC EQUAL 1 ) + SET(kmess_SOURCES ${kmess_SOURCES} binreloc.c) + SET(kmess_LIBS ${kmess_LIBS} pthread) +ENDIF( UNIX AND KMESS_ENABLE_BINRELOC EQUAL 1 ) + +# Add XScreensaver library for away-idle detection. +IF( X11_Xscreensaver_FOUND ) + SET(kmess_LIBS ${kmess_LIBS} ${X11_Xscreensaver_LIB}) +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 all files +KDE4_ADD_UI_FILES( kmess_SOURCES ${kmess_UI_FILES} ) +KDE4_ADD_EXECUTABLE( kmess ${kmess_SOURCES} ) + +# Link to final executable +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 new file mode 100644 index 0000000..746e410 --- /dev/null +++ b/src/account.cpp @@ -0,0 +1,1766 @@ +/*************************************************************************** + account.cpp - description + ------------------- + begin : Sun Jan 5 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 "account.h" + +#include "contact/msnobject.h" +#include "utils/kmessconfig.h" +#include "accountsmanager.h" +#include "kmessdebug.h" + +#include +#include + +#include + +#include +#include +#include + + +#ifdef KMESSDEBUG_ACCOUNT + #define KMESSDEBUG_ACCOUNT_GENERAL +// #define KMESSDEBUG_ACCOUNT_DIRTY +// #define KMESSDEBUG_ACCOUNT_MSNOBJECT +#endif + + + +// The constructor +Account::Account() + : autoreplyMessage_( i18n("I am away from my computer") ), + chatStyle_( "Fresh" ), + contactFontColor_("#000000"), + contactListDisplayMode_(VIEW_MIXED), + deleted_(false), + dirty_(false), + emailSupported_(true), // Assume true (for new accounts), until the msn server proves the opposite + emoticonStyle_("KMess-new"), + fontColor_("#000000"), + friendlyName_( i18n("Your name"), false ), // Do not parse this name, CurrentAccount is not ready when initializing + guestAccount_(true), + groupFollowupMessages_(true), + handle_( i18n("you@hotmail.com") ), + hideNotificationsWhenBusy_(true), + 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), + showNowListening_(false), + showOfflineContacts_(true), + showOtherFolders_(true), + showRemovedContacts_(false), + showHistoryBox_(false), + showSearchBar_(true), + showSessionInfo_(false), + showWinks_(true), + tabbedChatMode_( 0 ), + timestampShowSeconds_(false), + timestampShowDate_(false), + useAutologin_(false), + useContactFont_(false), + useEmoticons_(true), + useFontEffects_(true), + useIdleTimer_(true), + useListFormatting_(false), + useChatFormatting_(false), + + verified_(true), + + showPicture_(true), + msnObject_(0) +{ + font_.setFamily("Arial"); + font_.setBold(false); + font_.setItalic(false); + font_.setUnderline(false); + font_.setPointSize(12); + + contactFont_.setFamily("Arial"); + contactFont_.setBold(false); + contactFont_.setItalic(false); + contactFont_.setUnderline(false); + + saveChatPath_ = QDir::home().absolutePath(); +} + + + +// The destructor +Account::~Account() +{ + if ( msnObject_ ) + delete msnObject_; + +#ifdef KMESSDEBUG_ACCOUNT_GENERAL + kDebug() << "DESTROYED. [handle=" << handle_ << "]"; +#endif +} + + + +// Copy an account +void Account::copyAccount( const Account *account ) +{ +#ifdef KMESSDEBUG_ACCOUNT_GENERAL + kDebug() << "Copying account data..."; +#endif + + // This method is used to clone the settings of an Account to the CurrentAccount, + // or vice-versa. + + // 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() ); + + // 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_; + + // The MSN object needs to be replaced + updateMsnObject(); +} + + + +// Set the account as deleted +void Account::setDeleted() +{ + // Can be called twice, avoid warnings. + if( deleted_ ) + { + return; + } + + // Mark as deleted, so other classes avoid saving the settings again. + deleted_ = true; + guestAccount_ = true; +} + + + +// Read the auto-reply message. +const QString& Account::getAutoreplyMessage() const +{ + return autoreplyMessage_; +} + + + +// Return the chat style name. +const QString& Account::getChatStyle() const +{ + return chatStyle_; +} + + + +// Return the font used for contact messages, if forced to. +const QFont& Account::getContactFont() const +{ + return contactFont_; +} + + + +// Return the color of the forced contact font. +const QString& Account::getContactFontColor() const +{ + return contactFontColor_; +} + + + +// Read how contacts are shown, by group, by online/offline, or mixed. +Account::ContactListDisplayMode Account::getContactListDisplayMode() const +{ + return contactListDisplayMode_; +} + + + +// Return whether email notifications are supported +bool Account::getEmailSupported() const +{ + return emailSupported_; +} + + +// Return the user message font. +const QFont& Account::getFont() const +{ + return font_; +} + + + +// Return the color of the user message font. +const QString& Account::getFontColor() const +{ + return fontColor_; +} + + + +// Return the user's friendlyName +QString Account::getFriendlyName( FormattingMode mode ) const +{ + return friendlyName_.getString( mode ); +} + + + +// Whether follow-up messages from the contact should be grouped. +bool Account::getGroupFollowupMessages() const +{ + return groupFollowupMessages_; +} + + + +// Return the user's handle +QString Account::getHandle() const +{ + return handle_; +} + + + +// Return the length of time waited before the user goes idle. +const int& Account::getIdleTime() const +{ + return idleTime_; +} + + + +// Return whether now listening information should be displayed. +bool Account::getShowNowListening() const +{ + return showNowListening_; +} + + + +// Return the user's password +QString Account::getPassword() const +{ + return password_; +} + + + +// Return the personal message +QString Account::getPersonalMessage( FormattingMode mode ) const +{ + return personalMessage_.getString( mode ); +} + + + +// Return the selected emoticon's style +const QString& Account::getEmoticonStyle() const +{ + return emoticonStyle_; +} + + + +// Return whether to hide notifications when busy +bool Account::getHideNotificationsWhenBusy() const +{ + return hideNotificationsWhenBusy_; +} + + + +// Return the status to set upon connection +Status Account::getInitialStatus() const +{ + return initialStatus_; +} + + + +// Return whether or not to save chats. +bool Account::getSaveChats() const +{ + return saveChats_; +} + + + +// 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 +{ + return saveChatPath_; +} + + + +// Return the code of the structure used to save chats. +const int& Account::getSavedChatDirectoryStructure() const +{ + return savedChatDirectoryStructure_; +} + + + +// Return the user's saved password +QString Account::getSavedPassword() const +{ + return savedPassword_; +} + + + +// Read whether the password must be stored +bool Account::getSavePassword() const +{ + return savePassword_; +} + + + +// Read whether the chat window should shake when a nudge is received or sent. +bool Account::getShakeNudge() const +{ + return shakeNudge_; +} + + + +// Read whether or not allowed contacts are shown. +bool Account::getShowAllowedContacts() const +{ + return showAllowedContacts_; +} + + + +// 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 +{ + return showEmail_; +} + + + +// Read whether empty groups should be shown. +bool Account::getShowEmptyGroups() const +{ + return showEmptyGroups_; +} + + + +// 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 +{ + return showMessageTime_; +} + + + +// Read whether offline contacts should be shown. +bool Account::getShowOfflineContacts() const +{ + return showOfflineContacts_; +} + + + +// Read property of bool showOtherFolders. +bool Account::getShowOtherFolders() const +{ + return showOtherFolders_; +} + + + +// Read whether or not removed (reverse) contacts are shown. +bool Account::getShowRemovedContacts() const +{ + return showRemovedContacts_; +} + + + +// Read whether or not we need to show a search bar in the contact list +bool Account::getShowSearchBar() const +{ + return showSearchBar_; +} + + + +// Read whether or not to show join/part messages in chat +bool Account::getShowSessionInfo() const +{ + return showSessionInfo_; +} + + + +// Read whether to show winks +bool Account::getShowWinks() const +{ + return showWinks_; +} + + + +// Read the way the chats will be grouped together +int Account::getTabbedChatMode() const +{ + return tabbedChatMode_; +} + + + +// Return the a temporary password for the account for login attempts from the initialview dialog +const QString & Account::getTemporaryPassword() const +{ + return temporaryPassword_; +} + + + +// 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 +{ + return useAutologin_; +} + + + +// Return whether or not to enable MSN Plus! formatting in chat +bool Account::getUseChatFormatting() const +{ + return useChatFormatting_; +} + + + +// Return whether or not to show contact messages in the stored font. +bool Account::getUseContactFont() const +{ + return useContactFont_; +} + + + +// Return whether or not to show emoticons in chats. +bool Account::getUseEmoticons() const +{ + return useEmoticons_; +} + + + +// Return whether or not to use the bold/italic/underline effects. +bool Account::getUseFontEffects() const +{ + return useFontEffects_; +} + + + +// Return whether the idle timer should be used. +bool Account::getUseIdleTimer() const +{ + return useIdleTimer_; +} + + + +// Return whether or not to enable MSN Plus! formatting in the contact list +bool Account::getUseListFormatting() const +{ + return useListFormatting_; +} + + + +// Returns whether or not to send our display picture +bool Account::getShowPicture() const +{ + return showPicture_; +} + + + +// Returns display mode used to show pictures in contact list. +int Account::getListPictureSize() const +{ + return listPictureSize_; +} + + + +// Return the path to the current display picture +const QString Account::getPicturePath() const +{ + // Return the picture path if the user has selected to show it; else return an empty string + if( ! showPicture_ ) + { + return QString(); + } + + // if the user has selected a custom picture, it will be located in + // ~/.kde/share/apps/kmess//displaypics/.png + + // If the file can't be found, fallback to the default picture + if( displayPicturePath_.isEmpty() || ! QFile::exists( displayPicturePath_ ) ) + { + return KGlobal::dirs()->findResource( "data", "kmess/pics/kmesspic.png" ); + } + + return displayPicturePath_; +} + + + +// 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 +{ + if ( msnObject_ ) + return msnObject_->objectString(); + else + return ""; +} + + + +// Whether the account is marked to be deleted +bool Account::isDeleted() const +{ + return deleted_; +} + + + +// Whether the account has unsaved settings changes +bool Account::isDirty() const +{ + return dirty_; +} + + + +// Whether the account is a guest account, not permanently saved on the computer +bool Account::isGuestAccount() const +{ + return guestAccount_; +} + + + +// Validate a contact email +bool Account::isValidEmail( QString email ) +{ + return email.contains( QRegExp( "^[A-Z0-9._%\\-]+@(?:[A-Z0-9\\-]+\\.)+[A-Z]{2,4}$", Qt::CaseInsensitive ) ); +} + + + +// Return whether the account's passport is verified +bool Account::isVerified() const +{ + return verified_; +} + + + +// Read in account properties +void Account::readProperties( const QString &handle ) +{ + handle_ = handle; + QDir homeDir; + QString defaultPath; + + homeDir = QDir::home(); + defaultPath = homeDir.absolutePath(); + + // Choose the main group + KConfigGroup profileGroup = KMessConfig::instance()->getAccountConfig( handle_, "Account" ); + + autoreplyMessage_ = profileGroup.readEntry( "autoreplymessage", i18n("I am away from my computer") ); + chatStyle_ = profileGroup.readEntry( "chatStyle", "Fresh" ); + contactFont_.setFamily ( profileGroup.readEntry( "contactfontfamily", "Arial" ) ); + contactFont_.setBold ( profileGroup.readEntry( "contactfontbold", false ) ); + contactFont_.setItalic ( profileGroup.readEntry( "contactfontitalic", false ) ); + contactFont_.setUnderline ( profileGroup.readEntry( "contactfontunderline", false ) ); + contactFont_.setPointSize ( profileGroup.readEntry( "contactfontpointsize", 10 ) ); + contactFontColor_ = profileGroup.readEntry( "contactfontcolor" , "#000000" ); + contactListDisplayMode_ = (Account::ContactListDisplayMode) + profileGroup.readEntry( "contactListDisplayMode", (int)VIEW_MIXED ); + displayPicturePath_ = profileGroup.readEntry( "displayPicturePath", "" ); + originalDisplayPicturePath_ = profileGroup.readEntry( "originalDisplayPicturePath", "" ); + emailSupported_ = profileGroup.readEntry( "emailSupported", true ); + emoticonStyle_ = profileGroup.readEntry( "emoticonStyle", "KMess-new" ); + font_.setFamily ( profileGroup.readEntry( "fontfamily", "Arial" ) ); + font_.setBold ( profileGroup.readEntry( "fontbold", false ) ); + font_.setItalic ( profileGroup.readEntry( "fontitalic", false ) ); + font_.setPointSize ( profileGroup.readEntry( "fontpointsize", 12 ) ); + font_.setUnderline ( profileGroup.readEntry( "fontunderline", false ) ); + fontColor_ = profileGroup.readEntry( "fontColor" , "#000000" ); + friendlyName_.setString ( profileGroup.readEntry( "friendlyName", handle_ ) ); + groupFollowupMessages_ = profileGroup.readEntry( "groupfollowupmessages", true ); + hideNotificationsWhenBusy_ = profileGroup.readEntry( "hideNotificationsWhenBusy", true ); + idleTime_ = profileGroup.readEntry( "idleTime", 5 ); + initialStatus_ = (Status)profileGroup.readEntry( "initialStatus", (int) STATUS_ONLINE); + listPictureSize_ = profileGroup.readEntry( "listPictureSize", 0 ); + notificationDuration_ = profileGroup.readEntry( "notification", 5 ); + 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 ); + 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 ); + useEmoticons_ = profileGroup.readEntry( "useEmoticons", true ); + useFontEffects_ = profileGroup.readEntry( "useFontEffects", true ); + useIdleTimer_ = profileGroup.readEntry( "useIdleTimer", true ); + useListFormatting_ = profileGroup.readEntry( "useListFormatting", false ); + + updateMsnObject(); + + // After reading options from file, consider "dirty" to still be false + guestAccount_ = false; + dirty_ = false; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Resetting 'dirty' to false."; +#endif + + // If a chat style is removed, fall back to the default. + // 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() ) + { +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Auto-corrected chat & setting, setting 'dirty' to true."; +#endif + + // Fall back to our new default. + chatStyle_ = "Fresh"; + groupFollowupMessages_ = true; // Make sure Fresh looks good. + dirty_ = true; + } +} + + + +// Save account properties +void Account::saveProperties() +{ + // Protect against unwanted usage + 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 + KConfigGroup profileGroup = KMessConfig::instance()->getAccountConfig( handle_, "Account" ); + + if ( dirty_ ) + { +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Account " << handle_ << " is 'dirty', save properties."; +#endif + + // Write new settings + profileGroup.writeEntry( "autoreplymessage", autoreplyMessage_ ); + profileGroup.writeEntry( "chatStyle", chatStyle_ ); + profileGroup.writeEntry( "contactfontfamily", contactFont_.family() ); + profileGroup.writeEntry( "contactfontbold", contactFont_.bold() ); + profileGroup.writeEntry( "contactfontitalic", contactFont_.italic() ); + profileGroup.writeEntry( "contactfontunderline", contactFont_.underline() ); + profileGroup.writeEntry( "contactfontpointsize", contactFont_.pointSize() ); + profileGroup.writeEntry( "contactfontcolor", contactFontColor_ ); + profileGroup.writeEntry( "contactListDisplayMode", (int)contactListDisplayMode_ ); + profileGroup.writeEntry( "displayPicturePath", displayPicturePath_ ); + profileGroup.writeEntry( "originalDisplayPicturePath", originalDisplayPicturePath_ ); + profileGroup.writeEntry( "emailSupported", emailSupported_ ); + profileGroup.writeEntry( "emoticonStyle", emoticonStyle_ ); + profileGroup.writeEntry( "fontfamily", font_.family() ); + profileGroup.writeEntry( "fontbold", font_.bold() ); + profileGroup.writeEntry( "fontitalic", font_.italic() ); + profileGroup.writeEntry( "fontunderline", font_.underline() ); + profileGroup.writeEntry( "fontpointsize", font_.pointSize() ); + profileGroup.writeEntry( "fontColor", fontColor_ ); + profileGroup.writeEntry( "friendlyName", friendlyName_.getOriginal() ); + profileGroup.writeEntry( "groupfollowupmessages", groupFollowupMessages_ ); + profileGroup.writeEntry( "hideNotificationsWhenBusy", hideNotificationsWhenBusy_ ); + profileGroup.writeEntry( "idleTime", idleTime_ ); + 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( "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_ ); + profileGroup.writeEntry( "useEmoticons", useEmoticons_ ); + profileGroup.writeEntry( "useFontEffects", useFontEffects_ ); + profileGroup.writeEntry( "useListFormatting", useListFormatting_ ); + profileGroup.writeEntry( "useIdleTimer", useIdleTimer_ ); + profileGroup.writeEntry( "showPicture", showPicture_ ); + + if( ! savePassword_ ) + { + // Remove the cached password + password_ = QString(); + temporaryPassword_= QString(); + + // When storing the passwords, it will be removed from the password manager also + } + } +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + else + { + kDebug() << "Account " << handle_ << " is NOT 'dirty', don't save properties."; + } +#endif + + // Save to disk the changes now, to avoid losing data. + profileGroup.config()->sync(); +} + + + +// The login succeeded with the new password. Save the temporary password as new account password. +void Account::saveTemporaryPassword() +{ + if( ! temporaryPassword_.isEmpty() && temporaryPassword_ != password_ ) + { + password_ = temporaryPassword_; + temporaryPassword_ = QString(); + } +} + + + +/** +* +* @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 ) +{ + if( useListFormatting_ != useListFormatting + || showContactEmail_ != showContactEmail ) + { + useListFormatting_ = useListFormatting; + showContactEmail_ = showContactEmail; + + //let the contact list update to reflect the new changes + emit changedContactListOptions(); + } + + emit changedTimerSettings(); + + if( showNowListening_ != showNowListening ) + { +#ifdef KMESSDEBUG_ACCOUNT_GENERAL + kDebug() << "Now listening settings changed, notifying listeners."; +#endif + + showNowListening_ = showNowListening; + emit changedNowListeningSettings(); + } + + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set the auto-reply message. +void Account::setAutoreplyMessage( const QString& autoreplyMessage) +{ + if ( autoreplyMessage_ != autoreplyMessage ) + { + autoreplyMessage_ = autoreplyMessage; + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +/** +* +* @brief Set chat information +* +* Set options related to chatting +* @param useContactFont whether or not the contact's font should be forced to some value. +* @param useEmoticons whether or not emoticons should be used. +* @param showWinks whether to show winks +* @param useFontEffects whether or not to use bold/italic/underline effects in chats. +* @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. +* @param showMessageTime whether or not time information is shown for chat messages. +* @param timestampShowDate whether to show date in message timestamps. +* @param timestampShowSeconds whether to show seconds in message timestamps. +* @param groupFollowupMessages whether follow-up messages from the contact should be grouped. +* @param tabbedChatMode whether or not chats should be tabbed in one window. +* @param chatStyle the chat style to use. +* +*/ + 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 ) + || ( 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 ) + { + return; + } + + useContactFont_ = useContactFont; + useEmoticons_ = useEmoticons; + useFontEffects_ = useFontEffects; + useChatFormatting_ = useChatFormatting; + shakeNudge_ = shakeNudge; + showMessageTime_ = showMessageTime; + showWinks_ = showWinks; + timestampShowDate_ = timestampShowDate; + timestampShowSeconds_ = timestampShowSeconds; + groupFollowupMessages_ = groupFollowupMessages; + tabbedChatMode_ = tabbedChatMode; + chatStyle_ = chatStyle; + + emit changedChatStyleSettings(); + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set chat logging information +void Account::setChatLoggingInformation( bool saveChats, bool saveChatsToFile, Account::ChatExportFormat saveChatsFormat, + const QString& saveChatPath, int directoryStructure ) +{ + if( saveChats_ == saveChats + && saveChatsToFile_ == saveChatsToFile + && saveChatsFormat_ == saveChatsFormat + && saveChatPath_ == saveChatPath + && savedChatDirectoryStructure_ == directoryStructure ) + { + return; + } + + saveChats_ = saveChats; + saveChatsToFile_ = saveChatsToFile; + saveChatsFormat_ = saveChatsFormat; + saveChatPath_ = saveChatPath; + savedChatDirectoryStructure_ = directoryStructure; + + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + + +// Set how contacts are shown, by group, by online/offline, or mixed. +void Account::setContactListDisplayMode( ContactListDisplayMode displayMode ) +{ + if ( displayMode != contactListDisplayMode_ ) + { + contactListDisplayMode_ = displayMode; + emit changedViewMode(); + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Set email information +void Account::setEmailInformation( bool showEmail, bool showOtherFolders ) +{ + if( showEmail_ != showEmail + || showOtherFolders_ != showOtherFolders ) + { + showEmail_ = showEmail; + showOtherFolders_ = showOtherFolders; + + emit changedEmailDisplaySettings(); + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Update the email-supported state (protected method) +void Account::setEmailSupported(bool emailSupported) +{ + if( emailSupported_ != emailSupported ) + { + dirty_ = true; + } + + emailSupported_ = emailSupported; +} + + + +// Set the font +void Account::setFont( const QFont& font ) +{ + if( font != font_ ) + { + font_ = font; + emit changedFontSettings(); + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Set the font color +void Account::setFontColor( const QString& fontColor ) +{ + if( fontColor != fontColor_ ) + { + fontColor_ = fontColor; + emit changedFontSettings(); + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Set the fonts and font colors +void Account::setFontInformation( const QFont& font, const QString &fontColor, const QFont& contactFont, const QString &contactFontColor) +{ + bool changedSettings = (font_ != font) + || (fontColor_ != fontColor) + || (contactFont_ != contactFont) + || (contactFontColor_ != contactFontColor); + + // Avoid signals because the chat windows will regenerate all messages. + if( ! changedSettings ) + { + return; + } + + font_ = font; + fontColor_ = fontColor; + contactFont_ = contactFont; + contactFontColor_ = contactFontColor; + emit changedFontSettings(); + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set the emoticon path +void Account::setEmoticonStyle( const QString& emoticonStyle ) +{ + if( emoticonStyle != emoticonStyle_ ) + { + // Set the new style, and signal EmoticonManager about it. + emoticonStyle_ = emoticonStyle; + emit changedEmoticonSettings(); + + // Tell the account settings changed and need to be saved + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Change the friendly name +void Account::setFriendlyName(const QString& newName) +{ + if( newName.isEmpty() || newName == friendlyName_.getOriginal() ) + { + return; + } + + friendlyName_.setString( newName ); + + emit changedFriendlyName(); + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Whether the account is a guest account, not permanently saved on the computer +void Account::setGuestAccount( bool guestAccount ) +{ + guestAccount_ = guestAccount; + + // Undelete when user did restore the account. + if( ! guestAccount_ ) + { + deleted_ = false; + } +} + + + +// Change the status to set upon connection +void Account::setInitialStatus( Status status ) +{ + if( initialStatus_ == status ) + { + return; + } + + initialStatus_ = status; + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set the mode of display list pictures +void Account::setListPictureSize( int mode ) +{ + // No need to update + if( mode == listPictureSize_ ) + { + return; + } + + listPictureSize_ = mode; + + emit changedDisplaySettings(); + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set basic account data +void Account::setLoginInformation( QString handle, QString friendlyName, QString password ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( handle.contains("@") ); + KMESS_ASSERT( ! handle.isEmpty() ); +#endif + + handle = handle.toLower(); + + if( handle_ == handle + && friendlyName_.getOriginal() == friendlyName + && password == password_ ) + { + return; + } + + handle_ = handle; + + // Never change the nickname if the account is not verified. We would receive a server error + if( verified_ ) + { + friendlyName_.setString( friendlyName ); + emit changedFriendlyName(); + } + + if( ! password.isEmpty() ) + { + password_ = password; + } + + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set the account's login password +void Account::setPassword( const QString &password ) +{ + password_ = password; +} + + + +// Set the personal message +void Account::setPersonalMessage(const QString& newMessage) +{ + if( newMessage == personalMessage_.getOriginal() ) + { + return; + } + + personalMessage_.setString( newMessage ); + emit changedPersonalMessage(); + + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set the display picture file +void Account::setPicturePath( const QString& picturePath ) +{ + if( displayPicturePath_ == picturePath ) + { + return; + } + + displayPicturePath_ = picturePath; + + // Update the MSN Object linked to this account + updateMsnObject(); + + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// 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 the account's saved password +void Account::setSavedPassword( const QString &password ) +{ + savedPassword_ = password; +} + + + +// Set if the password must be stored +void Account::setSavePassword( bool savePassword ) +{ + savePassword_ = savePassword; + + if( ! savePassword ) + { + // Clear the password so the accountsmanager will remove it + password_.clear(); + } + + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set whether or not allowed contacts are shown. +void Account::setShowAllowedContacts( bool showAllowedContacts ) +{ + if( showAllowedContacts != showAllowedContacts_ ) + { + showAllowedContacts_ = showAllowedContacts; + emit changedDisplaySettings(); + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// 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 ) +{ + if( showEmptyGroups == showEmptyGroups_ ) + { + return; + } + + showEmptyGroups_ = showEmptyGroups; + emit changedViewMode(); + + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// 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 ) +{ + if( showOfflineContacts != showOfflineContacts_ ) + { + showOfflineContacts_ = showOfflineContacts; + emit changedDisplaySettings(); + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Set whether or not removed (reverse) contacts are shown. +void Account::setShowRemovedContacts( bool showRemovedContacts ) +{ + if( showRemovedContacts != showRemovedContacts_ ) + { + showRemovedContacts_ = showRemovedContacts; + emit changedDisplaySettings(); + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Set whether or not we need to show a search bar in the contact list at login +void Account::setShowSearchBar( bool showSearchBar ) +{ + if ( showSearchBar_ == showSearchBar ) + { + 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 changedTimerSettings(); + + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set the way the chats will be grouped together +void Account::setTabbedChatMode( int tabbedChatMode ) +{ + tabbedChatMode_ = tabbedChatMode; +} + + + +// Set a temporary password for the account for login attempts from the initialview dialog +void Account::setTemporaryPassword( const QString &temporaryPassword ) +{ + temporaryPassword_ = temporaryPassword; +} + + + +// Set whether or not to login with this account. +void Account::setUseAutologin( bool useAutologin) +{ + if( useAutologin != useAutologin_ ) + { + useAutologin_ = useAutologin; + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + } +} + + + +// Set whether or not to show emoticons in chats. +void Account::setUseEmoticons( bool useEmoticons) +{ + useEmoticons_ = useEmoticons; + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + emit changedChatStyleSettings(); +} + + + +// Set whether the account's passport is verified +void Account::setVerified( bool verified ) +{ + verified_ = verified; +} + + + +// Set whether or not to send our display picture +void Account::setShowPicture( bool showPicture ) +{ + if( showPicture == showPicture_ ) + { + return; + } + + showPicture_ = showPicture; + dirty_ = true; + + updateMsnObject(); + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Creates the MsnObject only if the user wants to show a display picture +void Account::updateMsnObject() +{ + QString oldMsnString; + QString newMsnString; + + // Remove the previous msn object if there is one + if( msnObject_ ) + { + oldMsnString = msnObject_->objectString(); + delete msnObject_; + msnObject_ = 0; + } + + // Verify if the picture exists: if not, change it to the default one as returned + // by getPicturePath() + QString picturePath( getPicturePath() ); + if( picturePath != displayPicturePath_ ) + { +#ifdef KMESSDEBUG_ACCOUNT_MSNOBJECT + kDebug() << "Replacing picture" << displayPicturePath_ << "with" << picturePath; +#endif + displayPicturePath_ = picturePath; + } + +#ifdef KMESSDEBUG_ACCOUNT_MSNOBJECT + kDebug() << "Show the picture?" << showPicture_ << "- Set picture path:" << displayPicturePath_; +#endif + + if ( showPicture_ ) + { + QFile iFile( displayPicturePath_ ); + if ( iFile.open( QIODevice::ReadOnly ) ) + { + const QByteArray& data( iFile.readAll() ); + iFile.close(); + + msnObject_ = new MsnObject( handle_, "KMess.tmp", "", MsnObject::DISPLAYPIC, data ); + newMsnString = msnObject_->objectString(); + } + else + { + kWarning() << "Picture could not be loaded: " << displayPicturePath_; + } + } + + // Detect if there was a change. + if( oldMsnString != newMsnString ) + { +#ifdef KMESSDEBUG_ACCOUNT_MSNOBJECT + kDebug() << "result is: '" << newMsnString << "'"; +#endif + emit changedMsnObject(); + } +} + + + +#include "account.moc" diff --git a/kmess/account.h b/src/account.h similarity index 59% rename from kmess/account.h rename to src/account.h index 284195e..e14ae0e 100644 --- a/kmess/account.h +++ b/src/account.h @@ -18,22 +18,25 @@ #ifndef ACCOUNT_H #define ACCOUNT_H -#include -#include +#include "contact/msnstatus.h" +#include "utils/richtextparser.h" + +#include // Forward declarations -class KConfig; class KMessTest; class MsnObject; + + /** * @brief Data class for user account settings. * * The properties of this class correspond with the profile section in the kmessrc file. * The data is read with the readProperties() method and saved with the saveProperties() method. * When the user switches to another account, the data is copied to the CurrentAccount class with - * the copyAccount() method. The set* methods are issued from the SettingsDialog code. - * When the account is disconnected, the data is copied back and saved to disk. + * the copyAccount() method. The set* methods are issued from the AccountSettingsDialog + * code. When the account is disconnected, the data is copied back and saved to disk. * * @author Mike K. Bennett * @ingroup Root @@ -44,34 +47,47 @@ 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 + { + VIEW_BYGROUP + , VIEW_BYSTATUS + , 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 ); - // Delete the account data - void deleteAccountData(); + // Set the account as deleted + void setDeleted(); // Read the auto-reply message. const QString& getAutoreplyMessage() const; // Return the chat style name. const QString& getChatStyle() const; + // Read how contacts are shown, by group, by online/offline, or mixed. + ContactListDisplayMode getContactListDisplayMode() const; // Return the font used for contact messages, if forced to. const QFont& getContactFont() const; // Return the color of the forced contact font. const QString& getContactFontColor() const; - // Read the email command used when not using hotmail - const QString& getEmailCommand() const; // Return whether email notifications are supported bool getEmailSupported() const; // Return the user message font. @@ -79,7 +95,7 @@ class Account : public QObject // Return the color of the user message font. const QString& getFontColor() const; // Return the user's friendlyName - QString getFriendlyName() const; + QString getFriendlyName( FormattingMode mode = STRING_CLEANED ) const; // Whether follow-up messages from the contact should be grouped. bool getGroupFollowupMessages() const; // Return the user's handle @@ -87,43 +103,47 @@ class Account : public QObject // Return the length of time waited before the user goes idle. const int& getIdleTime() const; // Return the status to set upon connection - QString getInitialStatus() 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 incoming mail. - bool getNotifyEmails() const; + Status getInitialStatus() const; + // Returns display mode used to show pictures in contact list. + int getListPictureSize() const; // Return the user's password QString getPassword() const; // Return the personal message - QString getPersonalMessage() const; - // Return whether or not to save chats. + QString getPersonalMessage( FormattingMode mode = STRING_CLEANED ) const; + // 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; + // Return the user's saved password + QString getSavedPassword() const; // Read whether or not allowed contacts are shown. bool getShowAllowedContacts() const; - // Read whether contacts are shown by group or by online/offline. - bool getShowContactsByGroup() 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; - // Returns whether display pictures should be shown in contact list. - bool getShowListPictures() 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 + bool getHideNotificationsWhenBusy() const; + // Read whether the password must be stored + 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. @@ -134,32 +154,42 @@ 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 + bool getUseChatFormatting() const; // Return whether or not to show contact messages in the stored font. bool getUseContactFont() const; // Return whether or not to show emoticons in chats. bool getUseEmoticons() const; // Return whether or not to use bold/italic/underline effects in chats. bool getUseFontEffects() const; - // Read whether the user uses hotmail to read email or a set command - bool getUseHotmail() const; // Return whether the idle timer should be used. bool getUseIdleTimer() const; - // Returns whether or not to send our display image - bool getShowImage() const; - // Return the path of the custom display image. - const QString getCustomImagePath() const; - // Return the path to the *current* display image - const QString getImagePath() const; + // Return whether or not to enable MSN Plus! formatting in the contact list + bool getUseListFormatting() const; + // Returns whether or not to send our display picture + 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; - // Return the path for a new the custom display image. - QString getNewCustomImagePath(); // Whether the account is marked to be deleted bool isDeleted() const; // Whether the account has unsaved settings changes @@ -169,21 +199,23 @@ class Account : public QObject // Return whether the account's passport is verified bool isVerified() const; // Read in account properties - void readProperties(KConfig *config, QString handle); + void readProperties( const QString &handle ); // Save account properties - void saveProperties(KConfig *config); + 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 ); // Set the auto-reply message. void setAutoreplyMessage( const QString& autoreplyMessage); // Set chat information - void setChatInformation( bool useContactFont, bool useEmoticons, bool useFontEffects, bool showMessageTime, bool groupFollowupMessages, 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 useHotmail, const QString& emailCommand, bool showEmail, bool showOtherFolders ); + void setEmailInformation( bool showEmail, bool showOtherFolders ); // Set the font void setFont( const QFont& font ); // Set the font color @@ -197,39 +229,45 @@ class Account : public QObject // Whether the account is a guest account, not permanently saved on the computer void setGuestAccount( bool guestAccount ); // Change the status to set upon connection - void setInitialStatus( QString status ); + void setInitialStatus( Status status ); + // Set the mode of display list pictures + void setListPictureSize( int mode ); // 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 doNotifyEmails, int notificationDuration ); - // 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 incoming mail. - void setNotifyEmails( bool doNotifyEmails ); + 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 the account's saved password + void setSavedPassword( const QString &password ); + // 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 contacts are shown by group or by online/offline. - void setShowContactsByGroup( bool showContactsByGroup ); - // Set whether the display pictures of the contacts should be shown in list - void setShowListPictures( bool showPictures); + // 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 void setTemporaryPassword( const QString &temporaryPassword ); // Set whether or not to login with this account. @@ -238,11 +276,15 @@ class Account : public QObject void setUseEmoticons( bool useEmoticons); // Set whether the account's passport is verified void setVerified( bool verified ); - // Set whether or not to send our display image - void setShowImage( bool showImage ); + // Set whether or not to send our display picture + void setShowPicture( bool showPicture ); // Creates the MsnObject only if the user wants to show a display picture void updateMsnObject(); + public: // Static public members + // Validate a contact email + static bool isValidEmail( QString email ); + protected: // Protected methods // Update the email-supported state (protected method) void setEmailSupported(bool emailSupported); @@ -256,26 +298,16 @@ class Account : public QObject QFont contactFont_; // The font color to be applied to contact messages. QString contactFontColor_; - // The number of the custom image - int customImageIndex_; + // Whether contacts should be shown by group, by online/offline status, or mixed. + ContactListDisplayMode contactListDisplayMode_; // Whether the account is marked to be deleted bool deleted_; // Whether the account has been changed at all bool dirty_; - // 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? - bool doNotifyEmails_; - // The external command used, optionally, to open email - QString emailCommand_; + // Path of the display picture set by the user + QString displayPicturePath_; + // 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 @@ -285,18 +317,22 @@ class Account : public QObject // The user's message font color. QString fontColor_; // The user's friendly name, i.e. "Mike" - QString friendlyName_; + FormattedString friendlyName_; // Whether the account is a "guest account", not permanently saved on the computer bool guestAccount_; // Whether follow-up messages from the contact should be grouped. bool groupFollowupMessages_; // The user's handle, i.e. mkb137b@hotmail.com QString handle_; + // Whether to hide popup notifications when busy. + bool hideNotificationsWhenBusy_; // The number of minutes of inactivity before the user status is // changed to idle. int idleTime_; // The status to connect as - QString initialStatus_; + Status initialStatus_; + // Display list pictures dimensions. + int listPictureSize_; // The duration in seconds that a notification balloon is shown. int notificationDuration_; // The user's password @@ -305,33 +341,57 @@ 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 + bool savePassword_; + // The password intially read from the store + QString savedPassword_; // Whether the chat window shakes for nudges bool shakeNudge_; // Whether or not allowed contacts should be visible. bool showAllowedContacts_; - // Whether contacts should be shown by group (true) or by online/offline status (false). - bool showContactsByGroup_; + // 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_; + // Whether or not to display empty groups in the contact list. + bool showEmptyGroups_; // Whether or not time information is shown for chat messages. bool showMessageTime_; // Whether now listening information should be shown or not. bool showNowListening_; - // Whether or not display pictures are shown. - bool showListPictures_; // Whether or not offline contacts are shown. bool showOfflineContacts_; // Whether or not notifications should be shown for "other folder" email. 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_; + // Whether or not chats should be tabbed in one window + 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. @@ -340,22 +400,26 @@ class Account : public QObject bool useEmoticons_; // Whether or not to use bold/italic/underline effects in chats. bool useFontEffects_; - // Whether to use Hotmail as the mail client or not (ie, use command given) - bool useHotmail_; // Whether or not the user wants to go idle after a certain time. bool useIdleTimer_; + // Whether or not to enable MSN Plus formatting in the contact list + bool useListFormatting_; + // Whether or not to enable MSN Plus formatting in chat + bool useChatFormatting_; // Whether the account's passport is verified bool verified_; // the user's personal message - QString personalMessage_; - // Whether or not to send our display image - bool showImage_; + FormattedString personalMessage_; + // Whether or not to send our display picture + bool showPicture_; // MsnObject representing our display picture if we have one MsnObject *msnObject_; 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 @@ -376,8 +440,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/kmess/actions/accountaction.cpp b/src/accountaction.cpp similarity index 81% rename from kmess/actions/accountaction.cpp rename to src/accountaction.cpp index c3411a5..74df846 100644 --- a/kmess/actions/accountaction.cpp +++ b/src/accountaction.cpp @@ -17,14 +17,18 @@ #include "accountaction.h" -#include "../account.h" -#include "../kmessdebug.h" +#include "account.h" +#include "kmessdebug.h" + + // The constructor -AccountAction::AccountAction(Account *account, QWidget *parent, const char *name ) - : KAction(parent,name), +AccountAction::AccountAction(Account *account, QWidget *parent ) + : KAction(parent), account_(account) { + setObjectName( "AccountAction[" + account->getHandle() + ']' ); + // The idea is to have an action that sends the account when its // normal "activated" signal is sent. // Then connect this action's regular "activated" signal to the action's @@ -32,10 +36,7 @@ AccountAction::AccountAction(Account *account, QWidget *parent, const char *name // signal. connect( this, SIGNAL( activated() ), this, SLOT ( slotActivated() ) ); -// // Connect the group so that this action's text will be updated if -// // the account's name changes. -// connect( account_, SIGNAL( changedFriendlyName() ), -// this, SLOT ( updateText() ) ); + // Initialize the text by calling update. updateText(); } @@ -65,7 +66,6 @@ void AccountAction::updateText() } setText( account_->getHandle() ); -// setText( account_->getFriendlyName() ); } #include "accountaction.moc" diff --git a/kmess/actions/accountaction.h b/src/accountaction.h similarity index 83% rename from kmess/actions/accountaction.h rename to src/accountaction.h index 1209151..53bc591 100644 --- a/kmess/actions/accountaction.h +++ b/src/accountaction.h @@ -18,26 +18,34 @@ #ifndef ACCOUNTACTION_H #define ACCOUNTACTION_H -#include +#include + // Forward declarations class Account; -/**An action menu for an account that gives an account object when - activated and can update its text when the account changes. - *@author Mike K. Bennett - */ +/** + * An action menu for an account that gives an account object when + * activated and can update its text when the account changes. + * + * @author Mike K. Bennett + * @ingroup Root + */ class AccountAction : public KAction { Q_OBJECT public: // The constructor - AccountAction(Account *account, QWidget *parent=0, const char *name=0); + explicit AccountAction( Account *account, QWidget *parent = 0 ); // The destructor - ~AccountAction(); + ~AccountAction(); + + public slots: + // Update the action's text based on the account. + void updateText(); protected slots: //Inherit from KAction... @@ -47,10 +55,6 @@ class AccountAction : public KAction // The stored user account Account *account_; - private slots: // Private slots - // Update the action's text based on the account. - void updateText(); - signals: void activated( Account *account ); }; diff --git a/src/accountsmanager.cpp b/src/accountsmanager.cpp new file mode 100644 index 0000000..a71b55b --- /dev/null +++ b/src/accountsmanager.cpp @@ -0,0 +1,722 @@ +/*************************************************************************** + accountsmanager.cpp - description + ------------------- + begin : Sat May 3 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 "accountsmanager.h" + +#include "utils/kmessconfig.h" +#include "currentaccount.h" +#include "kmess.h" +#include "kmessapplication.h" +#include "kmessdebug.h" + +#include + +#include +#include +#include + + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + #define KMESSDEBUG_ACCOUNTSMANAGER_KWALLET +#endif + + + +// Initialize the singleton instance to zero +AccountsManager* AccountsManager::instance_(0); + + + +/** + * Constructor + */ +AccountsManager::AccountsManager() +: doPasswordRead_( false ), + doPasswordWrite_( false ), + passwordManager_( 0 ) +{ + // Load the saved accounts from disk and create them + readProperties(); +} + + + +// Destructor +AccountsManager::~AccountsManager() +{ + // Delete the accounts + qDeleteAll( accounts_ ); + accounts_.clear(); + + // Delete the password manager instance + delete passwordManager_; + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + kDebug() << "DESTROYED."; +#endif +} + + + +// Add a new account to the list +void AccountsManager::addAccount( Account *account ) +{ + // Append account + accounts_.append( account ); + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + kDebug() << "New account created:" << account->getHandle() << "."; +#endif + + emit accountAdded( account ); +} + + + +// An account's settings have been changed +void AccountsManager::changeAccount( Account *account, QString oldHandle, QString oldFriendlyName ) +{ + if( KMESS_NULL( account ) ) return; + + QString newHandle( account->getHandle() ); + + // We're saving settings for a new account + if( getAccountByHandle( oldHandle ) == 0 ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + kDebug() << "Saving settings for new account" << newHandle; +#endif + + // Add the account to the account list. + addAccount( account ); + } +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + else + { + kDebug() << "Saving settings for " << oldHandle; + } +#endif + + // If the account is set to use autologin, make sure that all other accounts do not + if( ! account->isDeleted() && account->getUseAutologin() ) + { + foreach( Account *otherAccount, accounts_ ) + { + if( otherAccount != account ) + { + otherAccount->setUseAutologin( false ); + } + } + } + + // Rename the account's directory if the handle has changed + if( oldHandle != newHandle ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + kDebug() << "Moving account dir from" << oldHandle << "to" << newHandle; +#endif + + QString accountsPath( KMessConfig::instance()->getAccountsDirectory() ); + + QDir accountsDir( accountsPath ); + + if( accountsDir.exists( newHandle ) ) + { + kWarning() << "Destination account directory" << newHandle << "already exists!"; + } + + if( accountsDir.rename( oldHandle, newHandle ) ) + { + kWarning() << "Unable to move account directory" << oldHandle << "to" << newHandle << "!"; + } + } + + // Commit configuration changes to disk, now + // Makes sure the settings are not lost if KMess is terminated or crashes. + account->saveProperties(); + + // Emit a signal so that the UI can be updated + emit accountChanged( account, oldHandle, oldFriendlyName ); +} + + + +// 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 ); +} + + + +// Delete the given account +void AccountsManager::deleteAccount( Account *account ) +{ + if( KMESS_NULL(account) ) return; + + emit accountDeleted( account ); + + QString handle( account->getHandle() ); + KMessApplication *kmessApp = static_cast( kapp ); + + if( kmessApp->getContactListWindow()->isConnected() + && CurrentAccount::instance()->getHandle() == handle ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + kDebug() << "Cannot delete current account:" << handle; +#endif + return; + } + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + kDebug() << "Deleting account for " << handle << "."; +#endif + + // Remove the account from the list of accounts + if( accounts_.removeAll( account ) == 0 ) + { + kWarning() << "Account" << handle << "not found in collection!"; + } + + // Delete the account directory + KMessConfig::instance()->destroyConfigDir( KMessConfig::instance()->getAccountsDirectory() + "/" + handle ); + + // Delete the account's contents + account->setDeleted(); + account->deleteLater(); +} + + + +/** + * Delete the instance of the accounts manager + */ +void AccountsManager::destroy() +{ + delete instance_; + instance_ = 0; +} + + + +// 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 ) + { + return account; + } + } + + return 0; +} + + + +// Get the list of all saved accounts +const QList AccountsManager::getAccounts() const +{ + return accounts_; +} + + + +// Initialize the KWallet password manager +void AccountsManager::initializePasswordManager( bool block ) +{ + // Don't initialize if it is already + if( passwordManager_ != 0 ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "KWallet is already initialized."; +#endif + return; + } + + // Obtain the window ID of the main KMess window + KMessApplication *kmessApp = static_cast( kapp ); + WId wId = kmessApp->getContactListWindow()->window()->winId(); + + if( block ) + { + // Open KWallet (synchronously - blocks KMess until the password is given) + passwordManager_ = KWallet::Wallet::openWallet( KWallet::Wallet::LocalWallet(), wId, KWallet::Wallet::Synchronous ); + + // Call the slot manually + slotWalletOpen( true ); + return; + } + else + { + // 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 ); + + 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; + } + } +} + + + +// Queue a read for all passwords +void AccountsManager::readPasswords( bool block ) +{ + doPasswordRead_ = true; + initializePasswordManager( block ); +} + + + +// Save passwords for all accounts (only actually saves when there are accounts to be updated!) +void AccountsManager::savePasswords( bool block ) +{ + bool passwordsToWrite = false; + + // check if there are passwords to be written + foreach( const Account *account, accounts_ ) + { + if( account->getSavedPassword() != account->getPassword() ) + { + passwordsToWrite = true; + break; + } + } + + if( passwordsToWrite ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "There were passwords to be updated, scheduling an update."; +#endif + doPasswordWrite_ = true; + initializePasswordManager( block ); + } +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + else + { + kDebug() << "There were no passwords to be updated, skipping save request."; + } +#endif +} + + + +// Read the passwords from the just opened wallet +void AccountsManager::slotWalletOpen( bool success ) +{ + // if the wallet couldn't be opened, delete it + if( ! success || + ( passwordManager_ != 0 && ! passwordManager_->isOpen() ) ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Wallet opening failed, falling back to plain text passwords."; +#endif + + delete passwordManager_; + passwordManager_ = 0; + } + + // initialize the wallet + if( passwordManager_ ) + { + setupPasswordManager(); + } + + // Read the passwords + if( doPasswordRead_ ) + { + if( passwordManager_ == 0 ) + { + KConfigGroup passwordGroup( KMessConfig::instance()->getGlobalConfig( "Passwords" ) ); + const QStringList& passwordAccountList( passwordGroup.keyList() ); + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Reading passwords from plain-text storage instead of KWallet!"; +#endif + + // 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 + kDebug() << "Password have been read for account: " << accountHandle; +#endif + + QString password = passwordGroup.readEntry( accountHandle, QString() ); + account->setPassword( password ); + account->setSavedPassword( password ); + } + } + else // passwordManager_ != 0 + { + QString password; + + // Read the password for each account + foreach( Account *account, accounts_ ) + { + if( passwordManager_->readPassword( account->getHandle(), password ) != 0 || password.isEmpty() ) + { + continue; + } + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Password have been read for account: " << account->getHandle(); +#endif + + account->setPassword( password ); + account->setSavedPassword( password ); + } + } + + emit passwordsReady(); + } + + // Write the passwords + if( doPasswordWrite_ ) + { + if( passwordManager_ == 0 ) + { + kWarning() << "KWallet is not available: saving passwords in plain text."; + + KConfigGroup passwordGroup( KMessConfig::instance()->getGlobalConfig( "Passwords" ) ); + + // Store the password for each account + foreach( Account *account, accounts_ ) + { + const QString& handle( account->getHandle() ); + + // If we have already the entry, check if the user want still save the password.. + 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 + + account->setSavedPassword( "" ); + passwordGroup.deleteEntry( handle ); + continue; + } + } + + // Save the password + account->setSavedPassword( account->getPassword() ); + passwordGroup.writeEntry( handle, account->getPassword() ); + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Password for account" << handle << "saved."; +#endif + } + } + else // passwordManager_ != 0 + { + // Store the password for each account + foreach( Account *account, accounts_ ) + { + const QString& handle( account->getHandle() ); + bool savePassword = ( account->getSavePassword() && ! account->getPassword().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() << "Removing account" << handle << "from wallet"; +#endif + + account->setSavedPassword( "" ); + passwordManager_->removeEntry( handle ); + continue; + } + } + // 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 + } + + account->setSavedPassword( account->getPassword() ); + } + + // Save the passwords to disk now + passwordManager_->sync(); + } + } + + doPasswordRead_ = false; + doPasswordWrite_ = false; + + // Clean up the password manager, it's not needed anymore + // (not cleaning it up could result in weird issues if the program crashes or so) + delete passwordManager_; + passwordManager_ = 0; +} + + + +// Set up the passwordManager_ (change to the KMess folder, import plaintext passwords, etc) +void AccountsManager::setupPasswordManager() +{ +#ifdef KMESSTEST + KMESS_ASSERT( passwordManager_->isOpen() ); +#endif + + // Look for an existing kmess folder and create one if needed + if( ! passwordManager_->hasFolder( "KMess" ) ) + { + passwordManager_->createFolder( "KMess" ); + } + + // Set the current folder for password storing, it should't fail + if( ! passwordManager_->setFolder( "KMess" ) ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kWarning() << "Setting KWallet folder failed!"; +#endif + + delete passwordManager_; + passwordManager_ = 0; + + 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 :) + KConfigGroup passwordGroup( KMessConfig::instance()->getGlobalConfig( "Passwords" ) ); + const QStringList& passwordAccountList( passwordGroup.keyList() ); + if( ! passwordAccountList.isEmpty() ) + { + QStringList validAccounts; + + 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; + } + + validAccounts << accountHandle; + } + + // There are some accounts passwords. Ask the user + if( validAccounts.count() > 0 ) + { + kWarning() << "Insecure account passwords found for accounts: " << validAccounts; + + int res = KMessageBox::questionYesNoCancel( 0, + i18n( "Some insecurely stored account passwords have been found.
" + "Do you want to import the passwords to the KDE Wallet " + "named '%1', keep the insecurely stored passwords, or delete " + "them permanently?

" + "Note: it is not recommended to keep insecurely stored 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 insecurely stored passwords", + "Delete" ), + "edit-delete-shred" ), // No option + KGuiItem( i18nc( "Dialog button: Keep insecurely stored 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."; +#endif +} + + + +/** + * Return a singleton instance of the accounts manager + */ +AccountsManager* AccountsManager::instance() +{ + // If the instance is null, create a new accounts manager and return that. + if ( instance_ == 0 ) + { + instance_ = new AccountsManager(); + } + return instance_; +} + + + +/** + * Load the accounts from disk + */ +void AccountsManager::readProperties() +{ + // Obtain the list of account directories in the KMess config directory + QStringList accountList( KMessConfig::instance()->getAccountsList() ); + + // Add each one of the saved accounts to the internal list + foreach( const QString &handle, accountList ) + { + if( Account::isValidEmail( handle ) ) + { + Account *account = new Account(); + account->readProperties( handle ); + addAccount( account ); + } + } +} + + + +// Show the settings dialog for a given account +void AccountsManager::showAccountSettings( Account *account, QWidget *parentWindow, AccountSettingsDialog::Page startingPage ) +{ + // No account has been specified, create one + if( ! account ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + kDebug() << "Opening settings for a new account"; +#endif + + // Create an account to store the profile information + account = new Account(); + + // Assume the user *does* want to save it's settings, + // otherwise he/she would have used the main login dialog. + account->setGuestAccount( false ); + } +#ifdef KMESSDEBUG_ACCOUNTSMANAGER + else + { + kDebug() << "Opening settings for " << account->getHandle(); + } +#endif + + CurrentAccount *currentAccount = CurrentAccount::instance(); + KMess *kmess = static_cast( kapp )->getContactListWindow(); + 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 ); + + connect( accountSettingsDialog, SIGNAL( deleteAccount(Account*) ), + this, SLOT ( deleteAccount(Account*) ) ); + connect( accountSettingsDialog, SIGNAL( changedSettings(Account*,QString,QString) ), + this, SLOT ( changeAccount(Account*,QString,QString) ) ); + + + accountSettingsDialog->loadSettings( account, isConnectedCurrentAccount, startingPage ); + accountSettingsDialog->show(); + accountSettingsDialog->raise(); +} + + + +#include "accountsmanager.moc" diff --git a/src/accountsmanager.h b/src/accountsmanager.h new file mode 100644 index 0000000..6239a0c --- /dev/null +++ b/src/accountsmanager.h @@ -0,0 +1,127 @@ +/*************************************************************************** + accountsmanager.h - description + ------------------- + begin : Sat May 3 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 ACCOUNTSMANAGER_H +#define ACCOUNTSMANAGER_H + +#include "settings/accountsettingsdialog.h" + +#include + +#include + +// Forward declarations +class Account; + + + +/** + * @brief The class responsible for keeping a list of saved user accounts + * + * @author Valerio Pilo + * @ingroup Root + */ +class AccountsManager : public QObject +{ + Q_OBJECT + + public: // Public methods + + // Verify is there is a saved account with the specified handle + bool contains( Account *account ) const; + // Return the account for a given handle + Account * getAccountByHandle( const QString &handle ); + // Get the list of all saved accounts + const QList getAccounts() const; + // Load the accounts from disk + void readProperties(); + // Warning: If a passwordManager_ is already being initialized with block=false and a + // second request comes in with block=true, the second request will *not* block (but it will be + // handled later!) - this doesn't happen in kmess as of now, I'm just including this here in case. + // Read passwords for all accounts + void readPasswords( bool block = false ); + // Save passwords for all accounts (only actually saves when there are accounts to be updated!) + void savePasswords( bool block = false ); + // Show the settings dialog for a given account + void showAccountSettings( Account *account = 0, QWidget *parentWindow = 0, + AccountSettingsDialog::Page startingPage = AccountSettingsDialog::PageAccount ); + + + public slots: + + // Add a new account to the list + void addAccount( Account *account ); + // An account's settings have been changed + void changeAccount( Account *account, QString oldHandle, QString oldFriendlyName ); + // Delete the given account + void deleteAccount( Account *account ); + + + public: // Public static methods + + // Delete the instance of the accounts manager + static void destroy(); + // Return a singleton instance of the accounts manager + static AccountsManager *instance(); + + + private: // Private methods + + // Constructor + AccountsManager(); + // Destructor + ~AccountsManager(); + // Initialize the KWallet password manager + void initializePasswordManager( bool block = false ); + // Set up the passwordManager_ after initialization + void setupPasswordManager(); + + + private slots: + + // Read the passwords from the just opened wallet + void slotWalletOpen( bool success ); + + private: // Private properties + + // A list of user accounts + QList accounts_; + + bool doPasswordRead_; + bool doPasswordWrite_; + + private: // Private static members + + // The instance of the accounts manager singleton + static AccountsManager *instance_; + // The instance of the KWallet password manager + KWallet::Wallet *passwordManager_; + + signals: + // A new account has been created + void accountAdded( Account *account ); + // An account's properties have changed + void accountChanged( Account *account, QString oldHandle, QString oldFriendlyName ); + // An account has been deleted + void accountDeleted( Account *account ); + // The password manager has read the passwords + void passwordsReady(); +}; + + + +#endif diff --git a/kmess/binreloc.c b/src/binreloc.c similarity index 98% rename from kmess/binreloc.c rename to src/binreloc.c index c6dc0ae..827ca31 100644 --- a/kmess/binreloc.c +++ b/src/binreloc.c @@ -13,11 +13,13 @@ #ifndef __BINRELOC_C__ #define __BINRELOC_C__ -#ifdef ENABLE_BINRELOC +#include "config-kmess.h" + +#if ( ENABLE_BINRELOC != 0 ) #include #include #include -#endif /* ENABLE_BINRELOC */ +#endif /* ( ENABLE_BINRELOC != 0 ) */ #include #include #include @@ -38,7 +40,7 @@ extern "C" { static char * _br_find_exe (BrInitError *error) { -#ifndef ENABLE_BINRELOC +#if ( ENABLE_BINRELOC == 0 ) if (error) *error = BR_INIT_ERROR_DISABLED; return NULL; @@ -177,9 +179,9 @@ _br_find_exe (BrInitError *error) static char * _br_find_exe_for_symbol (const void *symbol, BrInitError *error) { -#ifndef ENABLE_BINRELOC - if (error) - *error = BR_INIT_ERROR_DISABLED; + *error = BR_INIT_ERROR_DISABLED; /* Avoid a compiler warning */ + +#if ( ENABLE_BINRELOC == 0 ) return (char *) NULL; #else #define SIZE PATH_MAX + 100 diff --git a/kmess/binreloc.h b/src/binreloc.h similarity index 100% rename from kmess/binreloc.h rename to src/binreloc.h diff --git a/src/chat/chat.cpp b/src/chat/chat.cpp new file mode 100644 index 0000000..54d7e23 --- /dev/null +++ b/src/chat/chat.cpp @@ -0,0 +1,1759 @@ +/*************************************************************************** + chat.cpp - description + ------------------- + begin : Wed Jan 15 22:41:32 CST 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 "chat.h" + + +#include "../contact/contactextension.h" +#include "../contact/invitedcontact.h" +#include "../contact/msnobject.h" +#include "../model/contactlist.h" +#include "../utils/kmessconfig.h" +#include "../utils/kmessshared.h" +#include "../currentaccount.h" +#include "../kmessapplication.h" +#include "../kmessdebug.h" +#include "../kmess.h" +#include "chatmessageview.h" +#include "chatwindow.h" +#include "contactswidget.h" + +#include +#include +#include + +#include +#include +#include + + + +#ifdef KMESSDEBUG_CHAT + #define KMESSDEBUG_CHAT_GENERAL + #define KMESSDEBUG_CHAT_CONTACTS + #define KMESSDEBUG_CHAT_FILETRANSFER +// #define KMESSDEBUG_CHAT_TYPING_MESSAGES +#endif + + + +// The constructor +Chat::Chat( QWidget *parent ) +: ChatView( parent ) +, firstMessage_( true ) +, initialized_( false ) +, msnSwitchboardConnection_( 0 ) +{ + hide(); + + // Setup the contact typing information timer + typingTimer_.setSingleShot( true ); + + connect( &typingTimer_, SIGNAL( timeout() ), + this, SLOT ( contactTyping() ) ); +} + + + +// The destructor +Chat::~Chat() +{ +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +// Choose the contact to start an invitation with. +const QString Chat::chooseContact() +{ + if( KMESS_NULL(msnSwitchboardConnection_) ) return QString(); + + // Choose the contact. + const QStringList &contactsInChat = msnSwitchboardConnection_->getContactsInChat(); + switch( contactsInChat.count() ) + { + case 0: + // No contacts in the chat + if( msnSwitchboardConnection_->getLastContact().isEmpty() ) + { + // Send invitation to the first contact that should appear in the chat. + return msnSwitchboardConnection_->getFirstContact(); + } + else + { + // Resume chat with last contact + return msnSwitchboardConnection_->getLastContact(); + } + + case 1: + // Choose the only contact available in the chat + return contactsInChat.first(); + + 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, i18nc( "Error dialog box text", + "You cannot send invitations when there are multiple contacts in a chat. " + "Please start a separate chat with the contact you wanted to send the invitation to." ) ); + return QString(); + } +} + + + +// A contact joined the chat +void Chat::contactJoined( ContactBase* contact, bool offlineContact ) +{ + // Don't replace the bool offlineContact with contact->isOffline(), because there may be + // real chats with invisible contacts + const QString& handle ( contact->getHandle() ); + const QString& friendlyName( contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ); + const QStringList &participants( getParticipants() ); + + // Don't show the message when the contact went/is offline (because in such cases, the message + // is unreliable, and if we started the chat we're just pretending the contact joined) + if( ! offlineContact && ( currentAccount_->getShowSessionInfo() || participants.count() > 1 ) ) + { + showMessage( ChatMessage( ChatMessage::TYPE_PRESENCE, + ChatMessage::CONTENT_PRESENCE_JOIN, + false, + i18n("%1 has joined the chat.", friendlyName ), + handle, + friendlyName ) ); + } + + // Change the chat title + emit chatInfoChanged(); + + // Allow future changes in the nickname and status to update the chat informations + if( contact ) + { + // 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( ContactBase *contact, bool isChatIdle ) +{ + const QString& handle ( contact->getHandle() ); + const QStringList &participants( getParticipants() ); + +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "contact '" << handle << "' has left" << (isChatIdle ? " due to inactivity" : "") << "."; +#endif + + // 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 ) + { + disconnect( contact, 0, this, 0 ); + } + + // Always show a message when this is a group chat, + // but never if it would be the first message. + if( ! firstMessage_ && ( currentAccount_->getShowSessionInfo() || participants.count() > 1 ) ) + { + const QString& contactName( contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ); + QString message; + + if( isChatIdle ) + { + message = i18nc( "Message shown in chat, %1 is the contact's friendly name", + "The chat went idle, %1 has left it.", + contactName ); + } + else + { + message = i18nc( "Message shown in chat, %1 is the contact's friendly name", + "%1 has left the chat.", + contactName ); + } + + showMessage( ChatMessage( ChatMessage::TYPE_PRESENCE, + ChatMessage::CONTENT_PRESENCE_LEAVE, + false, + message, + handle, + contactName ) ); + } + + // Change the caption to remove the contact who has left + emit chatInfoChanged(); +} + + + +// A contact is typing +// If called without arguments, it will only update the list of typing contacts. +void Chat::contactTyping( ContactBase *contact, bool forceExpiration ) +{ + int secsTo; + 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 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( ! 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( typingContactsNames_.contains( handle ) ) + { +#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(); + 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 + QMutableHashIterator 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_TYPING_EXPIRATION_TIME ) + { +#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 + if( secsTo && secsTo < nextUpdate ) + { + nextUpdate = secsTo; + } + } + +#ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES + 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 < CHAT_TYPING_EXPIRATION_TIME ) + { + nextUpdate = CHAT_TYPING_EXPIRATION_TIME - nextUpdate; + } + +#ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES + kDebug() << "Next update in" << nextUpdate << "seconds."; +#endif + + // Update the user interface + if( typingContactsNames_.contains( handle ) ) + { + contactsWidget_->contactTyping( contact ); + } + else + { + contactsWidget_->messageReceived( handle ); + } + +#ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES + kDebug() << "emitting signal from:" << this; +#endif + + // Let the other window components update, too + emit gotTypingMessage( this ); + + // Activate the timer for the next update if needed + if( ! typingContactsTimes_.isEmpty() ) + { + typingTimer_.start( nextUpdate * 1000 ); + } +} + + + +// Return a list of the contacts in the chat to be used as window caption +const QString Chat::getCaption() +{ + // Grep the current participants or the last participant + const QStringList &participants( getParticipants() ); + QString caption; + + // How many people are there in here? + switch( participants.count() ) + { + // The chat is completely empty - it is not even a chat! + case 0: + break; + + // One contact is connected; or the only contact of the session has left + case 1: + caption = currentAccount_->getContactFriendlyNameByHandle( participants[0], STRING_CLEANED ); + break; + + // Two contacts are connected + case 2: + caption = i18nc( "Name of a chat tab", "%1 and %2", + currentAccount_->getContactFriendlyNameByHandle( participants[0], STRING_CLEANED ), + currentAccount_->getContactFriendlyNameByHandle( participants[1], STRING_CLEANED ) + ); + break; + + // Three or more contacts are connected + default: + caption = i18nc( "Name of a chat tab", "%1 et al.", + currentAccount_->getContactFriendlyNameByHandle( participants[0], STRING_CLEANED ) + ); + } + + // Replace the 'return chars' with 'space chars' + return caption.replace( "\n", " " ); +} + + + +// Return the chat window which currently contains this Chat +ChatWindow *Chat::getChatWindow() +{ + return qobject_cast( window() ); +} + + + +// Return the list of contacts in the chat +const QStringList Chat::getParticipants() const +{ + if( msnSwitchboardConnection_ == 0 ) + { + return lastKnownContacts_; + } + + 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 + const 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() ) ); +} + + + +// Return the list of previously sent messages +QStringList& Chat::getQuickRetypeList() +{ + return quickRetypeList_; +} + + + +// Return the list of contacts which are typing +const QStringList Chat::getTypingContacts() const +{ + return typingContactsNames_.values(); +} + + + +// Return the date and time the chat has started +QDateTime Chat::getStartTime() const +{ + return QDateTime( startDate_, startTime_ ); +} + + + +// Return the switchboard connection used by the chat window. +MsnSwitchboardConnection * Chat::getSwitchboardConnection() const +{ + return msnSwitchboardConnection_; +} + + + +// Initialize the object +bool Chat::initialize( MsnSwitchboardConnection *switchboardConnection ) +{ + if ( initialized_ ) + { + kDebug() << "already initialized."; + return false; + } + + if( ! ChatView::initialize() ) + { + kDebug() << "Couldn't setup the chat view widget."; + return false; + } + + // 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 ); + + // Save the date/time the chat started. + // Use it to save a chatlog later. + startDate_ = QDate::currentDate(); + startTime_ = QTime::currentTime(); + + // Update the chat window caption with the contact name + emit chatInfoChanged(); + + initialized_ = true; + return true; +} + + + +// Invite a contact to the chat +void Chat::inviteContacts( const QStringList &contacts ) +{ + if( msnSwitchboardConnection_ == 0 ) + { + return; + } + + // Invite each selected contact, if it's not in chat already + foreach( const QString &handle, contacts ) + { + if( ! isContactInChat( handle, false ) ) + { + msnSwitchboardConnection_->inviteContact( handle ); + } + } +} + + + +// Return whether or not the chat is at its first incoming message +bool Chat::isChatFirstMessage() +{ + return firstMessage_; +} + + + +// Return whether or not the contact is in this chat. +bool Chat::isContactInChat( const QString &handle, bool isExclusiveChatWithContact ) +{ + const QStringList &participants( getParticipants() ); + +#ifdef KMESSDEBUG_CHAT_CONTACTS + 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() ) + { + return false; + } + + // Check if the contact is one of the participants to this chat. + bool 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" << check; +#endif + + return check; +} + + + +// The chat is closing +void Chat::queryClose() +{ +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Saving chat log"; +#endif + + // Notify ChatMaster + emit closing( this ); + + // Save the chat + saveChatAutomatically(); + + /** + * TODO: Uncomment this part: it needs a _reliable_ method to check whether there are running file + * transfers. The commented part uses "ApplicationList::isEmpty()" which I've removed, the new + * method to check will probably be elsewhere. The main code of that method was this: + * + // check if there are active applications + if ( mimeApplications_.count() + + p2pApplications_.count() - + abortingApplications_.count() == 0) + return true; else return false; + * + */ + /* + // If there are active applications show a warning to the user + if( participants_.count() == 1 ) // Transfers are not possibile in multiple chats + { + // Check if there are active applications + ContactBase *contact = currentAccount_->getContactByHandle( participants_.first() ); + if( contact != 0 && contact->getApplicationList() != 0 + && ! contact->getApplicationList()->isEmpty() ) + { + int choice = KMessageBox::warningContinueCancel( this, i18n("Continue closing the chat window?\nActive transfers will be aborted!")); + if( choice == KMessageBox::Cancel ) + { + return false; + } + } + } + */ +} + + + +// The application is exiting +void Chat::queryExit() +{ +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Saving chat log"; +#endif + + // Just save the chat before going down + saveChatAutomatically(); +} + + + +// A message was received from a contact. +void Chat::receivedMessage(const ChatMessage &message) +{ +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Displaying message, internal type=" << message.getType(); + kDebug() << "First message = " << firstMessage_ << "."; +#endif + + showMessage( message ); + + // Do not notify about presence messages + if( message.getType() == ChatMessage::TYPE_PRESENCE ) + { + return; + } + + // Update the date of the last received message. Only allowed for contacts on the contact list. + Contact *sourceContact = currentAccount_->getContactList()->getContactByHandle( message.getContactHandle() ); + if( sourceContact != 0 && sourceContact->getExtension() ) + { + sourceContact->getExtension()->setLastMessageDate(); + } + + // Check if we should send an automatic reply to the chat message + if( currentAccount_ != 0 + && msnSwitchboardConnection_ != 0 + && currentAccount_->getAutoreply() + && ( lastSentAutoMessage_.isNull() || lastSentAutoMessage_.elapsed() > 120000 ) ) + { + // 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() ) ); + + // Send the autoreply message to the contact(s) + msnSwitchboardConnection_->sendChatMessage( awayMessage ); + + // Show the autoreply message + ChatMessage autoMessage = ChatMessage( ChatMessage::TYPE_OUTGOING, + ChatMessage::CONTENT_MESSAGE, + false, + awayMessage, + currentAccount_->getHandle(), + currentAccount_->getFriendlyName( STRING_ORIGINAL ), + currentAccount_->getPicturePath(), + currentAccount_->getFont(), + currentAccount_->getFontColor() ); + showMessage( autoMessage ); + + // Save the time the message was sent, to display the next after some time + lastSentAutoMessage_.start(); + } + + // 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 ); + + // If this was the first received message, clear the flag + if( firstMessage_ ) + { + firstMessage_ = false; + } +} + + + +/** + * 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 ) +{ + // Check if "save chats" is enabled + if( ! currentAccount_->getSaveChats() ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "User has save chats disabled, not saving chat."; +#endif + return; + } + + // 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."; +#endif + return; + } + +#ifdef KMESSDEBUG_CHAT_GENERAL + if( ! saveExternalFile ) + { + kDebug() << "Automatically saving the XML log file."; + } + else + { + 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(); + } + + if( ! saveExternalFile ) + { + extension = "xml"; + format = Account::EXPORT_XML; + dir.setPath( KMessConfig::instance()->getAccountDirectory( currentAccount_->getHandle() ) + + "/chatlogs" ); + } + else + { + dir.setPath( currentAccount_->getSaveChatPath() ); + format = currentAccount_->getSaveChatsFormat(); + switch( format ) + { + 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; + } + + const QString& year ( startDate_.toString( "yyyy" ) ); + const QString& month( startDate_.toString( "MM" ) ); + const 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; + } + } + + // 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 MsnObject &msnObject ) +{ + QString winkHtml; + msnSwitchboardConnection_->sendWink( msnObject ); + + // Only show the sent wink if they're enabled + if( currentAccount_->getShowWinks() ) + { + WinksWidget::getHtmlFromWink( msnObject.getLocation(), winkHtml ); + } + + // If the stored wink didn't have a name, don't show it: + QString notificationText; + if( msnObject.getFriendly().isEmpty() ) + { + notificationText = i18nc( "Message shown in the chat window (when the wink name is unknown)", + "You have sent a wink!" ); + } + else + { + notificationText = i18nc( "Message shown in the chat window, %1 is the wink name", + "You have sent the "%1" wink!", + msnObject.getFriendly() ); + } + + ChatMessage message( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_WINK, + false, + notificationText + winkHtml, // Add the actual wink after the message + QString() ); + showMessage( message ); +} + + + +// The user wants to block or unblock a contact. +void Chat::setContactBlocked( QString handle, bool isBlocked ) +{ + emit contactBlocked( handle, isBlocked ); +} + + + +// Enable or disable the parts of the window which allow user interaction +void Chat::setEnabled( bool isEnabled ) +{ + // Also remove the switchboard connection when disabling + if( ! isEnabled && msnSwitchboardConnection_ != 0 ) + { + setSwitchboardConnection( 0 ); + } + + if( ! isEnabled ) + { + getChatWindow()->showStatusMessage( ChatStatusBar::Disconnected, i18n("The chat has been disabled because you are no longer connected to the Live Messenger 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 ) + { + return; + } + + ChatView::setEnabled( isEnabled ); + + if ( isEnabled ) + { + getChatWindow()->setUIState( ChatWindow::Connected ); + } + +} + + + +// Change the switchboard connection used by the chat window. +void Chat::setSwitchboardConnection( MsnSwitchboardConnection *newConnection ) +{ + // Everything is connected already. +#ifdef KMESSDEBUG_CHAT_GENERAL + if( msnSwitchboardConnection_ == 0 ) + { + kDebug() << "Switchboard was not set up."; + } + else + { + kDebug() << "Switchboard was " + << ( msnSwitchboardConnection_ == newConnection ? "already set" : "different" ) << "." << endl; + } +#endif + + if( msnSwitchboardConnection_ != 0 ) + { + // Notify that all contacts have left the chat + if( ! msnSwitchboardConnection_->isEmpty() ) + { + const QStringList &participants( getParticipants() ); + +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Removing old switchboard's participants from the chat:" << participants; +#endif + foreach( const QString &handle, participants ) + { + 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, contactsWidget_, 0 ); + disconnect( msnSwitchboardConnection_, 0, this, 0 ); + + // 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 ) + { + return; + } + + // Make the new signals connections + 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(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(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() ) ); + + + // 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( const QString &handle, participants ) + { + ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + contact = currentAccount_->addInvitedContact( handle ); + } + + contactJoined( contact, true /* don't notify about the join */ ); + 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.", + 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 a Live Messenger feature that KMess does not support yet.", + friendlyName ), + handle, + friendlyName ) ); + break; + } +} + + + +// Show a wink received by a contact +void Chat::showWink( const QString &handle, const QString &filename, const QString &animationName ) +{ +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Processing received wink data."; +#endif + + QString message; + 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() ) + { + if( animationName.isEmpty() ) + { + message = 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. " + "You can re-enable it in the
" + "account settings.", + friendlyName ); + } + else + { + message = i18nc( "Message shown in the chat window, %1 is the contact's " + "friendly name, %2 is the wink name", + "You received the "%2" wink from %1, but displaying " + "winks has been disabled. " + "You can re-enable it in the " + "account settings.", + friendlyName, + animationName ); + } + showMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_WINK, + false, + message, + handle ) ); + return; + } + + // Test whether the file exists, before cabextract fails. + if( ! QFile::exists( filename ) ) + { + kWarning() << "file not found: " << filename << "!"; + return; + } + + QString html; + WinksWidget::CABEXTRACTOR value = WinksWidget::getHtmlFromWink( filename, html ); + + if( value == WinksWidget::SUCCESS ) + { + if( animationName.isEmpty() ) + { + message = i18nc( "Message shown in the chat window, %1 is the contact's friendly name", + "%1 has sent you a wink!", + friendlyName ); + } + else + { + message = i18nc( "Message shown in the chat window, %1 is the contact's " + "friendly name, %2 is the wink name", + "%1 has sent you a wink: "%2"!", + friendlyName, + animationName ); + } + + // Show a notification + receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_WINK, + true, + message + html, + handle, + friendlyName ) ); + return; + } + + // Extraction failed + switch( value ) + { + case WinksWidget::NOTINSTALLED: + if( animationName.isEmpty() ) + { + message = 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.", + friendlyName ); + } + else + { + message = i18nc( "Message shown in the chat window, %1 is the contact's " + "friendly name, %2 is the wink name", + "You received the "%2" wink from %1, but it " + "could not be displayed. Make sure you have " + "the "cabextract" program installed.", + friendlyName, + animationName ); + } + break; + + case WinksWidget::FAILED: + if( animationName.isEmpty() ) + { + message = 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. Extracting the wink " + "package with "cabextract" has failed.", + friendlyName ); + } + else + { + message = i18nc( "Message shown in the chat window, %1 is the contact's " + "friendly name, %2 is the wink name", + "You received the "%2" wink from %1, but it " + "could not be displayed. Extracting the wink " + "package with "cabextract" has failed.", + friendlyName, + animationName ); + } + break; + + default: + if( animationName.isEmpty() ) + { + message = 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 ); + } + else + { + message = i18nc( "Message shown in the chat window, %1 is the contact's " + "friendly name, %2 is the wink name", + "You received the "%2" wink from %1, but it " + "could not be displayed. The data could not be " + "read.", + friendlyName, + animationName ); + } + break; + } + + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + false, + message, + handle ) ); +} + + + +// 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 logs 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_PRESENCE, + ChatMessage::CONTENT_PRESENCE_STATUS, + true, + message, + contact->getHandle() ) ); +} + + + +// Notify the user of a received nudge +void Chat::slotReceivedNudge( ContactBase *contact ) +{ +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Received a nudge."; +#endif + + // Get friendly name + const 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(); +} + + + +// Signal that a message could not be sent to the switchboard +void Chat::slotSendingFailed( const QString &handle, const MimeMessage &message ) +{ + const QString& contentType( message.getValue( "Content-Type" ) ); + QString errorMessage; + QString friendlyName; + +#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" ) || contentType.startsWith( "application/x-ms-ink" ) ) + { + errorMessage = i18nc( "Error message shown in chat, %1 is the contact's friendly name", "Failed to send the handwritten message 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; + } + + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + false, + errorMessage, + handle, + friendlyName ) ); +} + + + +// Send a file to a contact. +void Chat::startFileTransfer( QList fileList ) +{ + if( KMESS_NULL(msnSwitchboardConnection_) ) return; + + // Ask for a contact + const 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"; +#endif + + // If no file names were given, ask for a filename + KUrl fileName( KFileDialog::getOpenUrl( KUrl( "kfiledialog:///:fileupload" ) ) ); + + // Stop if no file was selected + if( fileName.isEmpty() ) + { + return; + } + + fileList.append( fileName ); + } + + foreach( const QUrl &fileUrl, 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() << "Not a local file, copying it locally."; +#endif + // 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() ); + } +} + + + +// Send a nudge to a contact +void Chat::slotSendNudge() +{ + if( msnSwitchboardConnection_ == 0 ) + { + return; + } + + // Show a more detailed message if we're in an active chat + QString messageText; + const QStringList &contactsInChat = msnSwitchboardConnection_->getContactsInChat(); + if( contactsInChat.count() == 1 && msnSwitchboardConnection_->isConnected() ) + { + messageText = i18nc( "Message shown in chat window, %1 is the contact's friendly name", + "You have sent a nudge to %1!", + currentAccount_->getContactFriendlyNameByHandle( contactsInChat.first(), STRING_CLEANED_ESCAPED ) ); + } + else + { + // Chat is either empty (should resume), or a multi-chat + messageText = i18n( "You have sent a nudge!" ); + } + + // Display message + ChatMessage message( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_NUDGE, + false, + messageText, + QString::null ); + showMessage( message ); + + // Send nudge + msnSwitchboardConnection_->sendNudge(); + + // Shake the window + emit gotNudge(); +} + + + +// Start a chat +void Chat::startChat() +{ + if( KMESS_NULL(msnSwitchboardConnection_) ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kWarning() << "Tried to open a chat without a switchboard!"; +#endif + return; + } + +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Opening a chat of type:" << ( msnSwitchboardConnection_->isInactive() ? "Offline" : "Active" ); +#endif + + // Add the participant contacts to the chat, even if they're offline + const QStringList &participants( msnSwitchboardConnection_->getContactsInChat() ); + +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Adding initial chat participants to the chat:" << participants; +#endif + + foreach( const QString &handle, participants ) + { + ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + contact = currentAccount_->addInvitedContact( handle ); + } + contactsWidget_->contactJoined( contact ); + } + + // 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() ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Initial chat participant " << contact->getHandle() << " is offline; pretending the contact joined"; +#endif + contactJoined( contact, true ); + + receivedMessage( ChatMessage( ChatMessage::TYPE_PRESENCE, + ChatMessage::CONTENT_SYSTEM_NOTICE, + false, + i18n( "%1 is currently offline. Any messages you send will be delivered the next time he or she logs in.", + contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ), + contact->getHandle() ) ); + } + } +} + + + +//Start voice conversation +void Chat::startConversation() +{ + if( KMESS_NULL(msnSwitchboardConnection_) ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kWarning() << "Tried to open a conversation without a switchboard!"; +#endif + return; + } + + kWarning() << "not implemented!"; + // msnSwitchboardConnection_->startApp( MsnSwitchboardConnection::VOICECONVERSATION ); +} + + + +// Start GnomeMeeting with a contact. +void Chat::startMeeting() +{ + // Choose the contact. + const 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 requestNetMeeting(handle); +} + + + +// Send webcam data to a contact. +void Chat::startWebcamTransfer() +{ + // Choose the contact. + const 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 new file mode 100644 index 0000000..bcdffe5 --- /dev/null +++ b/src/chat/chat.h @@ -0,0 +1,209 @@ +/*************************************************************************** + chat.h - description + ------------------- + begin : Wed Jan 15 22:41:32 CST 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 CHAT_H +#define CHAT_H + +#include "chatview.h" +#include "../network/msnswitchboardconnection.h" + +#include +#include +#include + + +// Forward declarations +class ChatInformation; +class ChatMessage; +class ChatView; +class ChatWindow; +class ContactBase; +class KMessTest; +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 + * + * This class manages a chat. It handles the communication with the Switchboard connection; + * and connects the Chat View signals and calls to make user interaction possible. + * + * It is meant to be inserted into a ChatWindow object, not to be used alone. + * + * @ingroup Chat + */ +class Chat : public ChatView +{ + Q_OBJECT + + friend class KMessTest; + + public: + // The construtor + Chat( QWidget* parent = 0 ); + // The destructor + ~Chat(); + // Return a list of the contacts in the chat to be used as window caption + const QString getCaption(); + // Return the chat window which currently contains this Chat + ChatWindow *getChatWindow(); + // Return the list of contacts in the chat + const QStringList getParticipants() const; + // Return the icon to use in the tab icon chat + KIcon getParticipantsTabIcon(); + // Return the list of previously sent messages + QStringList &getQuickRetypeList(); + // Return the date and time the chat has started + QDateTime getStartTime() const; + // Return the list of contacts which are typing + const QStringList getTypingContacts() const; + // Initialize the object + bool initialize( MsnSwitchboardConnection *switchboardConnection ); + // Return the switchboard connection used by the chat window. + MsnSwitchboardConnection * getSwitchboardConnection() const; + // 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 MsnObject &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 + void startChat(); + // Show a wink received by a contact + void showWink( const QString &handle, const QString &filename, const QString &animationName ); + + public slots: + // A message was received from a contact. + void receivedMessage(const ChatMessage &message); + // Change the switchboard connection used by the chat window. + void setSwitchboardConnection( MsnSwitchboardConnection *newConnection = 0 ); + // Send a nudge + void slotSendNudge(); + // Send a file to a contact. + void startFileTransfer( QList fileList = QList() ); + //Voice conversation + void startConversation(); + // Start GnomeMeeting with a contact. + void startMeeting(); + // Send webcam data to a contact. + void startWebcamTransfer(); + + private: // Private methods + // Choose the contact to start an invitation with. + const QString chooseContact(); + // save the chat if needed. + void saveChatAutomatically( bool saveExternalFile = false ); + + private slots: // Private slots + // A contact joined the chat + void contactJoined( ContactBase *contact, bool offlineContact = false ); + // A contact left the chat + void contactLeft ( ContactBase *contact, bool isChatIdle ); + // A contact is typing + 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( 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 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_; + // List of previously sent messages, to allow sending them again quickly + QStringList quickRetypeList_; + // The date/time the chat started + QDate startDate_; + QTime startTime_; + // The list of names of contacts which are currently typing + QHash typingContactsNames_; + // The list of times when the contacts have started typing + QHash typingContactsTimes_; + // A timer to update the typing information + QTimer typingTimer_; + // Handle a command from ChatView (e.g. '/online') + bool handleCommand( QString command ); + + + signals: + // Signal that some chat details (like the number of active contacts) have changed + void chatInfoChanged(); + // 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 + void gotTypingMessage( Chat *chat ); + // Signal that a nudge has been received + void gotNudge(); + // Signal that the ChatMaster should start a filetransfer. + 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 contactAdded( QString handle, bool isAdded ); + // The user wants to allow a contact to see his/hers online status. + 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 new file mode 100644 index 0000000..44af737 --- /dev/null +++ b/src/chat/chatmaster.cpp @@ -0,0 +1,2265 @@ +/*************************************************************************** + chatmaster.cpp - description + ------------------- + begin : Sat Jan 18 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 "chatmaster.h" + +#include "../contact/contact.h" +#include "../contact/contactextension.h" +#include "../contact/msnobject.h" +#include "../model/contactlist.h" +#include "../network/applications/applicationlist.h" +#include "../network/applications/mimeapplication.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" +#include "../kmessapplication.h" +#include "../kmessdebug.h" +#include "../utils/kmessconfig.h" +#include "chat.h" +#include "chatwindow.h" + +#include +#include +#include +#include + +#include + +#ifdef Q_WS_X11 +# include +#endif + +// Settings for debugging +#define CHATMASTER_SEND_FILES_MSNFTP 0 + + + +// The constructor +ChatMaster::ChatMaster(QObject *parent) + : QObject(parent), + initialized_(false) +{ + setObjectName("ChatMaster"); +} + + + +// The destructor +ChatMaster::~ChatMaster() +{ + disconnected(); + + // Delete all open windows + kDebug() << chatWindows_; + qDeleteAll( chatWindows_ ); + chatWindows_.clear(); + + // Cleanup pending messages + qDeleteAll( pendingMimeMessages_ ); + pendingMimeMessages_.clear(); + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "DESTROYED."; +#endif +} + + + +// The connection has been established +void ChatMaster::connected() +{ + // There are no chats to reactivate + if( chats_.isEmpty() ) + { + return; + } + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Trying reactivation of" << chats_.count() << "open chats."; +#endif + + QList windowsList; + + // Go through all the chats and reactivate them + foreach( Chat *chat, chats_ ) + { + // 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, skipping it."; +#endif + continue; + } + + const QString &handle( participants.first() ); + + // Only reactivate the chat if this contact is in the connected account's list + 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, handle ); + if( switchboard ) + { + chat->setSwitchboardConnection( switchboard ); + chat->setEnabled( true ); + + // Mark this chat's window for reactivation + if( ! windowsList.contains( chat->getChatWindow() ) ) + { + windowsList.append( chat->getChatWindow() ); + } + } + } + + // Go through all the windows and reactivate them + foreach( ChatWindow *window, windowsList ) + { + window->setUIState( ChatWindow::Connected ); + } +} + + +// The user has disconnected, so close all open switchboard connections and disable the chats +void ChatMaster::disconnected() +{ + // Don't waste time disabling the chats when exiting. + KMessApplication *kmessApp = static_cast( kapp ); + if( kmessApp->quitSelected() ) + { + return; + } + + if( ! chatWindows_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Disabling" << chatWindows_.count() << "open chat windows."; +#endif + + // Go through all the chats + foreach( ChatWindow *window, chatWindows_ ) + { + // Disable the chats so they can't receive user input anymore + window->setUIState( ChatWindow::Disconnected ); + } + } + + // close down all switchboards first. + if( ! switchboardConnections_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Closing" << switchboardConnections_.count() << "open switchboards."; +#endif + + // give each switchboard a chance to close properly. + foreach( MsnSwitchboardConnection *conn, switchboardConnections_ ) + { + conn->closeConnection(); + } + } + + if( ! chats_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Closing" << chats_.count() << "open chats."; +#endif + + // Go through all the chats and disable them + foreach( Chat *chat, chats_ ) + { + chat->setEnabled( false ); + } + } + + // 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 ); + } +} + + + +// Forward a new switchboard server request signal coming from an existing switchboard connection +void ChatMaster::forwardRequestNewSwitchboard( QString handle ) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Forwarding the new switchboard request signal for " + << handle << "." << endl; +#endif + + emit requestSwitchboard( handle, ChatInformation::CONNECTION_REFRESH ); +} + + + +// Forward a request to add or remove a contact from the contactlist, which comes from the ContactFrame. +void ChatMaster::forwardContactAdded( QString handle, bool isAdded ) +{ + if( isAdded ) + { + emit addContact( handle ); + } + else + { + emit removeContact( handle, false ); + } +} + + + +// Forward a request to block or unblock a contact, which comes from the ContactFrame. +void ChatMaster::forwardContactBlocked( QString handle, bool isBlocked ) +{ + if( isBlocked ) + { + emit blockContact( handle ); + } + else + { + emit unblockContact( handle ); + } +} + + + +// Return the application list for a given contact +ApplicationList * ChatMaster::getApplicationList(const QString &handle) +{ + ApplicationList *appList = 0; + + // Get the contact. + 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() ) + { + appList = contact->getApplicationList(); + } + else + { + // Create object if it wasn't created yet for this contact. +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Creating application list for contact " << handle; +#endif + appList = contact->createApplicationList(); + + // Connect signals from the applist + connect( appList, SIGNAL( newApplication(Application*) ), // A new application was created. + this, SLOT( slotConnectApplication(Application*) )); + connect( appList, SIGNAL( putMsg(const MimeMessage&, const QString&, bool) ), // Request to send message + this, SLOT( slotDeliverMimeMessage(const MimeMessage&, const QString&, bool) )); + } + + return appList; +} + + + +// Return the chat tab which uses the given switchboard connection +Chat *ChatMaster::getChatBySwitchboard( const MsnSwitchboardConnection *connection ) +{ + // Look through the chat windows for an exclusive chat with the given contact + foreach( Chat *chat, chats_ ) + { + if( chat->getSwitchboardConnection() == connection ) + { + return chat; + } + } + + return 0; +} + + + +// Return the chat window which uses the given switchboard connection +ChatWindow * ChatMaster::getChatWindowBySwitchboard(const MsnSwitchboardConnection *connection) +{ + Chat *chat = getChatBySwitchboard( connection ); + if( chat != 0 ) + { + return chat->getChatWindow(); + } + + return 0; +} + + + +// Return the chat where we're having an conversation with the given contact. +Chat *ChatMaster::getContactsChat( const QString &handle, bool privateChat ) +{ + Chat *result = 0; + + // Look through the chats for an exclusive one with the contact given + foreach( Chat *chat, chats_ ) + { + if( chat->isContactInChat( handle, true ) ) + { + return chat; // best candidate found + } + else if( ! privateChat && chat->isContactInChat( handle ) ) + { + result = chat; // keep it as a second choice + } + } + + return result; +} + + + +// Return the chat where we're having a conversation with the given contacts. +// The privateChat parameter is ignored. +Chat *ChatMaster::getContactsChat( const QStringList &handles, bool privateChat ) +{ + // Do nothing if there are no open chats or if the list is empty + if( handles.isEmpty() || chats_.isEmpty() ) + { + return 0; + } + + // If the list only has one contact, just call the single handle version of this method. + if( handles.count() == 1 ) + { + return getContactsChat( handles.first(), privateChat ); + } + + Chat *result = 0; + + // Look through the chats for a group chat with all the contacts of the list + foreach( Chat *chat, chats_ ) + { + bool found = true; + + // Check every contact in the list to see if they're all present in this chat + for( QStringList::ConstIterator it = handles.begin(); it != handles.end(); ++it ) + { + if( ! chat->isContactInChat( *it ) ) + { + found = false; + break; + } + } + + if( found ) + { + result = chat; + break; + } + } + + return result; +} + + + +// Return the chat connection where we're having an conversation with the given contact. +MsnSwitchboardConnection *ChatMaster::getContactSwitchboardConnection( const QString &handle, bool doRequirePrivateChat ) +{ + foreach( MsnSwitchboardConnection *connection, switchboardConnections_ ) + { + if( ! connection->isContactInChat( handle ) ) + { + continue; + } + + // If the wanted contact is in this chat, it's 99% sure this is the one we want, except when we want a private chat, but this is not + if( ! connection->isExclusiveChatWithContact( handle ) && doRequirePrivateChat ) + { + continue; + } + + return connection; + } + + return 0; +} + + + +// Initialize the class +bool ChatMaster::initialize() +{ + if ( initialized_ ) + { + kDebug() << "Already initialized."; + return false; + } + + // 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; +} + + + +// Check whether the contact is in any of the existing chat windows. +bool ChatMaster::isContactInChat( const QString &handle ) +{ + // Find the chat where we have an exclusive chat with the given contact + return ( getContactsChat( handle, false ) != 0 ); +} + + + +// Verify if a new chat can be opened and requests a switchboard +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 ); + + // No need to open another chat, notify about the presence of the existing one. + if( chat != 0 ) + { + raiseChat( chat, true ); + return; + } + + // Get the contact, see if it's online + CurrentAccount *currentAccount = currentAccount_; + ContactBase *contact = currentAccount->getContactByHandle( handle ); + + // 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 the contact is offline or invisible. + // We'll start an offline chat. + connectionType = ChatInformation::CONNECTION_OFFLINE; + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Starting an offline chat with " << handle; +#endif + } + else + { + // Start a normal chat with an online contact + connectionType = ChatInformation::CONNECTION_CHAT; + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Requesting a switchboard to chat with " << handle; +#endif + } + + MsnSwitchboardConnection *switchboard = getContactSwitchboardConnection( handle, true ); + if( switchboard != 0 ) + { + // 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( Chat *chat ) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Marking chat as closing."; +#endif + + // Make sure this chat window don't receive new messages. + closingChats_.append( chat ); + + // The contains check avoids deleting references to old switchboards which may be outdated and don't exist anymore. + MsnSwitchboardConnection *switchboard = chat->getSwitchboardConnection(); + if( switchboard && switchboardConnections_.contains( switchboard ) ) + { + switchboardConnections_.removeAll( switchboard ); + delete switchboard; + } +} + + +// A chat was destroyed +void ChatMaster::slotChatDestroyed( QObject *chatObject ) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Removing chat from list."; +#endif + + // Remove from the list + Chat *chat = static_cast( chatObject ); + + chats_ .removeAll( chat ); + closingChats_.removeAll( chat ); +} + + +// A chat window was destroyed +void ChatMaster::slotChatWindowDestroyed(QObject *chatWindow) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Removing chat window from list."; +#endif + + // Remove from the list + ChatWindow *window = static_cast( chatWindow ); + + chatWindows_.removeAll( window ); +} + + + +// A new application was created for a contact. +void ChatMaster::slotConnectApplication(Application *application) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Connecting application signals."; +#endif + + connect( application, SIGNAL( applicationMessage(const ChatMessage&) ), + this, SLOT( showSpecialMessage(const ChatMessage&) ) ); + connect( application, SIGNAL( updateApplicationMessage(const QString&,const QString&) ), + this, SIGNAL( updateApplicationMessage(const QString&,const QString&) ) ); + + // Special connections for applications which were started dynamically to handle an incoming data stream. + if( application->getMode() == Application::APP_MODE_DATACAST ) + { + if( qobject_cast( application ) != 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Connecting additional signals for InkTransferP2P."; +#endif + + connect( application, SIGNAL( inkReceived(const QString&,const QString&) ), + this, SLOT( slotGotInkMessage(const QString&,const QString&) )); + } + else + { + kWarning() << "Unknown datacast application: " << application->metaObject()->className(); + } + } +} + + + +// Append the message to the queue, waiting to be delivered +void ChatMaster::queueMessage( const MimeMessage &message, const QString &handle, bool privateChatRequired ) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Adding message for '" << handle << "' to the queue " + << "(size=" << ( pendingMimeMessages_.count() + 1 ) << ")." << endl; +#endif + // NOTE: Store these pending in ApplicationList class instead? + + PendingMimeMessage *pending = new PendingMimeMessage; + pending->handle = handle; + pending->message = message; + pending->privateChatRequired = privateChatRequired; + + // No active connection found. + // Request a new chat with the contact, keep the message pending. + pendingMimeMessages_.append( pending ); +} + + + +// Raise an existing chat window. Forcing a raise is reasonable only when the user requests to, since it makes the window +// to grab keyboard focus and be raised on top of other windows. +void ChatMaster::raiseChat( Chat *chat, bool force ) +{ + // Check if the pointer is valid + if( chat == 0 || ! chats_.contains( chat ) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Invalid raising request received; chat is probably already closed."; +#endif + return; + } + + ChatWindow *chatWindow = chat->getChatWindow(); + if( chatWindow == 0 || ! chatWindows_.contains( chatWindow ) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Invalid raising request received; chat is probably already closed."; +#endif + return; + } + + if( chatWindow->isVisible() && ! force ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Window has focus already."; +#endif + return; + } + + // Move the window on the current desktop if it wasn't shown before or if we're forcing its raise + // TODO: make this optional, maybe the user doesn't want the windows to span over desktops + if( ! chatWindow->isVisible() || force ) + { + KWindowSystem::setOnDesktop( chatWindow->winId(), KWindowSystem::currentDesktop() ); + } + + // 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( ! 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 + kDebug() << "Forcing window raise."; +#endif + + // 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(); + } + +#ifdef Q_WS_X11 + // Bypass focus stealing prevention (code from Quassel) + QX11Info::setAppUserTime( QX11Info::appTime() ); +#endif + + // Workaround a bug in KWin: force the window to get focus + if( chatWindow->windowState() & Qt::WindowMinimized) { + chatWindow->setWindowState( (chatWindow->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive ); + chatWindow->show(); + } + + // Set the keyboard focus to the chat window + chatWindow->raise(); + KWindowSystem::activateWindow( chatWindow->winId() ); + KApplication::setActiveWindow( chatWindow ); +} + + + +/** + * @brief Send all pending mime messages for the contact. + * @param handle The contact to send messages for. + * @param connection The switchboard connection that can be used to send the messages. + */ +void ChatMaster::sendPendingMimeMessages( const QString &handle, MsnSwitchboardConnection *connection ) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Sending pending messages for contact " << handle << ", if any."; +#endif + + QList sentMessages; + + bool isPrivateChat = (connection->getContactsInChat().size() < 2); + + foreach( PendingMimeMessage *pendingMimeMessage, pendingMimeMessages_ ) + { + // Ignore messages for other contacts + if( pendingMimeMessage->handle != handle ) + { + // Get next message + continue; + } + + // Ignore messages that can only be sent on a private chat. + if( pendingMimeMessage->privateChatRequired && ! isPrivateChat ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Switchboard is not a private chat, keeping message in queue."; +#endif + + // Get next message + continue; + } + + // Check when the connection is busy again + if( connection->isBusy() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Switchboard is busy again, keeping remaining messages in the queue."; +#endif + goto cleanup_return; + } + + // Check whether the contact is still in the chat. + if( ! connection->isConnected() || ! connection->getContactsInChat().contains( handle ) ) + { + // getContactsInChat() may be empty, don't re-invite the last contact to deviver the message +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Switchboard is not connected or contact left chat, keeping remaining messages in the queue."; +#endif + goto cleanup_return; + } + + // Send the message + connection->sendApplicationMessage( pendingMimeMessage->message ); + sentMessages.append( pendingMimeMessage ); + } + + +cleanup_return: + // Do deletion out of the loop, just to be sure. + foreach( PendingMimeMessage *sentMessage, sentMessages ) + { + pendingMimeMessages_.removeAll( sentMessage ); + delete sentMessage; + } +} + + + +// Deliver a chat message to the chat window (can be an Application message or an Offline-IM from MsnNotificationConnection). +void ChatMaster::showSpecialMessage( const ChatMessage &message, const MsnSwitchboardConnection *switchboardChat ) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Delivering application/ink/OIM chat message to chat window."; +#endif + + const QString &handle = message.getContactHandle(); + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Message info, Contact: " << handle << " - Message body: '" << message.getBody() << "' - " + "Message type: " << message.getType() << " - Message class: " << message.getContentsClass() << "." << endl; +#endif + + Chat *chat; + if( switchboardChat != 0 ) + { + chat = getChatBySwitchboard( switchboardChat ); + } + else + { + chat = getContactsChat( handle, true ); + } + + // Deliver the message to the contact's chat window + if( chat != 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Delivering message."; +#endif + + // The chat window is currently closing + if( closingChats_.contains( chat ) ) + { + if( message.isNormalMessage() ) + { + // TODO: Sometimes, you close a window when the other contact sends a new message, and you lose it. + // Maybe it's possible to avoid the loss, for example with a notification balloon to notify of the message. + kWarning() << "Chat window is closing, suppressing message '" << message.getBody() << "' from '" << handle << "'."; + } +#ifdef KMESSDEBUG_CHATMASTER + else + { + kDebug() << "Chat window is closing, suppressing message."; + } +#endif + + return; + } + + chat->receivedMessage( message ); + return; + } + + // No window is available - we should check if it's needed to create a new window, or if the message + // can be safely ignored. + switch( message.getContentsClass() ) + { + case ChatMessage::CONTENT_MESSAGE: + case ChatMessage::CONTENT_MESSAGE_INK: + case ChatMessage::CONTENT_NOTIFICATION_NUDGE: + case ChatMessage::CONTENT_NOTIFICATION_WINK: + case ChatMessage::CONTENT_APP_INVITE: +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Message is important, delivering it."; +#endif + break; + + default: +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Message is not important, will be ignored."; +#endif + return; + } + + + // Check if a switchboard is present + MsnSwitchboardConnection *switchboard = getContactSwitchboardConnection( handle, true ); + if( switchboard == 0 ) + { + // 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 ) ); + if( switchboard == 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Could not create an offline switchboard."; +#endif + return; + } + } + + // Create a new chat window for the message + chat = createChat( switchboard ); + if( chat == 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Could not create a chat window."; +#endif + return; + } + + // Deliver the message to the new chat + chat->receivedMessage( message ); +} + + + +// Display an MSN Object that was received. +void ChatMaster::showMsnObject( const QString &handle, const MsnObject &msnObject, Chat *chat ) +{ + QString fileName; + QString emoticonCode; + + // Get the contact + // Note I don't use msnObject.getCreator, because I don't want to trust the other client! + ContactBase *contact = 0; + Contact *msnContact = 0; + + // Get msn object filename + fileName = KMessConfig::instance()->getMsnObjectFileName( msnObject ); + + // Handle the picture + switch( msnObject.getType() ) + { + 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_->getContactList()->getContactByHandle(handle); + if(KMESS_NULL(msnContact)) return; + msnContact->getExtension()->setContactPicturePath( fileName ); + pendingDisplayPictures_.removeAll( handle ); + break; + + case MsnObject::WINK: + // Show the Wink in the chat window where the original datacast message came from. + if(KMESS_NULL(chat)) return; + chat->showWink( handle, fileName, msnObject.getFriendly() ); + break; + + case MsnObject::EMOTICON: + // Inform the contact that a custom emoticon can be parsed. + 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( Chat *chatUpdate, chats_ ) + { + if( chatUpdate->isContactInChat( handle ) ) + { + chatUpdate->updateCustomEmoticon( handle, emoticonCode ); + } + } + break; + + case MsnObject::BACKGROUND: + // handle background transfers + + case MsnObject::VOICECLIP: + // handle voicelip transfers + + default: + kWarning() << "Unable to handle MsnObject pictures of type '" << msnObject.getType() << "'."; + } +} + + + +// Determine what to do when a contact changed it's picture. +void ChatMaster::slotContactChangedMsnObject( Contact *contact ) +{ + // 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 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Contact '" << handle << "' removed its MSN object"; +#endif + + contact->getExtension()->setContactPicturePath( QString::null ); + return; + } + + MsnObject msnObject( *contact->getMsnObject() ); + + // See if the file already exists. + QString objectFileName( KMessConfig::instance()->getMsnObjectFileName( msnObject ) ); + if( QFile::exists( objectFileName ) ) + { + bool imageInvalid = QImageReader::imageFormat( objectFileName ).isEmpty(); + if( ! imageInvalid && msnObject.verifyFile( objectFileName ) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Picture for '" << handle << "' is already downloaded."; +#endif + + contact->getExtension()->setContactPicturePath( objectFileName ); + return; + } + else + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Picture for '" << handle + << "' is already downloaded, but corrupt " + << ( imageInvalid ? "(detected by QImageReader)" : "(detected by MsnObject)" ) + << ", deleting it: '" << objectFileName << "'" << endl; +#endif + QFile::remove( objectFileName ); + + // If the file was set as picture. reset right away. + if( contact->getExtension()->getContactPicturePath() == objectFileName ) + { +#ifdef KMESSDEBUG_CHATMASTER + kWarning() << "Corrupt picture was already set, " + << "resetting contact picture." << endl; +#endif + contact->getExtension()->setContactPicturePath( QString::null ); + } + } + } + + // If the contact is active in a chat, + // download the new picture straight away. + MsnSwitchboardConnection *switchboard = getContactSwitchboardConnection( handle, true ); + if( switchboard != 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Contact '" << handle << "' changed its MSN object."; +#endif + + // Automatically decides which switchboard is the best to use, + // this may change during the transfer. + startMsnObjectDownload( handle, &msnObject, 0 ); + return; + } + + + // Queue a request to download it later in the background. + // That method will check for the prerequisites to download it, + // since that may change between this point and the timedUpdate() call. + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Contact '" << handle << "' changed its MSN object, queueing a request for it."; +#endif + + // Request the contact's msnobject + if( ! pendingDisplayPictures_.contains( handle ) ) + { + pendingDisplayPictures_.append( handle ); + } +} + + + +// A contact joined to one of our switchboard sessions. +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 ) + { + // Find the chat window where the contact is the only participant. + if( connection->getContactsInChat().size() > 1 ) + { + // Contact joined chat conversation with multiple partipipants, ignore this. +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Contact '" << handle << "' joined multi-chat, not sending pending messages."; +#endif + } + else + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Contact '" << handle << "' joined chat, checking for pending messages."; +#endif + + // Send the messages + if( pendingMimeMessages_.count() > 0 ) + { + sendPendingMimeMessages( handle, connection ); + } + } + } + + + // Check whether the contact picture is outdated. + // Use getContactByHandle() from the MSN contact list to get the msn object. + const Contact *fullContact = currentAccount_->getContactList()->getContactByHandle( handle ); + if( fullContact != 0 && fullContact->hasP2PSupport() ) + { + if( fullContact->getMsnObject() != 0 ) + { + startMsnObjectDownload( fullContact->getHandle(), fullContact->getMsnObject(), 0 ); + } + } +} + + + +/** + * @brief Deliver an application command to the correct application. + */ +void ChatMaster::slotDeliverAppCommand(QString cookie, QString handle, QString command) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Delivering application command."; +#endif + + Application *app = 0; + + // Get the contact. + ContactBase *contact = currentAccount_->getContactByHandle(handle); + if(KMESS_NULL(contact)) return; + + // Get the application list + if( contact->hasApplicationList() ) + { + app = contact->getApplicationList()->getApplicationByCookie(cookie); + } + + // App not found. + if( app == 0 ) + { + kWarning() << "Application not found to deliver user command (contact=" << contact << ", command=" << command << ")."; + return; + } + + // Deliver the 'accept' or 'cancel' command. + app->gotCommand( command ); +} + + + +/** + * @brief Deliver a message from an Application to the switchboard connection. + * @param message The Mime message to deliver. The message can contain a normal MIME or binary P2P payload. + * @param handle The contact the message should be delivered to. + * @param privateChatRequired Whether a private chat is required to deliver the message. If not, a multi-chat will be used when available. + * + * This method automatically determines which switchboard is should use to deliver the message. + * When the contact is not present in any of the existing switchboard connections, a new connection request will be made. + * The message will be queued for delivery to the switchboard so it can be delivered once it's available. + * Conversations with multiple contacts are avoided because of the networking overhead; + * since the switchboard is a broadcast channel, each participant receives the message. + * + * Unlike the direct connection link, the switchboard is only capable of transferring mime messages. + * To transfer the P2P data, the P2PApplication has to wrap the message as MimeMessage payload. + */ +void ChatMaster::slotDeliverMimeMessage(const MimeMessage &message, const QString &handle, bool privateChatRequired) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Delivering application message for '" << handle << "' to switchboard."; +#endif +#ifdef KMESSTEST + 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 + if( contentType == "application/x-msnmsgrp2p" ) + { + KMESS_ASSERT( message.getValue("P2P-Dest") == handle ); + } +#endif + + MsnSwitchboardConnection *connection = getContactSwitchboardConnection(handle, privateChatRequired); + + if( connection != 0 ) + { + if( connection->isBusy() ) + { + // Connection has unacked messages, keep waiting until the switchboard is ready to send +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Switchboard is currently busy, queueing message until the switchboard is ready to send."; +#endif + queueMessage( message, handle, privateChatRequired ); + + // Pause application so it won't continue to send much more messages (see P2PApplication::slotSendData()). + ApplicationList *appList = getApplicationList(handle); + if( appList != 0 ) + { + appList->pauseApplications(); + } + } + else + { + // Deliver the message + connection->sendApplicationMessage(message); + } + } + else + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "No switchboard available to deliver message," + << " requesting chat and queueing message " << (pendingMimeMessages_.count() + 1) << "." << endl; +#endif + + emit requestSwitchboard( handle, ChatInformation::CONNECTION_BACKGROUND ); + queueMessage( message, handle, privateChatRequired ); + } +} + + + +// Parse an gif ink message +void ChatMaster::slotGotInkMessage( const QString &inkData, const QString &contactHandle ) +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Parsing ink message"; +#endif + + // Validate + QRegExp inkChars("([^A-Za-z0-9:+/=])" ); + if( ! inkData.startsWith("base64:") || inkChars.indexIn( inkData ) != -1 ) + { + kWarning() << "Received invalid ink message from" << contactHandle << ", found char 0x" << QString::number( inkChars.cap(1)[0].unicode(), 16 ) << "at position" << inkChars.pos(1) << "in: " << inkData; + return; + } + + // Use the ink data as inline image. + QString inkUrlData( QString( inkData ).replace( "base64:", "base64," ) ); + + // Get the contact data + QString friendlyName; + QString contactPicture; + const ContactBase *contact = currentAccount_->getContactByHandle( contactHandle ); + if( contact != 0 ) + { + friendlyName = contact->getFriendlyName( STRING_ORIGINAL ); + contactPicture = contact->getContactPicturePath(); + } + + // Cast the sender object to determinate if the ink is recevied from p2p or switchboard. + // WLM sends the ink (gif) by p2p protocol for private chat and by mime for multi-chat + // Other clients send all by mime message, so it's importat to determinate what switchboard + // is used to grep the correct chat window to showing the message + MsnSwitchboardConnection *switchboard = qobject_cast( sender() ); + + // Send the message as HTML to the chat window. + // Using data url scheme for embedded images (src="data:image/gif;base64,fdsfsdfsd") + showSpecialMessage( ChatMessage( ChatMessage::TYPE_INCOMING, + ChatMessage::CONTENT_MESSAGE_INK, + true, "", + contactHandle, + friendlyName, + contactPicture ), switchboard ); +} + + + +// The switchboard received a Mime message +void ChatMaster::slotGotMessage(const MimeMessage &message, const QString &handle) +{ + ApplicationList *appList = getApplicationList(handle); + if( appList != 0 ) + { + appList->gotMessage(message); + } +} + + + +// The switchboard received a P2P message +void ChatMaster::slotGotMessage(const P2PMessage &message, const QString &handle) +{ + ApplicationList *appList = getApplicationList(handle); + if( appList != 0 ) + { + appList->gotMessage(message); + } +} + + + +// The switchboard received an msn object +void ChatMaster::slotGotMsnObject(const QString &msnObjectData, const QString &handle) +{ + // Get the contact. + ContactBase *contact = currentAccount_->getContactByHandle(handle); + if(KMESS_NULL(contact)) return; + + // Get the switchboard connection where the emoticon/wink/voiceclip was posted + const MsnSwitchboardConnection *connection = static_cast( sender() ); + Chat *chat = 0; + if( connection != 0 ) + { + chat = getChatBySwitchboard( connection ); + } + + // Parse the msn object + MsnObject msnObject(msnObjectData); + + // Get the contact name + QString friendlyName( currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED_ESCAPED ) ); + + // Determine the statusmessage to display. + QString statusMessage; + MsnObject::MsnObjectType objectType = msnObject.getType(); + if( objectType == MsnObject::WINK ) + { + statusMessage = i18n( "%1 is sending a wink: "%2"", friendlyName, msnObject.getFriendly() ); + } + + // Show the status message + if( ! statusMessage.isEmpty() ) + { + if( ! KMESS_NULL(connection) && ! KMESS_NULL(chat) ) + { + chat->getChatWindow()->showStatusMessage( statusMessage ); + } + } + + startMsnObjectDownload( handle, &msnObject, chat ); +} + + + +// A msn object (picture, wink, emoticon) was received for the contact. +void ChatMaster::slotMsnObjectReceived(const QString &handle, const MsnObject &msnObject) +{ +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Received msn object from: " << handle << "."; +#endif + + Chat *chat = 0; + + // Get sender of this signal, slotGotMsnObject() assigned this to the p2papp. + const P2PApplication *application = static_cast( sender() ); + if( application != 0 ) + { + chat = application->getChat(); + if( chat != 0 && ! chats_.contains( chat ) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Original chat not found for received MSNObject " + << "(objecttype=" << msnObject.getType() + << " contact=" << handle << ")." << endl; +#endif + chat = getContactsChat( handle, true ); + } + } + + showMsnObject( handle, msnObject, chat ); +} + + + +// The switchboard is ready to send more messages. +void ChatMaster::slotSwitchboardReady() +{ + // No need to send pending messages or resume an application (a message is always queued before the app is paused). + if( pendingMimeMessages_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "A switchboard is ready to send more messages, no messages pending."; +#endif + return; + } + + // Get the connection + MsnSwitchboardConnection *connection = static_cast( const_cast( sender() ) ); + if(KMESS_NULL(connection)) return; + + // Get the contacts + const QStringList &contacts = connection->getContactsInChat(); + bool isPrivateChat = (contacts.size() < 2); + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "A switchboard is ready to send more messages, " << pendingMimeMessages_.count() << " messages pending."; +#endif + + // Send all pending messages + sendPendingMimeMessages( contacts[0], connection ); + + // See if the switchboard is still ready. + // Don't use connection->isBusy() as it will break with + // the test above when exactly all messages are sent before the connection became busy. + if( ! pendingMimeMessages_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Switchboard is busy again, not notifying applications."; +#endif + return; + } + + // A switchboard is still available. + // If the contact applications were paused, resume them now. + ContactBase *contact = currentAccount_->getContactByHandle( contacts[0] ); + if( contact != 0 && contact->hasApplicationList() ) + { + contact->getApplicationList()->resumeApplications(isPrivateChat); + } +} + + + +// Delete an existing switchboard +void ChatMaster::slotSwitchboardDelete( MsnSwitchboardConnection *closing, bool deleteObject ) +{ + // Remove from collection + switchboardConnections_.removeAll( closing ); + + // Do not delete the object: this method can be called as slot from the switchboard's destructor + if( ! deleteObject ) + { + return; + } + + // Disconnect and destroy + disconnect( closing, 0, this, 0 ); + closing->deleteLater(); +} + + + +// Configure and start the Mime application object. +void ChatMaster::startApplication( MimeApplication *application ) +{ + // Get the application list. + ApplicationList *appList = getApplicationList( application->getContactHandle() ); + if(KMESS_NULL(appList)) return; + + // Add to list + appList->addApplication( application ); // requires MimeApplication/P2PApplication type. + + // Start application + application->start(); +} + + + +// Configure and start the P2P application object. +void ChatMaster::startApplication( P2PApplication *application ) +{ + // Get the application list. + ApplicationList *appList = getApplicationList( application->getContactHandle() ); + if(KMESS_NULL(appList)) return; + + // Add to list. + appList->addApplication( application ); // requires MimeApplication/P2PApplication type. + + // Start application + application->start(); +} + + + +// Start a connection with the information gathered from the Notification connection +MsnSwitchboardConnection *ChatMaster::startSwitchboard( const ChatInformation &chatInfo ) +{ + MsnSwitchboardConnection *switchboard = 0; + const QString &handle( chatInfo.getContactHandle() ); + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Starting new switchboard session with" << handle; +#endif + + /** + * Refresh requests are made by expired/disconnected switchboard sessions, and they are refreshed + * with the new connection data. + * All other types of chat request create a new switchboard session from the chat info. + * We could attach the newly created SB to a chat window, but we don't know what kind of chat it + * may be at this point (the list of initial participants will be received later, when the SB + * connection will be established). Therefore, we just don't attach it to any chat, and so we + * posticipate the decision to later. + * (Also remember that you may have more than one chat with a contact, a 1-on-1, a group one, + * and a data transfer one) + */ + if( chatInfo.getType() == ChatInformation::CONNECTION_REFRESH ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Finding the session to refresh."; +#endif + foreach( MsnSwitchboardConnection *currentSwitchboard, switchboardConnections_ ) + { + if( currentSwitchboard->getContactsInChat().contains( handle ) + && currentSwitchboard->isWaiting() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Session found, it will be refreshed."; +#endif + switchboard = currentSwitchboard; + break; + } + } + + if( switchboard == 0 ) + { + kWarning() << "Unable to find which session requested a refresh."; + return 0; + } + } + else + { + switchboard = createSwitchboardConnection(); + if( KMESS_NULL(switchboard) ) return 0; +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Creating new session."; +#endif + } + + // If this switchboard is a background one, made to request a contact's picture, + // we can remove the pending request from the list now. + if( chatInfo.getType() == ChatInformation::CONNECTION_BACKGROUND + && pendingDisplayPictures_.contains( handle ) ) + { + pendingDisplayPictures_.removeAll( handle ); + } + + // Connect to the new server + switchboard->start( chatInfo ); + + Chat *chat = getChatBySwitchboard( switchboard ); + if( chat ) + { + chat->setEnabled( true ); + } + + return switchboard; +} + + + +// Start a chat with the information gathered from a switchboard connection +Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard, bool requestedByUser ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( switchboard != 0 ); +#endif + + Chat *newChat; + ChatWindow *newChatWindow; + + // If the new chat is a group chat, find existing group chat windows; else find private chats + const QStringList& partecipants( switchboard->getContactsInChat() ); + newChat = getContactsChat( partecipants, true ); + + // If the chat was requested by a contact, check if we have a chat request + // pending for that contact and remove it + if( ! requestedByUser && partecipants.count() < 2 ) + { + const QString& handle( partecipants.first() ); + // Also change the request source to the user if we asked a chat with this contact first + requestedByUser = requestedChats_.contains( handle ); + if( requestedByUser ) + { + // Remove the request + requestedChats_.removeAll( handle ); + } + } + + if( newChat != 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "A chat with contacts" + << switchboard->getContactsInChat().join(",") << "already exists, raising it." << endl; +#endif + + // The chat may have been disabled, reenable it just in case. + // Seen happening with group chats where you get reinvited to after a reconnection. + newChat->setEnabled( true ); + + // Delete the previous switchboard ( if it's different from the current one ) and attach the new + MsnSwitchboardConnection *oldConnection = newChat->getSwitchboardConnection(); + if( oldConnection != switchboard ) + { + newChat->setSwitchboardConnection( switchboard ); + slotSwitchboardDelete( oldConnection, true ); + } + + // 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, requestedByUser ); + return newChat; + } + + // Create the chat widget + newChat = new Chat(); + + if( newChat == 0 ) + { + kDebug() << "Couldn't create a new chat tab."; + return 0; + } + + // Initialize it + if( ! newChat->initialize( switchboard ) ) + { + kDebug() << "Couldn't initialize the chat tab."; + return 0; + } + + // Select the chat window where to open the new tab, or create a new one + newChatWindow = createChatWindow( newChat ); + + // Create the first tab in the chat + newChat = newChatWindow->addChatTab( newChat, switchboard->getUserStartedChat() ); + if( newChat == 0 ) + { + kWarning() << "Couldn't add the initial chat."; + return 0; + } + + // Connect the chat's request signals + connect( newChat, SIGNAL( gotChatMessage(const ChatMessage&,Chat*) ), + this, SIGNAL( newChatMessage(const ChatMessage&,Chat*) ) ); + connect( newChat, SIGNAL( contactAllowed(QString) ), + this, SIGNAL( allowContact(QString) ) ); + 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( 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&) ), + newChat, SIGNAL( updateApplicationMessage(const QString&,const QString&) ) ); + + // Add the new chat to our list + chats_.append( newChat ); + + // Finally, start the new chat + newChat->startChat(); + + // 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, requestedByUser ); + + return newChat; +} + + + +// Create a new chat window or retrieve an existing one if tabbed chatting is enabled +ChatWindow *ChatMaster::createChatWindow( Chat *chat ) +{ + // 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 ) + { + return window; + } + + // Create the new chat window +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "No existing chat window, creating new."; +#endif + // Create the window: it should have no parent, so it will be displayed in the taskbar for Windows. + window = new ChatWindow(); + + // Bail out if the window could not be initialized + if( ! window->initialize() ) + { + kWarning() << "Couldn't initialize the new chat window!"; + return 0; + } + + // Connect its signals + connect( window, SIGNAL( destroyed(QObject*) ), + this, SLOT ( slotChatWindowDestroyed(QObject*) ) ); + connect( window, SIGNAL( reconnect() ), + this, SIGNAL( reconnect() ) ); + + // Add the new chat window to our list + chatWindows_.append( window ); + + return window; +} + + + +// Create and register a new switchboard +MsnSwitchboardConnection *ChatMaster::createSwitchboardConnection( MsnSwitchboardConnection *replace, QString handle ) +{ + MsnSwitchboardConnection *switchboard; + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Creating a new switchboard connection."; +#endif + + // Initialize the switchboard connection + if( replace != 0 ) + { + switchboard = new MsnSwitchboardConnection( *replace ); + } + else + { + switchboard = new MsnSwitchboardConnection(); + } + if( ! switchboard || ! switchboard->initialize( handle ) ) + { + kWarning() << "Couldn't initialize switchboard connection."; + delete switchboard; + return 0; + } + + switchboardConnections_.append( switchboard ); + + // Connect the switchboard's signals to the Chat Master. + 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&) ), + this, SLOT ( slotGotMessage(const P2PMessage&, const QString&) )); + connect(switchboard, SIGNAL( gotInkMessage(const QString&, const QString&) ), + this, SLOT ( slotGotInkMessage(const QString&, const QString&) )); + connect(switchboard, SIGNAL( gotMsnObject(const QString&, const QString&) ), + this, SLOT ( slotGotMsnObject(const QString&, const QString&) )); + connect(switchboard, SIGNAL( readySend() ), + this, SLOT ( slotSwitchboardReady() )); + connect(switchboard, SIGNAL( requestNewSwitchboard(QString) ), + this, SLOT ( forwardRequestNewSwitchboard(QString) )); + connect(switchboard, SIGNAL( requestChatWindow(MsnSwitchboardConnection*) ), + this, SLOT ( createChat(MsnSwitchboardConnection*) )); + connect(switchboard, SIGNAL( deleteMe(MsnSwitchboardConnection*) ), + this, SLOT ( slotSwitchboardDelete(MsnSwitchboardConnection*) )); + + return switchboard; +} + + + +// Start a file transfer with the information from the Chat +void ChatMaster::startFileTransfer( const QString &handle, const QString &filename ) +{ + 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 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!"; + return; + } + + if( contact == 0 || ! contact->hasP2PSupport() ) + { + // This should be so rare that it justifies a warning message. + if( contact == 0 ) + { + kWarning() << "Contact" << handle << "object not found, using old MIME invitations because P2P might not be supported."; + } + else + { + kWarning() << "Contact" << handle << "does not support P2P transfers, using old MIME invitations instead."; + } + + // 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 ); +} + + + +// Start a netmeeting invitation +void ChatMaster::startNetMeeting(const QString &handle) +{ + // Get the application list + ApplicationList *appList = getApplicationList(handle); + if(KMESS_NULL(appList)) return; + + // Get the contact + const ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if(KMESS_NULL(contact)) return; + + // Create the application + MimeApplication *app = new GnomeMeeting(handle); + startApplication(app); +} + + + +// Start a msnobject transfer to get the contact's msn object. +void ChatMaster::startMsnObjectDownload( const QString &handle, const MsnObject *msnObject, Chat *chat ) +{ + // Test input + if(KMESS_NULL(msnObject)) return; + + // Get the application list + ApplicationList *appList = getApplicationList(handle); + if(KMESS_NULL(appList)) return; + + // First check if the actual object is currently being downloaded already. + // call before cache check, since file can be partially downloaded. + if( appList->hasMsnObjectTransfer(*msnObject) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "object is already being downloaded, not sending a second invite."; +#endif + return; + } + + // Get the picture filename, perhaps from a cache + QString objectFileName( KMessConfig::instance()->getMsnObjectFileName( *msnObject ) ); + bool fileExists = QFile::exists( objectFileName ); + + // 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 ) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Cached MsnObject is corrupt " + << ( imageCorrupt ? "(detected by QImage)" : "(detected by MsnObject)" ) + << ", deleting it: '" << objectFileName << "'" << endl; +#endif + QFile::remove( objectFileName ); + fileExists = false; + } + } + + // Avoid downloading again if it exists + if( fileExists ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Contact MsnObject is already in cache."; +#endif + + // Already have it, handle processing in a generic way. + // Don't use slotMsnObjectReceived() because it uses sender() to get the Chat object. + showMsnObject( handle, msnObject->objectString(), chat ); + } + else + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Starting MsnObject download (type=" << msnObject->getType() << ")."; +#endif + + // Create and initialize the application. + P2PApplication *app = new MsnObjectTransferP2P(appList, *msnObject); + app->setChat( chat ); // for winks, to display in originating chat window. + connect(app, SIGNAL( msnObjectReceived(const QString&, const MsnObject&) ), + this, SLOT ( slotMsnObjectReceived(const QString&, const MsnObject&) )); + startApplication(app); + } +} + + + +// 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. + * + * This method is synchronized with the ping timer of MsnNotificationConnection + * to avoid multiple timers which reduces power consumption (see www.linuxpowertop.org). + * + * Currently this is used to download display pictures in the background, + * but it can also be used for other events. + */ +void ChatMaster::timedUpdate() +{ + // Handle the queue of display pictures to download, but only if we're not hidden + if( pendingDisplayPictures_.count() == 0 || currentAccount_->getStatus() == STATUS_INVISIBLE ) + { + return; + } + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "handling timed events."; +#endif + + // See if there are pictures to download. + // Get 4 pictures at once. + int requestCount = pendingDisplayPictures_.count(); + requestCount = requestCount > 4 ? 4 : requestCount; + while( requestCount > 0 && ! pendingDisplayPictures_.isEmpty() ) + { + // Unshift the first handle of the list. + QString handle( pendingDisplayPictures_.first() ); + pendingDisplayPictures_.removeAll( handle ); + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "see if the display picture of '" << handle << "' should be downloaded."; +#endif + + // See if the picture was already downloaded somehow (e.g. user opened a chat) + + // First get the contact. + // Using getContactList()->.. because it skips the InvitedContact objectss returned by CurrentAccount::getContactByHandle() + Contact *contact = currentAccount_->getContactList()->getContactByHandle( handle ); + if( contact == 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "contact not found, was it removed?"; +#endif + continue; + } + + // See if the contact is still online. + if( contact->isOffline() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "contact is no longer online."; +#endif + continue; + } + + // See if the contact is still blocked. + // Avoid starting a chat which "invites" the contact to chat back. + if( contact->isBlocked() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "contact is blocked."; +#endif + continue; + } + + // Get the msn object, can become null now. + const MsnObject *msnObject = contact->getMsnObject(); + if( msnObject == 0 ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "MsnObject has been reset."; +#endif + continue; + } + + // See if the object already exists in the cache + QString objectFileName( KMessConfig::instance()->getMsnObjectFileName( *msnObject ) ); + if( QFile::exists( objectFileName ) + && ! QImageReader::imageFormat( objectFileName ).isEmpty() + && msnObject->verifyFile( objectFileName ) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Picture is already downloaded."; +#endif + continue; + } + + + // See if the actual object is currently being downloaded (e.g. user just opened a chat). + // Put as last check because it creates the ApplicationList on demand. + + +#ifdef KMESSDEBUG_CHATMASTER + // Made the debug output easier to understand. + if( ! contact->hasApplicationList() ) + { + kDebug() << "Picture is not available, creating application list."; + } +#endif + + // Get the application list + ApplicationList *appList = getApplicationList( handle ); + if( KMESS_NULL(appList) ) continue; + + // See if a picture is currently being downloaded. + if( appList->hasMsnObjectTransfer( *msnObject ) ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "transfer for the picture is already active."; +#endif + continue; + } + + + // All tests passed. + // Download the picture. + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Picture is not available, starting switchboard connection to download it."; +#endif + + // Start a chat to download the picture. + // The download will be initiated up by ChatMaster::slotContactJoinedChat(). + emit requestSwitchboard( handle, ChatInformation::CONNECTION_BACKGROUND ); + requestCount--; + } +} + + + +// 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/kmess/chat/chatmaster.h b/src/chat/chatmaster.h similarity index 68% rename from kmess/chat/chatmaster.h rename to src/chat/chatmaster.h index 81cced8..c2a4a58 100644 --- a/kmess/chat/chatmaster.h +++ b/src/chat/chatmaster.h @@ -18,21 +18,23 @@ #ifndef CHATMASTER_H #define CHATMASTER_H -#include "chatmessage.h" +#include "../network/chatmessage.h" #include "../network/chatinformation.h" #include "../network/mimemessage.h" -#include -#include +#include + // Forward declarations class Application; class ApplicationList; class ChatInformation; class ChatMessage; +class Chat; class ChatWindow; class Contact; class ContactBase; +class CurrentAccount; class MimeApplication; class MimeMessage; class P2PApplication; @@ -40,10 +42,14 @@ class P2PMessage; class MsnObject; class MsnSwitchboardConnection; + + /** * This class governs the chat windows, detecting when a chat * can be restarted in an open window and the like. + * * @author Mike K. Bennett + * @ingroup Chat */ class ChatMaster : public QObject { @@ -60,48 +66,56 @@ class ChatMaster : public QObject bool initialize(); public slots: // Public slots - // The user has disconnected, so close all open chats + // The connection has been established + 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( ChatWindow *chatWindow, 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). - void showSpecialMessage(const ChatMessage &message); + void showSpecialMessage(const ChatMessage &message, const MsnSwitchboardConnection *switchboardChat = 0 ); // Start a switchboard connection with the information gathered from the Notification connection MsnSwitchboardConnection *startSwitchboard( const ChatInformation &chatInfo ); - // Start a file transfer with the information from the ChatWindow + // 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 - // Create and initialize a new chat window. - ChatWindow *createChatWindow( MsnSwitchboardConnection *switchboard ); - // Forward the signal of a new incoming message from a chat window - void forwardNewChatMessage( const ChatMessage &message, ChatWindow *chatWindow ); + // Start a chat with the information gathered from a switchboard connection + 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 ); - // Forward a request to allow a contact, which comes from the ContactFrame. - void forwardSetContactAllowed( QString handle ); + 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 ); - // A chat window is closing - void slotChatWindowClosing(QObject *chatWindow); + void forwardContactBlocked( QString handle, bool isBlocked ); + // A chat is closing + void slotChatClosing( Chat *chat ); + // A chat was destroyed + void slotChatDestroyed( QObject *chatObject ); // A chat window was destroyed void slotChatWindowDestroyed(QObject *chatWindow); // 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. void slotDeliverMimeMessage(const MimeMessage &message, const QString &handle, bool privateChatRequired); + // The switchboard or p2p application received a Ink message. + void slotGotInkMessage( const QString &inkData, const QString &handle ); // The switchboard received a Mime message void slotGotMessage(const MimeMessage &message, const QString &handle); // The switchboard received a P2P message @@ -111,33 +125,43 @@ class ChatMaster : public QObject // A msn object (picture, wink, emoticon) was received for the contact. void slotMsnObjectReceived(const QString &handle, const MsnObject &msnObject); // Delete an existing switchboard - void slotSwitchboardDelete( MsnSwitchboardConnection *closing ); + void slotSwitchboardDelete( MsnSwitchboardConnection *closing, bool deleteObject = false ); // The switchboard is ready to send more messages. 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 + MsnSwitchboardConnection *createSwitchboardConnection( MsnSwitchboardConnection *replace = 0, QString handle = QString() ); // Check whether the contact is in any of the existing chat windows. bool isContactInChat( const QString &handle ); // Display an MSN Object that was received. - void showMsnObject(const QString &handle, const MsnObject &msnObject, ChatWindow *chatWindow); + void showMsnObject(const QString &handle, const MsnObject &msnObject, Chat *chatWindow); // Configure and start the mime application object. void startApplication( MimeApplication *application ); // Configure and start the P2P application object. void startApplication( P2PApplication *application ); // Start the transfer of the contact's picture - void startMsnObjectDownload(const QString &handle, const MsnObject *msnObject, ChatWindow *chatWindow); + void startMsnObjectDownload(const QString &handle, const MsnObject *msnObject, Chat *chatWindow); // Return the application list for a given contact ApplicationList *getApplicationList(const QString &handle); + // Return the chat tab which uses the given switchboard connection + Chat *getChatBySwitchboard(const MsnSwitchboardConnection *connection); // Return the chat window which uses the given switchboard connection ChatWindow *getChatWindowBySwitchboard(const MsnSwitchboardConnection *connection); // Return the chat window where we're having an conversation with the given contact. - ChatWindow *getContactChatWindow(const QString &handle, bool privateChat); + Chat *getContactsChat( const QString &handle, bool privateChat ); // Return the chat window where we're having a conversation with the given contacts. - ChatWindow *getContactsChatWindow(const QStringList &handles); + Chat *getContactsChat( const QStringList &handles, bool privateChat ); // Return the chat connection where we're having an conversation with the given contact. - MsnSwitchboardConnection * getContactSwitchboardConnection(const QString &handle, bool privateChat); + MsnSwitchboardConnection *getContactSwitchboardConnection( const QString &handle, bool doRequirePrivateChat ); // Append the message to the queue, waiting to be delivered void queueMessage( const MimeMessage &message, const QString &handle, bool privateChatRequired ); // Send all pending mime messages for the contact. @@ -151,18 +175,26 @@ class ChatMaster : public QObject bool privateChatRequired; }; + // The pointers to the currently active chats + QList chats_; // The pointers to the chat windows - QPtrList chatWindows_; - // The pointers of chat windows that are closing - QPtrList closingChatWindows_; + 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 - QPtrList< PendingMimeMessage > pendingMimeMessages_; + QList pendingMimeMessages_; + // A list of requested chat with one contact ( handle ) + QStringList requestedChats_; // The pointers to the switchboard server connections - QPtrList switchboardConnections_; + QList switchboardConnections_; + // The current tabbed chat setting + int chatTabbedMode_; signals: // Public signals // Ask the Notification connection to add a contact @@ -172,13 +204,17 @@ class ChatMaster : public QObject // Ask the Notification connection to block a contact void blockContact( QString handle ); // Signal the presence of a new incoming chat message - void newChatMessage( const ChatMessage &message, ChatWindow *chatWindow ); + void newChatMessage( const ChatMessage &message, Chat *chatWindow ); // Ask the Notification connection to remove a contact void removeContact( QString handle, bool block ); // Ask the Notification connection to initiate a new switchboard connection with the contact void requestSwitchboard( QString handle, ChatInformation::ConnectionType type ); // Ask the Notification connection to unblock a contact 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 new file mode 100644 index 0000000..b9339cb --- /dev/null +++ b/src/chat/chatmessagestyle.cpp @@ -0,0 +1,1071 @@ +/*************************************************************************** + chatmessagestyle.cpp - description + ------------------- + begin : Sat Okt 29 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 "chatmessagestyle.h" + +#include "../contact/contactbase.h" +#include "../utils/richtextparser.h" +#include "../utils/kmessshared.h" +#include "../currentaccount.h" +#include "../emoticonmanager.h" +#include "../kmessdebug.h" +#include "xsltransformation.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +// Originally from libxml/chvalid.h, but with the last check in xmlIsCharQ removed; +// the last check was for four-byte characters, we only check shorts. Removing +// the last check fixes two warnings on the console. :) +#define xmlIsChar_ch(c) (((0x9 <= (c)) && ((c) <= 0xa)) || \ + ((c) == 0xd) || \ + (0x20 <= (c))) +#define xmlIsCharQ(c) (((c) < 0x100) ? \ + xmlIsChar_ch((c)) :\ + (((0x100 <= (c)) && ((c) <= 0xd7ff)) || \ + ((0xe000 <= (c)) && ((c) <= 0xfffd)))) + + +// The constructor +ChatMessageStyle::ChatMessageStyle() + : QObject(0) + , canConvert_(false) + , contactFontColor_("#000000") + , groupFollowupMessages_(false) + , showTime_(true) + , useContactFont_(false) + , useEmoticons_(true) + , useFontEffects_(true) + , useFormatting_(false) +{ + xslTransformation_ = new XslTransformation(); +} + + + +// The destructor +ChatMessageStyle::~ChatMessageStyle() +{ + delete xslTransformation_; +} + + + +// 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) +{ + // Reset state, changed by parseMsnString + pendingEmoticonTags_.clear(); + + // Create and convert the XML message + if(xslTransformation_ == 0 || ! xslTransformation_->hasStylesheet()) + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "no XSL theme loaded (theme=" << name_ << ")," + << " using fallback theme." << endl; +#endif + + // Create fallback message. + return createFallbackMessage(message); + } + else + { + QString xmlMessage ( convertMessageToXml( message ) ); + QString parsedMessage( xslTransformation_->convertXmlString(xmlMessage) ); + + // 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_ << ")," + << " using fallback theme." << endl; +#endif + return createFallbackMessage(message); + } + else if( isEmptyResult(parsedMessage) ) + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "XSL conversion returned no data (theme=" << name_ << ")," + << " using fallback theme." << endl; +#endif + return createFallbackMessage(message); + } + else + { + // Received expected result + return parsedMessage; // DONE! + } + } +} + + + +// Convert a group of chat message to HTML string +QString ChatMessageStyle::convertMessageList(const QList &messageList) +{ + // Reset state, changed by parseMsnString + pendingEmoticonTags_.clear(); + + // Warn for empty list, avoid broken markup + if( messageList.isEmpty() ) + { + kWarning() << "no messages given!"; + return QString::null; + } + else if( messageList.count() == 1 ) + { + // When there is only one message, don't wrap it in a . + // Makes the calling-code easier, and the layout consistent. + return convertMessage( *messageList.first() ); + } + + // Create iterator + QListIterator it( messageList ); + bool hasStyle = (xslTransformation_ != 0 && xslTransformation_->hasStylesheet()); + QString parsedMessage; + + // Avoid all the trouble when we can't create + if( ! hasStyle ) + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "no XSL theme loaded (theme=" << name_ << ")," + << " using fallback theme." << endl; +#endif + } + else + { + // Create XML string. + QDateTime lastMessageDate; + QString xmlMessage( "\n" ); + while( it.hasNext() ) + { + 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 the current messages + parsedMessage += xslTransformation_->convertXmlString(xmlMessage); + + // 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_ << ")," + << " using fallback theme." << endl; +#endif + } + else if( isEmptyResult(parsedMessage) ) + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "XSL conversion returned no data (theme=" << name_ << ")," + << " using fallback theme." << endl; +#endif + } + else + { + // Received expected result + return parsedMessage; // DONE! + } + } + + // Conversion failed, create fallback + while( it.hasNext() ) + { + parsedMessage += createFallbackMessage( *it.next() ); + } + return parsedMessage; +} + + + +// 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() +{ + QString parsedMessage; + + // Avoid all the trouble when we can't create a style + if( ! hasStyle() ) + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "no XSL theme loaded."; +#endif + } + else + { + // Not much to add here yet.. + QString xmlMessage( "" + "" ); + + // Convert + parsedMessage = xslTransformation_->convertXmlString(xmlMessage); + if( ! parsedMessage.isNull() ) + { + if( isEmptyResult(parsedMessage) ) + { + // Indicate the chat style doesn't define the whole header/footer, + // so KMess can use it's default instead. + return QString::null; + } + return parsedMessage; // DONE! + } + else + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "XSL conversion failed (theme=" << name_ << ")."; +#endif + } + } + + return QString::null; +} + + +// Convert the message as HTML, fallback method when XML fails. +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" ); + + // Reset state, changed by parseMsnString + pendingEmoticonTags_.clear(); + + // Create the fallback message when the XML/XSL conversion failed + if( message.isNormalMessage() ) + { + // Contact message + QString fontBefore; + QString fontAfter; + QString time; + QFont font; + QString color; + + // Extract fonts + parseFont(message, font, color, fontBefore, fontAfter); + + // Escape HTML, replace standard emoticons, links and formatting + RichTextParser::parseMsnString( name, useEmoticons_, true, false, useFormatting_ ); + + // Replace font special effects, like *bold* + if( useFontEffects_ ) + { + parseEffects( name ); + } + + // Body can already be HTML if generated internally. + if( ! message.hasHtmlBody() ) + { + // Escape HTML, replace all emoticons, links and formatting + RichTextParser::parseMsnString( body, useEmoticons_, false, true, useFormatting_, handle, pendingEmoticonTags_ ); + + // Replace font special effects, like *bold* + if( useFontEffects_ ) + { + parseEffects( body ); + } + } + + // Replace newlines with
+ parseBody(body); + + // Misc variables + if( showTime_ ) + { + 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"; + + // Create HTML + return "
" + (showTime_ ? time + " " : "") + + i18n("%1 says:", name) + + "
" + + fontBefore + body + "

" + fontAfter + + "
"; + } + else if( type == ChatMessage::TYPE_SYSTEM ) + { + // Red system message + parseBody( KMessShared::htmlEscape( body ) ); + return "

" + "" + body + "" + "
"; + } + else if( type == ChatMessage::TYPE_APPLICATION || type == ChatMessage::TYPE_APPLICATION_WEBCAM + || type == ChatMessage::TYPE_APPLICATION_FILE || type == ChatMessage::TYPE_APPLICATION_AUDIO ) + { + // Blue application message + parseBody( KMessShared::htmlEscape( body ) ); + return "
" + body + "
"; + } + else if( type == ChatMessage::TYPE_PRESENCE ) + { + // Gray presence message + parseBody( KMessShared::htmlEscape( body ) ); + return "
" + body + "
"; + } + else + { + // Purple notification message + parseBody( KMessShared::htmlEscape( body ) ); + return "
" + body + "
"; + } +} + + + +// Convert the message as XML. +QString ChatMessageStyle::convertMessageToXml( const ChatMessage &message, bool isHistory ) +{ + uint timestamp = 0; + QString fontBefore; + QString fontAfter; + QString xmlMessage; + QString parsedMessage; + QString typeString; + QString color; + QFont font; + + // Remove any characters which are not allowed in XML + const ushort* utf16 = message.getBody().utf16(); + ushort* newutf16 = new ushort[ message.getBody().size() ]; + int j = 0; + for( int i = 0; i < message.getBody().size(); ++i ) + { + // Utf16 sometimes uses more than two bytes for a character, but in those cases, + // both parts will be valid, so xmlIsCharQ (checking if a short is valid) will always return true. + if( xmlIsCharQ( utf16[i] ) ) + { + newutf16[ j++ ] = utf16[i]; + } +#ifdef KMESSDEBUG_CHATVIEW + else + { + kDebug() << "Found invalid character with code " << (int)utf16[i] << ", not showing"; + } +#endif + } + QString body = QString::fromUtf16( newutf16, j ); + + // Get message info + int type = message.getType(); + QString handle ( message.getContactHandle() ); + QString name ( message.getContactName() ); + bool isRtl = body.isRightToLeft(); + bool nameIsRtl = name.isRightToLeft(); + + // See if this is a contact's message and not the user + + + // Prepare the strings for HTML + // App messages are not parsed, they may contain HTML (links to click on, etc..) + if( message.isNormalMessage() ) + { + // Extract fonts + parseFont(message, font, color, fontBefore, fontAfter); + + // Escape HTML, replace standard emoticons, links and formatting + RichTextParser::parseMsnString( name, useEmoticons_, true, false, useFormatting_ ); + + // Parse effects characters (_, *, /) + if( useFontEffects_ ) + { + parseEffects( name ); + } + + // Body can already be HTML if generated internally. + if( ! message.hasHtmlBody() ) + { + // Escape HTML, replace all emoticons, links and formatting + RichTextParser::parseMsnString( body, useEmoticons_, false, true, useFormatting_, handle, pendingEmoticonTags_ ); + + if( useFontEffects_ ) + { + parseEffects( body ); + } + } + } + + + // Replace newlines with
tags + parseBody(body); + + // Show the message time + // TODO: maybe timestamps should always available in the histories, just not necessarily shown? + if( showTime_ ) + { + // Get the time + const QDateTime &messageDate = message.getDateTime(); + timestamp = messageDate.toTime_t(); + } + + + // Get message type for XSL + switch(type) + { + case ChatMessage::TYPE_INCOMING: typeString = "incoming"; break; + case ChatMessage::TYPE_OUTGOING: typeString = "outgoing"; break; + case ChatMessage::TYPE_SYSTEM: typeString = "system"; break; + case ChatMessage::TYPE_APPLICATION_FILE: + case ChatMessage::TYPE_APPLICATION_WEBCAM: + case ChatMessage::TYPE_APPLICATION_AUDIO: + case ChatMessage::TYPE_APPLICATION: typeString = "application"; break; + case ChatMessage::TYPE_OFFLINE_INCOMING: typeString = "offlineIncoming"; break; + case ChatMessage::TYPE_PRESENCE: typeString = "presence"; break; + case ChatMessage::TYPE_NOTIFICATION: + default: + typeString = "notification"; + break; + } + + + // IMPORTANT: + // The QStyleSheet::escape() function doesn't escape quotes. + // Special care needs to be taken to avoid XML parsing errors. + + // Create an XML message for the XSL theme conversion + // "" + if ( isHistory ) + { + xmlMessage = "\n"; + } + else + { + QString timeString; + const QDateTime &datetime = QDateTime::fromTime_t( timestamp ); + + if ( showDate_ ) + { + timeString = KGlobal::locale()->formatDateTime( datetime, KLocale::ShortDate, showSeconds_ ); + } + else + { + timeString = KGlobal::locale()->formatTime( datetime.time(), showSeconds_ ); + } + + xmlMessage = "\n"; + } + + // The contact can be empty for some notification messges + if(! message.getContactHandle().isEmpty() ) + { + xmlMessage += " \n" + " \n"; + + // If the user doesn't have a display picture, the style will use a default image. + if( ! message.getContactPicturePath().isEmpty() && QFile::exists( message.getContactPicturePath() ) ) + { + xmlMessage += " \n"; + } + + if( ! name.isEmpty() ) + { + xmlMessage += " \n"; + } + + xmlMessage += " \n" + " \n"; + } + + // Add message + xmlMessage += " \n" + + KMessShared::htmlEscape( body ) + '\n' + + "\n" // escape again for XML + "\n"; + return xmlMessage; +} + + + +// Return the base folder of the style. +const QString & ChatMessageStyle::getBaseFolder() const +{ + return baseFolder_; +} + + + +// Return the font used for contact messages, if forced to. +const QFont& ChatMessageStyle::getContactFont() const +{ + return contactFont_; +} + + + +// Return the color of the forced contact font. +const QString& ChatMessageStyle::getContactFontColor() const +{ + return contactFontColor_; +} + + + +// 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" ); + if( ! QFile::exists(cssFile) ) + { + return QString::null; + } + else + { + return cssFile; + } +} + + + +// 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 +{ + return name_; +} + + + +// 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 +{ + return pendingEmoticonTags_; +} + + + +// 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 +{ + return useContactFont_; +} + + + +// 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 ) +{ + return stripDoctype(parsedMessage).trimmed().isEmpty(); +} + + + +// Return whether an style is loaded. +bool ChatMessageStyle::hasStyle() const +{ + return (xslTransformation_ != 0 && xslTransformation_->hasStylesheet()); +} + + + +// Replace the newline characters +void ChatMessageStyle::parseBody(QString &body) const +{ + // Replace any newline characters in the message with "
" so that carriage returns will show properly. + body = body.replace(QRegExp("\r?\n?$"), QString::null) // Remove last \n + .replace( "\r\n", "
" ) + .replace( '\r', "
" ) + .replace( '\n', "
" ); +} + + +// Do some effects characters (ie, bold, underline and italic specials) +void ChatMessageStyle::parseEffects(QString &text) const +{ + int offset = 0; + int nextOffset = 0; + QRegExp effectsSearch; + QString effectsCharacter; + QChar boundaryCharacter; + int tagPosOpen, tagPosClose; + QString replacement; + + // Process bold, italics, underline + const char* effectHtml = "biu"; // bold, italic, underline + QString effectCharacters( "*/_" ); + + for( int i = 0; i < 3; i++ ) + { + effectsCharacter = QRegExp::escape( effectCharacters.mid(i, 1) ); + effectsSearch.setPattern( effectsCharacter + "([\\d\\w\\s]+)" + effectsCharacter ); + + offset = 0; + + while( offset >= 0 ) + { + // Find next pattern match + offset = effectsSearch.indexIn( text, nextOffset ); + if( offset == -1 ) + { + break; + } + + // Skip effects contained in HTML tags + tagPosOpen = text.indexOf( "<", nextOffset ); + tagPosClose = text.indexOf( ">", tagPosOpen ); + if( tagPosOpen != -1 && tagPosClose != -1 && offset > tagPosOpen && offset < tagPosClose ) + { + // Continue from the first character after the HTML tag + nextOffset = tagPosClose + 1; + continue; + } + + nextOffset = offset + effectsSearch.matchedLength(); + + // Abort if there is a normal char before + if( offset != 0 ) + { + boundaryCharacter = text.at( offset - 1 ); + if( ! boundaryCharacter.isSpace() && ! boundaryCharacter.isPunct() ) + { + continue; + } + } + + // Abort if there is a normal char after + if( ( offset + effectsSearch.matchedLength() ) < text.length() ) + { + boundaryCharacter = text.at( offset + effectsSearch.matchedLength() ); + if( ! boundaryCharacter.isSpace() && ! boundaryCharacter.isPunct() ) + { + continue; + } + } + + // Replace if start and end are free. + if( effectHtml[i] == 'b' ) + { + // Bold is standard + replacement = "*" + effectsSearch.cap(1) + "*"; + } + else if( effectHtml[i] == 'i' ) + { + // Same for italics + replacement = "/" + effectsSearch.cap(1) + "/"; + } + else if( effectHtml[i] == 'u' ) + { + // Same for underline + replacement = "_" + effectsSearch.cap(1) + "_"; + } + + // Replace and change offset + text.replace(offset, effectsSearch.matchedLength(), replacement); + nextOffset = offset + replacement.length() + 2; + } + } +} + + + +// Parse the font tags +void ChatMessageStyle::parseFont(const ChatMessage &message, QFont &font, QString &color, QString& fontBefore, QString& fontAfter) const +{ + // Extract the font from the message. + ChatMessage::MessageType type = message.getType(); + if( useContactFont_ && (type == ChatMessage::TYPE_INCOMING || type == ChatMessage::TYPE_OFFLINE_INCOMING) ) + { + // Replace the given font with the user's stored contact font + font = contactFont_; + color = contactFontColor_; + } + else + { + // Use the font settings from the message + font = message.getFont(); + color = message.getFontColor(); + } + + // 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" ); + + // 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.clear(); + fontAfter.clear(); + if( font.bold() ) fontBefore += ""; + if( font.italic() ) fontBefore += ""; + if( font.underline() ) fontBefore += ""; + fontBefore += ""; + fontAfter += ""; + if( font.underline() ) fontAfter += ""; + if( font.italic() ) fontAfter += ""; + if( font.bold() ) fontAfter += ""; +} + + + +// The the contact font +void ChatMessageStyle::setContactFont(const QFont &font) +{ + contactFont_ = font; +} + + + +// The the contact font color +void ChatMessageStyle::setContactFontColor(const QString &fontColor) +{ + contactFontColor_ = 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) +{ + showTime_ = 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" ) ); + + if(path.isNull()) + { + kWarning() << "could not find the style named '" << style << "'."; + return false; + } + + // Set stylesheet + name_ = style; + xslTransformation_->setStylesheet(path); + bool styleSheetLoaded = xslTransformation_->hasStylesheet(); + + if(styleSheetLoaded) + { + // Update the base folder + KUrl pathUrl; + pathUrl.setPath(path); + baseFolder_ = pathUrl.directory( KUrl::AppendTrailingSlash ); + + QMap parameters; + parameters["basepath"] = baseFolder_; + parameters["csspath"] = getCssFile(); + 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() ); + + return styleSheetLoaded; +} + + + +// Enable or disable contact font overrides +void ChatMessageStyle::setUseContactFont(bool useContactFont) +{ + useContactFont_ = useContactFont; +} + + + +// Enable or disable emoticons +void ChatMessageStyle::setUseEmoticons(bool useEmoticons) +{ + useEmoticons_ = useEmoticons; +} + + + +// Enable or disable font effects +void ChatMessageStyle::setUseFontEffects(bool useFontEffects) +{ + useFontEffects_ = useFontEffects; +} + + + +// Enable or disable MSN Plus formatting +void ChatMessageStyle::setUseFormatting( bool useFormatting ) +{ + useFormatting_ = useFormatting; +} + + + +// Strip the DOCTYPE tag from the message +QString ChatMessageStyle::stripDoctype( const QString &parsedMessage ) +{ + if( parsedMessage.startsWith( "\r?\n?"); + int endPos = parsedMessage.indexOf( re ); + if( endPos == -1 ) + { + kWarning() << "Could not strip DOCTYPE tag: end position not found!"; + return parsedMessage; + } + + // Strip both end end possible \r\n character + return parsedMessage.mid( endPos + re.matchedLength() ); + } + else + { + return parsedMessage; + } +} + + + +#include "chatmessagestyle.moc" + diff --git a/kmess/chat/chatmessagestyle.h b/src/chat/chatmessagestyle.h similarity index 64% rename from kmess/chat/chatmessagestyle.h rename to src/chat/chatmessagestyle.h index a807b9c..91bb18d 100644 --- a/kmess/chat/chatmessagestyle.h +++ b/src/chat/chatmessagestyle.h @@ -18,21 +18,22 @@ #ifndef CHATMESSAGESTYLE_H #define CHATMESSAGESTYLE_H -#include "chatmessage.h" +#include "../network/chatmessage.h" + +#include +#include +#include -#include -#include -#include -#include -#include class XslTransformation; + /** * Utility class to convert chat messages to the current style/appearance. * * @author Diederik van der Boor + * @ingroup Chat */ class ChatMessageStyle : public QObject { @@ -45,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 QPtrList &messageList); + 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. @@ -59,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; @@ -73,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 @@ -83,16 +118,14 @@ class ChatMessageStyle : public QObject void setUseEmoticons(bool useEmoticons); // Enable or disable font effects void setUseFontEffects(bool useFontEffects); + // Enable or disable MSN Plus formatting + void setUseFormatting( bool useFormatting ); private: // private methods // 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 bool isEmptyResult( const QString &parsedMessage ); // Replace the newline characters @@ -101,10 +134,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 ); @@ -112,26 +141,34 @@ 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_; - // The last ID of the pending emoticon placeholders (to generate ID's) - int lastPendingEmoticonId_; + // Current emoticon style + QString emoticonStyle_; + // Group follow up messages + bool groupFollowupMessages_; // The name of the style QString name_; - // The ID's of the pending emoticons + // A list of IDs of pending emoticons QStringList pendingEmoticonTags_; - // The filename for the pending placeholder image. - QString pendingPlaceholder_; // 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 bool useEmoticons_; // Whether font effects should be used bool useFontEffects_; + // Whether MSN Plus formatting should be used + bool useFormatting_; // The XSL transformation XslTransformation *xslTransformation_; }; diff --git a/src/chat/chatmessageview.cpp b/src/chat/chatmessageview.cpp new file mode 100644 index 0000000..1b2db25 --- /dev/null +++ b/src/chat/chatmessageview.cpp @@ -0,0 +1,1086 @@ +/*************************************************************************** + chatmessageview.cpp - description + ------------------- + begin : Sat Nov 8 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 "chatmessageview.h" + +#include "../dialogs/addemoticondialog.h" +#include "../utils/kmessshared.h" +#include "../currentaccount.h" +#include "../emoticonmanager.h" +#include "../kmessdebug.h" +#include "chatmessagestyle.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + + +// The constructor +ChatMessageView::ChatMessageView( QWidget *parent ) + : KHTMLPart( parent, 0, DefaultGUI ) + , chatClearingMark_(0) + , isEmpty_(true) + , lastMessageId_(0) +{ + // Disable features that might do harm or are not useful + setJScriptEnabled( false ); + setJavaEnabled( false ); + setMetaRefreshEnabled( false ); + setOnlyLocalReferences( false ); + setSuppressedPopupIndicator( false ); + + // 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&) ), + this, SIGNAL( openUrlRequest(const KUrl&) ) ); + + // Make sure this widget can't get any focus. + view()->setFocusPolicy( Qt::NoFocus ); + + // 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(); +} + + + +// The destructor +ChatMessageView::~ChatMessageView() +{ + // Delete the saved chat messages. + qDeleteAll( chatMessages_ ); + chatMessages_.clear(); + lastContactMessages_.clear(); + + delete chatStyle_; +} + + + +/** + * Remove from the chat all links to add an emoticon + * + * This method is called when you've added a custom emoticon that a contact has sent you. + * It searches the chat for the emoticon you have added; and removes the "add this emoticon" + * link from all the occurrences of it. + * This way, you can't add twice an emoticon. This behavior mimicks that of MSN/Windows Live + * Messenger. + */ +void ChatMessageView::addedEmoticon( QString shortcut ) +{ +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Replacing add emoticon links with shortcut '" << shortcut << "'."; +#endif + + // The shortcut in emoticon links is url-encoded, convert the original one to match it + shortcut = KUrl::toPercentEncoding( shortcut ); + + DOM::HTMLElement link, parent, image; + DOM::HTMLDocument document = htmlDocument(); + + // Find all the list's links which point to this emoticon + DOM::NodeList linksList = document.getElementsByName( "newEmoticon_" + shortcut ); + + if( linksList.isNull() ) + { + return; + } + + // Check all the links in the list. The search is done backwards, because when we delete one of the items + // of the list, the list itself shortens down reassigning the indices, and a regular loop would fail + for( long i = (linksList.length() - 1); i >= 0; i-- ) + { + link = linksList.item( i ); + if( link.isNull() || ! link.isHTMLElement() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Link null, skipping."; +#endif + continue; + } + + // Replace the link with its first child (the emoticon image) + parent = link.parentNode(); + image = link.firstChild(); + + if( parent.isNull() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Parent null, skipping."; +#endif + continue; + } + + if( image.isNull() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Image null, skipping."; +#endif + continue; + } + + parent.replaceChild( image, link ); + } +} + + + +// Add the given html to the chat browser and scroll to the end +void ChatMessageView::addHtmlMessage(const QString &text) +{ + lastMessageId_++; + + // Create new HTML node + DOM::HTMLElement newNode = document().createElement("div"); + newNode.setAttribute( "id", "message" + QString::number(lastMessageId_) ); + newNode.setAttribute( "class", "messageContainer" ); + newNode.setInnerHTML( text ); + + DOM::HTMLElement messageRoot = htmlDocument().getElementById("messageRoot"); + if( messageRoot.isNull() ) + { + messageRoot = htmlDocument().body(); + } + messageRoot.appendChild( document().createTextNode("\n") ); + messageRoot.appendChild( newNode ); + messageRoot.appendChild( document().createTextNode("\n") ); + + isEmpty_ = false; +} + + + +// 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::getHistory( Account::ChatExportFormat format, bool &append, QString &appendPoint ) +{ + 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 +{ + return isEmpty_; +} + + + +// 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 ) ); + if( lastNode.isNull() || ! lastNode.isHTMLElement() ) + { + kWarning() << "message block with id" + lastId + "not found, appending message instead."; + addHtmlMessage( text ); + return; + } + + // Replace contents + lastNode.setInnerHTML( text ); +} + + + +// 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 ) ); +} + + + +// Scroll to the bottom of the chat browser +void ChatMessageView::scrollChatToBottom() +{ + 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 &newHtmlBody ) +{ + // Reset state variables + lastMessageId_ = 0; + + // If the style is not working, prepare a standard HTML page + if( ! chatStyle_->canConvert() ) + { + 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" ); + } + + // Complete loading + end(); +} + + + +// Replace the entire contents with a new chat in XML +void ChatMessageView::setXml( const QString &newXmlBody ) +{ + setHtml( chatStyle_->convertXmlMessageList( newXmlBody ) ); +} + + + +// Add the given message to the message browser. +void ChatMessageView::showMessage( const ChatMessage &message ) +{ + // Avoid duplicating the same presence message. + if( message.getType() == ChatMessage::TYPE_PRESENCE + && ! chatMessages_.isEmpty() ) + { + ChatMessage *lastChatMessage = chatMessages_.last(); + if( lastChatMessage->getType() == message.getType() + && lastChatMessage->getContentsClass() == message.getContentsClass() + && lastChatMessage->getContactHandle() == message.getContactHandle() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Not showing presence message for the same contact again."; +#endif + return; + } + } + + // 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() ) ); +} + + + +// Replace an application's accept/reject/cancel links with another text +void ChatMessageView::updateApplicationMessage( const QString &messageId, const QString &newMessage ) +{ + DOM::HTMLDocument document( htmlDocument() ); + DOM::HTMLElement linksSpan = document.getElementById( "app" + messageId + "-links-block" ); + + // This chat doesn't contain messages for this application, bail out + if( linksSpan.isNull() ) + { + return; + } + + // Change the span's ID so it won't trigger changes anymore + linksSpan.setId( DOM::DOMString( "app" + messageId ) ); + + // Replace the links with the given text + linksSpan.setInnerText( DOM::DOMString( newMessage ) ); +} + + + +// 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 ) +{ +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Replacing emoticon '" << code << "' with '" << replacement << "' for '" << handle << "'"; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( ! code.isEmpty() ); + KMESS_ASSERT( ! replacement.isEmpty() ); + KMESS_ASSERT( ! handle.isEmpty() ); +#endif + + // Check for empty replacements. + if( replacement.isEmpty() ) + { + kWarning() << "can't update custom emoticon, replacement not found (contact=" << handle << ")."; + return; + } + + // The pattern used to find if the new custom emoticon is already in our theme + QString customEmoticonsPattern( EmoticonManager::instance()->getHtmlPattern( true ).pattern() ); + + // Process all pending tags, avoid parsing all tags + DOM::HTMLDocument document = htmlDocument(); + foreach( const QString &tag, pendingEmoticonTags_ ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Checking DOM element '" << tag << "'"; +#endif + + // Check if the element is valid + DOM::HTMLElement img = document.getElementById( tag ); + if( img.isNull() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Skipped null element."; +#endif + continue; + } + + // Get the image's alternative text attribute + QString imageAltText( img.getAttribute("alt").string() ); + + // Before converting the alt attribute, save it; we'll use it later + 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) + KMessShared::htmlEscape( imageAltText ); + + // See if this element's ALT attribute matches the shortcut + if( img.isNull() || imageAltText != code ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Skipped invalid element (searched '" << code << "', found '" << imageAltText << "')."; +#endif + continue; + } + + // Also check whether the handle is also set, avoid replacing someone elses code. + if( img.getAttribute("contact") != handle ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Emoticon code found, but different handle: " << img.getAttribute("contact"); +#endif + continue; + } + + + // Update image placeholder attributes (replacing childs is too much trouble). + // Create a regexp to parse the replacement attributes. + QRegExp attribRegExp( + "([a-z]+)=" // words followed by an = + "(?:" // start of options + "'([^']*)'|" // attrib separated by single quote, or.. + "\"([^\"]*)\"|" // attrib separated by double quote, or.. + "([^ \t\r\n>]+)" // attrib followed by space, newline, tab, endtag + ")" // end of options + ); +#ifdef KMESSTEST + KMESS_ASSERT( attribRegExp.isValid() ); +#endif + + int attribPos = 0; + while(true) + { + // Find next attribute + attribPos = attribRegExp.indexIn(replacement, attribPos); + if( attribPos == -1 ) + { + break; + } + +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Emoticon replacement has attribute: " << attribRegExp.cap(1) << "=" << attribRegExp.cap(2); +#endif + img.setAttribute( attribRegExp.cap(1), attribRegExp.cap(2) ); + + // Also change the image's class and reset its ID + img.setAttribute( "class", "customEmoticon" ); + img.setAttribute( "id", "" ); + + attribPos += attribRegExp.matchedLength(); + } + + + // Allow the user to "steal" this emoticon + 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 ); + + // Remove any title in the emoticon image, as it would be displayed instead of the + // title from the link we're creating + newImage.setAttribute( "title", "" ); + + // 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 ) ); + + // 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", code ) ); // Not escaped for " or ', KHTML does it + newLink.setAttribute( "href", "kmess://emoticon/" + handle + "/" + urlCode + "/" + + KUrl::toPercentEncoding( newImage.getAttribute("src").string() ) ); + + // Add the new image as child of the new link + newLink.appendChild( newImage ); + + // And put the link in place of the old image + img.parentNode().replaceChild( newLink, img ); + } + } + + // Force updating the view to display instantly the new image + 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 new file mode 100644 index 0000000..3e34830 --- /dev/null +++ b/src/chat/chatmessageview.h @@ -0,0 +1,128 @@ +/*************************************************************************** + chatmessageview.h - description + ------------------- + begin : Sat Nov 8 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. * + * * + ***************************************************************************/ + +#ifndef CHATMESSAGEVIEW_H +#define CHATMESSAGEVIEW_H + +#include "account.h" + +#include +#include + + +class ChatMessage; +class ChatMessageStyle; +class CurrentAccount; +class QStringList; + + + +/** + * This class is used to display chat messages. + * A KHTMLPart is used for this because unlike QTextBrowser, KHTML has support for CSS. + * + * @author Diederik van der Boor + * @ingroup Chat + */ +class ChatMessageView : public KHTMLPart +{ + Q_OBJECT + + public: // public methods + + // The constructor + ChatMessageView( QWidget *parent ); + // The destructor + virtual ~ChatMessageView(); + // 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; + // 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 + void appCommand(QString cookie, QString contact, QString method); + // Signal a click on an URL + void openUrlRequest( const KUrl &url ); +}; + +#endif + 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 new file mode 100644 index 0000000..a29004b --- /dev/null +++ b/src/chat/chatview.cpp @@ -0,0 +1,972 @@ +/*************************************************************************** + chatview.cpp - description + ------------------- + begin : Wed Jan 15 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 "chatview.h" + +#include "../contact/contact.h" +#include "../dialogs/addemoticondialog.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 "contactswidget.h" +#include "inkedit.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + + +// The constructor +ChatView::ChatView( QWidget *parent ) +: QWidget( parent ) +// , Ui::ChatView() +, contactsWidget_( 0 ) +, currentAccount_( 0 ) +, initialized_( false ) +{ + // Insert a KHTMLPart in the placeholder + chatMessageView_ = new ChatMessageView( this ); + connect( chatMessageView_, SIGNAL( popupMenu(const QString&,const QPoint&) ), + this, SLOT ( slotShowContextMenu(const QString&,const QPoint&) ) ); + connect( chatMessageView_, SIGNAL( openUrlRequest(const KUrl&) ), + this, SLOT( slotOpenURLRequest(const KUrl&) ) ); + connect( this, SIGNAL( updateApplicationMessage(const QString&,const QString&) ), + chatMessageView_, SLOT( updateApplicationMessage(const QString&,const QString&) ) ); + + // Create a layout to maximize the KHTMLPart + 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 ); + + // Create the containers for this chat's current text and drawing + inkEditContents_ = new InkImage(); + messageEditContents_ = new QTextDocument(); +} + + + +// The destructor +ChatView::~ChatView() +{ + // Delete the related widgets + delete contactsWidget_; + delete inkEditContents_; + delete messageEditContents_; +} + + + +// Copy the currently selected text +void ChatView::editCopy() +{ + // The view never has focus, only selection. + if( ! chatMessageView_->hasSelection() ) + { + return; + } + + kapp->clipboard()->setText( chatMessageView_->selectedText() ); + // use selectedTextAsHTML() and setData() to copy HTML instead of text +} + + + +// Event filter to detect special actions in the message editor; also detect those of the message view. They get filtered +// here since the message view has a NoFocus policy, which prevents it from having keyboard shortcut events. +bool ChatView::eventFilter( QObject *obj, QEvent *event ) +{ + Q_UNUSED( obj ); + + switch( event->type() ) + { + case QEvent::DragEnter: + { + QDragEnterEvent *dragEvent = static_cast( event ); + + if( dragEvent->mimeData()->hasUrls() ) + { + dragEvent->acceptProposedAction(); + return true; + } + else if( dragEvent->mimeData()->hasFormat( "application/kmess.list.item" ) ) + { + dragEvent->acceptProposedAction(); + return true; + } + + break; + } + + case QEvent::Drop: + { + QDropEvent *dropEvent = static_cast( event ); + const QMimeData *data = dropEvent->mimeData(); + + // 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 + + // Send the files to the contact + startFileTransfer( dropEvent->mimeData()->urls() ); + + dropEvent->acceptProposedAction(); + return true; + } + + if( data->hasFormat( "application/kmess.list.item" ) + && ! data->text().isEmpty() ) + { + // Invite the listed contacts, but check them a little + QStringList handles( data->text().split( "; " ) ); + + foreach( const QString &handle, handles ) + { + // Don't try to invite random strings, nonexistent handles + if( ! Account::isValidEmail( handle ) + || currentAccount_->getContactByHandle( handle ) == 0 ) + { + handles.removeAll( handle ); + } + } + + // If any address has survived, it has gained itself the valhalla, an invitation to our chat + if( ! handles.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Drag'n'dropped addresses:" << handles; +#endif + inviteContacts( handles ); + dropEvent->acceptProposedAction(); + return true; + } + } + + break; + } + + default: + break; + } + + return false; +} + + + +// Return a pointer to this chat's Contacts Widget +ContactsWidget *ChatView::getContactsWidget() const +{ + return contactsWidget_; +} + + + +// Return a pointer to the ink image drawn by the user in this chat +InkImage *ChatView::getInkEditContents() const +{ + return inkEditContents_; +} + + + +// Return a pointer to the text typed by the user in this chat +QTextDocument *ChatView::getMessageEditContents() const +{ + return messageEditContents_; +} + + + +// Get the text zoom factor +int ChatView::getZoomFactor() +{ + return chatMessageView_->zoomFactor(); +} + + + +// Initialize the object +bool ChatView::initialize() +{ +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "initializing."; +#endif + + if ( initialized_ ) + { + kDebug() << "already initialized."; + return false; + } + + currentAccount_ = CurrentAccount::instance(); + if ( currentAccount_ == 0 ) + { + kDebug() << "Couldn't get the instance of the current account."; + return false; + } + + connect( currentAccount_, SIGNAL( changedFontSettings() ), + chatMessageView_, SLOT ( updateChatStyle() ) ); + connect( currentAccount_, SIGNAL( changedChatStyleSettings() ), + 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; +} + + + +// Whether or not the message area is empty +bool ChatView::isEmpty() const +{ + return chatMessageView_->isEmpty(); +} + + + +/* Save the chat to the given file + * + * @param path The path to the file to save to + * @param format Format of the file (xml, text, ...) + * @param overwriteContents whether to append or overwrite the contents of the file + * @param allowUserInteraction whether to allow dialog boxes to be sent if something succeeds or fails + * @returns true if everything was saved correctly, false otherwise + */ +bool ChatView::saveChatToFile( const QString &path, Account::ChatExportFormat format, bool overwriteContents, bool allowUserInteraction ) +{ +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "saving chat to '" << path << "'."; +#endif + + // Find out if the file already exists + QFile file( path ); + bool isExistingFile = file.exists(); + + // Create and open the file. + if( ! file.open( QIODevice::ReadWrite ) ) + { + 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; + } + + // Add a bit more security to the log file, if the platform supports it + file.setPermissions( QFile::ReadOwner | QFile::WriteOwner ); + + QString fileData; + QString appendPoint; + bool willAppend = ( isExistingFile && ! overwriteContents ); + + // 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 ) + { + 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() << "Will append to current file?" << willAppend; +#endif + + if( willAppend ) + { +#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 + { + kDebug() << "Creating new chat file..."; + file.resize( 0 ); // Truncate it (99% useless precaution) + } +#endif + + // Output the chat history to the file, with the right text encoding + QTextStream textStream( &file ); + textStream.setCodec( QTextCodec::codecForLocale() ); + textStream << chatHistory; + file.close(); + + return true; +} + + + +// Enable or disable the parts of the chat which allow user interaction +void ChatView::setEnabled( bool isEnabled ) +{ + // Set the state of the main UI elements + contactsWidget_->setEnabled( isEnabled ); + + // The chat is being enabled back, replace some stuff which changes + // at every connection + if( isEnabled ) + { + // Re-read the current account pointer + // because it likely is a different one + currentAccount_ = CurrentAccount::instance(); + } +} + + + +// Set the zoom factor of the text +void ChatView::setZoomFactor( int percentage ) +{ + chatMessageView_->setFontScaleFactor( percentage ); +} + + + +// 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_ ) ) + { + contactsWidget_->messageReceived( message.getContactHandle() ); + } +} + + + +// Show a dialog to save the chat. +void ChatView::showSaveChatDialog() +{ + QFileInfo targetFile; + 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, + 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() ) + { + return; + } + + // Default to accept the path name + overwriteAllowed = KMessageBox::Ok; + + // Check if the file exists and if so, warn the user + targetFile.setFile( path ); + if( targetFile.exists() ) + { + 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" ) ) ); + } + + } + while( overwriteAllowed == KMessageBox::Cancel ); + + 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(); +} + + + +/** + * Open a dialog to add a new custom emoticon seen in the chat + */ +void ChatView::slotAddNewEmoticon() +{ + if( ! chatViewClickedUrl_.isValid() || chatViewClickedUrl_.protocol() != "kmess" || chatViewClickedUrl_.host() != "emoticon" ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Ignoring request for invalid URL: " << chatViewClickedUrl_; +#endif + + return; + } + +/* + * KMess' internal emoticon addition 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 + QString picture ( path.section( "/", 2 ) ); // Third parameter: emoticon picture path + + const 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 + picture = KUrl::fromPercentEncoding( picture.toAscii() ); + shortcut = KUrl::fromPercentEncoding( shortcut.toAscii() ); + +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Showing Add Emoticon dialog - shortcut=" << shortcut << " picture=" << picture; +#endif + + // Finally, show the dialog, preselecting the picture file and shortcut + AddEmoticonDialog *addDialog = new AddEmoticonDialog( EmoticonManager::instance()->getTheme( true ), chatMessageView_->view() ); + + connect( addDialog, SIGNAL( addedEmoticon(QString) ), + chatMessageView_, SLOT ( addedEmoticon(QString) ) ); + + addDialog->preSelect( picture, shortcut ); + +} + + + +// Clear the chat's contents +void ChatView::slotClearChat() +{ + chatMessageView_->clearView( false ); +} + + + +// The user clicked the "copy address" or "copy email" option in the context menu +void ChatView::slotCopyAddress() +{ + QString url( chatViewClickedUrl_.url() ); + + if( ! chatViewClickedUrl_.isValid() ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Not copying invalid URL: " << url; +#endif + + return; + } + +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Copying URL: " << url; +#endif + + // Strip the pseudo-protocol 'mail to' from email addresses + if( url.left( 7 ) == "mailto:" ) + { + url = url.mid( 7 ); + } + + kapp->clipboard()->setText( url ); + + // Reset the url + chatViewClickedUrl_.clear(); +} + + + +// The user clicked the "copy text" option in the context menu. +void ChatView::slotCopyChatText() +{ +// For HTML use selectedTextAsHTML(); + kapp->clipboard()->setText( chatMessageView_->selectedText() ); +} + + + +// The user clicked the "find text" option in the context menu +void ChatView::slotFindChatText() +{ + chatMessageView_->findText(); +} + + + +/** + * 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 ) +{ + chatViewClickedUrl_ = url; + + // Internal URLs form: kmess://call_type/parameters?more_parameters + + if( url.protocol() == "kmess" ) + { + // Application URLs form: kmess://application/responseType/contactHandle?cookieId + if( url.host() == "application" ) + { + // Handle the applications input + slotSendAppCommand(); + } + // Emoticon URLs form: kmess://emoticon/contactHandle/urlEncodedShortcut/urlEncodedPictureTag + else if( url.host() == "emoticon" ) + { + // 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" ) + { + // Obtain the widget of the main KMess window, to correctly link it to the opened app + KMessApplication *kmessApp = static_cast( kapp ); + QWidget *mainWindow = kmessApp->getContactListWindow()->window(); + + // Execute the local file with the system's default association (KRun auto-deletes itself) + new KRun( url, mainWindow, 0, true ); + } + else + { + // Just execute the link + slotVisitAddress(); + } +} + + + +// 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() +{ + chatMessageView_->selectAll(); +} + + + +/** + * The user clicked a kmess internal link in the ChatMessageView + */ +void ChatView::slotSendAppCommand() +{ + // Ignore non-internal links and non-application internal links + if( ! chatViewClickedUrl_.isValid() || chatViewClickedUrl_.protocol() != "kmess" || chatViewClickedUrl_.host() != "application" ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Not sending invalid application link: " << chatViewClickedUrl_.url(); +#endif + + return; + } + +/* + * KMess' internal application URLs are in the form + * kmess://application/responseType/accountHandle?cookieId + */ + + 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 + +#ifdef KMESSTEST + KMESS_ASSERT( ! path.isEmpty() ); + KMESS_ASSERT( ! query.isEmpty() ); +#endif + +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Sending application link - method=" << method << " contact=" << contact << " cookie=" << cookie; +#endif + + emit appCommand( cookie, contact, method ); +} + + + +// The user right clicked at the KHTMLPart to show a popup. +void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &point ) +{ + KAction *urlAction = 0; + + // Add items to this context menu + KMenu *contextMenu = new KMenu( chatMessageView_->view() ); + + // Analyze incoming URL, if present + if( ! clickedUrl.isEmpty() ) + { + KUrl url( clickedUrl ); + +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Clicked URL: " << url.prettyUrl(); +#endif + + if( url.protocol() == "kmess" && url.host() == "emoticon" ) + { + 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("Hide this &Emoticon"), this ); + connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotIgnoreEmoticon()) ); + contextMenu->addAction( urlAction ); + } + else if( url.protocol().left( 6 ) == "mailto" ) + { + urlAction = new KAction( KIcon( "mail" ), i18n("Send &Email"), this ); + connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotVisitAddress()) ); + contextMenu->addAction( urlAction ); + + 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( KIcon( "launch" ), i18n("Visit &Link"), this ); + connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotVisitAddress()) ); + contextMenu->addAction( urlAction ); + + urlAction = new KAction( KIcon( "edit-copy" ), i18n("Copy &Address"), this ); + connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotCopyAddress()) ); + contextMenu->addAction( urlAction ); + } + + chatViewClickedUrl_ = url; + } + + // Create items + 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") ); + selectAllAction ->setText( i18n("Select &All") ); + 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 ) + { + contextMenu->addSeparator(); + } + + contextMenu->addAction( copyAction ); + contextMenu->addAction( selectAllAction ); + contextMenu->addAction( findAction ); + contextMenu->addSeparator(); + contextMenu->addAction( clearChatAction ); + contextMenu->addAction( saveToFileAction ); + + // Set items disabled, depending on the text selection + if( chatMessageView_->hasSelection() ) + { + saveToFileAction->setEnabled( false ); + } + else + { + copyAction->setEnabled( false ); + } + + // Only enable the clear chat action if it contains messages + clearChatAction->setEnabled( ! isEmpty() ); + + // Show the menu + contextMenu->exec( point ); + delete contextMenu; + delete copyAction; +} + + + +// The user clicked the "visit address" or "send email" option in the context menu, or clicked a link in the ChatMessageView +void ChatView::slotVisitAddress() +{ + if( ! chatViewClickedUrl_.isValid() ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Not opening invalid URL: " << chatViewClickedUrl_; +#endif + + return; + } + +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Opening URL: " << chatViewClickedUrl_; +#endif + + // Launch the browser for the given URL + if( chatViewClickedUrl_.protocol() == "mailto" ) + { + currentAccount_->openMailAtCompose( chatViewClickedUrl_.url().mid( 7 ) ); + } + else + { + KMessShared::openBrowser( chatViewClickedUrl_ ); + } + + // Reset the url + chatViewClickedUrl_.clear(); +} + + + +// Update the messages which contain custom emoticons +void ChatView::updateCustomEmoticon( const QString &handle, const QString &code ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( ! code.isEmpty() ); +#endif + + // Check for empty replacements. + if( code.isEmpty() ) + { + kWarning() << "can't update custom emoticon, emoticon code not given (contact=" << handle << ")."; + return; + } + + // Get contact emoticon replacements. + const ContactBase *contact = currentAccount_->getContactByHandle(handle); + if(KMESS_NULL(contact)) return; + + // Get emoticon replacement, instruct chatMessageView to replace it. + const QString &replacement = contact->getEmoticonReplacements()[code]; + chatMessageView_->updateCustomEmoticon( code, replacement, handle ); +} + + + +#include "chatview.moc" + diff --git a/kmess/chat/chatview.h b/src/chat/chatview.h similarity index 53% rename from kmess/chat/chatview.h rename to src/chat/chatview.h index 34c547f..40af254 100644 --- a/kmess/chat/chatview.h +++ b/src/chat/chatview.h @@ -18,30 +18,31 @@ #ifndef CHATVIEW_H #define CHATVIEW_H -#include -#include -#include -#include +#include "../network/chatmessage.h" +#include "../account.h" +#include "chatmessageview.h" -#include -#include -#include - -#include "chatmessage.h" -#include "chatviewinterface.h" // Forward declarations -class CurrentAccount; -class KMessTest; +class QTextDocument; + class ChatMessageStyle; class ChatMessageView; +class ContactsWidget; +class CurrentAccount; +class EmoticonsWidget; +class InkImage; +class KMessTest; + /** * The view widget of a chat with a contact with message display and entry. + * * @author Mike K. Bennett + * @ingroup Chat */ -class ChatView : public ChatViewInterface +class ChatView : public QWidget { Q_OBJECT @@ -49,61 +50,61 @@ class ChatView : public ChatViewInterface public: // The constructor - ChatView(QWidget *parent=0, const char *name=0); + ChatView( QWidget *parent = 0 ); // The destructor - ~ChatView(); + virtual ~ChatView(); // Copy the currently selected text void editCopy(); // Initialize the object bool initialize(); - // Return the encoding of the HTML document. - QString getEncoding() const; - // Return the HTML source of the page. - QString getHtml() 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( KConfig *config ); - // Save the window properties (called by the parent ChatWindow) - void saveProperties( KConfig *config ); 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 - // Delete the newline behind the message edit's cursor. - void deleteNewlineAtCursor(); // Event filter to detect special actions in the message editor. bool eventFilter( QObject *obj, QEvent *event ); + // Set up the contacts widget + bool initializeContactsWidget(); // Initialize the current account bool initializeCurrentAccount(); - // 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 clicked a kmess internal link in the ChatMessageView @@ -112,61 +113,46 @@ class ChatView : public ChatViewInterface void slotCopyAddress(); // The user clicked the "copy text" option in the context menu. void slotCopyChatText(); + // 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, const KParts::URLArgs &args); + 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); // 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(); - private: // Private attributes - QPtrList chatMessages_; - // The embedded khtml part - ChatMessageView *chatMessageView_; - // The XSL transformation handler - ChatMessageStyle *chatStyle_; - // URL address which has been right-clicked - KURL chatViewClickedUrl_; + protected: // Protected attributes + // The contacts widget, containing the contacts present in this chat + ContactsWidget *contactsWidget_; // A pointer to the instance of the current account CurrentAccount *currentAccount_; - // 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_; + + private: // Private attributes + // The embedded khtml part + ChatMessageView *chatMessageView_; + // URL address which has been right-clicked + KUrl chatViewClickedUrl_; + // The text typed by the user in this chat + InkImage *inkEditContents_; // Whether or not the object was initialized bool initialized_; - // The last messages sent by the same contact. This is used to combine them - QPtrList lastContactMessages_; - // The message bar's height - int messageBarHeight_; - // The messages that contain custom emoticons - QStringList pendingEmoticonTags_; - // The sidebar's width - int sidebarWidth_; - // A timer to time whether a "user is typing" message should be sent. - QTimer userTypingTimer_; - - private slots: - // The color in the text box changed. - void editorColorChanged(const QColor &color); - // Update the chat style - void updateChatStyle(); + // 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 user wants to transfer some files - void sendFiles( QStringList fileList ); - // Signal that the user is typing - void userIsTyping(); + 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 ); }; #endif diff --git a/src/chat/chatwindow.cpp b/src/chat/chatwindow.cpp new file mode 100644 index 0000000..4896045 --- /dev/null +++ b/src/chat/chatwindow.cpp @@ -0,0 +1,2572 @@ +/*************************************************************************** + chatwindow.cpp - description + ------------------- + begin : Tue Apr 23 2002 + copyright : (C) 2002 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 "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 "contactswidget.h" +#include "emoticonswidget.h" +#include "inkedit.h" +#include "winkswidget.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef KMESSDEBUG_CHATWINDOW + #define KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES +#endif + +#define TYPING_NOTIFICATION_TIME 4000 + + + +// The constructor +ChatWindow::ChatWindow( QWidget *parent ) +: KXmlGuiWindow( parent ) +, Ui::ChatWindow() +, actionCollection_( actionCollection() ) +, blinkToUpper_( true ) +, currentAccount_( 0 ) +, doSendTypingMessages_( true ) +, indexSentences_( 0 ) +, initialized_( false ) +, zoomLevel_( 100 ) +{ + setObjectName( "ChatWindow#" ); + + // Create the interface + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setCentralWidget( mainWidget ); + +#if KMESS_ENABLE_INK == 0 + // Only enable the Ink button if GIFLib is available + inkButton_->hide(); + inkEdit_->setEnabled( false ); +#endif + + // 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 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 + chatTabs_->setHoverCloseButton( true ); + chatTabs_->setHoverCloseButtonDelayed( true ); +#endif + + // Create the status bar + statusLabel_ = new ChatStatusBar( this ); + statusBar()->addWidget( statusLabel_, 1 ); + + // 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 + connect( &blinkTimer_, SIGNAL( timeout() ), + this, SLOT ( slotBlinkCaption() ) ); + // Setup the status bar text timer + statusTimer_.setSingleShot( true ); + connect( &statusTimer_, SIGNAL( timeout() ), + this, SLOT ( showStatusMessage() ) ); +} + + + +// The destructor +ChatWindow::~ChatWindow() +{ + // Save the window properties + saveProperties(); + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "DESTROYED."; +#endif +} + + + +// Add a new chat tab +Chat *ChatWindow::addChatTab( Chat *newChat, bool foreground ) +{ + // Connect its main signals + connect( newChat, SIGNAL( chatInfoChanged() ), + this, SLOT ( slotUpdateChatInfo() ) ); + connect( newChat, SIGNAL( gotNudge() ), + this, SLOT ( slotGotNudge() ) ); + connect( newChat, SIGNAL( gotChatMessage(const ChatMessage&,Chat*) ), + this, SLOT ( slotGotChatMessage(const ChatMessage&,Chat*) ) ); + connect( newChat, SIGNAL( gotTypingMessage(Chat*) ), + this, SLOT ( slotGotTypingMessage(Chat*) ) ); + + // 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; +} + + + +// Set the zoom factor of the text +void ChatWindow::changeZoomFactor( bool increase ) +{ + int newZoom = zoomLevel_; + + 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; + } + + // Apply the zoom level to all chats + zoomLevel_ = newZoom; + + for( int i = 0; i < chatTabs_->count(); i++ ) + { + getChat( i )->setZoomFactor( zoomLevel_ ); + } +} + + + +// Check if the window must be closed +bool ChatWindow::checkAndCloseWindow() +{ + // Check how many chat are still opened + int chatsNumber = chatTabs_->count(); + if( chatsNumber > 0 ) + { + // 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() +{ + // Do not ask if there only is one tab, or if the user has + // explicitly requested all the tabs to be closed + if( chatTabs_->count() > 1 && sender() != closeAllAction_ ) + { + 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 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 + { + // Else close the current tab + closeTab(); + } +} + + + +// 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() +{ + // Get the cursor reference + QTextCursor cursor = messageEdit_->textCursor(); + + if( cursor.hasSelection() ) + { + messageEdit_->copy(); + } + else + + getCurrentChat()->editCopy(); +} + + + +// put the marked text/object into the clipboard and remove +// it from the document +void ChatWindow::editCut() +{ + // If another editor has focus, don't actually cut anything + if( ! messageEdit_->hasFocus() ) + { + return; + } + + messageEdit_->cut(); +} + + + +// Bring up a find dialog to search for text in the chat. +void ChatWindow::editFind() +{ + getCurrentChat()->slotFindChatText(); +} + + + +// Bring up a dialog to change the message font color. +void ChatWindow::editFont() +{ + QFont selection( currentAccount_->getFont() ); + + int result = KFontDialog::getFont( selection, KFontChooser::NoDisplayFlags, this ); + + if( result != KFontDialog::Accepted ) + { + return; + } + + currentAccount_->setFont( selection ); + + // Commit changes to disk, now + currentAccount_->saveProperties(); +} + + + +// Bring up a dialog to change the message font color. +void ChatWindow::editFontColor() +{ + 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 + const QString& fontColor( color.name() ); + // Set it to the stored account + currentAccount_->setFontColor(fontColor); + + // Commit changes to disk, now + currentAccount_->saveProperties(); + } +} + + + +// 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. + // UPDATE: Happens with Qt 4.5 too. Also resets the font weight. + 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() ) ); + messageEdit_->setFont( QFont ( currentAccount_->getFont() ) ); + } +} + + + +// paste the clipboard into the document +void ChatWindow::editPaste() +{ + // Regardless of focus, always paste in message edit. + messageEdit_->paste(); +} + + + +// Filter to catch window activation events +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() ) + { + // 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 ) + { + 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 ) + { + QStringList& quickRetypeList = getCurrentChat()->getQuickRetypeList(); + 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 ) + { + 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; + + default: + break; + } + + return false; +} + + + +/** + * @brief Return a reference to a chat + * + * When called without parameters, this method returns the active chat. + * If the given index is not valid, the current index is returned, too. + * + * @param index Number of the chat to retrieve, or nothing to get the currently active one. + * @return Chat * + */ +Chat *ChatWindow::getChat( int index ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( chatTabs_->count() > 0 ); +#endif + + if( index < 0 || index >= chatTabs_->count() ) + { + return getCurrentChat(); + } + + return qobject_cast( chatTabs_->widget( index ) ); +} + + + +// Return a reference to the active chat +Chat *ChatWindow::getCurrentChat() +{ + return qobject_cast( chatTabs_->currentWidget() ); +} + + + + +// Handle a text command (e.g. '/online') +bool ChatWindow::handleCommand( QString command ) +{ + if( command.isEmpty() ) + { + return true; + } + + // Parse arguments + QStringList arguments( command.split( " ", QString::SkipEmptyParts ) ); + if( arguments.isEmpty() ) + { + return true; + } + + command = arguments.takeFirst(); + + // Make it lower-case + command = command.toLower(); + + // 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.
" + "You can also use shortcuts like /online or /phone." ), + i18nc( "Dialog box caption for wrong command syntax warning", "Incorrect /status Syntax" ) + ); + return true; + } + + QString toStatus; + const QStringList& participants( getCurrentChat()->getParticipants() ); + + if( isStatusCommand ) + { + toStatus = arguments.takeFirst(); // we take the first, so we can get to the other arguments. + } + + // 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 cannot use the /block command in a group chat." ), + i18nc( "Caption when trying to block someone in a group chat", + "Cannot use /block command" ) + ); + return true; + } + getCurrentChat()->setContactBlocked( participants.first(), true ); + } + else if( command == "unblock" ) + { + if( participants.count() != 1 ) + { + KMessageBox::sorry( this, + i18n( "You cannot use the /unblock command in a group chat." ), + i18nc( "Caption when trying to unblock someone in a group chat", + "Cannot use /unblock command!" ) + ); + 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. + + if( command.contains( '/' ) ) + { + return 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; + } + + // Clear the message edit field, because the command was executed succesfully. + messageEdit_->clear(); + messageEdit_->setFocus(); + + return true; +} + + + +// Initialize the user interface +bool ChatWindow::initialize() +{ + if( initialized_ ) + { + kDebug() << "already initialized."; + return false; + } + + if( ! initializeCurrentAccount() ) + { + kDebug() << "Couldn't setup the current account."; + return false; + } + + // 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(); + + // 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; +} + + + +// Set up the current account +bool ChatWindow::initializeCurrentAccount() +{ +#ifdef KMESSTEST + KMESS_ASSERT( currentAccount_ == 0 ); +#endif + + currentAccount_ = CurrentAccount::instance(); + if ( currentAccount_ == 0 ) + { + kWarning() << "Could not get an instance of the current account."; + return false; + } + + // Set up some widgets based on account settings + 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; +} + + + +// Insert an emoticon into the message editor +void ChatWindow::insertEmoticon( const QString &shortcut ) +{ + // Insert the text at the cursor + messageEdit_->insertPlainText( shortcut ); + + // Switch to the message editor then + slotSwitchEditor(); +} + + + +// The window is closing, called by KMainWindow +bool ChatWindow::queryClose() +{ +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Closing all open chats"; +#endif + + return closeAllTabs(); +} + + + +// The application is exiting, called by KMainWindow +bool ChatWindow::queryExit() +{ +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Closing all open chats"; +#endif + + // Allow performing last operations to all open chats and delete them + for( int i = 0; i < chatTabs_->count(); i++ ) + { + Chat *chat = getChat( i ); + chat->queryExit(); + } + + // Clear the list of chat tabs + 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 presented in KMessApplication::slotLastWindowClosed() too. +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Accepting exit request."; +#endif + + return true; +} + + + +// Restore the window properties (called by KMainWindow) +void ChatWindow::readProperties(const KConfigGroup &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 + const QPoint pos( group.readEntry( "Position", QPoint() ) ); + if( ! pos.isNull() ) + { + move( pos ); + } + + // 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 minChatViewHeight = chatTabs_->minimumSize().height(); + splitter_->setSizes( group.readEntry( "MessageSplitterSizes", QList() << minChatViewHeight << 1 ) ); + + // Load the level of zoom + zoomLevel_ = group.readEntry( "CurrentZoom", 100 ); +} + + + +// Close a chat tab without user intervention +void ChatWindow::removeChatTab( Chat *chat ) +{ + chatTabs_->removeTab( chatTabs_->indexOf( chat ) ); +} + + + +// Save the chat according to the user's request +void ChatWindow::saveChat() +{ + getCurrentChat()->showSaveChatDialog(); +} + + + +// Save the window properties (called by KMainWindow) +void ChatWindow::saveProperties( KConfigGroup &config ) +{ + // The parameter is kept to mantain the same arguments as KMainWindow::saveProperties(). + Q_UNUSED( config ); + KConfigGroup group( KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatWindow" ) ); + + // 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() ) + { + 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 + { + // 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" ); + + // Send the message to the contact(s) + getCurrentChat()->sendChatMessage( text ); + + // 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 + QStringList &quickRetypeList = getCurrentChat()->getQuickRetypeList(); + 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 ) ); +} + + + +// Enable or disable the parts of the window which allow user interaction +void ChatWindow::setEnabled( bool isEnabled ) +{ + // Set the state of the main UI elements + customEmoticonsWidget_ ->setEnabled( isEnabled ); + standardEmoticonsWidget_->setEnabled( isEnabled ); + customEmoticonsDock_ ->setEnabled( isEnabled ); + standardEmoticonsDock_ ->setEnabled( isEnabled ); + + inkEdit_ ->setEnabled( isEnabled ); + messageEdit_ ->setEnabled( isEnabled ); + newLineButton_ ->setEnabled( isEnabled ); + sendButton_ ->setEnabled( isEnabled ); + standardEmoticonButton_ ->setEnabled( isEnabled ); + customEmoticonButton_ ->setEnabled( isEnabled ); + inviteButton_ ->setEnabled( isEnabled ); + textButton_ ->setEnabled( isEnabled ); + + + // Set the state of the extra contact actions + 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 ); + + // Update the winks and handwriting buttons + updateModeButtons(); + + // The window is being enabled back, replace some stuff which changes + // on every connection + if( isEnabled ) + { + // Re-read the current account pointer + // because it likely is a different one + currentAccount_ = CurrentAccount::instance(); + } +} + + + +// Enable or disable the parts of the window which allow user interaction +void ChatWindow::setUIState( UIState state ) +{ + switch( state) + { + 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; + } +} + + + +// Change the caption of the chat window +void ChatWindow::setWindowTitle( const QString &caption ) +{ + // 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(); + } + 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 ); +} + + + +// Show a status message for some seconds in the status dialog +void ChatWindow::showStatusMessage( QString message, int duration ) +{ + // Avoid newlines which cause problems to the UI layout. + message = message.replace( "\n", " " ); + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Showing status bar text" << message << "with duration" << duration; +#endif + + // 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(); + + // Non-expiring messages do not trigger the timer + if( duration <= 0 || message.isEmpty() ) + { + return; + } + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Setting status bar update timer to" << duration << "sec."; +#endif + statusTimer_.start( duration * 1000 ); +} + + + +// Make the caption blink if the window still doesn't have focus +void ChatWindow::slotBlinkCaption() +{ + // 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 ); +} + + + +// A message has been received +void ChatWindow::slotGotChatMessage( const ChatMessage &message, Chat *chat ) +{ + Q_UNUSED( message ); + + // Display an highlighted tab title + if( chat != getCurrentChat() ) + { + // 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 + if( isActiveWindow() ) + { + return; + } + + // Start blinking the caption + blinkTimer_.start( 1500 ); +} + + + +// A nudge has been received: shake the window. +void ChatWindow::slotGotNudge() +{ + if( ! currentAccount_->getShakeNudge() ) + { + return; + } + + + // avoid shaking again in a short period. + if( lastShake_.secsTo( QTime::currentTime() ) < 15 ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Not shaking the window until" + << lastShake_.secsTo( QTime::currentTime() ) << "more seconds."; +#endif + return; + } + lastShake_ = QTime::currentTime(); + + QTime t; + int xp = x(); + int yp = y(); + + t.start(); + + // Code example from: http://ariya.blogspot.com/2005/12/buzz-or-shake-my-window.html + + // Shake the window. + for ( int i = 16; i > 0; ) + { + kapp->processEvents(); + + if ( t.elapsed() >= 50 ) + { + int delta = i >> 2; + int dir = i & 3; + int dx = (dir == 1 || dir == 2) ? delta : -delta; + int dy = (dir < 2) ? delta : -delta; + + move( xp+dx, yp+dy ); + t.restart(); + i--; + } + } + + // Move to start again + move( xp, yp ); +} + + + +// Update the contact typing messages in the status bar +void ChatWindow::slotGotTypingMessage( Chat *chat ) +{ + // Get the active chat if called with no or invalid parameters + if( chat == 0 ) + { + chat = getCurrentChat(); +#ifdef KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES + kDebug() << "Using current chat" << chat; +#endif + } +#ifdef KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES + else + { + kDebug() << "Using chat:" << chat; + } +#endif + + 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 the color is red, leave it + if( chatTabs_->tabTextColor( tabIndex ) != QColor( "red" ) ) + { + 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 + // the status bar processing altogether + if( chat != getCurrentChat() ) + { +#ifdef KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES + kDebug() << "Typing message was not for the active chat, skipping status bar update."; +#endif + return; + } + + // If no one is typing anymore, clean up the status bar + if( typingContacts.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES + kDebug() << "No contacts are typing anymore, cleaning up the status bar."; +#endif + showStatusMessage(); + return; + } + + QString statusString; + + // Decide what string will be used depending on how many contacts are typing + if( typingContacts.count() == 1 ) + { + const QString& first( typingContacts.first() ); + statusString = i18n( "%1 is typing...", first ); + } + else + { + int count = typingContacts.count() - 2; + const QString& first ( typingContacts[0] ); + const QString& second ( typingContacts[1] ); + + if( count == 0 ) + { + statusString = i18n( "%1 and %2 are typing...", first, second ); + } + else + { + statusString = i18n( "%1, %2 and %3 others are typing...", first, second, count ); + } + } + + // 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 ); +} + + + +// Invite button was pressed +void ChatWindow::slotInviteContact() +{ + // 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() ) + { + 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" ) + { + return; + } + + // If a command is being typed, don't send a typing message + if( messageEdit_->toPlainText().left( 1 ) == "/" and messageEdit_->toPlainText().left( 2 ) != "//" ) + { + return; + } + } + + // 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() ) + { + sendInk(); + inkEdit_->inkFrame_->setFocus(); + } + else if( winksButton_->isChecked() ) + { + const MsnObject &msnObject = winksWidget_->getMsnObjectWinkSelected(); + if( msnObject.isValid() ) + { + getCurrentChat()->sendWink( msnObject ); + } + } + else + { + 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_ ) ); + updateModeButtons(); + 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 ); + + // Reset quick re-type index + indexSentences_ = chat->getQuickRetypeList().size(); + + // Set the font style/color + updateEditorFont(); + + // Update the window UI with this chat's details + slotSwitchEditor(); + setWindowTitle(); + updateModeButtons(); + 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.replace( '&', "&&" ) ); + 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( "
  • " ), + chat->getStartTime().toString( Qt::DefaultLocaleLongDate ), + currentAccount_->getHandle() ) ); + + chatTabs_->setTabToolTip( index, toolTip ); + + // If it is the current one, the UI must be updated + if ( chat == getCurrentChat() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Source chat is the current one, updating UI."; +#endif + + // Update the window title + setWindowTitle(); + // Update the status of the writing mode buttons (winks, handwriting,...) + // This is needed in case the contact has changed status + updateModeButtons(); + } +} + + + +// 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 status of the tiny writing mode buttons +void ChatWindow::updateModeButtons() +{ + // don't do anything when the window / chat was just closed + if( getCurrentChat() == NULL ) + { + return; + } + +#if KMESS_ENABLE_INK == 1 + bool enableInkButton = true; +#else + bool enableInkButton = false; +#endif + + bool enableWinksButton = true; + + const QStringList &participants( getCurrentChat()->getParticipants() ); + foreach( const QString &handle, participants ) + { + const ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + continue; + } + +#if KMESS_ENABLE_INK == 1 + if( enableInkButton ) + { + // Disable the Ink button if the contact doesn't support GIF Ink + if( ! contact->hasCapability( ContactBase::MSN_CAP_INK_GIF ) ) + { + enableInkButton = false; + } + + // TODO Fix sending Ink to WLM 8.5 and 2009 (probably by implementing ISF support) + // Disable the Ink button also if we're chatting with an ISF-enabled WLM8.5 / WLM2009 + if( ( contact->getClientName() == "Windows Live Messenger 8.5" + || contact->getClientName() == "Windows Live Messenger 2009" ) + && contact->hasCapability( ContactBase::MSN_CAP_INK_ISF ) ) + { + enableInkButton = false; + } + } +#endif + + // Disable the Winks button if the contact doesn't support Winks + if( enableWinksButton + && ! contact->hasCapability( (ContactBase::MsnClientCapabilities) ( ContactBase::MSN_CAP_WINKS | ContactBase::MSN_CAP_MULTI_PACKET ) ) ) + { + enableWinksButton = false; + } + } + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Winks/Ink button disabling check: all contacts support winks?" << enableWinksButton + << "and ink?" << enableInkButton; +#endif + + inkButton_ ->setEnabled( enableInkButton ); + winksButton_->setEnabled( enableWinksButton ); + + // Set a tooltip or a status bar message to either buttons. + // The tooltip covers the status message otherwise. + +#if KMESS_ENABLE_INK == 1 // else, the ink button isn't showed anyway + if( enableInkButton ) + { + inkButton_->setToolTip ( i18n( "Handwriting mode" ) ); + inkButton_->setStatusTip( QString() ); + } + else + { + inkButton_->setToolTip ( QString() ); + if( getCurrentChat()->getParticipants().count() > 1 ) + { + inkButton_->setStatusTip( i18nc( "Label text", + "Handwriting is disabled: KMess cannot send drawings to " + "some of the contacts." ) ); + } + else + { + inkButton_->setStatusTip( i18nc( "Label text", + "Handwriting is disabled: KMess cannot send drawings to " + "this contact." ) ); + } + } +#endif + + if( enableWinksButton ) + { + winksButton_->setToolTip ( i18n( "Winks" ) ); + winksButton_->setStatusTip( QString() ); + } + else + { + winksButton_->setToolTip ( QString() ); + if( getCurrentChat()->getParticipants().count() > 1 ) + { + winksButton_->setStatusTip( i18nc( "Label text", + "Winks are disabled: KMess cannot send winks to " + "some of the contacts." ) ); + } + else + { + winksButton_->setStatusTip( i18nc( "Label text", + "Winks are disabled: KMess cannot send winks to " + "this contact." ) ); + } + } +} + + + +// 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 new file mode 100644 index 0000000..83b606d --- /dev/null +++ b/src/chat/chatwindow.h @@ -0,0 +1,298 @@ +/*************************************************************************** + chatwindow.h - description + ------------------- + begin : Tue Apr 23 2002 + copyright : (C) 2002 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 CHATWINDOW_H +#define CHATWINDOW_H + +#include "ui_chatwindow.h" +#include "chatstatusbar.h" + +#include +#include + +#include +#include +#include +#include + + +// forward declarations +class Chat; +class ChatMessage; +class ChatView; +class CurrentAccount; +class EmoticonsWidget; +class MsnSwitchboardConnection; + +class QLabel; + +class KActionMenu; +class KConfigGroup; +class KHelpMenu; +class KMenu; +class KTabBar; +class KToolBarButton; +class KToolBarPopupAction; + + + +/** + * The interface for the chat window, defining the menus. + * + * @author Mike K. Bennett + * @ingroup Chat + */ +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 ); + // The destructor + virtual ~ChatWindow(); + // Add a new chat tab + 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(); + // Initialize the object + bool initialize(); + // 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 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 + // 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 ); + // Set up the preferences which depend on the current account + bool initializeCurrentAccount(); + // Create the menus. + void createMenus(); + // Restore the window properties (called by KMainWindow) + void readProperties( const KConfigGroup &config = *((const KConfigGroup *)0) ); + // 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 temporarily in the status dialog + void showStatusMessage( QString message = QString(), int duration = 5 ); + + private slots: // Private slots + // 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(); + // 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(); + // 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() ); + // "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 ); + // 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 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 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 session messages" action is called. + void toggleSessionInfo( bool showSessionMessages ); + // Called when the "use spell checking" action is called. + void toggleSpellCheck( bool useSpellCheck ); + // Update the status of the tiny writing mode buttons + void updateModeButtons(); + // 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. + QTimer blinkTimer_; + // Whether to blink to upper (true) or lower (false) case + bool blinkToUpper_; + // The stored window caption + QString caption_; + // 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_; + // Custom emoticons Dock Widget + QDockWidget *customEmoticonsDock_; + // Action to cut text to the clipboard + KAction *cutAction_; + // 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_; + // Index for quick-retype + int indexSentences_; + // Whether or not the object was initialized + bool initialized_; + // The contact invite action + 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_; + // Action to switch to the previous tab + KAction *prevTabAction_; + // Action to start a file transfer + KAction *sendAction_; + // 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 + ChatStatusBar *statusLabel_; + // A timer to time the duration that a status message is shown + QTimer statusTimer_; + // 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 ); + // Reconnect + void reconnect(); + // Signal that the user is typing + void userIsTyping(); +}; +#endif diff --git a/src/chat/chatwindow.ui b/src/chat/chatwindow.ui new file mode 100644 index 0000000..4398f3f --- /dev/null +++ b/src/chat/chatwindow.ui @@ -0,0 +1,388 @@ + + + ChatWindow + + + + 0 + 0 + 463 + 391 + + + + + 0 + + + 0 + + + + + Qt::Vertical + + + 4 + + + false + + + + + 0 + 100 + + + + + 150 + 100 + + + + QTabWidget::pane { border: 0px solid transparent; padding: 0; } + + + Qt::ElideRight + + + false + + + true + + + true + + + + + + 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 the standard text mode. + + + + + + true + + + true + + + + + + + Qt::NoFocus + + + Handwriting mode + + + Click this button to switch to the handwriting mode, so you can write or paint a handwritten message. + + + + + + true + + + + + + + Qt::Vertical + + + + + + + Qt::NoFocus + + + Standard emoticons + + + Click this button to show all default Live Messenger emoticons, so you can easily insert them in your messages. + + + + + + true + + + + + + + Qt::NoFocus + + + Custom emoticons + + + Click this button to show all custom emoticons, 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/contactframe.cpp b/src/chat/contactframe.cpp new file mode 100644 index 0000000..dc0e4ff --- /dev/null +++ b/src/chat/contactframe.cpp @@ -0,0 +1,813 @@ +/*************************************************************************** + contactframe.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 "contactframe.h" + +#include "../contact/contact.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" + +// HACK: Must go after 2.0-final +#include "../network/msnnotificationconnection.h" +#include "../kmess.h" +#include "../kmessapplication.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +// Time in milliseconds before the glowing done for a typing user fades away +#define GLOWING_PICTURE_TIMEOUT 5000 + + + +// The constructor +ContactFrame::ContactFrame( QWidget *parent ) + : QWidget(parent) + , Ui::ContactFrame() + , contact_(0) + , contactActionPopup_(0) + , contactPixmapLabelEnabled_(true) + , contactPropertiesDialog_(0) + , detailedContact_(0) + , handle_(QString::null) + , currentMode_(ModeNormal) + , infoLabelEnabled_(true) + , locked_(true) +{ + // Setup the UI as first thing + setupUi( this ); + layout()->setAlignment( Qt::AlignTop | Qt::AlignLeft ); + + // Just for show + const QPixmap& pixmap( KGlobal::dirs()->findResource( "data", "kmess/pics/unknown.png" ) ); + contactPixmapLabel_->setPixmap( pixmap ); + + 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() ) ); +} + + + +ContactFrame::~ContactFrame() +{ + qDeleteAll( copyLinkActionsList_ ); +} + + + +// Activate the frame by giving it a contact +void ContactFrame::activate( ContactBase *contact ) +{ + // Disconnect the signals linked to previous contact( if there is anyone ) + if ( contact_ != 0 ) + { + disconnect( contact_, 0, this, 0 ); + } + + if( contact == 0 ) + { +#ifdef KMESSDEBUG_CONTACTFRAME + kDebug() << "Deactivating frame for contact:" << handle_; +#endif + + contact_ = 0; + detailedContact_ = 0; + locked_ = true; + + qDeleteAll( copyLinkActionsList_ ); + copyLinkActionsList_.clear(); + } + else + { + contact_ = contact; + handle_ = contact_->getHandle(); + detailedContact_ = CurrentAccount::instance()->getContactList()->getContactByHandle( handle_ ); + + if( detailedContact_ != 0 ) + { + // Connect the contact, to update the frame on presence info changes + connect( detailedContact_, SIGNAL( changedList(Contact*) ), + this, SLOT ( contactChangedList() ) ); + 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*) ) ); + } + } + + // Activate the right-click context menu + initContactPopup(); + + // And prepare the widgets + updatePicture(); + updateStatusWidgets(); + + locked_ = false; + + show(); +} + + + +// Allow this contact to see our MSN status +void ContactFrame::allowContact() +{ + if( detailedContact_ == 0 ) + { + return; + } + + emit contactAllowed( handle_ ); + + locked_ = true; +} + + + +// Foward the changed list signal from contact +void ContactFrame::contactChangedList() +{ + locked_ = false; + updateStatusWidgets(); +} + + + +// The contact was destroyed +void ContactFrame::contactDestroyed( QObject *object ) +{ + // This method is relevant for invited contacts, the following happens: + // - an InvitedContact leaves the chat, SB notifies + // - ContactFrame::setDisplayMode() will be called, and updates the widgets. + // - CurrentAccount deletes the InvitedContact object. + // - somehow a code paths leads to this class (Chat::setSwitchboardConnection(0) is already patched). + // - crash. + +#ifdef KMESSDEBUG_CONTACTFRAME + if( contact_ && contact_ != object ) + { + kWarning() << "Received unexpected contact reference to" << object->metaObject()->className(); + } + else + { + kDebug() << "Resetting contact reference."; + } +#else + Q_UNUSED( object ); +#endif + + contact_ = 0; + detailedContact_ = 0; +} + + + +// Copy some details of the contact to the clipboard. +// Only one method is used to copy all different details, and that's to avoid having three identical methods which only copy different +// text bits on the clipboard. +void ContactFrame::copyText() +{ + // Get the signal sender to find out who called us + KAction *action = static_cast( const_cast( sender() ) ); + if(KMESS_NULL(action)) return; + + if( action == popupCopyFriendlyName_ ) + { + kapp->clipboard()->setText( contact_->getFriendlyName( STRING_CLEANED ) ); + } + else if( action == popupCopyHandle_ ) + { + kapp->clipboard()->setText( handle_ ); + } + else if( action == popupCopyPersonalMessage_ && detailedContact_ != 0 ) + { + kapp->clipboard()->setText( detailedContact_->getPersonalMessage( STRING_CLEANED ) ); + } + else if( action == popupCopyMusic_ && detailedContact_ != 0 ) + { + kapp->clipboard()->setText( detailedContact_->getCurrentMediaString() ); + } + else if( detailedContact_ != 0 ) + { + // Copy the link from PM or Friendly Name + kapp->clipboard()->setText( action->toolTip() ); + } +} + + + +// The personal status message received an event. +bool ContactFrame::eventFilter( QObject *obj, QEvent *event ) +{ + 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. + } + + const QMouseEvent *mouseEvent = static_cast( event ); + + // Show the menu regardlessly of where the mouse button has been pressed + showContactPopup( mouseEvent->globalPos() ); + + return false; // don't stop processing. +} + + + +// Return the handle of this frame's contact +const QString& ContactFrame::getHandle() const +{ + return handle_; +} + + + +// Initialize the contact popup +bool ContactFrame::initContactPopup() +{ + // Check if there is a valid contact_ and if contact action menu was already initialized + if( contact_ == 0 || contactActionPopup_ != 0 ) + { + return false; + } + + // Initialize context popup actions + 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 ); + popupContactProperties_ = new KAction( KIcon("user-properties"), i18n("&Properties"), this ); + + popupAddContact_ = new KAction( KIcon("list-add"), i18n("&Add Contact"), this ); + popupAllowContact_ = new KAction( KIcon("dialog-ok-apply"), i18n("A&llow Contact"), this ); + popupRemoveContact_ = new KAction( KIcon("list-remove-user"), i18n("&Delete Contact"), this ); + + popupBlockContact_ = new KAction( KIcon("dialog-cancel"), i18n("&Block Contact"), this ); + popupUnblockContact_ = new KAction( KIcon("dialog-ok"), i18n("&Unblock Contact"), 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("Song &Name"), this ); + + popupPropGeneral_ = new KAction( KIcon("user-properties"), i18n("&Information"), this ); + popupPropImages_ = new KAction( KIcon("draw-brush"), i18n("Display Pictures"), this ); + popupPropNotes_ = new KAction( KIcon("document-edit"), i18n("&Notes"), this ); + popupPropEmoticons_ = new KAction( KIcon("face-smile"), i18n("&Emoticons"), this ); + + + // 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( showContactProperties() ) ); + //connect( popupContactProperties_, SIGNAL(triggered(bool)), this, SLOT( showContactProperties() ) ); + + connect( popupAddContact_, SIGNAL(triggered(bool)), this, SLOT( toggleContactAdded() ) ); + connect( popupAllowContact_, SIGNAL(triggered(bool)), this, SLOT( allowContact() ) ); + connect( popupRemoveContact_, SIGNAL(triggered(bool)), this, SLOT( toggleContactAdded() ) ); + + connect( popupBlockContact_, SIGNAL(triggered(bool)), this, SLOT( toggleContactBlocked() ) ); + connect( popupUnblockContact_, SIGNAL(triggered(bool)), this, SLOT( toggleContactBlocked() ) ); + + connect( popupCopyFriendlyName_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + connect( popupCopyPersonalMessage_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + connect( popupCopyHandle_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + connect( popupCopyMusic_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + + connect( popupPropGeneral_, SIGNAL(triggered(bool)), this, SLOT( showContactProperties() ) ); + connect( popupPropImages_, SIGNAL(triggered(bool)), this, SLOT( showContactProperties() ) ); + connect( popupPropNotes_, SIGNAL(triggered(bool)), this, SLOT( showContactProperties() ) ); + connect( popupPropEmoticons_, SIGNAL(triggered(bool)), this, SLOT( showContactProperties() ) ); + + // Initialize sub popups + popupCopyMenu_ = new KActionMenu( i18n("&Copy"), this ); + popupCopyMenu_ ->addAction( popupCopyFriendlyName_ ); + popupCopyMenu_ ->addAction( popupCopyPersonalMessage_ ); + popupCopyMenu_ ->addAction( popupCopyHandle_ ); + popupCopyMenu_ ->addAction( popupCopyMusic_ ); + popupCopyMenu_ ->addSeparator(); + + popupPropMenu_ = new KActionMenu( i18n("&Properties"), this ); + popupPropMenu_ ->addAction( popupPropGeneral_ ); + popupPropMenu_ ->addAction( popupPropImages_ ); + popupPropMenu_ ->addAction( popupPropNotes_ ); + popupPropMenu_ ->addAction( popupPropEmoticons_ ); + + // 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_ ); + //contactActionPopup_->addAction( popupEditNotes_ ); + contactActionPopup_->addSeparator(); + + contactActionPopup_->addAction( popupAddContact_ ); + contactActionPopup_->addAction( popupAllowContact_ ); + + contactActionPopup_->addAction( popupBlockContact_ ); + contactActionPopup_->addAction( popupUnblockContact_ ); + + contactActionPopup_->addAction( popupRemoveContact_ ); + + contactActionPopup_->addSeparator(); + + contactActionPopup_->addAction( popupPropMenu_ ); + + return true; +} + + + +// The user received a message from this contact +void ContactFrame::messageReceived() +{ + // Stop the "user is typing" glow + typingTimer_.stop(); + stopTyping(); +} + + + +// Email the contact +void ContactFrame::sendEmail() +{ + if ( contact_ != 0 ) + { + CurrentAccount::instance()->openMailAtCompose( handle_ ); + } +} + + + +// Change the display mode of the frame when the contact leaves the chat or there are many active contacts +void ContactFrame::setDisplayMode( DisplayMode mode ) +{ + if( currentMode_ == mode ) + { + return; + } + + // Save the new current mode to avoid useless updates + currentMode_ = mode; + +#ifdef KMESSDEBUG_CONTACTFRAME + kDebug() << "Frame mode:" << mode; +#endif + + // Change the displayed widgets + switch( mode ) + { + case ModeSingle: + popupStartPrivateChat_->setVisible( false ); + contactPixmapLabelEnabled_ = true; + infoLabelEnabled_ = true; + break; + + 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(); +} + + + +// 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 isAllowed = false; + bool isBlocked = false; + bool hasPersonalMessage = false; + bool hasMediaMessage = false; + + // If detailed contact information is available + if( detailedContact_ != 0 ) + { + // We have the contact already in our list, but is possible to block/allow/unblock it + isAdded = detailedContact_->isFriend(); + isAllowed = detailedContact_->isAllowed(); + isBlocked = detailedContact_->isBlocked(); + + hasPersonalMessage = ! detailedContact_->getPersonalMessage().isEmpty(); + hasMediaMessage = ! detailedContact_->getCurrentMediaString().isEmpty(); + + // Search for links + 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_ ); + } + } + + //popupEditNotes_ ->setVisible( detailedContact_ != 0 ); + popupContactProperties_ ->setVisible( detailedContact_ != 0 ); + popupMsnProfile_ ->setVisible( detailedContact_ != 0 ); + + popupAllowContact_ ->setVisible( ! isAllowed && ! isAdded && detailedContact_ != 0 ); + popupCopyPersonalMessage_->setVisible( hasPersonalMessage ); + popupCopyMusic_ ->setVisible( hasMediaMessage ); + + popupAddContact_ ->setVisible( ! locked_ && ! isAdded ); + popupRemoveContact_ ->setVisible( ! locked_ && isAdded ); + + popupBlockContact_ ->setVisible( ! locked_ && ! isBlocked && detailedContact_ != 0 ); + popupUnblockContact_ ->setVisible( ! locked_ && isBlocked ); + + contactActionPopup_->popup( point ); +} + + + +// Show the contact properties window +void ContactFrame::showContactProperties() +{ + // Check if there are details for contact + if( detailedContact_ != 0 && detailedContact_->getExtension() != 0 ) + { + // Default is not to open notes tab + ContactPropertiesDialog::DefaultTab defaultTab = ContactPropertiesDialog::Information; + + // If we've been called via the edit notes action, open that tab + if( sender() == popupEditNotes_ ) + { + defaultTab = ContactPropertiesDialog::Notes; + } + else if( sender() == popupPropImages_ ) + { + defaultTab = ContactPropertiesDialog::Images; + } + else if( sender() == popupPropEmoticons_ ) + { + defaultTab = ContactPropertiesDialog::Emoticons; + } + else if( sender() == popupPropImages_ ) + { + defaultTab = ContactPropertiesDialog::Images; + } + else if( sender() == popupPropNotes_ ) + { + defaultTab = ContactPropertiesDialog::Notes; + } + + // the qlistwidget in the dialog doesn't seem to handle being reopened from + // a saved instance (unknown why). it causes display issues (i.e., displays the same + // groups multiple times or doesn't display them at all). This resolves the problem. + ContactPropertiesDialog *dialog = new ContactPropertiesDialog(this); + + KMess *kmess = static_cast( kapp )->getContactListWindow(); + + // HACK: MUST GO AFTER 2.0-final!! + connect( dialog, SIGNAL(addContactToGroup(QString, QString)), + kmess->getNsConnection(), SLOT( addContactToGroup(QString, QString) ) ); + + connect( dialog, SIGNAL(removeContactFromGroup(QString, QString)), + kmess->getNsConnection(), SLOT( removeContactFromGroup(QString, QString) ) ); + + dialog->launch( detailedContact_, defaultTab ); + + delete dialog; + } +} + + + +// Show the contact's profile +void ContactFrame::showProfile() +{ + if( contact_ == 0 ) + { + return; + } + + // Create a URL to the msn profile page, localized with our system's locale. + const KUrl url( "http://members.msn.com/default.msnw?mem=" + handle_ + "&mkt=" + KGlobal::locale()->language() ); + + // Launch the browser for the given URL + KMessShared::openBrowser( url ); +} + + + +// Request to start private chat +void ContactFrame::slotStartPrivateChat() +{ + emit startPrivateChat( handle_ ); +} + + + +// Receive notice that the contact is typing +void ContactFrame::startTyping() +{ + contactPixmapLabel_->setPixmap( contactTypingPicture_ ); + + // Make the contact picture glow + // Start the timer to disable the label + typingTimer_.start( GLOWING_PICTURE_TIMEOUT ); +} + + + +// Disable the typing label when the timer has timed out +void ContactFrame::stopTyping() +{ + contactPixmapLabel_->setPixmap( contactPicture_ ); +} + + + +// Add or remove the contact from the contact list +void ContactFrame::toggleContactAdded() +{ + if( detailedContact_ == 0 ) + { + emit contactAdded( handle_, true ); + } + else + { + emit contactAdded( handle_, ! detailedContact_->isFriend() ); + } + + // Disallow adding unknown contacts more than once + locked_ = true; +} + + + +// Change the contact's blocked/unblocked status +void ContactFrame::toggleContactBlocked() +{ + if( detailedContact_ == 0 ) + { + emit contactBlocked( handle_, true ); + } + else + { + emit contactBlocked( handle_, ! detailedContact_->isBlocked() ); + } + + // Disallow adding unknown contacts more than once + locked_ = true; +} + + + +// Update the contact picture +void ContactFrame::updatePicture() +{ + if ( contact_ == 0 ) + { + return; + } + + // See if the contact picture is not updated. Avoids GUI flashing on older boxes + const QString& contactPicturePath( contact_->getContactPicturePath() ); + const QFileInfo& contactPictureInfo( contactPicturePath ); + const QDateTime& contactPictureDate( contactPictureInfo.lastModified() ); + + if( contactPicturePath == contactPicturePath_ + && contactPictureDate == contactPictureDate_ ) + { +#ifdef KMESSDEBUG_CONTACTFRAME + kDebug() << "Picture was already loaded."; +#endif + return; + } + +#ifdef KMESSDEBUG_CONTACTFRAME + kDebug() << "New contact picture:" << contactPicturePath; +#endif + + QImage contactImage( contactPicturePath ); + bool loaded = ! contactImage.isNull(); + if( loaded ) + { + // Loaded + contactPicturePath_ = contactPicturePath; + contactPictureDate_ = contactPictureDate; + } + else + { + // Not loaded (PNG error?). load default if custom image could not be loaded + loaded = contactImage.load( contact_->getContactDefaultPicturePath() ); + + if( ! loaded ) + { + return; + } + } + + // Setup the normal and typing pixmaps + contactPicture_ = QPixmap::fromImage( contactImage ); + KIconEffect::toGamma( contactImage, 0.8f ); + contactTypingPicture_ = QPixmap::fromImage( contactImage ); + + // Display the image + contactPixmapLabel_->setPixmap( contactPicture_ ); + contactPixmapLabel_->setMinimumSize( contactImage.width(), contactImage.height() ); +} + + + +// Update the status widgets +void ContactFrame::updateStatusWidgets() +{ + if( contact_ == 0 ) + { + return; + } + + QString label, statusIdentifier; + const Status status( contact_->getStatus() ); + Flags flags = FlagNone; + + if( detailedContact_ != 0 && detailedContact_->isBlocked()) + { + // Show blocked regardless of status + statusIdentifier = i18n( "Blocked" ); + flags = FlagBlocked; + } + else + { + statusIdentifier = MsnStatus::getName( status ); + } + + 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 Live Messenger status, like 'Online'", + "The contact is %1", + statusIdentifier ) ); + statusPixmapLabel_->setPixmap( MsnStatus::getIcon( status, flags ) ); + + // Update the informative label + if( detailedContact_ && infoLabelEnabled_ ) + { + const QString& mediaString( detailedContact_->getCurrentMediaString() ); + const QString& messageString( detailedContact_->getPersonalMessage( STRING_CHAT_SETTING_ESCAPED ) ); + if( ! mediaString.isEmpty() ) + { + // 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 + { + infoLabel_->setVisible( false ); + } + } + else + { + infoLabel_->setVisible( false ); + } + + contactPixmapLabel_->setVisible( contactPixmapLabelEnabled_ ); +} + + + +#include "contactframe.moc" diff --git a/kmess/chat/contactframe.h b/src/chat/contactframe.h similarity index 59% rename from kmess/chat/contactframe.h rename to src/chat/contactframe.h index 9c10da6..0e8e3d4 100644 --- a/kmess/chat/contactframe.h +++ b/src/chat/contactframe.h @@ -18,70 +18,89 @@ #ifndef CONTACTFRAME_H #define CONTACTFRAME_H -#include -#include -#include -#include +#include "ui_contactframe.h" + +#include +#include -#include "contactframeinterface.h" // Forward declarations class Contact; class ContactBase; +class ContactPropertiesDialog; class CurrentAccount; class KAction; class KActionMenu; -class KPopupMenu; +class KMenu; -/**The frame displaying contact information. - *@author Mike K. Bennett - */ -class ContactFrame : public ContactFrameInterface + +/** + * The frame displaying contact information. + * + * @author Mike K. Bennett + * @ingroup Chat + */ +class ContactFrame : public QWidget, private Ui::ContactFrame { Q_OBJECT + public: // Public enumerations + + // Contact frame display modes + enum DisplayMode + { + 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, const char *name=0); + ContactFrame(QWidget *parent=0); // The destructor - ~ContactFrame(); + ~ContactFrame(); // Activate the frame by giving it a contact - void activate(ContactBase *contact); - // Deactivate (grey-out) the frame when a contact leaves the chat - void deactivate(); - // Reactivate the frame when a contact rejoins the chat - void reactivate(); + void activate( ContactBase *contact ); // Return the handle of this frame's contact - QString getHandle() const; + const QString& getHandle() const; // Initialize the contact popup bool initContactPopup(); - // Whether or not the frame has been activated - bool isActivated() const; // The user received a message from this contact 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(); private: // Private methods - // Set whether or not the widgets are enabled or disabled - void enableWidgets(bool doEnable); // The personal status message received an event. bool eventFilter( QObject *obj, QEvent *event ); - // Update all the widgets based on the given contact - void updateWidgets(); private slots: // Private slots // Allow this contact to see our MSN status void allowContact(); + // Foward the changed list signal from contact + void contactChangedList(); + // The contact was destroyed + void contactDestroyed( QObject *object ); // Copy some details of the contact to the clipboard void copyText(); // Email the contact void sendEmail(); // Update and show the contact popup menu void showContactPopup( const QPoint &point ); + // Show the contact properties window + void showContactProperties(); // 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 @@ -94,31 +113,43 @@ class ContactFrame : public ContactFrameInterface void updateStatusWidgets(); private: // Private attributes - // Whether or not the frame has been activated - bool activated_; // The contact whom the frame represents ContactBase *contact_; // The menu of actions possible to perform on a given contact - KPopupMenu *contactActionPopup_; + KMenu *contactActionPopup_; // The contact's image QPixmap contactPicture_; // The contact picture date 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_; - // The defailed contact information, if available + // 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 KAction *popupAllowContact_; // Contact popup KAction to block the contact KAction *popupBlockContact_; - // Contact popup menu to show the friendly name/personal message copying options + // Contact popup menu to show the contact's properties window + KAction *popupContactProperties_; + // Contact popup menu to show the friendly name/personal message/media copying options KActionMenu *popupCopyMenu_; // Contact popup KAction to copy the contact's friendly name to clipboard KAction *popupCopyFriendlyName_; @@ -126,24 +157,40 @@ class ContactFrame : public ContactFrameInterface KAction *popupCopyPersonalMessage_; // Contact popup KAction to copy the contact's email address to clipboard KAction *popupCopyHandle_; + // Contact popup KAction to copy links from pm and friendly name + KAction *popupCopyLink_; + // Contact popup KAction to copy contact's media message + KAction *popupCopyMusic_; + // Contact popup KAction to edit notes + KAction *popupEditNotes_; // Contact popup KAction to send an email to the contact KAction *popupEmailContact_; // Contact popup KAction to show the contact's profile 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_; + // popup actions for the properties menu + KActionMenu *popupPropMenu_; + KAction *popupPropGeneral_; + KAction *popupPropImages_; + KAction *popupPropNotes_; + KAction *popupPropEmoticons_; // A timer to time the duration that the typing label is shown QTimer typingTimer_; 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 new file mode 100644 index 0000000..e6078c5 --- /dev/null +++ b/src/chat/contactframe.ui @@ -0,0 +1,169 @@ + + ContactFrame + + + + 0 + 0 + 112 + 149 + + + + + 1 + + + 4 + + + 0 + + + 12 + + + 0 + + + + + 0 + + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 20 + 20 + + + + false + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + Qt::RichText + + + + + + + + + + 0 + 0 + + + + + 9 + true + + + + Qt::RichText + + + + + + + true + + + + 0 + 0 + + + + + 96 + 96 + + + + + 96 + 96 + + + + PointingHandCursor + + + Qt::ClickFocus + + + Click here to display the menu for this contact + + + QFrame::StyledPanel + + + QFrame::Sunken + + + Qt::PlainText + + + true + + + Qt::NoTextInteraction + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 12 + 12 + + + + + + + + qPixmapFromMimeSource + + + diff --git a/src/chat/contactswidget.cpp b/src/chat/contactswidget.cpp new file mode 100644 index 0000000..6a7ad73 --- /dev/null +++ b/src/chat/contactswidget.cpp @@ -0,0 +1,492 @@ +/*************************************************************************** + 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 "../network/msnswitchboardconnection.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 + ContactFrame *contactFrame = getContactFrameByHandle( contact->getHandle() ); + if ( contactFrame != 0 ) + { + contactFrame->activate( contact ); + } +} + + + +// 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 = createContactFrame(); + 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 + ContactFrame *contactFrame = getContactFrameByHandle( contact->getHandle() ); + if ( contactFrame != 0 ) + { + contactFrame->activate( 0 ); + } +} + + + +// 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 one new contact frame +ContactFrame* ContactsWidget::createContactFrame() +{ + ContactFrame *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 = 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/contactswidget.h b/src/chat/contactswidget.h new file mode 100644 index 0000000..6ed53fb --- /dev/null +++ b/src/chat/contactswidget.h @@ -0,0 +1,109 @@ +/*************************************************************************** + contactswidget.h - 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. * + * * + ***************************************************************************/ + +#ifndef CONTACTSWIDGET_H +#define CONTACTSWIDGET_H + +#include "contactframe.h" + +#include "ui_contactswidget.h" + +#include +#include + + +// Forward declarations +class ContactBase; +class ContactList; + +class QBoxLayout; +class QDockWidget; + + + +/** + * The widget in a chat that contains the little contact information frames. + * + * @author Mike K. Bennett + * @ingroup Chat + */ +class ContactsWidget : public QWidget, private Ui::ContactsWidget +{ + Q_OBJECT + + public: + // The constructor + ContactsWidget( QWidget *parent = 0 ); + // The destructor + 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( ContactBase* contact ); + // A contact left the chat + void contactLeft ( ContactBase*, bool isChatIdle ); + // A contact was removed from the contact list + void contactRemoved( Contact *contact ); + // A contact is typing + 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 contactAdded( QString handle, bool isAdded ); + // The user wants to allow a contact to see hi/hers online status. + void contactAllowed( QString handle ); + // Toggle blocked status for a contact + void contactBlocked( QString handle, bool isBlocked ); + // The user wants to start private chat + void startPrivateChat( const QString &handle ); + + private: // Private methods + // Return one new contact frame + ContactFrame* createContactFrame(); + // 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 + ContactFrame* getContactFrameByHandle(const QString& handle); + + private: // Private attributes + // The list of frames contained in the widget + QList contactFrames_; + // 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..e589a61 --- /dev/null +++ b/src/chat/contactswidget.ui @@ -0,0 +1,148 @@ + + + ContactsWidget + + + + 0 + 0 + 229 + 315 + + + + + + + + 100 + 50 + + + + Qt::NoFocus + + + QScrollArea#area_ { background-color: transparent } + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + false + + + + + 0 + 0 + 94 + 120 + + + + QWidget#container_ { background-color: transparent } + + + + + + + + + + + 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/emoticonswidget.cpp b/src/chat/emoticonswidget.cpp new file mode 100644 index 0000000..da63acf --- /dev/null +++ b/src/chat/emoticonswidget.cpp @@ -0,0 +1,500 @@ +/*************************************************************************** + 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 ) ); + setGridSize( QSize( 20,20 ) ); + setUniformItemSizes( true ); + 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 have not 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() ), QString(), 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/emoticonswidget.h b/src/chat/emoticonswidget.h new file mode 100644 index 0000000..300dce7 --- /dev/null +++ b/src/chat/emoticonswidget.h @@ -0,0 +1,138 @@ +/*************************************************************************** + emoticonswidget.h - 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. * + * * + ***************************************************************************/ + +#ifndef EMOTICONSWIDGET_H +#define EMOTICONSWIDGET_H + +#include + + +class AddEmoticonDialog; +class Emoticon; +class EmoticonListWidget; +class EmoticonManager; + +class QBoxLayout; +class QDockWidget; +class QLabel; +class QMouseEvent; +class QPoint; +class QResizeEvent; + + + +/** + * The widget in a chat that contains the emoticons to send to your contacts. + * + * @author Diederik van der Boor, Valerio Pilo + * @ingroup Chat + */ +class EmoticonsWidget : public QWidget +{ + Q_OBJECT + + public: + // The constructor + EmoticonsWidget( QWidget *parent ); + // The destructor + 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(); + // 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 ); + + private: // Private enumerations + enum ButtonRole + { + ShortcutRole = Qt::UserRole // Role to store the button's shortcut + , PictureRole // Role to store the button's picture path + }; + + private: // private properties + // Emoticon dialog for edit the custom emoticons + AddEmoticonDialog *emoticonDialog_; + // Whether the widget has been initialized + bool initialized_; + // Whether we will keep a standard or custom theme + bool isCustom_; + // 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( const QString &html ); +}; + + + +// Extend the class QListWidget to grep the mousePressEvent +// because the use of showContextMenu in main class calls also the clicked slot. +class EmoticonListWidget : public QListWidget +{ + Q_OBJECT + + public: + EmoticonListWidget( QWidget *parent ); + + protected: + // Reimplement the mouse press event to grep left and right click + 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 requestPreview( const QListWidgetItem* ); +}; + + +#endif diff --git a/src/chat/inkedit.cpp b/src/chat/inkedit.cpp new file mode 100644 index 0000000..fee24de --- /dev/null +++ b/src/chat/inkedit.cpp @@ -0,0 +1,516 @@ +/*************************************************************************** + inkvedit.cpp - description + ------------------- + begin : Wed May 14 2008 + copyright : (C) 2008 by Antonio Nastasi + (C) 2009 by Sjors Gielen + email : sifcenter@gmail.com + dazjorz@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 "inkedit.h" + +#include "../kmessdebug.h" +#include "config-kmess.h" + +#if KMESS_ENABLE_INK == 1 + #include +#endif + +#include +#include + +#include +#include +#include +#include + + + +#ifdef KMESSDEBUG_INKEDIT + #define KMESSDEBUG_INKEDIT_GENERAL +#endif + + + +// 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" ) ); + eraseButton_->setIcon( KIcon( "draw-eraser" ) ); + clearButton_->setIcon( KIcon( "edit-clear" ) ); + + connect( colorButton_, SIGNAL( clicked() ), + this, SLOT ( changeColor() ) ); + connect( eraseButton_, SIGNAL( clicked() ), + this, SLOT ( eraseBrush() ) ); + connect( clearButton_, SIGNAL( clicked() ), + this, SLOT ( clearImage() ) ); +} + + + +// Clear the current image +void InkEdit::clearImage() +{ + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + image_->pixels.fill( qRgb( 255, 255, 255 ) ); + update(); + isEmpty_ = true; + + // Reset the drawn area + image_->area = QRect(); + + emit inkChanged(); +} + + + +// Change color for current pen +void InkEdit::changeColor() +{ + KColorDialog::getColor( color_ ); +} + + + +// 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(); + + int minX = position.x() - sizePen; + int maxX = position.x() + sizePen; + int minY = position.y() - sizePen; + int maxY = position.y() + sizePen; + + // Fix min and max to never spread larger than the image + // First fix max to not be bigger than the image, then fix min, then max again + maxX = qBound( 0, maxX, image_->pixels.width() ); + minX = qBound( 0, minX, maxX ); + maxX = qBound( minX, maxX, maxX ); + // Same for Y + maxY = qBound( 0, maxY, image_->pixels.height() ); + minY = qBound( 0, minY, maxY ); + maxY = qBound( minY, maxY, maxY ); + + // Adjust the initial size and position + if( image_->area.right() == -1 || image_->area.bottom() == -1 ) + { + image_->area.setLeft ( minX ); + image_->area.setRight ( maxX ); + image_->area.setTop ( minY ); + image_->area.setBottom( maxY ); + return; + } + + // Adjust the x position and width + if( minX < image_->area.left() ) + { + image_->area.setLeft( minX ); + } + if( maxX > image_->area.right() ) + { + image_->area.setRight( maxX ); + } + + // Adjust the y position and height + if( minY < image_->area.top() ) + { + image_->area.setTop( minY ); + } + if( maxY > image_->area.bottom() ) + { + image_->area.setBottom( maxY ); + } +} + + + +// Draw a line from start point to last point +void InkEdit::drawLineTo( const QPoint &endPoint ) +{ + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + QPainter painter( &(image_->pixels) ); + painter.setRenderHints( QPainter::Antialiasing | QPainter::SmoothPixmapTransform, true ); + + QColor color = color_; + if( erasingImage_ ) + { + color = QColor( "white" ); + } + + painter.setPen( QPen( color, sizePen_->value(), Qt::SolidLine, Qt::RoundCap, + Qt::RoundJoin ) ); + + painter.drawLine( lastPoint_, endPoint ); + + int rad = (1 / 2) + 2; + update( QRect( lastPoint_, endPoint ).normalized() + .adjusted( -rad, -rad, +rad, +rad ) ); + + lastPoint_ = endPoint; +} + + + +// Erase brush was selected +void InkEdit::eraseBrush() +{ + erasingImage_ = ! erasingImage_; + + if( erasingImage_ ) + { + eraseButton_->setIcon( KIcon( "draw-freehand" ) ); + } + else + { + eraseButton_->setIcon( KIcon( "draw-eraser" ) ); + } +} + + + +// Returns true if the image is empty +bool InkEdit::isEmpty() +{ + return isEmpty_; +} + + + +void InkEdit::mousePressEvent( QMouseEvent *event ) +{ + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + if( event->button() == Qt::LeftButton ) + { + lastPoint_ = event->pos(); + cropImage( lastPoint_ ); + scribbling_ = true; + } +} + + + +void InkEdit::mouseMoveEvent(QMouseEvent *event) +{ + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + if( ( event->buttons() & Qt::LeftButton ) && scribbling_ ) + { + QPoint position = event->pos(); + cropImage( position ); + drawLineTo( position ); + } +} + + + +void InkEdit::mouseReleaseEvent(QMouseEvent *event) +{ + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + if( event->button() == Qt::LeftButton && scribbling_ ) + { + QPoint position = event->pos(); + cropImage( position ); + drawLineTo( position ); + + isEmpty_ = false; + scribbling_ = false; + emit inkChanged(); + } +} + + + +void InkEdit::paintEvent(QPaintEvent *event) +{ + Q_UNUSED( event ); + + 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 ) +{ + if( image_ == 0 ) + { + 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(); + } + + QWidget::resizeEvent( event ); +} + + + +// Return the image +InkImage *InkEdit::getImage() +{ + return image_; +} + + + +// Return the bytes representing the image +const QByteArray& InkEdit::getImageBytes() +{ + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + imageBytes_.clear(); + return imageBytes_; + } + +#if KMESS_ENABLE_INK == 1 + // Copy the interesting piece of the image over to a new image + QImage image = image_->pixels.copy( image_->area ).convertToFormat( QImage::Format_Indexed8, Qt::ThresholdDither ); + + // Initialise the gif variables + GifFileType *gft = NULL; + ColorMapObject *cmap = NULL; + int height = image.height(); + int width = image.width(); + bool gifError = false; + + // Open a temporary file + QTemporaryFile tempFile( "kmess-ink-XXXXXX.gif" ); + QFile tempFile2; + if( ! tempFile.open() ) + { + kWarning() << "Couldn't open temporary file for GIF conversion."; + goto error; + } + +#ifdef KMESSDEBUG_INKEDIT_GENERAL + kDebug() << "Created temporary file to convert ink to GIF image."; +#endif + + // Convert the image to GIF using libgif + // This is needed because Windows Live Messenger (at least 2009) does not display inks + // which are not in GIF format (it doesn't even give an error). + gifError = true; + + // Open the gif file + gft = EGifOpenFileHandle( tempFile.handle() ); + if( gft == 0 ) + { + kWarning() << "Couldn't initialize gif library."; + goto error; + } + + // Create the color map + cmap = MakeMapObject( image.numColors(), NULL ); + if( cmap == 0 ) + { + kWarning() << "Couldn't create map object for gif conversion (num colors = " << image.numColors() << ")"; + goto error; + } + + // Fill in the color map with the colors in the image color table + for( int i = 0; i < image.numColors(); i++ ) + { + QRgb color = image.color( i ); + cmap->Colors[i].Red = qRed( color ); + cmap->Colors[i].Green = qGreen( color ); + cmap->Colors[i].Blue = qBlue( color ); + } + + // Initialize the GIF file + if( EGifPutScreenDesc( gft, width, height, 8, 0, cmap) == GIF_ERROR ) + { + kWarning() << "EGifPutScreenDesc failed."; + goto error; + } + + // Initialize the GIF image + if( EGifPutImageDesc( gft, 0, 0, width, height, 0, NULL) == GIF_ERROR ) + { + kWarning() << "EGifPutImageDesc failed."; + goto error; + } + + // Write every line + for( int j = 0; j < height; j++ ) + { + // FIXME: This is the point where the artifacts are made. I don't know why, but if you run: + // EGifPutLine( gft, image.bits(), image.width() * image.height() ) // i.e. convert the complete image in one call + // then the image is mangled, so something is wrong with the width or so, it seems to be off by two pixels or so. (Try it!) + //if( EGifPutLine( gft, image.scanLine( j ), width ) == GIF_ERROR ) + if( EGifPutLine( gft, image.scanLine( j ), width ) == GIF_ERROR ) + { + kWarning() << "EGifPutLine failed for scanline" << j << "(height=" << image.height() << ";width=" << image.width() << ";bytesperline=" << image.bytesPerLine() << ")"; + goto error; + } + } + + // Clean up the GIF converter etc + EGifCloseFile( gft ); + FreeMapObject( cmap ); + gifError = false; + + // Read the file back in + // Because the QTemporaryFile is opened in unbuffered mode, we have to flush it then re-open it with QFile. + tempFile.flush(); + tempFile2.setFileName( tempFile.fileName() ); + if( ! tempFile2.open( QIODevice::ReadOnly | QIODevice::Unbuffered ) ) + { + kWarning() << "Couldn't reopen temporary file: " << tempFile2.errorString(); + goto error; + } + + imageBytes_ = tempFile2.readAll(); + + tempFile2.close(); + tempFile.close(); + +#ifdef KMESSDEBUG_INKEDIT_GENERAL + kDebug() << "Converted ink to GIF (" << image.height() << "x" << image.width() << "), sending " << imageBytes_.size() << " bytes of image data."; +#endif + + return imageBytes_; + +error: + if( gifError ) + { + kWarning() << "A GIF error occured in getImageBytes, returning empty byte array. The error was: "; + PrintGifError(); + } + else + { + kWarning() << "A non-GIF error occured in getImageBytes, returning empty byte array."; + } + + imageBytes_.clear(); + return imageBytes_; +#else // KMESS_ENABLE_INK + imageBytes_.clear(); + return imageBytes_; +#endif // KMESS_ENABLE_INK +} + + + +void InkEdit::resizeImage( QImage *image, const QSize &newSize ) +{ + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + if( image->size() == newSize ) + { + return; + } + + QImage newImage( newSize, QImage::Format_ARGB32 ); + newImage.fill( qRgb( 255, 255, 255 ) ); + QPainter painter( &newImage ); + if( ! image->isNull() ) + { + painter.drawImage( QPoint( 0, 0 ), (*image).scaled( newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); + } + else + { + painter.drawImage( QPoint( 0, 0 ), *image ); + } + + *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 new file mode 100644 index 0000000..ebeb533 --- /dev/null +++ b/src/chat/inkedit.h @@ -0,0 +1,106 @@ +/*************************************************************************** + inkedit.cpp - description + ------------------- + begin : Wed May 14 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 INKEDIT_H +#define INKEDIT_H + +#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: + // Constructor + InkEdit( QWidget *parent = 0 ); + // Return the image + InkImage *getImage(); + // Return the bytes representing the image + const QByteArray &getImageBytes(); + // Returns true if the image is empty + bool isEmpty(); + // Change the image + void setImage( InkImage *newImage ); + + public slots: + // Clear the current image + void clearImage(); + + protected: // protected methods + // Implements all events to grep the mouse pointer + void mousePressEvent( QMouseEvent *event ); + void mouseMoveEvent( QMouseEvent *event ); + void mouseReleaseEvent( QMouseEvent *event ); + void paintEvent( QPaintEvent *event ); + void resizeEvent( QResizeEvent *event ); + + private: // private methods + // Crop the image to send only the drawed area + void cropImage( QPoint position ); + // Draw a line from start point to last point + void drawLineTo( const QPoint &endPoint ); + // Resize image method + void resizeImage( QImage *image, const QSize &newSize ); + + private slots: + // Change color for current pen + void changeColor(); + // Erase brush was selected + void eraseBrush(); + + private: // private attribute + // Color of current pen + QColor color_; + // It's true if the erase brush was selected. + bool erasingImage_; + // Current image data + InkImage *image_; + // The bytes of image + QByteArray imageBytes_; + // Variable to store if the image is empty or not + bool isEmpty_; + // Last point where the mouse pointer was released + QPoint lastPoint_; + // True if the user is painting + bool scribbling_; + + signals: + // Emitted when the ink was modified + void inkChanged(); +}; + +#endif diff --git a/src/chat/inkedit.ui b/src/chat/inkedit.ui new file mode 100644 index 0000000..e0d46ff --- /dev/null +++ b/src/chat/inkedit.ui @@ -0,0 +1,140 @@ + + InkEdit + + + + 0 + 0 + 386 + 153 + + + + + 200 + 70 + + + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + 2 + + + 2 + + + + + Qt::Horizontal + + + + 311 + 107 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::NoFocus + + + Clear area + + + + + + + + + + Qt::NoFocus + + + Pen color + + + + + + + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + Pen size + + + 1 + + + 10 + + + 3 + + + Qt::Horizontal + + + + + + + Erase brush + + + + + + + + + + + + + + diff --git a/src/chat/winkswidget.cpp b/src/chat/winkswidget.cpp new file mode 100644 index 0000000..88891d0 --- /dev/null +++ b/src/chat/winkswidget.cpp @@ -0,0 +1,358 @@ +/*************************************************************************** + 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 do not 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 = "
    \n" + " \n" + "
    \n"; + + return SUCCESS; +} + + + +const MsnObject WinksWidget::getMsnObjectWinkSelected() +{ + // Check if there is item selected + QListWidgetItem *item = list_->currentItem(); + if( item == 0 ) + { + return MsnObject(); + } + + // 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 MsnObject(); + } + + // 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( winksDir_ + fileName + ".stamp" ); + if( ! file.open( QIODevice::ReadOnly ) ) + { + return MsnObject(); + } + + // Third, read the certificate + const QByteArray& stamp( file.readAll() ); + file.close(); + if( stamp.isEmpty() ) + { + return MsnObject(); + } + + // Then find out if the wink has a name + QString winkFriendly; + file.setFileName( winksDir_ + fileName + ".name" ); + if( file.open( QIODevice::ReadOnly ) ) + { + winkFriendly = file.readAll(); + file.close(); + } + + // Finally, return the msn object + return MsnObject( handle, fileInfo.baseName(), winkFriendly, MsnObject::WINK, data, stamp ); +} + +#include "winkswidget.moc" diff --git a/src/chat/winkswidget.h b/src/chat/winkswidget.h new file mode 100644 index 0000000..0740eeb --- /dev/null +++ b/src/chat/winkswidget.h @@ -0,0 +1,68 @@ +/*************************************************************************** + 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; +class MsnObject; + + + +/** + * 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 MsnObject 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/kmess/chat/xsltransformation.cpp b/src/chat/xsltransformation.cpp similarity index 77% rename from kmess/chat/xsltransformation.cpp rename to src/chat/xsltransformation.cpp index 9c09a1a..162c24c 100644 --- a/kmess/chat/xsltransformation.cpp +++ b/src/chat/xsltransformation.cpp @@ -15,35 +15,32 @@ * * ***************************************************************************/ -/* - * The kopetexsl.cpp file from Kopete is used as working - * demo/example to create this code, since it's more - * to-the-point then the online libxml documentation. - */ - #include "xsltransformation.h" + #include "../kmessdebug.h" -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include // After xsltconfig and xsltInternals or it breaks compiling on some libxslt versions. - // stdlib.h is required to build on Solaris #include #include +#include +#include +#include +#include +#include // After xsltconfig and xsltInternals or it breaks compiling on some libxslt versions. + +#include +#include + +#include +#include + + +/* + * The kopetexsl.cpp file from Kopete is used as working + * demo/example to create this code, since it's more + * to-the-point than the online libxml documentation. + */ // The constructor @@ -72,7 +69,7 @@ XslTransformation::~XslTransformation() // Remove xsl params for( int i = 0; i < xslParamCount_; i++ ) { - delete xslParams_[i]; + free( xslParams_[i] ); } delete[] xslParams_; @@ -98,21 +95,21 @@ QString XslTransformation::convertXmlString( const QString &xml ) const // Convert data to C-string // It needs to be stored in a local variable // before it can be passed to a function. - QCString xmlCString = xml.utf8(); + QByteArray xmlCString = xml.toUtf8(); // Create XmlDoc sourceXmlDoc = xmlParseMemory( xmlCString.data(), xmlCString.length() ); if( sourceXmlDoc == 0 ) { - kdWarning() << "XslTransformation: could not parse the XML data." << endl; + kWarning() << "could not parse the XML data."; return QString::null; } // Apply XSL - resultXmlDoc = xsltApplyStylesheet( styleSheet_, sourceXmlDoc, xslParams_ ); + resultXmlDoc = xsltApplyStylesheet( styleSheet_, sourceXmlDoc, (const char**)xslParams_ ); if( resultXmlDoc == 0 ) { - kdWarning() << "XslTransformation: could not convert the XML data." << endl; + kWarning() << "could not convert the XML data."; goto cleanSource; } @@ -158,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( QMapConstIterator it = xslParameters.begin(); it != xslParameters.end(); ++it ) - { - // Duplicate the strings as they will be deleted outside this scope. - QCString key = it.key().utf8(); - QCString value = QString( "'" + it.data() + "'" ).utf8(); - xslParams_[ i++ ] = strdup( key.data() ); - xslParams_[ i++ ] = strdup( value.data() ); - } - xslParamCount_ = i; - xslParams_[ i++ ] = 0; - -#ifdef KMESSTEST - ASSERT( i == argCount ); -#endif - } + parametersMap_ = xslParameters; + updateParametersList(); } @@ -206,7 +181,7 @@ void XslTransformation::setStylesheet(const QString &xslFileName) xslFileName_ = xslFileName; #ifdef KMESSDEBUG_XSLTRANSFORMATION - kdDebug() << "XslTransformation: loading new style sheet '" << xslFileName << "'" << endl; + kDebug() << "loading new style sheet '" << xslFileName << "'"; #endif // Clean up previous stylesheet @@ -219,14 +194,14 @@ void XslTransformation::setStylesheet(const QString &xslFileName) } // Get file path - KURL fileUrl(xslFileName); - QCString basePath = fileUrl.directory(false).utf8(); + KUrl fileUrl(xslFileName); +// QByteArray basePath = fileUrl.directory( KUrl::AppendTrailingSlash ).toUtf8(); // Open XSL file QFile file(xslFileName); - if( ! file.open(IO_ReadOnly) ) + if( ! file.open(QIODevice::ReadOnly) ) { - kdWarning() << "XslTransformation: could not load '" << xslFileName << "'!" << endl; + kWarning() << "could not load '" << xslFileName << "'!"; return; } @@ -238,7 +213,7 @@ void XslTransformation::setStylesheet(const QString &xslFileName) xslDoc_ = xmlParseMemory( fileData.data(), fileData.size() ); if(xslDoc_ == 0) { - kdWarning() << "XslTransformation: could not parse XML from '" << xslFileName << "'!" << endl; + kWarning() << "could not parse XML from '" << xslFileName << "'!"; return; } @@ -249,7 +224,7 @@ void XslTransformation::setStylesheet(const QString &xslFileName) // Useful commands: // xmlDocDump( stdout, xslDoc_ ); - // + // xmlNode *xslRoot = xmlDocGetRootElement( xslDoc_ ); @@ -263,7 +238,7 @@ void XslTransformation::setStylesheet(const QString &xslFileName) xmlNs *xslNs = xmlSearchNsByHref( xslDoc_, xslRoot, (xmlChar*) "http://www.w3.org/1999/XSL/Transform" ); if( xslNs == 0 ) { - kdWarning() << "XslTransformation::setStylesheet: Could not find XSL namespace in chat style." << endl; + kWarning() << "Could not find XSL namespace in chat style."; } */ @@ -273,7 +248,7 @@ void XslTransformation::setStylesheet(const QString &xslFileName) xmlNs *kmessNs = xmlSearchNsByHref( xslDoc_, xslRoot, (xmlChar*) "http://www.kmess.org/xmlns/ChatStyles/v1/" ); if( xslNs == 0 || kmessNs == 0 ) { - kdWarning() << "XslTransformation::setStylesheet: 'xsl' and 'kmess' namespaces not found in '" + kWarning() << "'xsl' and 'kmess' namespaces not found in '" << xslFileName << "' chat style, " << "chat style can't be translated." << endl; } @@ -288,14 +263,14 @@ void XslTransformation::setStylesheet(const QString &xslFileName) if( styleSheet_ == 0 || styleSheet_->errors != 0 ) { // Also happens when an fails - kdWarning() << "XslTransformation: could not parse XSL from '" << xslFileName << "'!" << endl; + kWarning() << "could not parse XSL from '" << xslFileName << "'!"; xmlFreeDoc( xslDoc_ ); xslDoc_ = 0; } #ifdef KMESSDEBUG_XSLTRANSFORMATION else { - kdDebug() << "XslTransformation: style sheet loaded." << endl; + kDebug() << "style sheet loaded."; } #endif @@ -303,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 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 ) { @@ -343,17 +360,17 @@ 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. // Ignore nodes. - bool timmed = trimmer.match( content ) != -1; - content = content.simplifyWhiteSpace(); + bool timmed = trimmer.indexIn( content ) != -1; + content = content.simplified(); if( content.isEmpty() ) { continue; @@ -361,19 +378,19 @@ void XslTransformation::updateXslTranslations( xmlNode *node, const xmlNs *xslNs // Translate the string. // Add the trimmed spaces back. - content = i18n( "chat-style-text", content ); + content = i18nc( "chat-style-text", content.toLatin1() ); if( timmed ) { content = trimmer.cap(1) + content + trimmer.cap(3); } #ifdef KMESSDEBUG_XSLTRANSFORMATION - kdDebug() << "XslTransformation: translated node \"" << oldContent << "\"" - << " to \"" << content << "\" using i18n(\"" << oldContent.simplifyWhiteSpace() << "\")." << endl; + kDebug() << "translated node \"" << oldContent << "\"" + << " to \"" << content << "\" using i18n(\"" << oldContent.simplified() << "\")." << endl; #endif // Write the translated string back. - QCString utf8Content = content.utf8(); // store to avoid cleanup before end of if-block. + QByteArray utf8Content = content.toUtf8(); // store to avoid cleanup before end of if-block. const xmlChar *newRawContent = (const xmlChar*) utf8Content.data(); xmlNodeSetContent( curNode, newRawContent ); continue; diff --git a/kmess/chat/xsltransformation.h b/src/chat/xsltransformation.h similarity index 86% rename from kmess/chat/xsltransformation.h rename to src/chat/xsltransformation.h index 6abdca3..b36fda7 100644 --- a/kmess/chat/xsltransformation.h +++ b/src/chat/xsltransformation.h @@ -18,12 +18,14 @@ #ifndef XSLTRANSFORMATION_H #define XSLTRANSFORMATION_H -#include -#include - #include #include +#include +#include +#include + + /** * A wrapper class to call libxslt functions. @@ -31,6 +33,7 @@ * chat messages in the desired HTML markup. * * @author Diederik van der Boor + * @ingroup Chat */ class XslTransformation { @@ -45,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 ); @@ -58,8 +65,9 @@ class XslTransformation QString xslFileName_; xsltStylesheet *styleSheet_; xmlDoc *xslDoc_; - const char **xslParams_; + char **xslParams_; int xslParamCount_; + QMap parametersMap_; }; #endif diff --git a/src/contact/contact.cpp b/src/contact/contact.cpp new file mode 100644 index 0000000..5706ceb --- /dev/null +++ b/src/contact/contact.cpp @@ -0,0 +1,536 @@ +/*************************************************************************** + contact.cpp - description + ------------------- + begin : Sun Jan 5 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 "contact.h" + +#include "../contact/msnobject.h" +#include "../utils/kmessconfig.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" +#include "contactextension.h" + + +#ifdef KMESSDEBUG_CONTACT + #define KMESSDEBUG_CONTACT_GENERAL +#endif + + + +// The constructor +Contact::Contact( const QString& handle, const QString& friendlyName, int lists, + const QStringList& groupIds, const QString& guid ) + : ContactBase(handle, friendlyName), + allowed_(false), + blocked_(false), + friend_(false), + groupIds_(groupIds), + guid_(guid), + lastStatus_(STATUS_OFFLINE), + movingFrom_(""), + msnObject_(0), + pending_(false), + reverse_(false), + status_(STATUS_OFFLINE) +{ +#ifdef KMESSTEST + KMESS_ASSERT( ! handle_.isEmpty() ); + KMESS_ASSERT( ! friendlyName_.getOriginal().isEmpty() ); + KMESS_ASSERT( lists != 0 ); +#endif + + if(lists & MSN_LIST_FRIEND) friend_ = true; + if(lists & MSN_LIST_ALLOWED) allowed_ = true; + if(lists & MSN_LIST_BLOCKED) blocked_ = true; + if(lists & MSN_LIST_REVERSE) reverse_ = true; + if(lists & MSN_LIST_PENDING) pending_ = true; + + // The extension stores additional properties not found in + // the official client/protocol, but only found in KMess. + // Pictures are stored there because you can assign one + // (KMess implemented this before the official client supported + // msnobject transfers). Names can be aliased, which is why there're + // also there. + extension_ = new ContactExtension( this ); + + // Relay some signals needed externally + connect ( extension_, SIGNAL( changedFriendlyName() ), + this, SIGNAL( changedFriendlyName() ) ); + connect ( extension_, SIGNAL( changedPicture() ), + this, SIGNAL( changedPicture() ) ); +} + + + +// The destructor +Contact::~Contact() +{ +#ifdef KMESSDEBUG_CONTACT_GENERAL + kDebug() << "DESTROYED. [handle=" << handle_ << "]"; +#endif + + delete extension_; + if(msnObject_) delete msnObject_; +} + + + +// 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; + } + + // Append to groups + groupIds_.append(groupId); + +#ifdef KMESSDEBUG_CONTACT_GENERAL + kDebug() << "groups of " << handle_ << " are '" << groupIds_.join(",") << "'"; +#endif + + emit changedGroup(this); +} + + + +// Return the path to the contact's picture +const QString Contact::getContactPicturePath() const +{ + // Check before if there is some alternative contact's picture + QString picturePath( extension_->getContactAlternativePicturePath() ); + + if( ! picturePath.isEmpty() ) + { + return picturePath; + } + + // Check for contact picture ( sended by msn object ) + picturePath = extension_->getContactPicturePath(); + + if( ! picturePath.isEmpty() ) + { + return picturePath; + } + + // else return the default contact picture path + return getContactDefaultPicturePath(); +} + + + +// Return the current media type +const QString & Contact::getCurrentMediaType() const +{ + return currentMediaType_; +} + + + +// Return the current media type +const QString & Contact::getCurrentMediaString() const +{ + return currentMediaString_; +} + + + +// Return a pointer to the extension class +ContactExtension *Contact::getExtension() const +{ + return extension_; +} + + +// Return the contact's friendly name +const QString& Contact::getFriendlyName( FormattingMode mode ) const +{ + // Check if alternative friendly name is set + if( extension_->getUseAlternativeName() ) + { + return extension_->getAlternativeName( mode ); + } + // Else return the string contained in friendlyName + return friendlyName_.getString( mode ); +} + + + +// Return the contact's previous status +Status Contact::getLastStatus() const +{ + return lastStatus_; +} + + + +// Return the contact's globally unique identifier +const QString &Contact::getGuid() const +{ + return guid_; +} + + + +// Return the group ID's the contact is added to +const QStringList& Contact::getGroupIds() const +{ + return groupIds_; +} + + + +// 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 +{ + return msnObject_; +} + + + +// Return the contact's personal message +const QString & Contact::getPersonalMessage( FormattingMode mode ) const +{ + return personalMessage_.getString( mode ); +} + + + +// Return the contact's status +Status Contact::getStatus() const +{ + return status_; +} + + + +// Return the contact's true friendly name, regardless of extension +const QString& Contact::getTrueFriendlyName( FormattingMode mode ) const +{ + return friendlyName_.getString( mode ); +} + + + +// Whether or not the contact is allowed +bool Contact::isAllowed() const +{ + return allowed_; +} + + + +// Whether or not the contact is blocked +bool Contact::isBlocked() const +{ + return blocked_; +} + + + +// Whether or not the contact is on the friends list +bool Contact::isFriend() const +{ + return friend_; +} + + + +// Whether or not the contact is on the pending list +bool Contact::isPending() const +{ + return pending_; +} + + + +// Whether or not the contact is on the reverse list +bool Contact::isReverse() const +{ + return reverse_; +} + + + +// Setup and load an MSN Object +void Contact::loadMsnObject( QString msnObject ) +{ + // Contact removed his picture. + if( msnObject.isEmpty() ) + { +#ifdef KMESSDEBUG_CONTACT_GENERAL + kDebug() << "Contact " << getHandle() << " - MSN Object Removed!"; +#endif + + delete msnObject_; + msnObject_ = 0; + emit changedMsnObject( this ); + } + + // Contact set his picture, or changed it. + if( msnObject_ ) + { + // Actually not changed... + if( ! msnObject_->hasChanged( msnObject ) ) + { + return; + } + + // Delete previous object. + delete msnObject_; + msnObject_= 0; + } + +#ifdef KMESSDEBUG_CONTACT_GENERAL + kDebug() << "Contact " << getHandle() << " - MSN Object Changed!"; +#endif + + msnObject_ = new MsnObject( msnObject ); + emit changedMsnObject( this ); +} + + + +// Load extension settings for a contact +void Contact::readProperties( const KConfigGroup &config ) +{ + // Get the configuration group where this contact's data is stored + KConfigGroup contactConfig = config.group( handle_ ); + + // Restore cached state of this class + capabilities_ = contactConfig.readEntry( "capabilities", 0 ); + clientName_ = contactConfig.readEntry( "clientName", QString() ); + clientFullName_ = contactConfig.readEntry( "clientFullName", QString() ); + personalMessage_.setString( contactConfig.readEntry( "lastPersonalMessage", "" ) ); + emoticonBlackList_ = contactConfig.readEntry( "emoticonBlackList", QStringList() ); + + // TODO: restore more state variables here, to implement contact list caching. + + // Restore extension + extension_->readProperties( contactConfig ); +} + + + +// Remove the group from the list of group IDs +void Contact::removeGroupId( const QString &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 ); +} + + + +// Save extension settings for a contact +void Contact::saveProperties( KConfigGroup &config ) +{ + // Get the configuration group where this contact's data is stored + KConfigGroup contactConfig = config.group( handle_ ); + + // Save state of this class + contactConfig.writeEntry( "capabilities", getCapabilities() ); + contactConfig.writeEntry( "clientName", getClientName( false ) ); + contactConfig.writeEntry( "clientFullName", getClientFullName() ); + contactConfig.writeEntry( "lastPersonalMessage", getPersonalMessage( STRING_ORIGINAL ) ); + contactConfig.writeEntry( "emoticonBlackList", getEmoticonBlackList() ); + + // store extension + extension_->saveProperties( contactConfig ); +} + + + +// Set whether or not the contact is allowed +void Contact::setAllowed( bool allowed ) +{ + if( allowed_ != allowed ) + { + allowed_ = allowed; + emit changedList(this); + } +} + + + +// Set whether or not the contact is blocked +void Contact::setBlocked( bool blocked ) +{ + if( blocked_ != blocked ) + { + blocked_ = blocked; + emit changedList(this); + } +} + + + +// Set whether or not the contact is on the friends list +void Contact::setFriend( bool isFriend ) +{ + if( friend_ != isFriend ) + { + friend_ = isFriend; + + // If the contact is no longer at the FL, remove from all groups + if(! isFriend) + { + groupIds_.clear(); + setStatus( STATUS_OFFLINE, false ); + } + + emit changedList(this); + } +} + + + +// Change the contact's friendly name +void Contact::setFriendlyName( QString newName ) +{ + if( newName.isEmpty() ) + { + kWarning() << "Not setting the friendly name of " << handle_ << " to an empty value (previously: " << friendlyName_.getCleaned() << ")"; + return; + } + + friendlyName_.setString( newName ); + + emit changedFriendlyName(); +} + + + +// 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 ) +{ + guid_ = guid; +} + + + +// Set the extra information retrieved by soap response +void Contact::setInformations( const QHash &informations ) +{ + informations_ = informations; +} + + + +// Set wether or not the contact is on pending list +void Contact::setPending( bool isPending ) +{ + pending_ = isPending; +} + + + +// 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 ) + { + return; + } + + currentMediaType_ = mediaType; + currentMediaString_ = mediaString; + personalMessage_.setString( message ); + + emit changedPersonalMessage(this); +} + + + +// Set whether or not the contact is on the reverse list +void Contact::setReverse( bool reverse ) +{ + if( reverse_ != reverse ) + { + reverse_ = reverse; + emit changedList(this); + } +} + + + +// Set the contact's status +void Contact::setStatus( const Status newStatus, bool showBaloon ) +{ + if( status_ == newStatus ) + { + return; + } + + lastStatus_ = status_; + status_ = newStatus; + +#ifdef KMESSDEBUG_CONTACT_GENERAL + kDebug() << "Contact " << handle_ << " went from " << MsnStatus::getCode( lastStatus_ ) + << " to " << MsnStatus::getCode( status_ ) << "."; +#endif + + // Signal the UI + emit changedStatus(); + + // Check if the contact went offline + if( status_ == STATUS_OFFLINE && lastStatus_ != STATUS_OFFLINE ) + { +#ifdef KMESSDEBUG_CONTACT_GENERAL + kDebug() << "Contact went offline."; +#endif + emit contactOffline( this, showBaloon ); + } + // Check if the contact went online + else if( status_ != STATUS_OFFLINE && lastStatus_ == STATUS_OFFLINE ) + { + // showBaloon is here to avoid showing notification when we connect +#ifdef KMESSDEBUG_CONTACT_GENERAL + kDebug() << "Contact went online."; +#endif + emit contactOnline( this, showBaloon ); + } +} + +#include "contact.moc" diff --git a/kmess/contact/contact.h b/src/contact/contact.h similarity index 82% rename from kmess/contact/contact.h rename to src/contact/contact.h index 07c0637..b715f9e 100644 --- a/kmess/contact/contact.h +++ b/src/contact/contact.h @@ -19,10 +19,15 @@ #define CONTACT_H #include "contactbase.h" -#include "contactextension.h" + +#include + // Forward declarations class MsnObject; +class ContactExtension; + +class KConfigGroup; /** @@ -73,15 +78,14 @@ class Contact : public ContactBase public: // Public methods // The constructor - Contact(QString handle, QString friendlyName, int lists, QStringList groupIds, QString guid); + Contact( const QString& handle, const QString& friendlyName, int lists, + const QStringList& groupIds, const QString& guid ); // The destructor - ~Contact(); + 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; + const QString getContactPicturePath() const; // Return the current media type const QString & getCurrentMediaType() const; // Return the current media type @@ -89,23 +93,23 @@ class Contact : public ContactBase // Return a pointer to the extension class ContactExtension *getExtension() const; // Return the contact's friendly name - QString getFriendlyName() const; + const QString& getFriendlyName( FormattingMode mode = STRING_CLEANED ) const; // Return the group ID's the contact is added to - QStringList getGroupIds() const; + const 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 - const QString &getLastStatus() const; + Status getLastStatus() const; // Return the contact's personal message - const QString & getPersonalMessage() const; + const QString & getPersonalMessage( FormattingMode mode = STRING_CLEANED ) const; // Return the contact's status - QString getStatus() const; + Status getStatus() const; // Return the contact's true friendly name, regardless of extension - QString getTrueFriendlyName() const; + const 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 @@ -118,8 +122,12 @@ class Contact : public ContactBase bool isReverse() const; // Setup and load a string representing an MSNObject void loadMsnObject( QString msnObject ); + // Load cached state for a contact + void readProperties( const KConfigGroup &config ); // Remove the group from the list of group IDs void removeGroupId(const QString &groupId); + // Save cached state for for a contact + void saveProperties( KConfigGroup &config ); // Set whether or not the contact is allowed void setAllowed(bool allowed); // Set whether or not the contact is blocked @@ -130,16 +138,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 QString status, bool showBaloon = true); + void setStatus( const Status newStatus, bool showBaloon = true ); private: // Private attributes // Whether or not the contact is "allowed" @@ -158,8 +166,10 @@ 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 - QString lastStatus_; + Status lastStatus_; // Name of the original group when the contact is being moved QString movingFrom_; // msn object @@ -167,17 +177,11 @@ class Contact : public ContactBase // Whether or not the contact is on the pending list bool pending_; // The contact's personal message - QString personalMessage_; + FormattedString personalMessage_; // Whether or not the contact is on the reverse list bool reverse_; // The contact's online status - QString status_; - - private slots: // Slots - // Forward the "changed friendlyname" signal - void forwardChangedFriendlyName(); - // Forward the "changed picture" signal - void forwardChangedPicture(); + Status status_; signals: // Public signals // Signal that the contact may have changed list affiliation diff --git a/src/contact/contactbase.cpp b/src/contact/contactbase.cpp new file mode 100644 index 0000000..12c1331 --- /dev/null +++ b/src/contact/contactbase.cpp @@ -0,0 +1,738 @@ +/*************************************************************************** + contactbase.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 "contactbase.h" + +#include "../contact/msnobject.h" // only used for detectClientName()! +#include "../network/applications/applicationlist.h" +#include "../utils/kmessshared.h" +#include "../kmessdebug.h" + +#include +#include + +#include +#include + + + +// The constructor +ContactBase::ContactBase( const QString& handle, const QString& friendlyName, uint capabilities) + : capabilities_(capabilities) + , 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; + } +} + + + +// The destructor +ContactBase::~ContactBase() +{ + delete applicationList_; + applicationList_ = 0; +} + + + +// Add a custom emoticon definition +void ContactBase::addEmoticonDefinition(const QString &emoticonCode, const QString &msnObjectDataHash ) +{ +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "adding '" << emoticonCode << "' to pending replacements"; +#endif + + // Escape the code so the HTML parser won't be fooled. + QString shortcut( emoticonCode ); + KMessShared::htmlEscape( shortcut ); + + // Add emoticon to pending list, until Msn object is received. + pendingEmoticons_.insert( msnObjectDataHash, shortcut ); + + // Regenerate the pending emoticon regexp + regeneratePendingEmoticonPattern(); +} + + + +// Add a custom emoticon file +void ContactBase::addEmoticonFile(const QString &msnObjectDataHash, const QString &filename) +{ + // Check whether the mapping is available. + if( ! pendingEmoticons_.contains(msnObjectDataHash) ) + { + kWarning() << "Received an custom emoticon, but no emoticon code found!"; + return; + } + + // Get the emoticon code from pending list, remove it + QString emoticonCode( pendingEmoticons_[msnObjectDataHash] ); // no QString& because record gets removed. + pendingEmoticons_.remove(msnObjectDataHash); + +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "linking '" << emoticonCode << "' to received file."; +#endif + + // Check if filename exists, attempt to read it. + if( ! QFile::exists(filename) ) + { + kWarning() << "Could not read emoticon file: file not found!"; + return; + } + QImage emoticonData(filename); + if( emoticonData.isNull() ) + { + kWarning() << "Could not read emoticon file!"; + return; + } + +#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 ) ); + + // Update regexp pattern + if( emoticonRegExp_.isEmpty() ) + { + emoticonRegExp_ = QRegExp( escapedCode ); + } + else + { + emoticonRegExp_ = QRegExp( emoticonRegExp_.pattern() + "|" + escapedCode ); + } + + // Regenerate the pending emoticon pattern + regeneratePendingEmoticonPattern(); + +#ifdef KMESSTEST + KMESS_ASSERT( emoticonRegExp_.isValid() ); +#endif + + + // Get the image dimensions from the file + int originalWidth = emoticonData.width(); + int originalHeight = emoticonData.height(); + + // Resize the displayed image to match KMess' maximum emoticon size + int width = originalWidth; // qMin( EMOTICONS_MAX_SIZE, originalWidth ); // Require only a max height + int height = qMin( EMOTICONS_MAX_SIZE, originalHeight ); + + if( originalWidth > originalHeight ) + { + height = ( width * originalHeight ) / originalWidth; + } + else + { + width = ( height * originalWidth ) / originalHeight; + } + + // Add replacement. + QString altCode ( emoticonCode ); + altCode = KMessShared::htmlUnescape( altCode ).replace("'", "'"); + QString replacement( "" + altCode
+                     + "" ); + + customEmoticons_.insert( emoticonCode, replacement ); + customHashes_.insert( emoticonCode, msnObjectDataHash ); +} + + + +// Register the contact as participant in the chat session +void ContactBase::addSwitchboardConnection( const MsnSwitchboardConnection *connection ) +{ +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "adding connection to list."; +#endif + + if( chatSessions_.contains(connection) ) + { + kWarning() << "chat session is already added."; + return; + } + + chatSessions_.append( connection ); +} + + + +// Initialize an application list for the contact. +ApplicationList * ContactBase::createApplicationList() +{ + if( applicationList_ != 0 ) + { + kWarning() << "application list already created for contact '" << handle_ << "'."; + } + else + { + applicationList_ = new ApplicationList( handle_ ); + + connect( applicationList_, SIGNAL( applicationsAborted(const QString &) ), + this, SLOT ( slotApplicationListAborted() ) ); + } + + return applicationList_; +} + + + +// Set the application name based on the capabilities +void ContactBase::detectClientName( 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, 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; + } + + + // Third party clients also include their name in the MsnObject, + // since that's already available at the notification connection. + QString newClientName; + QString pictureClientName; + if( msnObject != 0 ) + { + const QString &pictureLocation = msnObject->getLocation(); + + if( ! pictureLocation.isEmpty() + && pictureLocation != "0" // WLM 8.1 + && ! pictureLocation.startsWith("TFR") ) // MSN / WLM + { + // Known variations: + if( pictureLocation == "KMess.tmp" ) + { + pictureClientName = "KMess"; + } + else if( pictureLocation == "Mercury.tmp" ) + { + pictureClientName = "Mercury"; + } + else if( pictureLocation == "kopete.tmp" or pictureLocation == "1.tmp" ) + { + pictureClientName = "Kopete"; + } + else if( pictureLocation == "amsn.tmp" ) + { + pictureClientName = "aMSN"; + } + else if( pictureLocation == "EncartaIcon.png" ) + { + // Encarta Instant Answers. + // ignore, no special string for this one. + } + else + { +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "NOTICE: Unknown client name in MsnObject location:" << pictureLocation; +#endif + } + } + } + + if( ! pictureClientName.isNull() ) + { + newClientName = pictureClientName; + } + // Check capabilities for special software + else if( capabilities & MSN_CAP_WIN_MOBILE ) + { + newClientName = i18n( "Windows Mobile" ); + } + else if( capabilities & MSN_CAP_WEB_CLIENT ) + { + newClientName = i18n( "Web Messenger" ); + } + else if( capabilities & MSN_CAP_MSO_CLIENT ) + { + newClientName = i18n( "Office Communicator" ); + } + else if( capabilities & MSN_CAP_BOT ) + { + newClientName = i18n( "Messenger Bot" ); + } + else if( capabilities & MSN_CAP_MCE_CLIENT ) + { + newClientName = i18n( "Windows Media Center" ); + } + else + { + if( msnVersion == 0 ) + { + // pre p2p clients. msn 4.x is locked out after the switch to SSL logins. + newClientName = i18n( "MSN Messenger %1 compatible", QString( "5.0" ) ); + } + else if( msnVersion < 8.0 ) + { + // pre wlm client + newClientName = i18n( "MSN Messenger %1 compatible", QString::number( msnVersion ) ); + } + else + { + // 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 ) + { + if( msnVersion < 9999999 ) + { + // Supports all default caps of 8.1 or 2009, remove the "compatible" string. This truly is WLM. + newClientName = i18n( "Windows Live Messenger %1", QString::number( msnVersion ) + suffix ); + } + else + { + // Beyond our current finger print database, can't show version number yet. + newClientName = i18n( "Windows Live Messenger" ); + } + } + else + { + if( msnVersion < 9999999 ) + { + newClientName = i18n( "Windows Live Messenger %1 compatible", QString::number( msnVersion ) ); + } + else + { + // Kopete seems to use 0xc0000000 as capabilities.. 2 versions beyond WLM2009 + // (this is fixed in a later version, turns out they added all supported MSN versions instead of just sending the newest one) + // Its caps are 0xc0148028; ink-isf, multi-packet, winks, voice-clips, sip + newClientName = i18n( "Windows Live Messenger compatible" ); + } + } + } + } + + // If the base client name has changed, the full name has probably changed too + if( newClientName != clientName_ ) + { + clientName_ = newClientName; + clientFullName_.clear(); + } + +#ifdef KMESSDEBUG_CONTACTBASE + if( isOnline() ) + { + QStringList caps; + 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"; // 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"; // 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:" << clientName_ << "msn version:" << msnVersion << "capabilities:" << capabilities << caps; + } +#endif +} + + + +// Return the application list of the contact +ApplicationList * ContactBase::getApplicationList() const +{ + return applicationList_; +} + + + +// The capabilities of the client +uint ContactBase::getCapabilities() const +{ + return capabilities_; +} + + + +// Return a user readable client name string. +const QString & ContactBase::getClientName( bool getFullNameIfAvailable ) const +{ + if( getFullNameIfAvailable && ! getClientFullName().isEmpty() ) + { + return clientFullName_; + } + + return clientName_; +} + + + +// Return the third party client name field +const QString & ContactBase::getClientFullName() const +{ + return clientFullName_; +} + + + +// Return the default contact picture path +QString ContactBase::getContactDefaultPicturePath() const +{ + KStandardDirs *dirs = KGlobal::dirs(); + return dirs->findResource( "data", "kmess/pics/unknown.png" ); +} + + + +// 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 +{ + return pendingEmoticons_[ msnObjectDataHash ]; +} + + + +// Return the custom emoticon search pattern. +const QRegExp & ContactBase::getEmoticonPattern() const +{ + return emoticonRegExp_; +} + + + +// Return the custom emoticon replacements. +const QHash& ContactBase::getEmoticonReplacements() const +{ + return customEmoticons_; +} + + + +// Return the custom emoticon hashes. +const QHash& ContactBase::getEmoticonHashes() const +{ + return customHashes_; +} + + + +// Return the contact's friendly name +const QString& ContactBase::getFriendlyName( FormattingMode mode ) const +{ + return friendlyName_.getString( mode ); +} + + + +// Return the contact's handle +const QString& ContactBase::getHandle() const +{ + return handle_; +} + + + +// Return the search pattern for pending custom emoticons. +const QRegExp & ContactBase::getPendingEmoticonPattern() const +{ + return pendingRegExp_; +} + + + +// Regenerate the pending emoticon regexp, because it was changed +void ContactBase::regeneratePendingEmoticonPattern() +{ + QString pattern; + foreach( const QString& shortcut, pendingEmoticons_ ) + { + // Escape the code to insert it safely into a regular expression + QString escapedCode( QRegExp::escape( shortcut ) ); + if( pattern.isEmpty() ) + { + pattern = escapedCode; + } + else + { + pattern.append( "|" + escapedCode ); + } + } + + pendingRegExp_ = QRegExp( pattern ); + +#ifdef KMESSTEST + KMESS_ASSERT( pendingRegExp_.isValid() ); +#endif +} + + + +// Return the list of switchboard connections +const QList ContactBase::getSwitchboardConnections() const +{ + return chatSessions_; +} + + + +// Returns whether the contact has an application list initialized. +bool ContactBase::hasApplicationList() const +{ + return (applicationList_ != 0); +} + + + +// Returns whether the contact has capability +bool ContactBase::hasCapability( MsnClientCapabilities flag ) const +{ + return ( capabilities_ & flag ) == flag; +} + + + +// Returns whether the contact's client supports the given MSNP2P version +bool ContactBase::hasP2PSupport( MsnClientCapabilities minimalVersion ) const +{ +#ifdef KMESSTEST + KMESS_ASSERT( minimalVersion != 0 && (minimalVersion & 0x0fffffff) == 0 ); // don't pass some other capability. +#endif + + return capabilities_ >= (uint) minimalVersion; +} + + + +// Return true if the contact is offline +bool ContactBase::isOffline() const +{ + return getStatus() == STATUS_OFFLINE; +} + + + +// Return true if the contact is online +bool ContactBase::isOnline() const +{ + return getStatus() != STATUS_OFFLINE; +} + + + +// 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 ) +{ +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "removing connection, userInitiated=" << userInitiated; +#endif + + bool found = chatSessions_.removeAll( connection ) > 0; + if( ! found ) + { + kWarning() << "chat session not found."; + } + + if( chatSessions_.isEmpty() ) + { +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << handle_ << " is no longer in any other chat conversation, cleaning up."; +#endif + + // Inform the ApplicationList if we have one. + // It's possible some sessions need to be terminated now. + if( applicationList_ != 0 ) + { + bool hasAbortingApps = applicationList_->contactLeftChat( userInitiated ); + + // If there aren't any applications aborting, the object can be deleted now. + // Also avoid deleting the object if there is still a direct connection. + // It's possible a switchboard is replaced with another one (with WLM -> background chat -> normal chat). + // Note the object could be destroyed from slotApplicationListAborted() too. + if( ! hasAbortingApps && applicationList_ != 0 && ! applicationList_->hasAuthorizedDirectConnection() ) + { +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "no applications to abort, deleting ApplicationList object."; +#endif + + delete applicationList_; + applicationList_ = 0; + } + } + + // This will be used by CurrentAccount to clean up temporary InvitedContact objects. + emit leftAllChats( this ); + } +} + + + +// Set the client capabilities +void ContactBase::setCapabilities( uint capabilities ) +{ + // See if the client software could have changed. + // 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 && capabilities > 0 ) + { +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "capabilities of" << handle_ << "changed from" << capabilities_ << "to" << capabilities << ", resetting detected app name."; +#endif + + clientName_.clear(); + } + + // Set caps + capabilities_ = capabilities; +} + + + +// Save the simple name of the client used by the contact +void ContactBase::setClientName( const QString &clientName ) +{ + clientName_ = clientName; +} + + + +// Set the full name of the client used by the contact +void ContactBase::setClientFullName( const QString& clientFullName ) +{ + clientFullName_ = clientFullName; + + // Make the name more readable + clientFullName_ = clientFullName_.replace( '/', ' ' ); + + // 'Purple 2.3.1' means the user actually has Pidgin or Adium (because they use libpurple). + if( clientFullName_.startsWith( "Purple " ) ) + { + clientFullName_ = "Pidgin/Adium (" + clientFullName_ + ")"; + } +} + + + +// The application list completed aborting it's applications. +void ContactBase::slotApplicationListAborted() +{ + // Avoid killing an object if it was filled with new entries again + if( ! applicationList_->isEmpty() || applicationList_->hasAuthorizedDirectConnection() ) + { +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "requested abortion completed, but ApplicationList object has object references: not deleting object."; +#endif + return; + } + +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "requested abortion completed, deleting ApplicationList object."; +#endif + + + // Use deleteLater() because this is called from the signal loop. + applicationList_->deleteLater(); + applicationList_ = 0; +} + + + +#include "contactbase.moc" diff --git a/kmess/contact/contactbase.h b/src/contact/contactbase.h similarity index 64% rename from kmess/contact/contactbase.h rename to src/contact/contactbase.h index a9ba362..41cb160 100644 --- a/kmess/contact/contactbase.h +++ b/src/contact/contactbase.h @@ -18,13 +18,16 @@ #ifndef CONTACTBASE_H #define CONTACTBASE_H -#include -#include +#include "../utils/richtextparser.h" +#include "msnstatus.h" -#include "../network/msnswitchboardconnection.h" +#include +class MsnSwitchboardConnection; class ApplicationList; +class MsnObject; + /** @@ -55,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). @@ -65,20 +69,29 @@ 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). MSN_CAP_MSN70 = 0x40000000, ///< 0x40000000, the client supports the P2P protocol features of MSNC4 (introduced with MSN 7.0). 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_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_MSN90beta = 0x90000000, ///< 0x90000000, the client supports the P2P protocol features of MSNC9 (introduced with WLM 9.0 beta). + MSN_CAP_MSN2009 = 0xa0000000, ///< 0xa0000000, the client supports the P2P protocol features of MSNC10 (introduced with WLM 2009). }; @@ -93,46 +106,65 @@ class ContactBase : public QObject void addSwitchboardConnection( const MsnSwitchboardConnection *connection ); // Initialize an application list for the contact. ApplicationList *createApplicationList(); + // Set the application name based on the capabilities + void detectClientName( uint capabilities, const MsnObject *msnObject ); // Return the application list of the contact ApplicationList *getApplicationList() const; // Return the capablities of the client the contact uses. uint getCapabilities() const; + // Return the name of the client used by the contact + const QString & getClientName( bool getFullNameIfAvailable = true ) const; // Return the default contact picture path QString getContactDefaultPicturePath() const; // Return the path to the contact's picture - virtual QString getContactPicturePath() const = 0; + virtual const 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 - const QString & getEmoticonCode(const QString &msnObjectDataHash) const; + QString getEmoticonCode(const QString &msnObjectDataHash) const; // Return the custom emoticon search pattern. const QRegExp & getEmoticonPattern() const; + // Return the custom emoticon hashes. + const QHash & getEmoticonHashes() const; // Return the custom emoticon replacements. - const QMap & getEmoticonReplacements() const; + const QHash & getEmoticonReplacements() const; // Return the contact's friendly name - virtual QString getFriendlyName() const; + virtual const QString& getFriendlyName( FormattingMode mode = STRING_CLEANED ) const; // Return the contact's handle - QString getHandle() const; + const QString& getHandle() const; // Return the search pattern for pending custom emoticons. const QRegExp & getPendingEmoticonPattern() const; // Return the contact's status - virtual QString getStatus() const = 0; + virtual Status getStatus() const = 0; // Return the list of switchboard connections - const QPtrList getSwitchboardConnections() const; + const QList getSwitchboardConnections() const; // Returns whether the contact has an application list initialized. bool hasApplicationList() const; + // Returns whether the contact has capability + bool hasCapability( MsnClientCapabilities flag ) const; // Returns whether the contact's client supports the given MSNP2P version bool hasP2PSupport( MsnClientCapabilities minimalVersion = MSN_CAP_MSN60 ) const; // Return true if the contact is offline 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. void setCapabilities(uint capabilities); + // Set the full name of the client used by the contact + void setClientFullName( const QString &clientFullName ); protected: // Protected methods // The constructor - ContactBase(QString handle, QString friendlyName, uint capabilities = 0); + ContactBase( const QString& handle, const QString& friendlyName, uint capabilities = 0); + // Set the full name of the client used by the contact + const QString & getClientFullName() const; + // Save the simple name of the client used by the contact + void setClientName( const QString &clientName ); + private slots: // The application list completed aborting it's applications. @@ -141,16 +173,24 @@ class ContactBase : public QObject protected: // Protected attributes // The capabilities of the client uint capabilities_; + // The name of the client application + QString clientName_; + // The third party client name field + QString clientFullName_; // The custom emoticons for the contact. - QMap customEmoticons_; + QHash customEmoticons_; + // The custom emoticon mappings from shortcut to hash. + QHash customHashes_; + // The list of custom emoticons to ignore for this contact + QStringList emoticonBlackList_; // The emoticon regexp QRegExp emoticonRegExp_; // The contact's friendly name - QString friendlyName_; + FormattedString friendlyName_; // 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 @@ -161,14 +201,18 @@ class ContactBase : public QObject // The list of peer-to-peer application invitations. ApplicationList *applicationList_; // The list of chat sessions the contact participates in. - QPtrList chatSessions_; + QList chatSessions_; + + private: // private methods + // Regenerate the pending emoticon regexp, because it was changed + void regeneratePendingEmoticonPattern(); signals: // Public signals // Signal that the contact's friendly name changed 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 new file mode 100644 index 0000000..34190c3 --- /dev/null +++ b/src/contact/contactextension.cpp @@ -0,0 +1,363 @@ +/*************************************************************************** + contactextension.cpp - description + ------------------- + begin : Fri 13 Dec 2002 + copyright : (C) 2003 by Michael Curtis. + email : mdcurtis@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "contactextension.h" + +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include + +#include +#include + + + +// The constructor with specified contact handle +ContactExtension::ContactExtension( Contact *contact ) + : QObject(), + alternativeName_(), + alternativePictureFile_(""), + disableNotifications_(false), + pictureFile_(""), + soundFile_(""), + useAlternativeName_(false) +{ + // Set the current contact and connect the contactOffline event for lastSeen entry + handle_ = contact->getHandle(); + contact_ = contact; + connect( contact_ , SIGNAL( contactOffline( Contact*, bool ) ), this, SLOT( setLastSeen() ) ); +} + + +// The destructor +ContactExtension::~ContactExtension() +{ +} + + + +// Clear the cache of picture files +void ContactExtension::clearCache() +{ + QFile file; + + // Grep all pictures and remove these + foreach( const QString &fileName, pictureFileList_ ) + { + // Remove the picture file + file.setFileName( fileName ); + if( file.exists() ) + { + file.remove(); + file.close(); + } + + // Remove the dat file + file.setFileName( fileName + ".dat" ); + if( file.exists() ) + { + file.remove(); + file.close(); + } + } + pictureFileList_.clear(); +} + + + +// Read the contact alias +const QString & ContactExtension::getAlternativeName( FormattingMode mode ) const +{ + return alternativeName_.getString( mode ); +} + + + +// Read the custom contact picture path +const QString& ContactExtension::getContactAlternativePicturePath() const +{ + return alternativePictureFile_; +} + + + +// Read the original contact picture path +const QString ContactExtension::getContactPicturePath() const +{ + if( QFile::exists( pictureFile_ ) ) + { + return pictureFile_; + } + + return QString::null; +} + + + +// Read the custom contact sound path +const QString ContactExtension::getContactSoundPath() const +{ + if( QFile::exists( soundFile_ ) ) + { + return soundFile_; + } + + return QString::null; +} + + + +// Read whether KMess should notify when this contact does an action +bool ContactExtension::getDisableNotifications() const +{ + return disableNotifications_; +} + + + +// Read when the contact has been seen the last time +const QDateTime& ContactExtension::getLastSeen() +{ + return lastSeen_; +} + + +// Read when the last message from this contact has been received +const QDateTime& ContactExtension::getLastMessageDate() +{ + return lastMessageDate_; +} + + + +// Get the notes about this contact +const QString& ContactExtension::getNotes() const +{ + return notes_; +} + + + +// Read whether to use the alias or not +bool ContactExtension::getUseAlternativeName() const +{ + return useAlternativeName_; +} + + + +// Read the list of pictures which the contact has used +const QStringList& ContactExtension::getPictureList() const +{ + return pictureFileList_; +} + + + +// Load extension settings for a contact +void ContactExtension::readProperties( const KConfigGroup &config ) +{ + // Get the configuration group where this contact's data is stored + 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_ = QDateTime::fromTime_t( extensionGroup.readEntry("lastSeen", 0 ) ); + lastMessageDate_ = QDateTime::fromTime_t( extensionGroup.readEntry("lastMessageDate", 0 ) ); + disableNotifications_ = extensionGroup.readEntry("disableNotifications", false ); + 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 ) ); +} + + + +// Save extension settings for a contact +void ContactExtension::saveProperties( KConfigGroup &config ) +{ + // Get the configuration group where this contact's data is stored + 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_ + && disableNotifications_ + && alternativeName_.getOriginal().isEmpty() + && alternativePictureFile_ .isEmpty() + && lastSeen_ .isNull() + && lastMessageDate_ .isNull() + && pictureFile_ .isEmpty() + && soundFile_ .isEmpty() ) + { +#ifdef KMESSDEBUG_CONTACTEXTENSION + if( extensionGroup.hasGroup( "Extension" ) ) + { + kDebug() << "Deleting unused contact info for" << handle_; + } + else + { + kDebug() << "Not saving unused contact info for" << handle_; + } +#endif + + config.deleteGroup( "Extension" ); + return; + } + + extensionGroup.writeEntry( "useAlternativeName", useAlternativeName_ ); + extensionGroup.writeEntry( "alternativePictureFile", alternativePictureFile_ ); + extensionGroup.writeEntry( "alternativeName", alternativeName_.getOriginal() ); + extensionGroup.writeEntry( "disableNotifications", disableNotifications_ ); + extensionGroup.writeEntry( "notes", notes_ ); + + // If the contact is connects, refresh the lastSeen before saves it + if( contact_->isOnline() ) + { + setLastSeen(); + } + + extensionGroup.writeEntry( "lastSeen", lastSeen_.toTime_t() ); + extensionGroup.writeEntry( "lastMessageDate", lastMessageDate_.toTime_t() ); + extensionGroup.writeEntry( "pictureFile", pictureFile_ ); + extensionGroup.writeEntry( "pictureFileList", pictureFileList_ ); + extensionGroup.writeEntry( "soundFile", soundFile_ ); +} + + + +// Change the contact alias +void ContactExtension::setAlternativeName( const QString& newAlternativeName ) +{ + // Ignore invalid requests + if( newAlternativeName.isEmpty() || newAlternativeName == alternativeName_.getOriginal() ) + { + return; + } + + // Copy the new name to the three versions + alternativeName_.setString( newAlternativeName ); + + if( getUseAlternativeName() ) + { + emit changedFriendlyName(); + } +} + + + +// Change the custom contact picture path +void ContactExtension::setContactAlternativePicturePath( const QString& _newVal ) +{ + alternativePictureFile_ = _newVal; +} + + + +// Change the original contact picture path +void ContactExtension::setContactPicturePath( const QString & _newVal ) +{ + pictureFile_ = _newVal; + + if( ! _newVal.isEmpty() ) + { + // If the current picture isn't in the list of all used pictures, + // then add it. + if( ! pictureFileList_.contains( _newVal ) ) + { + pictureFileList_.append( _newVal ); + } + + // If the picture file hasn't a dat file, then create it + // and put into the current date + QFile fileDat( _newVal + ".dat" ); + if( ! fileDat.exists () ) + { + if ( fileDat.open( QIODevice::WriteOnly | QIODevice::Text ) ) + { + QTextStream out( &fileDat ); + out << QDate::currentDate ().toString( Qt::SystemLocaleDate ); + fileDat.close(); + } + } + } + + emit changedPicture(); +} + + + +// Change the custom contact sound path +void ContactExtension::setContactSoundPath( const QString & _newVal) +{ + soundFile_ = _newVal; +} + + + +// Write whether KMess should notify when this contact change status or do any actions +void ContactExtension::setDisableNotifications( bool _newVal ) +{ + disableNotifications_ = _newVal; +} + + + +// Set when the contact has been seen the last time +void ContactExtension::setLastSeen() +{ + lastSeen_ = QDateTime::currentDateTime(); +} + + + +// Set the time of the last received message from this contact +void ContactExtension::setLastMessageDate() +{ + lastMessageDate_ = QDateTime::currentDateTime(); +} + + + +// Write the notes about this contact +void ContactExtension::setNotes( const QString& _newVal ) +{ + notes_ = _newVal; +} + + + +// Set whether to use the alias or not +void ContactExtension::setUseAlternativeName( bool _newVal) +{ + bool needUpdate; + + needUpdate = ( useAlternativeName_ != _newVal); + + useAlternativeName_ = _newVal; + + if ( needUpdate == true ) emit changedFriendlyName(); +} + + + +#include "contactextension.moc" diff --git a/kmess/contact/contactextension.h b/src/contact/contactextension.h similarity index 50% rename from kmess/contact/contactextension.h rename to src/contact/contactextension.h index 5225686..1384cce 100644 --- a/kmess/contact/contactextension.h +++ b/src/contact/contactextension.h @@ -18,15 +18,19 @@ #ifndef CONTACTEXTENSION_H #define CONTACTEXTENSION_H -#include - -#include - +#include "../utils/richtextparser.h" #include "contactbase.h" +#include "contact.h" + +#include +#include + // forward declarations class Contact; -class KConfig; +class KConfigGroup; + + /** * @brief Additional KMess-specific properties of a contact. @@ -45,51 +49,75 @@ class ContactExtension : public QObject public: // The constructor with specified contact handle - ContactExtension(QString handle); + ContactExtension( Contact *contact ); // The destructor - ~ContactExtension(); + ~ContactExtension(); - // Read property of QString alternativeName_. - const QString & getAlternativeName() const; - // Read property of QString pictureFile_. + // Clear the cache of picture files + void clearCache(); + // Read the contact alias + const QString & getAlternativeName( FormattingMode mode = STRING_CLEANED ) const; + // Read the custom contact picture path + const QString & getContactAlternativePicturePath() const; + // Read the original contact picture path const QString getContactPicturePath() const; - // Read property of QString soundFile_. + // Read the custom contact sound path const QString getContactSoundPath() const; - // Read property of QString clientName_ - const QString getClientName() const; - // Read property of bool notifyOnline_ - bool getNotifyOnline() const; - // Read property of bool useAlternativeName_. + // Read whether KMess should notify when this contact does an action + bool getDisableNotifications() const; + // Read when the contact has been seen the last time + const QDateTime& getLastSeen(); + // Read when the last message from this contact has been received + const QDateTime& getLastMessageDate(); + // Get the notes about this contact + const QString& getNotes() const; + // Read whether to use the alias or not bool getUseAlternativeName() const; + // Read the list of pictures which the contact has used + const QStringList& getPictureList() const; // Load extension settings for a contact - void readProperties(KConfig *config); + void readProperties( const KConfigGroup &config ); // Save extension settings for a contact - void saveProperties(KConfig *config); - // Write property of QString alternativeName_. - void setAlternativeName( const QString& _newVal ); - //Write property of QString clientname_. - void setClientName ( const QString& _newVal ); - // Write property of QString pictureFile_. + void saveProperties( KConfigGroup &config ); + // Change the contact alias + void setAlternativeName( const QString& newAlternativeName ); + // Change the custom contact picture path + void setContactAlternativePicturePath( const QString& _newVal ); + // Change the original contact picture path void setContactPicturePath( const QString& _newVal ); - // Write property of QString soundFile_. + // Change the custom contact sound path void setContactSoundPath( const QString& _newVal ); - // Write property of bool notifyOnline_ - void setNotifyOnline( bool _newVal ); - // Write property of bool useAlternativeName_; + // Write whether KMess should notify when this contact change status or do any actions + void setDisableNotifications( bool _newVal ); + // Set the time of the last received message from this contact + void setLastMessageDate(); + // Write the notes about this contact + void setNotes( const QString& _newVal ); + // Set whether to use the alias or not void setUseAlternativeName( bool _newVal ); private: // Private attributes // The alternative name - QString alternativeName_; - // The client name used by the user - QString clientName_; + FormattedString alternativeName_; + // The alternative picture + QString alternativePictureFile_; + // The current contact + Contact *contact_; + // Whether or not to notify actions + bool disableNotifications_; // The contact's handle (ie email) QString handle_; - // Whether or not to notify online/offline status - bool notifyOnline_; + // The last date the contact has been seen + QDateTime lastSeen_; + // The date the last message has been received + QDateTime lastMessageDate_; + // The contact's notes string + QString notes_; // A picture used for the "contact is online" balloons QString pictureFile_; + // A list of all pictures used by the contact + QStringList pictureFileList_; // A sound played when the contact is online QString soundFile_; // Whether or not we should use the alternative name stored in the class @@ -101,5 +129,9 @@ class ContactExtension : public QObject // Signal that the contact's picture path has changed void changedPicture(); + private slots: + // Set when the contact has been seen the last time + void setLastSeen(); + }; #endif diff --git a/kmess/contact/group.cpp b/src/contact/group.cpp similarity index 54% rename from kmess/contact/group.cpp rename to src/contact/group.cpp index 2d825ac..bf798ad 100644 --- a/kmess/contact/group.cpp +++ b/src/contact/group.cpp @@ -17,21 +17,15 @@ #include "group.h" -#include -#include -#include - +#include "../utils/kmessconfig.h" #include "../currentaccount.h" #include "../kmessdebug.h" -#include "../specialgroups.h" +#include "specialgroups.h" -// The current default position of the groups -int Group::groupDefaultPosition_(0); - // The constructor -Group::Group(QString id, QString name) +Group::Group(const QString &id, const QString &name) : id_(id), isExpanded_(true), name_(name), @@ -43,8 +37,6 @@ Group::Group(QString id, QString name) ( id_ == SpecialGroups::ALLOWED ) || ( id_ == SpecialGroups::REMOVED ) || ( id_ == SpecialGroups::INDIVIDUALS ); - - readProperties(); } @@ -53,7 +45,7 @@ Group::Group(QString id, QString name) Group::~Group() { #ifdef KMESSDEBUG_GROUP - kdDebug() << "DESTROYED Group [handle=" << name_ << ", id=" << id_ << "]" << endl; + kDebug() << "DESTROYED. [handle=" << name_ << ", id=" << id_ << "]"; #endif } @@ -76,6 +68,14 @@ const QString& Group::getName() const +// Return the old sort value (XXX HACK FIXME OMG) +int Group::getOldSortPosition() const +{ + return oldSortPosition_; +} + + + // Return the sort value int Group::getSortPosition() const { @@ -101,76 +101,82 @@ bool Group::isSpecialGroup() const // Read in group properties -void Group::readProperties() +void Group::readProperties( const KConfigGroup &config ) { - KConfig *config = kapp->config(); + // Get the configuration group where this group's data is stored + const KConfigGroup& groupConfig( config.group( id_ ) ); - if(! isSpecialGroup()) + // Obtain the sort positiong of this group. Special groups have no sorting. + if( ! isSpecialGroup() ) { - config->setGroup("Profile_" + CurrentAccount::instance()->getHandle()); - sortPosition_ = config->readNumEntry ( "group_" + id_ + "_sortingPosition", groupDefaultPosition_++ ); + sortPosition_ = groupConfig.readEntry( "sortPosition", sortPosition_ ); } else { - config->setGroup("Profile_GENERAL"); - sortPosition_ = 9999; // Special groups have no sorting. + sortPosition_ = 9999; } - isExpanded_ = config->readBoolEntry( "group_" + id_ + "_isexpanded", true ); +#ifdef KMESSDEBUG_GROUP + kDebug() << "Read sort position for group " << name_ << "=" << sortPosition_; +#endif + + // Is the group expanded? that is, can the user see the group's contacts? + isExpanded_ = groupConfig.readEntry( "isExpanded", true ); } // Save group properties -void Group::saveProperties(KConfig *config) +void Group::saveProperties( KConfigGroup &config ) { - if( CurrentAccount::instance()->isGuestAccount() ) + // Get the configuration group where this group's data is stored + KConfigGroup groupConfig( config.group( id_ ) ); + + // Save the sort positiong of this group. Special groups have no sorting. + if( ! isSpecialGroup() ) { - kdWarning() << "ContactList: Request to save properties, but account is a temporary guest account!" << endl; + groupConfig.writeEntry( "sortPosition", sortPosition_ ); } - if(! isSpecialGroup()) - { - config->setGroup("Profile_" + CurrentAccount::instance()->getHandle()); - config->writeEntry("group_" + id_ + "_sortingPosition", sortPosition_); - } - else - { - config->setGroup("Profile_GENERAL"); - // Special groups have no sorting. - } - - config->writeEntry("group_" + id_ + "_isexpanded", isExpanded_); + groupConfig.writeEntry( "isExpanded", isExpanded_ ); } // Change the group name -void Group::setName(const QString& newName) +void Group::setName( const QString &newName ) { #ifdef KMESSTEST - ASSERT( newName != "" ); - ASSERT( ( id_ != SpecialGroups::ONLINE ) && ( id_ != SpecialGroups::OFFLINE ) && ( id_ != SpecialGroups::ALLOWED ) && ( id_ != SpecialGroups::REMOVED ) ); + 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; - emit nameChanged(); } } // Change the sort position -void Group::setSortPosition(int sortPosition) +void Group::setSortPosition( int sortPosition ) { #ifdef KMESSDEBUG_GROUP - kdDebug() << "Group " << name_ << " new sort position = " << sortPosition << endl; + kDebug() << "Group " << name_ << " old sort position = " << sortPosition_ + << "new sort position = " << sortPosition; #endif - sortPosition_ = sortPosition; - emit sortPositionChanged(); + oldSortPosition_ = sortPosition_; + sortPosition_ = sortPosition; + emit changedPosition( this, oldSortPosition_, sortPosition_ ); +} + + + +void Group::setOldSortPosition( int oldSortPosition ) +{ + oldSortPosition_ = oldSortPosition; } @@ -179,7 +185,6 @@ void Group::setSortPosition(int sortPosition) void Group::setExpanded(bool expanded) { isExpanded_ = expanded; - emit expandedStateChanged(); } diff --git a/kmess/contact/group.h b/src/contact/group.h similarity index 73% rename from kmess/contact/group.h rename to src/contact/group.h index e89251e..42088c1 100644 --- a/kmess/contact/group.h +++ b/src/contact/group.h @@ -18,10 +18,8 @@ #ifndef GROUP_H #define GROUP_H -#include +#include -// Forward declarations -class KConfig; /** @@ -42,31 +40,33 @@ class Group : public QObject public: // Public methods // The constructor - Group(QString id, QString name); + Group( const QString &id, const QString &name ); // The destructor - ~Group(); + virtual ~Group(); // Return the group ID const QString& getId() const; // Return the group name const QString& getName() const; // Return the sort value int getSortPosition() const; + // Return the previous sort value when swapping groups (XXX HACK FIXME OMG) + int getOldSortPosition() const; // Return true if this group is expanded. bool isExpanded() const; // Return true if this is a special group bool isSpecialGroup() const; - // Save group properties - void saveProperties(KConfig *config); - // Change the group name - void setName(const QString& newName); - // Change the sort position - void setSortPosition(int sortPosition); - // Change the expanded state - void setExpanded(bool expanded); - - private: // Private methods // Read in group properties - void readProperties(); + void readProperties( const KConfigGroup &config ); + // Save group properties + void saveProperties( KConfigGroup &config ); + // Change the group name + void setName( const QString& newName ); + // Change the sort position + void setSortPosition( int sortPosition ); + // Change the old sort position (XXX HACK FIXME OMG) + void setOldSortPosition( int oldSortPosition ); + // Change the expanded state + void setExpanded( bool expanded ); private: // Private attributes // The group id @@ -79,17 +79,11 @@ class Group : public QObject QString name_; // The group's sort value int sortPosition_; - // The sequential default groups sorting value - static int groupDefaultPosition_; - - signals: // Public signals - // The expanded state was changed - void expandedStateChanged(); - // The name was changed - void nameChanged(); - // The sorting index was changed - void sortPositionChanged(); + // The group's previous sort value when swapping groups (XXX HACK FIXME OMG) + int oldSortPosition_; + signals: + void changedPosition( Group*, int oldPosition, int newPosition ); }; #endif diff --git a/kmess/contact/invitedcontact.cpp b/src/contact/invitedcontact.cpp similarity index 80% rename from kmess/contact/invitedcontact.cpp rename to src/contact/invitedcontact.cpp index 61a9d9e..3165840 100644 --- a/kmess/contact/invitedcontact.cpp +++ b/src/contact/invitedcontact.cpp @@ -20,10 +20,12 @@ #include "../kmessdebug.h" + // The constructor -InvitedContact::InvitedContact(QString handle, QString friendlyName, uint capabilities) +InvitedContact::InvitedContact( const QString &handle, const QString &friendlyName, uint capabilities) : ContactBase(handle, friendlyName, capabilities) { + detectClientName( capabilities, 0 ); } @@ -32,13 +34,13 @@ InvitedContact::InvitedContact(QString handle, QString friendlyName, uint capabi InvitedContact::~InvitedContact() { #ifdef KMESSDEBUG_INVITEDCONTACT - kdDebug() << "DESTROYED InvitedContact [" << getHandle() << "]" << endl; + kDebug() << "DESTROYED. [" << getHandle() << "]"; #endif } // Return the path to the contact's picture -QString InvitedContact::getContactPicturePath() const +const QString InvitedContact::getContactPicturePath() const { return getContactDefaultPicturePath(); } @@ -46,10 +48,10 @@ QString InvitedContact::getContactPicturePath() const // Return the contact's status -QString InvitedContact::getStatus() const +Status InvitedContact::getStatus() const { - // Since no status updates are returned for a contact not on the list, return "Online". - return "NLN"; + // Since no status updates are returned for a contact not on the list, return "Invisible". + return STATUS_INVISIBLE; } diff --git a/kmess/contact/invitedcontact.h b/src/contact/invitedcontact.h similarity index 85% rename from kmess/contact/invitedcontact.h rename to src/contact/invitedcontact.h index 0998a0d..8636a42 100644 --- a/kmess/contact/invitedcontact.h +++ b/src/contact/invitedcontact.h @@ -20,6 +20,8 @@ #include "../contact/contactbase.h" + + /** * @brief Data class for contacts that are not in your MSN ContactList. * @@ -28,6 +30,7 @@ * If your privacy settings allow this, contacts can always start a chat with you (even if they're not on your AL/BL/FL/RL lists). * * @author Mike K. Bennett + * @ingroup Contact */ class InvitedContact : public ContactBase { @@ -35,13 +38,13 @@ 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 - ~InvitedContact(); + virtual ~InvitedContact(); // Return the path to the contact's picture - QString getContactPicturePath() const; + const QString getContactPicturePath() const; // Return the contact's status - QString getStatus() const; + Status getStatus() const; }; #endif diff --git a/kmess/msnobject.cpp b/src/contact/msnobject.cpp similarity index 50% rename from kmess/msnobject.cpp rename to src/contact/msnobject.cpp index 7e72296..5bfefc9 100644 --- a/kmess/msnobject.cpp +++ b/src/contact/msnobject.cpp @@ -17,27 +17,30 @@ #include "msnobject.h" -#include "crypt/sha1.h" +#include "../kmessdebug.h" + +#include +#include +#include +#include -#include -#include -#include -#include // The constructor MsnObject::MsnObject() : size_(0) + , type_( INVALID ) { } + MsnObject::MsnObject(const QString &object) : original_(object) { if( object.isEmpty() ) { - kdWarning() << "MsnObject: passed object is empty." << endl; + kWarning() << "passed object is empty."; return; } @@ -45,6 +48,7 @@ MsnObject::MsnObject(const QString &object) } + // Copy constructor MsnObject::MsnObject(const MsnObject &other) : creator_(other.creator_) @@ -56,17 +60,19 @@ MsnObject::MsnObject(const MsnObject &other) , sha1d_(other.sha1d_) , sha1c_(other.sha1c_) { - + } -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(); @@ -77,8 +83,6 @@ MsnObject::MsnObject(const QString &creator, const QString &location, - - // The destructor MsnObject::~MsnObject() { @@ -89,23 +93,21 @@ MsnObject::~MsnObject() // Parse an attribute from the object string QString MsnObject::getAttribute( const QString& name, const QString& object ) { - QString value; - int index; - QRegExp findAttribute( name + "=\"([^ ]*)\"" ); + // Find attribute + QRegExp findAttribute( name + "=\"([^ ]*)\"" ); + int index = findAttribute.indexIn( object ); - index = findAttribute.search( object ); - if ( index >= 0 ) + // Return if found + if( index >= 0 && findAttribute.numCaptures() > 0 ) { - if ( findAttribute.numCaptures() > 0 ) - { - value = findAttribute.capturedTexts()[1]; - } + return findAttribute.cap( 1 ); } - return value; + return QString::null; } + // Get the sha1c hash const QString MsnObject::getContentHash() const { @@ -113,6 +115,7 @@ const QString MsnObject::getContentHash() const } + // Get the object's creator const QString& MsnObject::getCreator() const { @@ -120,6 +123,7 @@ const QString& MsnObject::getCreator() const } + // Get the sha1d hash const QString MsnObject::getDataHash() const { @@ -134,6 +138,7 @@ const QString& MsnObject::getLocation() const } + const QString& MsnObject::getFriendly() const { // This is actually base-64 encoded. We must decode it before @@ -142,6 +147,7 @@ const QString& MsnObject::getFriendly() const } + // Get the object's size int MsnObject::getSize() const { @@ -158,6 +164,14 @@ MsnObject::MsnObjectType MsnObject::getType() const +// Get if this is a valid MSNObject. +bool MsnObject::isValid() const +{ + return ( type_ != INVALID ); +} + + + // Use an MSN object descriptor from the server to load data void MsnObject::loadObject( const QString& object ) { @@ -165,87 +179,76 @@ void MsnObject::loadObject( const QString& object ) location_ = getAttribute( "Location", object ); size_ = getAttribute( "Size", object ).toInt(); type_ = (MsnObjectType)getAttribute( "Type", object ).toInt(); - sha1d_ = getAttribute("SHA1D", object).utf8(); - sha1c_ = getAttribute("SHA1C", object).utf8(); + sha1d_ = getAttribute("SHA1D", object).toUtf8(); + sha1c_ = getAttribute("SHA1C", object).toUtf8(); - // Get friendly name, make sure it's parsed correctly - QString friendlyEncoded = getAttribute( "Friendly", object ); - if( ! friendlyEncoded.contains("AA") ) + // Get the friendly name from the object + const QString& friendlyEncoded( getAttribute( "Friendly", object ) ); + + // The string is empty, store an empty friendly + if( friendlyEncoded.isEmpty() ) { - // This could cause crashes. - kdWarning() << "MsnObject: friendly name is missing a null-terminator (contact=" << creator_ << ")!" << endl; - } - else - { - QByteArray friendlyUcs2; - KCodecs::base64Decode( friendlyEncoded.utf8(), friendlyUcs2 ); - friendly_ = QString::fromUcs2( reinterpret_cast(friendlyUcs2.data()) ); + friendly_ = QString(); + return; } - // Bah! Verification is for the weak. - //if(!verifyObjectHash()) - //{ - // kdDebug() << "Hash does not match!"; - // kdDebug() << "MSN6 data for contact: " << creator_ << " " << location_ << " " << size_ << " " << type_ << " " << getFriendly() << endl; // kdDebug() << "Real sha1c " << sha1c_ << " vs. calculated " << generateObjectHash() << endl; - //} + // Don't check for invalid characters in the encoded string, QByteArray does it + const QByteArray friendlyUcs2( QByteArray::fromBase64( friendlyEncoded.toUtf8() ) ); + friendly_ = QString::fromUtf16( reinterpret_cast( friendlyUcs2.data() ), friendlyUcs2.size() ).toUtf8(); } + bool MsnObject::verifyObjectHash() const { - // And yes, QCString overloads operator== + // And yes, QByteArray overloads operator== return generateObjectHash() == sha1c_; } + bool MsnObject::verifyFile( const QString &fileName ) const { QFile file( fileName ); - if( ! file.open( IO_ReadOnly ) ) + if( ! file.open( QIODevice::ReadOnly ) ) { - kdWarning() << "MsnObject::verifyFile() - unable to open file '" << fileName << "'." << endl; + kWarning() << "unable to open file '" << fileName << "'."; return false; } - QByteArray fileData = file.readAll(); + const QByteArray& fileData( file.readAll() ); file.close(); return generateDataHash( fileData ) == sha1d_; } -const QCString MsnObject::generateDataHash( const QByteArray &fileData ) const + +const QByteArray MsnObject::generateDataHash( const QByteArray &fileData ) const { - Sha1 sha1; - QByteArray hash; - hash.duplicate( (const char *) sha1.calcSha1( (const byte *) fileData.data(), fileData.size() ), 20 ); - return KCodecs::base64Encode(hash); + // Thanks Qt 4.3... :-) + return QCryptographicHash::hash( fileData, QCryptographicHash::Sha1 ).toBase64(); } -const QCString MsnObject::generateObjectHash() const + + +const QByteArray MsnObject::generateObjectHash() const { - // First, we must build the string that needs to be hashed. - // See amsn protocol.tcl (create_msnobj) for an example. - // We concatenate field names with their values, in the following order: - // Creator, Size, Type, Location, Friendly, SHA1D - QCString baseString= "Creator" + creator_.utf8() + - "Size" + QString::number(size_).utf8() + - "Type" + QString::number((int)type_).utf8() + - "Location" + location_.utf8() + - "Friendly" + friendly_.utf8() + - "SHA1D" + sha1d_; + // Generate input + // 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_ ); - // Sha1 the thing - QByteArray shaData(20); // 160 bits of output - Sha1 sha1; - shaData.duplicate( (const char *) sha1.calcSha1( (const byte*) baseString.data(), baseString.length() ), 20 ); - - // Return the base64-encoded version - // No worry about linefeeds: should come out to 28 bytes - return KCodecs::base64Encode(shaData); + // Hash as sha1, and encode with base64 + return QCryptographicHash::hash( baseString, QCryptographicHash::Sha1 ).toBase64(); } + const QString MsnObject::objectString() const { if( ! original_.isEmpty() ) @@ -253,7 +256,7 @@ const QString MsnObject::objectString() const return original_; } - QCString friendlyBase64; + QByteArray friendlyBase64; if( friendly_.length() == 0 ) { @@ -261,37 +264,34 @@ const QString MsnObject::objectString() const } else { - QByteArray friendlyUcs2; - int size = friendly_.length() * 2; - // Copy existing UTF16 string to an QByteArray - friendlyUcs2.duplicate( reinterpret_cast(friendly_.ucs2()), size ); - // Add null-padding - friendlyUcs2.resize( size + 4 ); - friendlyUcs2[size + 0] = '\0'; - friendlyUcs2[size + 1] = '\0'; - friendlyUcs2[size + 2] = '\0'; - friendlyUcs2[size + 3] = '\0'; - - // To BASE64 encoding. - friendlyBase64 = KCodecs::base64Decode(friendlyUcs2); + // remains valid until string is modified. + const char *ucs2Data = reinterpret_cast( friendly_.utf16() ); + friendlyBase64 = QByteArray( ucs2Data ).toBase64(); } // Create msn object string. - return QString( - "" - ) - .arg(creator_).arg(size_).arg(type_).arg(location_).arg(friendlyBase64) - .arg(sha1d_).arg(sha1c_); + QString msnObjectString( ""; } bool MsnObject::hasChanged( const QString &newObj ) const { - // TODO: The QString comparing with != should be overridden to match on QCStrings or char*'s - // If no hash is present we can't check it, assume it's changed. // Will probably just waste a bit of bandwidth. if( sha1c_.isEmpty() && sha1d_.isEmpty() ) @@ -299,16 +299,16 @@ 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() ) { // If false the data is the same, the object hasn't changed - return ( sha1d_ != objSha1d.utf8() ); + return ( sha1d_ != objSha1d.toUtf8() ); } // The data hash is not available: use the full object hash - - return ( sha1c_ != getAttribute( "SHA1C", newObj ).utf8() ); + return ( sha1c_ != getAttribute( "SHA1C", newObj ).toUtf8() ); } + diff --git a/kmess/msnobject.h b/src/contact/msnobject.h similarity index 89% rename from kmess/msnobject.h rename to src/contact/msnobject.h index 6de4dfa..c489c43 100644 --- a/kmess/msnobject.h +++ b/src/contact/msnobject.h @@ -18,7 +18,9 @@ #ifndef MSNOBJECT_H #define MSNOBJECT_H -#include +#include + + /** * @brief Data class for the msnobject tag. @@ -27,7 +29,7 @@ * contact pictures, emoticons and backgrounds. * * @author Mike K. Bennett - * @ingroup Root + * @ingroup Contact */ class MsnObject { @@ -37,6 +39,7 @@ class MsnObject // Some ID's are never sent as invitation enum MsnObjectType { + INVALID = 0, // KMess-specific // 1 is unused (avatar) EMOTICON = 2, DISPLAYPIC = 3, @@ -77,10 +80,11 @@ class MsnObject * @param type The type of object. * @param fileData The file this MsnObject represents. The data is * used to calculate the data hash and file size. + * @param stamp The base64-encoded certificate (useful for winks) */ 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(); @@ -100,6 +104,12 @@ class MsnObject const QString getDataHash() const; + /** + * Get if this is a valid MSNObject. + */ + bool isValid() const; + + /** * Verify the hash of the MSNObject. * Assuming we have all the fields, in the right order, @@ -130,16 +140,15 @@ 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 QCString generateDataHash( const QByteArray &fileData ) const; + const QByteArray generateDataHash( const QByteArray &fileData ) const; /// Generate the base64-encoded sha1 hash for this object - const QCString generateObjectHash() const; + const QByteArray generateObjectHash() const; /// Use an MSN object descriptor from the server to load data void loadObject( const QString& object ); @@ -158,9 +167,11 @@ class MsnObject // The type of the object MsnObjectType type_; // The base64-encoded SHA1 hash of the MsnObject's data - QCString sha1d_; + QByteArray sha1d_; // The base64-encoded SHA1 hash of the MsnObject string itself - QCString sha1c_; + QByteArray sha1c_; + // The base-64 encoded certificate useful for winks + QByteArray stamp_; }; diff --git a/src/contact/msnstatus.cpp b/src/contact/msnstatus.cpp new file mode 100644 index 0000000..1c85495 --- /dev/null +++ b/src/contact/msnstatus.cpp @@ -0,0 +1,253 @@ +/*************************************************************************** + contactstatus.cpp + ------------------- + begin : Sunday March 9th 2008 + copyright : (C) 2008 by Richard Conway + email : richardconway1984 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 "msnstatus.h" + +#include "../kmessdebug.h" + +#include +#include +#include +#include +#include + + +// Initialize the status menu +KMenu* MsnStatus::statusMenu_( 0 ); + +MsnStatus::~MsnStatus() +{ + delete statusMenu_; +} + +/** + * Returns an icon for the specified status + * + * Additionally, you can specify a flag you want to overlay on the status icon. + * + * @param status Status for which to create the picture + * @param flags Optional flags to add overlays, @see Flags enum + * @return The status icon + */ +QPixmap MsnStatus::getIcon( const Status status, const Flags flags ) +{ + 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; + + // Set the base icon depending on the status + switch( status ) + { + 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-extended"; + iconOverlay = "contact_phone_overlay"; + break; + + case STATUS_OUT_TO_LUNCH: + iconBase = "user-away-extended"; + iconOverlay = "contact_food_overlay"; + break; + + default: + kWarning() << "Invalid status" << status << "!"; + } + + // Choose the picture's overlay, if any. + // FIXME: there is no 'blocked' image or overlay image in the oxygen icon set + // One may be released in time, for now use the busy overlay as it looks the part + // in the CURRENT oxygen theme! this may change + switch( flags ) + { + case FlagNone: break; + case FlagBlocked: iconOverlay = "contact_busy_overlay"; break; + case FlagWebMessenger: break; + case FlagMobile: break; + } + + // Load the icon + QPixmap icon = KIconLoader::global()->loadIcon( iconBase, KIconLoader::Small ); + + // Add the overlay if needed + if( ! iconOverlay.isEmpty() ) + { + // Add the overlay image to our icon + QPixmap overlayIcon = KIconLoader::global()->loadIcon( iconOverlay, KIconLoader::Small ); + QImage iconImage = icon.toImage(); + QImage overlayImage = overlayIcon.toImage(); + + KIconEffect::overlay( iconImage, overlayImage ); + icon = QPixmap::fromImage( iconImage ); + } + + return icon; +} + + + +/** + * Returns a three-letter code (like BSY for Busy) for a status + * + * @param status The status to convert + * @return Three-letter status code + */ +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_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" ); + } +} + + + +/** + * Returns the localized name for a status + * + * @param status The status to convert + * @return Localized status name + */ +QString MsnStatus::getName( const Status status ) +{ + // Localize and return the status name + switch( status ) + { + 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" ); + } +} + + + +/** + * 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 + * + * @param status The status to convert + * @return MSN Status enum value + */ +Status MsnStatus::codeToStatus( const QString &status ) +{ + if( status == "AWY" ) return STATUS_AWAY; + else if( status == "BRB" ) return STATUS_BE_RIGHT_BACK; + else if( status == "BSY" ) return STATUS_BUSY; + else if( status == "FLN" ) return STATUS_OFFLINE; + else if( status == "HDN" ) return STATUS_INVISIBLE; + else if( status == "IDL" ) return STATUS_IDLE; + else if( status == "LUN" ) return STATUS_OUT_TO_LUNCH; + else if( status == "NLN" ) return STATUS_ONLINE; + else if( status == "PHN" ) return STATUS_ON_THE_PHONE; + else + { + kWarning() << "Invalid status" << status << "!"; + return STATUS_ONLINE; + } +} + + diff --git a/src/contact/msnstatus.h b/src/contact/msnstatus.h new file mode 100644 index 0000000..a8997af --- /dev/null +++ b/src/contact/msnstatus.h @@ -0,0 +1,102 @@ +/*************************************************************************** + contactstatus.h + ------------------- + begin : Saturday March 8th 2008 + copyright : (C) 2008 by Richard Conway + email : richardconway1984 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 MSNSTATUS_H +#define MSNSTATUS_H + +#include + + +// Forward declarations +class KMenu; + + + +/** + * Available MSN states + * @ingroup Contact + */ +enum Status +{ + 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) +}; + + +/** + * Contact flags + * + * These can be used to apply icon overlays to the status icons + * @ingroup Contact + */ +enum Flags +{ + FlagNone = 0 + , FlagBlocked + , FlagWebMessenger + , FlagMobile +}; + + +/** + * Contact Status management class + * + * This class contains everything we need to manage the MSN states. + * The main enumeration which contains the MSN states can be used + * along the conversion methods, which translate the enum values to + * string (the three letter character codes like NLN for Online) and + * to localized strings (like "Out to lunch"). There's also a method + * to translate the status values to the relative status icon. + * + * @author Valerio Pilo + * @author Richard Conway + * @ingroup Contact + */ +class MsnStatus +{ + public: // Public static methods + ~MsnStatus(); + + // Returns an icon for a status + static QPixmap getIcon( const Status status, const Flags flags = FlagNone ); + // Returns a three-letter code (like BSY) for a status + static QString getCode( const Status status ); + // Returns the localized name for a status + static QString getName( 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_; +}; + + +#endif diff --git a/kmess/specialgroups.h b/src/contact/specialgroups.h similarity index 93% rename from kmess/specialgroups.h rename to src/contact/specialgroups.h index 9aa0e75..9ded76d 100644 --- a/kmess/specialgroups.h +++ b/src/contact/specialgroups.h @@ -15,12 +15,17 @@ * * ***************************************************************************/ -// Define the special groups here #ifndef SPECIALGROUPS_H #define SPECIALGROUPS_H -#include +#include + + +/** + * Defines for the special groups + * @ingroup Contact + */ namespace SpecialGroups { const QString INDIVIDUALS = "individuals"; @@ -30,4 +35,6 @@ namespace SpecialGroups const QString REMOVED = "removed"; } + + #endif diff --git a/kmess/currentaccount.cpp b/src/currentaccount.cpp similarity index 50% rename from kmess/currentaccount.cpp rename to src/currentaccount.cpp index 7313c99..22f9bca 100644 --- a/kmess/currentaccount.cpp +++ b/src/currentaccount.cpp @@ -17,28 +17,21 @@ #include "currentaccount.h" -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "kmessdebug.h" -#include "contact/contactlist.h" +#include "contact/contactbase.h" #include "contact/contact.h" #include "contact/invitedcontact.h" +#include "model/contactlist.h" +#include "utils/kmessconfig.h" +#include "utils/kmessshared.h" +#include "emoticonmanager.h" +#include "kmess.h" +#include "kmessapplication.h" +#include "kmessdebug.h" + +#include +#include + + // Initialize the instance to zero CurrentAccount* CurrentAccount::instance_(0); @@ -48,9 +41,8 @@ CurrentAccount::CurrentAccount() : autoreply_(false), contactList_(0), externalPort_(0), - loginTime_(0), noEmails_(0), - status_("FLN") + status_(STATUS_OFFLINE) { } @@ -60,13 +52,14 @@ CurrentAccount::CurrentAccount() CurrentAccount::~CurrentAccount() { #ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "DESTROYED CurrentAccount " << endl; + kDebug() << "DESTROYED."; #endif // Delete all remaining invited contacts - invitedContacts_.setAutoDelete(true); + qDeleteAll( invitedContacts_ ); invitedContacts_.clear(); + // Unset the instance instance_ = 0; } @@ -76,15 +69,15 @@ CurrentAccount::~CurrentAccount() InvitedContact * CurrentAccount::addInvitedContact( const QString &handle, const QString &friendlyName, const uint capabilities ) { #ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount::addInvitedContact " << handle << endl; + kDebug() << handle; #endif #ifdef KMESSTEST - ASSERT( ! handle.isEmpty() ); + KMESS_ASSERT( ! handle.isEmpty() ); #endif if(getContactByHandle(handle) != 0) { - kdWarning() << "CurrentAccount::addInvitedContact: attempted to add contact " << handle << " twice." << endl; + kWarning() << "attempted to add contact " << handle << " twice."; return 0; } @@ -115,7 +108,7 @@ void CurrentAccount::changeNoEmails( int change ) #endif setNoEmails( noEmails_ + change ); #ifdef KMESSTEST - ASSERT( ( noEmails_ == ( oldNoEmails + change ) ) || ( noEmails_ == 0 ) ); + KMESS_ASSERT( ( noEmails_ == ( oldNoEmails + change ) ) || ( noEmails_ == 0 ) ); #endif } @@ -147,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 { @@ -180,17 +165,16 @@ ContactBase * CurrentAccount::getContactByHandle(const QString &handle) const // Return a contact's name by handle -QString CurrentAccount::getContactFriendlyNameByHandle(const QString &handle) const +QString CurrentAccount::getContactFriendlyNameByHandle( const QString &handle, FormattingMode mode ) const { - ContactBase *contact = getContactByHandle(handle); + ContactBase *contact = getContactByHandle( handle ); + if( contact == 0 ) { - return QString::null; - } - else - { - return contact->getFriendlyName(); + return QString(); } + + return contact->getFriendlyName( mode ); } @@ -235,10 +219,10 @@ uint CurrentAccount::getExternalPort() const -// Return the inbox command. -const QString& CurrentAccount::getInboxCommand() const +// Return the language code setted for current account +const QString& CurrentAccount::getLanguageCode() const { - return inboxCommand_; + return languageCode_; } @@ -246,15 +230,12 @@ const QString& CurrentAccount::getInboxCommand() const // Find an invited contact by handle InvitedContact * CurrentAccount::getInvitedContactByHandle(const QString &handle) const { - QPtrListIterator it( invitedContacts_ ); - while( it.current() != 0 ) + foreach( InvitedContact *contact, invitedContacts_ ) { - if( it.current()->getHandle() == handle ) + if( contact->getHandle() == handle ) { - return static_cast( it.current() ); + return contact; } - - ++it; } return 0; @@ -262,6 +243,14 @@ InvitedContact * CurrentAccount::getInvitedContactByHandle(const QString &handle +// Return the key for offline im messages +const QString& CurrentAccount::getOfflineImKey() const +{ + return offlineImKey_; +} + + + // Return the local IP. const QString& CurrentAccount::getLocalIp() const { @@ -277,28 +266,27 @@ int CurrentAccount::getNoEmails() const -// Read property of int sessionLength. -int CurrentAccount::getSessionLength() const +// Return the user's staus +Status CurrentAccount::getStatus() 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 status_; } -// Return the user's staus -QString CurrentAccount::getStatus() const +// Return the requested token +const QString CurrentAccount::getToken( const QString &domain ) const { - return status_; + // 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_; } @@ -325,123 +313,54 @@ CurrentAccount* CurrentAccount::instance() // Open mail with the given command, url, and folder -void CurrentAccount::openMail( const QString& command, const QString& folder, const QString& url ) +void CurrentAccount::openMail( const QString &folder ) { -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount::openMail()" << endl; -#endif - - - if( getUseHotmail() ) - { - if( url == "" ) - { - KMessageBox::error( 0, i18n( "This account does not have an Hotmail inbox!" ) ); - return; - } - - QString login = getHandle(); - QString sl; - sl.sprintf( "%d", getSessionLength() ); - KMD5 context( authorization_ + sl + getPassword() ); - QString credentials = context.hexDigest(); - - QString linkUrl = url - + "&mode=ttl" - + "&login=" + login.left( login.find("@") ) - + "&username=" + login - + "&sid=" + sid_ - + "&id=" + command - + "&sl=" + sl - + "&rru=" + folder - + "&auth=" + authorization_ - + "&creds=" + credentials - + "&svc=mail" - + "&js=yes"; - - kapp->invokeBrowser( linkUrl ); - } - else - { - startProcess( getEmailCommand() ); - } - + 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 ) { -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount::openMailAtCompose()" << endl; -#endif - - QString contactEmail, folder; - - if( getUseHotmail() ) - { - // The contact's email has to have the @ and . changed. - contactEmail = contactHandle.replace( QRegExp( "@" ), "%40" ); - contactEmail = contactEmail.replace( QRegExp( "\\." ), "%2e" ); - // For a compose message, the folder had to include the address of the contact - folder = composeFolder_ + "?mailto=1&to=" + contactEmail; - // Launch the html - openMail( composeCommand_, folder, composeUrl_ ); - } - else - { - startProcess( getEmailCommand() + " " + 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() { -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount::openMailAtInbox()" << endl; -#endif - - if( getUseHotmail() ) - { - openMail( inboxCommand_, inboxFolder_, inboxUrl_ ); - } - else - { - startProcess( getEmailCommand() ); - } + const QString inboxFolder( urls_.value( "INBOX" ) ); + KMessShared::openEmailClient( "", inboxFolder, getEmailSupported() ); } // Set some account information void CurrentAccount::setAccountInformation( QString authorization, QString preferredEmail, - QString sid, bool emailSupported, QString externalIp, uint externalPort, + QString sid, QString languageCode, bool emailSupported, + QString externalIp, uint externalPort, QString localIp) { - time_t currentTime, t; + Q_UNUSED( authorization ); #ifdef KMESSTEST bool goodSid; sid.toInt(&goodSid); - ASSERT( goodSid ); + KMESS_ASSERT( goodSid ); #endif - authorization_ = authorization; preferredEmail_ = preferredEmail; sid_ = sid; + languageCode_ = languageCode; externalIp_ = externalIp; externalPort_ = externalPort; localIp_ = localIp; // protected method call setEmailSupported(emailSupported); - - // Set the local login time by getting the current time - currentTime = time(&t); - loginTime_ = static_cast(currentTime); } @@ -454,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) @@ -481,13 +381,14 @@ void CurrentAccount::setContactList(const ContactList *contactList) } + // Set initial email information void CurrentAccount::setInitialEmailInformation( int noEmailsInInbox, int noEmailsInOtherFolders ) { #ifdef KMESSTEST - ASSERT( noEmails_ == 0 ); - ASSERT( noEmailsInInbox >= 0 ); - ASSERT( noEmailsInOtherFolders >= 0 ); + KMESS_ASSERT( noEmails_ == 0 ); + KMESS_ASSERT( noEmailsInInbox >= 0 ); + KMESS_ASSERT( noEmailsInOtherFolders >= 0 ); #else Q_UNUSED( noEmailsInOtherFolders ); // Avoid compiler warning #endif @@ -497,7 +398,15 @@ void CurrentAccount::setInitialEmailInformation( int noEmailsInInbox, int noEmai -// Set the e-mail post url +// Set the key for offline im messages +void CurrentAccount::setOfflineImKey( const QString &key ) +{ + offlineImKey_ = key; +} + + + +// Set the email post url void CurrentAccount::setEmailUrl( QString postUrl ) { emailUrl_ = postUrl; @@ -509,7 +418,7 @@ void CurrentAccount::setEmailUrl( QString postUrl ) void CurrentAccount::setNoEmails( int noEmails ) { #ifdef KMESSTEST - ASSERT( noEmails >= 0 ); + KMESS_ASSERT( noEmails >= 0 ); #endif noEmails_ = noEmails; if ( noEmails_ < 0 ) @@ -522,53 +431,56 @@ void CurrentAccount::setNoEmails( int noEmails ) // Set the user's status -void CurrentAccount::setStatus( QString status ) +void CurrentAccount::setStatus( Status status ) { -#ifdef KMESSTEST - ASSERT( ( status == "AWY" ) || ( status == "BRB" ) || ( status == "BSY" ) || ( status == "FLN" ) || ( status == "HDN" ) - || ( status == "IDL" ) || ( status == "LUN" ) || ( status == "NLN" ) || ( status == "PHN" ) ); -#endif - if ( ( status == "AWY" ) || ( status == "BRB" ) || ( status == "BSY" ) - || ( status == "FLN" ) || ( status == "HDN" ) || ( status == "IDL" ) - || ( status == "LUN" ) || ( status == "NLN" ) || ( status == "PHN" ) ) + // Apply the status change + Status oldStatus = status_; + status_ = status; + + // If there are no real changes in the user's status, end now + if( status_ == oldStatus ) { - QString oldStatus = status_; - status_ = status; - -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount: Status set to " << status_ << "." << endl; -#endif - - emit changedStatus(); - - if( status_ != oldStatus ) - { - // Check if the contact went offline - if( status_ == "FLN" ) - { -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount: Account went offline." << endl; -#endif - emit accountOffline(); - } - // Check if the account went invisible - if( status == "HDN" ) - { -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount: Account went invisible." << endl; -#endif - emit accountInvisible(); - } - // Check if the contact went online - else if( oldStatus == "FLN" || oldStatus == "HDN" ) - { -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount: Account went online." << endl; -#endif - emit accountOnline(); - } - } + return; } + +#ifdef KMESSDEBUG_CURRENTACCOUNT + kDebug() << "Status set to " << MsnStatus::getCode( status_ ) << "."; +#endif + + emit changedStatus(); + + // Check if the contact went offline + if( status_ == STATUS_OFFLINE ) + { +#ifdef KMESSDEBUG_CURRENTACCOUNT + kDebug() << "Account went offline."; +#endif + emit accountOffline(); + } + // Check if the account went invisible + if( status == STATUS_INVISIBLE ) + { +#ifdef KMESSDEBUG_CURRENTACCOUNT + kDebug() << "Account went invisible."; +#endif + emit accountInvisible(); + } + // Check if the contact went online + else if( oldStatus == STATUS_OFFLINE || oldStatus == STATUS_INVISIBLE ) + { +#ifdef KMESSDEBUG_CURRENTACCOUNT + kDebug() << "Account went online."; +#endif + emit accountOnline(); + } +} + + + +// Set the tokens +void CurrentAccount::setTokens( const QHash tokens ) +{ + tokens_ = tokens; } @@ -578,14 +490,14 @@ void CurrentAccount::slotInvitedContactLeftAllChats( ContactBase *contact ) { if(KMESS_NULL(contact)) return; #ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount: invited contact " << contact->getHandle() << " left all chats, delete contact." << endl; + kDebug() << "invited contact " << contact->getHandle() << " left all chats, delete contact."; #endif // Remove from list - bool removed = invitedContacts_.removeRef(contact); + bool removed = invitedContacts_.removeAll( static_cast( contact ) ) > 0; if( ! removed ) { - kdWarning() << "CurrentAccount: could not remove invited contact '" << contact->getHandle() << "' from the list!" << endl; + kWarning() << "could not remove invited contact '" << contact->getHandle() << "' from the list!"; } // Delete after all slots are processed. @@ -594,30 +506,4 @@ void CurrentAccount::slotInvitedContactLeftAllChats( ContactBase *contact ) -// Start a process -void CurrentAccount::startProcess( QString command ) -{ -#ifdef KMESSDEBUG_CURRENTACCOUNT - kdDebug() << "CurrentAccount::startProcess: starting '" << getEmailCommand() << "'." << endl; -#endif - - // Construct a command by simply attaching a the email address to the program name - KProcess *process = new KProcess(); // auto deletes - - // Add all parameters separately - QStringList commandItems = QStringList::split(" ", command, false); - for( QStringList::Iterator it = commandItems.begin(); it != commandItems.end(); ++it ) - { - *process << *it; - } - - // Launch it - bool started = process->start(KProcess::DontCare); - - if(! started) - { - kdWarning() << "Failed to start '" << getEmailCommand() << "'!" << endl; - } -} - #include "currentaccount.moc" diff --git a/kmess/currentaccount.h b/src/currentaccount.h similarity index 74% rename from kmess/currentaccount.h rename to src/currentaccount.h index caf6b71..66870f9 100644 --- a/kmess/currentaccount.h +++ b/src/currentaccount.h @@ -20,18 +20,18 @@ #include "account.h" -#include -#include -#include +#include -#include "contact/contactbase.h" // Forward declarations +class ContactBase; class InvitedContact; class KMessTest; class ContactList; class MsnSwitchboardConnection; + + /** * @brief Data class for session information of the logged in user. * @@ -54,7 +54,7 @@ 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 @@ -63,12 +63,10 @@ class CurrentAccount : public Account static void destroy(); // 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 - QString getContactFriendlyNameByHandle(const QString &handle) const; + QString getContactFriendlyNameByHandle(const QString &handle, FormattingMode mode = STRING_CLEANED ) const; // Return the contact list as read-only const ContactList * getContactList() const; // Return the contact which was last dragged. @@ -79,52 +77,57 @@ 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. const QString& getLocalIp() const; // Return the number of email in the inbox int getNoEmails() const; + // Return the key for offline im messages + const QString& getOfflineImKey() const; // Return the user's staus - QString getStatus() const; + 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 - void openMail(const QString& command, const QString& folder, const QString& url); - // Open e-mail at the compose page with the given contact handle + // Open email with the given command, url, and folder + void openMail( const QString &folder ); + // 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, bool emailSupported, QString externalIp, uint externalPort, + QString sid, QString languageCode, bool emailSupported, + QString externalIp, uint externalPort, QString internalIp ); // 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 user's status - void setStatus( QString status ); + void setStatus( Status status ); + // Set the tokens + void setTokens( const QHash tokens ); private: // Private methods // The constructor CurrentAccount(); // The destructor - ~CurrentAccount(); - // Calculate the length of the session with the notification server. - int getSessionLength() const; + virtual ~CurrentAccount(); private slots: // Private slots // An invited contact left all chats. @@ -133,20 +136,10 @@ class CurrentAccount : public Account private: // private methods // Find an invited contact by handle InvitedContact * getInvitedContactByHandle(const QString &handle) const; - // Start a process - void startProcess(QString command); private: // Private attributes - // 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) @@ -155,20 +148,16 @@ 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. - QPtrList invitedContacts_; + QList invitedContacts_; + // Key for offline im messages + QString offlineImKey_; + // Current language code setted for current 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_; // The email address considered by the server to be the user's preferred address. I don't know when it differs from the handle. @@ -176,7 +165,11 @@ class CurrentAccount : public Account // A value used to access the user's hotmail account. QString sid_; // The online status of the user. - QString status_; + 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 new file mode 100644 index 0000000..4b35f37 --- /dev/null +++ b/src/dialogs/addcontactdialog.cpp @@ -0,0 +1,170 @@ +/*************************************************************************** + addcontactdialog.cpp - description + ------------------- + begin : Sun Apr 14 2002 + copyright : (C) 2002 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 "addcontactdialog.h" + +#include "../contact/group.h" +#include "../model/contactlist.h" +#include "../utils/kmessconfig.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + + + +/** + * Constructor + * + * The dialog is instantly shown as modal when the class is instantiated. + * + * @param handle Reference to the handle of the contact to add + * @param groupsId Reference to the added contact's initial groups + * @param parent Parent widget + */ +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 ); + + // Configure the dialog + setWindowModality( Qt::WindowModal ); + setCaption( i18n("Add a Contact") ); + setButtons( Ok | Cancel ); + setDefaultButton( Ok ); + + // Connect the signals to check dialog's input + connect( emailAddressEdit_, SIGNAL( textChanged(const QString&) ), + this, SLOT ( interfaceChanged() ) ); + + // Lock the dialog height, it's ugly otherwise + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "AddContactDialog" ) ); + + icon_->setPixmap( KIcon( "list-add-user" ).pixmap( 48, 48 ) ); + + // Fill up the groups list from the contactlist data + const QList< Group* >& groupList( CurrentAccount::instance()->getContactList()->getGroupList() ); + QListWidgetItem *item; + + foreach( Group *group, groupList ) + { + if( ! group->isSpecialGroup() ) + { + 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 ); + } + } + + // Force an update of the widgets (to disable the Ok button) + interfaceChanged(); + emailAddressEdit_->setFocus(); + + // Show the dialog modally + int result = exec(); + + // Set the result strings if the user has pressed the Ok button + if( result == QDialog::Accepted ) + { + handle = emailAddressEdit_->text(); + groupsId = getSelectedGroups(); + } + else + { + handle = QString(); + groupsId = QStringList(); + } + + // Schedule the dialog for deletion + deleteLater(); +} + + + +// Destructor +AddContactDialog::~AddContactDialog() +{ + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "AddContactDialog" ); + saveDialogSize( group ); +} + + + +/** + * Controls the OK button by checking the dialog's widgets + * + * It's called everytime that a change is made to one of the dialog's widgets, and checks if their contents are valid. + * Then enables or disables the OK button accordingly. + */ +void AddContactDialog::interfaceChanged() +{ + const QString& emailAddress( emailAddressEdit_->text() ); + + /** + * If you try to add a contact handle which doesn't pass basic mail validation (addresses like "" or "none" + * or "a@bc"), the MSN Servers disconnect you and send you a so called ".NET message" with the error details. + * This basic set of tests is more than enough to pass the server requirements. + * + * Other than the usual address validation (see the Account::isValidEmail() method), MSN will kick you out if + * you try adding an address having ".co" as top level domain. So we ensure it has not. This is probably due + * to people keeping mistyping ".com" when adding people to their list - all random 2-character domains are + * allowed, except ".co". + */ + + // If the mail address seems correct, accept it + if( ! emailAddress.isEmpty() + && Account::isValidEmail( emailAddress ) + && ! emailAddress.endsWith( ".co" ) ) + { + enableButtonOk( true ); + return; + } + + enableButtonOk( false ); +} + + + +// 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/kmess/dialogs/addcontactdialog.h b/src/dialogs/addcontactdialog.h similarity index 57% rename from kmess/dialogs/addcontactdialog.h rename to src/dialogs/addcontactdialog.h index a956972..e6d5b3f 100644 --- a/kmess/dialogs/addcontactdialog.h +++ b/src/dialogs/addcontactdialog.h @@ -18,38 +18,39 @@ #ifndef ADDCONTACTDIALOG_H #define ADDCONTACTDIALOG_H -#include -#include -#include +#include "ui_addcontactdialog.h" -// Forward declarations -class KLineEdit; +#include -/**The dialog for adding a contact. - *@author Mike K. Bennett - */ -class AddContactDialog : public KDialogBase//AddContactDialogInterface + +/** + * A dialog to add a new friend to the list + * + * There's no need to call exec() on it, just create an instance: it will popup automatically. + * If the user accepts the changes, the friend is added and the dialog then auto-destroys. + * + * @author Mike K. Bennett + * @author Valerio Pilo + * @ingroup Dialogs + */ +class AddContactDialog : public KDialog, private Ui::AddContactDialog { Q_OBJECT public: - AddContactDialog(QWidget *parent=0, const char *name=0); - ~AddContactDialog(); - // Show the dialog and obtain the contact handle. - bool launch(QString &contactHandle); + // Constructor + AddContactDialog( QString &handle, QStringList &groupsId, QWidget *parent = 0 ); + // Destructor + ~AddContactDialog(); + + private: // private methods + // Iterate to check the selected groups + const QStringList getSelectedGroups() const; protected slots: // Protected slots - // The Cancel button was pressed. - void slotCancel(); - // The OK button was pressed. - void slotOk(); - - private: // Private attributes - // The contact handle edit - KLineEdit *handleEdit_; - // Whether or not OK was pressed. - bool ok_; + // Controls the OK button by checking the dialog's widgets + void interfaceChanged(); }; #endif diff --git a/src/dialogs/addcontactdialog.ui b/src/dialogs/addcontactdialog.ui new file mode 100644 index 0000000..a725f50 --- /dev/null +++ b/src/dialogs/addcontactdialog.ui @@ -0,0 +1,63 @@ + + AddContactDialog + + + + + + + 56 + 56 + + + + + 56 + 56 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + + + Initial groups + + + + + + + + + + + + + + Enter here the email address of the person you wish to add to your contact list + + + Email address: + + + + + + + + + + + + + diff --git a/src/dialogs/addemoticondialog.cpp b/src/dialogs/addemoticondialog.cpp new file mode 100644 index 0000000..eb8fb46 --- /dev/null +++ b/src/dialogs/addemoticondialog.cpp @@ -0,0 +1,383 @@ +/*************************************************************************** + addemoticondialog.cpp - shows a dialog to add a custom emoticon + ------------------- + begin : Tue 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 "addemoticondialog.h" + +#include "../utils/kmessconfig.h" +#include "../utils/kmessshared.h" +#include "../emoticonmanager.h" +#include "../kmessdebug.h" + +#include +#include +#include + + +#ifdef KMESSDEBUG_EMOTICONS + #define KMESSDEBUG_EMOTICONS_ADDING +#endif + + + +/** + * Constructor + * + * The dialog is instantly shown as non-modal when the class is instantiated. + * + * @param theme Theme to add the new emoticon to + * @param parent Parent widget + */ +AddEmoticonDialog::AddEmoticonDialog( EmoticonTheme *theme, QWidget *parent ) + : KDialog( parent ) + , Ui::AddEmoticonDialog() + , theme_(theme) + , isEditing_(false) +{ + // Set up the interface and the dialog + setObjectName( "AddEmoticon" ); + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + + // Configure the dialog + setWindowModality( Qt::WindowModal ); + setButtons( Help | Ok | Cancel ); + setDefaultButton( Ok ); + setCaption( i18n("Add New Emoticon") ); + + setMainWidget( container_ ); + + // Lock the dialog height, it's ugly otherwise + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "AddEmoticonDialog" ) ); + setMaximumHeight( minimumSizeHint().height() ); + + // Connect the interface's signals to manage its events + connect( browseButton_, SIGNAL( clicked() ), + this, SLOT( choosePicture() ) ); + connect( pictureEdit_, SIGNAL( textChanged(const QString&) ), + this, SLOT( interfaceChanged() ) ); + connect( shortcutEdit_, SIGNAL( textChanged(const QString&) ), + this, SLOT( interfaceChanged() ) ); + + movie_ = new QMovie(); + + // Force an update of the widgets (mainly to show the KMess logo as + // the preview and to disable the Ok button) + interfaceChanged(); + + show(); +} + + + +/** + * Destructor + */ +AddEmoticonDialog::~AddEmoticonDialog() +{ + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "AddEmoticonDialog" ); + saveDialogSize( group ); + delete movie_; + +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "DESTROYED."; +#endif +} + + + +/** + * Shows a File Selection dialog to choose an image for the new emoticon + * + * Gets the emoticon picture location from the user, using a KFile dialog, putting the pictureEdit_ widget contents + * as a default, and then replaces the contents of said widget with the result of the file selection dialog. + */ +void AddEmoticonDialog::choosePicture() +{ + KUrl file( pictureEdit_->text() ); + + // Choose a file, filtering out all files but the preselected image types + file = KFileDialog::getImageOpenUrl( file, this ); + + if( file.isEmpty() || ! file.isLocalFile() ) + { + return; + } + + // Update the text widget, so an update will be issued and the preview will be updated. + pictureEdit_->setText( file.path() ); +} + + + +// Edit the custom emoticon +void AddEmoticonDialog::editEmoticon( const QString &pictureName, const QString &shortcut ) +{ + setCaption( i18n("Edit Emoticon") ); + isEditing_ = true; + preSelect( pictureName, shortcut ); +} + + + + +/** + * Controls the OK button by checking the dialog's widgets + * + * It's called everytime that a change is made to one of the dialog's widgets, and checks if their contents are valid. + * Then enables or disables the OK button accordingly. + */ +void AddEmoticonDialog::interfaceChanged() +{ + const QString& currentEmoticonPath( pictureEdit_->text() ); + + // Check if the current emoticon path is empty. + if( currentEmoticonPath.isEmpty() ) + { + // If the path is empty reset the view + movie_->stop(); + movie_->setFileName( "" ); + } + else + { + if( currentEmoticonPath != movie_->fileName() ) + { + // User updated the current emoticon path + movie_->stop(); + movie_->setFileName( pictureEdit_->text() ); + } + else + { + // The user updated only shortcut so we need only to update the OK button. + enableButtonOk( ! shortcutEdit_->text().isEmpty() ); + return; + } + } + + // Start the movie only if it's valid + if( movie_->isValid() ) + { + // The chosen file is valid, update the preview. + +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "Updated preview."; +#endif + + emoticonPreview_->setMovie( movie_ ); + movie_->start(); + } + else + { + // The chosen file is not valid, reset the preview to the KMess logo. + +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "Resetting preview."; +#endif + + emoticonPreview_->setPixmap( KIconLoader::global()->loadIcon( "kmess", KIconLoader::Desktop, KIconLoader::SizeHuge ) ); + } + + // Enable the OK button only if both fields have valid contents + enableButtonOk( movie_->isValid() && ! shortcutEdit_->text().isEmpty() ); +} + + + +/** + * Preselects a file name and an emoticon shortcut in the dialog + * + * @param pictureName Full path to the file that will be added + * @param shortcut Emoticon shortcut to preselect + */ +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 ); + pictureEdit_->setEnabled( pictureName.isEmpty() ); + browseButton_->setEnabled( pictureName.isEmpty() ); + + // Select the shortcut, and save it so later we can tell everyone we've added this particular emoticon + preselectedShortcut_ = shortcut; + + // Select the shortcut, decoded from HTML to show it in its original form + shortcutEdit_->setText( KMessShared::htmlUnescape( shortcut ) ); +} + + + + +/** + * Adds the new emoticon to the theme + * + * First it copies the user-selected picture to the custom theme's folder, then adds it to the theme itself; + * finally it closes the dialog. + */ +void AddEmoticonDialog::slotButtonClicked( int button ) +{ + bool isEditing = isEditing_; + isEditing_ = false; + + // If the Cancel button has been pressed, close without saving + if( button != Ok ) + { + KDialog::slotButtonClicked( button ); + return; + } + + QImageReader emoticonData; + QString shortcut, pictureName; + +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "OK button was pressed!"; +#endif + + shortcut = shortcutEdit_->text(); + pictureName = pictureEdit_->text(); + + // Check if the shortcut is really changed + if( preselectedShortcut_ == shortcut && isEditing ) + { + accept(); + return; + } + + emoticonData.setFileName( pictureName ); + QString format( emoticonData.format() ); + + if( format.isEmpty() || shortcut.isEmpty() ) + { + kWarning() << "Shortcut or picture is not valid!"; + return; + } + + // If the emoticon does already exist in the theme, ask if you want to replace it. + if( theme_->contains( shortcut ) ) + { +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "Asking for overwrite."; +#endif + + int result = KMessageBox::questionYesNo( this, + i18n( "The emoticon \"%1\" already exists. Do you want to replace it?", shortcut ), + i18n("Add New Emoticon") ); + if ( result == KMessageBox::Yes ) + { + theme_->removeEmoticon( shortcut ); + } + else + { + return; + } + } + + // Create any missing directories. + QDir dir; + dir.mkpath( theme_->getThemePath() ); + + if( isEditing ) + { +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "Editing emoticon: shortcut changed from " << preselectedShortcut_ << " to " << shortcut; +#endif + theme_->renameEmoticon( preselectedShortcut_, shortcut ); + theme_->saveTheme(); + + accept(); + return; + } + + // Access the original picture file details + QFileInfo pictureInfo( pictureName ); + + // For the most common image formats, keep the original filetype; otherwise, save the image as a PNG. This increases portability + // between 3rd-party clients and ensures that MSN will always be able to read our emoticons. + if( format == "gif" || format == "png" || format == "jpg" ) + { + // Just copy over the image + + // Get handles for the original picture and the new emoticon + QFile originalPicture( pictureName ); + QFile newThemePicture( theme_->getThemePath() + pictureInfo.fileName() ); + +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "Copying original picture" << pictureName << "to theme as" << newThemePicture.fileName(); +#endif + + // Open the two images + if( ! originalPicture.open( QIODevice::ReadOnly ) ) + { + kWarning() << "Couldn't open source file: " << originalPicture.fileName(); + return; + } + + if( ! newThemePicture.open( QIODevice::WriteOnly ) ) + { + kWarning() << "Couldn't open destination file: " << newThemePicture.fileName(); + return; + } + + // Copy the file contents + newThemePicture.write( originalPicture.readAll() ); + newThemePicture.close(); + originalPicture.close(); + + // Quick validity check + if( newThemePicture.size() != originalPicture.size() ) + { + kWarning() << "File sizes do not match: " + << originalPicture.fileName() << " (" << originalPicture.size() << ")" + << " != " << newThemePicture.fileName() << " (" << newThemePicture.size() << ")" << endl; + return; + } + } + else + { + // Save the loaded picture as a PNG image. + +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "Recoding original picture" << pictureName << "(which format was" << format << ") to theme as" << pictureInfo.completeBaseName() << ".png"; +#endif + + emoticonData.read().save( theme_->getThemePath() + pictureInfo.completeBaseName() + ".png", "png" ); + } + + +#ifdef KMESSDEBUG_EMOTICONS_ADDING + kDebug() << "Adding new emoticon: " << shortcut << "."; +#endif + + // We've just created a file whose name is like "file.name.png", so give to the theme a name "file.name" so it can guess + // the file type on its own. + theme_->addEmoticon( pictureInfo.completeBaseName(), QStringList( shortcut ) ); + theme_->saveTheme(); + + // If a shortcut has been preselected, signal that we've added that emoticon. + // If it hasn't, just send the new shortcut. + if( ! preselectedShortcut_.isEmpty() ) + { + shortcut = preselectedShortcut_; + } + + // Signal to anyone interested that we've added this emoticon + emit addedEmoticon( shortcut ); + + accept(); +} + + + +#include "addemoticondialog.moc" diff --git a/kmess/dialogs/addemoticondialog.h b/src/dialogs/addemoticondialog.h similarity index 65% rename from kmess/dialogs/addemoticondialog.h rename to src/dialogs/addemoticondialog.h index 9634fb5..2526668 100644 --- a/kmess/dialogs/addemoticondialog.h +++ b/src/dialogs/addemoticondialog.h @@ -3,7 +3,7 @@ ------------------- begin : Tue April 10 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -18,11 +18,13 @@ #ifndef ADDEMOTICONDIALOG_H #define ADDEMOTICONDIALOG_H -#include +#include "ui_addemoticondialog.h" +#include +#include +#include -class AddEmoticonDialogInterface; class EmoticonTheme; @@ -33,39 +35,44 @@ class EmoticonTheme; * There's no need to call exec() on it, just create an instance: it will popup automatically. * If the user accepts the changes, the new emoticon will be added to the current custom emoticons theme. * - * @author Valerio Pilo -*/ -class AddEmoticonDialog : public KDialogBase + * @author Valerio Pilo + * @ingroup Dialogs + */ +class AddEmoticonDialog : public KDialog, private Ui::AddEmoticonDialog { Q_OBJECT public: // Constructor - AddEmoticonDialog( EmoticonTheme *theme, QWidget *parent = 0, const char *name = "AddEmoticonDialog" ); + explicit AddEmoticonDialog( EmoticonTheme *theme, QWidget *parent = 0 ); // Destructor - ~AddEmoticonDialog(); + virtual ~AddEmoticonDialog(); + // Edit the custom emoticon + 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 - void choosePicture(); + void choosePicture(); // Controls the OK button by checking the dialog's widgets - void interfaceChanged(); - // Adds the new emoticon to the theme - void slotOk(); + void interfaceChanged(); + // Adds the new emoticon to the theme if the Ok button has been pressed + void slotButtonClicked( int button ); private: - // The dialog box's interface, which contains all of our widgets - AddEmoticonDialogInterface *interface_; // Preselected shortcut text QString preselectedShortcut_; + // Movie object for gif movie + QMovie *movie_; // Theme instance to which we'll add the new emoticon EmoticonTheme *theme_; + // Determinate if we are editing the current emoticon + bool isEditing_; 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 new file mode 100644 index 0000000..6effd4a --- /dev/null +++ b/src/dialogs/addemoticondialog.ui @@ -0,0 +1,176 @@ + + AddEmoticonDialog + + + + 0 + 0 + 400 + 150 + + + + + 0 + 0 + + + + + 400 + 150 + + + + + + + + 0 + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + + 64 + 64 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + true + + + Qt::AlignCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 50 + + + + + + + + + + + + Enter a shortcut for the emoticon: + + + false + + + + + + + 7 + + + + + + + Select an image file: + + + false + + + + + + + + + + + + + 0 + 0 + + + + + 22 + 0 + + + + ... + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 16 + 16 + + + + + + + + + + + + + qPixmapFromMimeSource + + + diff --git a/kmess/dialogs/awaymessagedialog.cpp b/src/dialogs/awaymessagedialog.cpp similarity index 50% rename from kmess/dialogs/awaymessagedialog.cpp rename to src/dialogs/awaymessagedialog.cpp index a1e22f3..a8a57db 100644 --- a/kmess/dialogs/awaymessagedialog.cpp +++ b/src/dialogs/awaymessagedialog.cpp @@ -17,31 +17,25 @@ #include "awaymessagedialog.h" -#include -#include -#include +#include "../utils/kmessconfig.h" + -#include // The constructor -AwayMessageDialog::AwayMessageDialog(QWidget *parent, const char *name ) -: KDialogBase( parent, name, false, i18n("Specify an Away message"), Ok | Cancel, Ok, true ) +AwayMessageDialog::AwayMessageDialog( QWidget *parent ) +: KDialog( parent ) +, Ui::AwayMessageDialog() { - setInitialSize( configDialogSize("AwayMessageDialog") ); + // Set up the interface and the dialog + setObjectName( "AwayMessage" ); + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); - QWidget *page = new QWidget( this ); - setMainWidget( page ); - - QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); - - QLabel *infoLabel = new QLabel( i18n( "Enter the message that will automatically be\nsent to people who try to message you:" ), page, "info" ); - topLayout->addWidget( infoLabel ); - - messageEdit_ = new QTextEdit( page, "messageEdit" ); - messageEdit_->setMinimumWidth( fontMetrics().maxWidth()*20 ); - topLayout->addWidget( messageEdit_ ); - - topLayout->addStretch( 10 ); + setButtons( Ok | Cancel ); + setDefaultButton( Ok ); + setCaption( i18n("Automatic Away Message") ); + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "AwayMessageDialog" ) ); adjustSize(); } @@ -51,6 +45,8 @@ AwayMessageDialog::AwayMessageDialog(QWidget *parent, const char *name ) // The destructor AwayMessageDialog::~AwayMessageDialog() { + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "AwayMessageDialog" ); + saveDialogSize( group ); } @@ -58,38 +54,23 @@ AwayMessageDialog::~AwayMessageDialog() // Show the dialog bool AwayMessageDialog::useMessage(QString &message) { - // Set whether the "ok" button was pressed to false - ok_ = false; // Set the given mesage name to the text edit as the default message - messageEdit_->setText( message ); - // Exec the form (to show it modally). - exec(); + messageEdit_->setPlainText( message ); + + // Show the form modally + int result = exec(); + // If OK was pressed... - if ( ok_ ) + if( result != QDialog::Accepted ) { - // Get the group name from the text edit and store it - message = messageEdit_->text(); + return false; } - return ok_; + + // Get the group name from the text edit and store it + message = messageEdit_->toPlainText(); + return true; } -// The Cancel button was pressed. -void AwayMessageDialog::slotCancel() -{ - saveDialogSize("AwayMessageDialog"); - reject(); -} - - - -// The OK button was pressed. -void AwayMessageDialog::slotOk() -{ - saveDialogSize("AwayMessageDialog"); - ok_ = true; - accept(); -} - #include "awaymessagedialog.moc" diff --git a/kmess/dialogs/awaymessagedialog.h b/src/dialogs/awaymessagedialog.h similarity index 63% rename from kmess/dialogs/awaymessagedialog.h rename to src/dialogs/awaymessagedialog.h index 09350e2..fe0ccc8 100644 --- a/kmess/dialogs/awaymessagedialog.h +++ b/src/dialogs/awaymessagedialog.h @@ -18,39 +18,30 @@ #ifndef AWAYMESSAGEDIALOG_H #define AWAYMESSAGEDIALOG_H -#include +#include "ui_awaymessagedialog.h" -// Forward declarations -class QTextEdit; +#include -/**The dialog lets the user set the auto-reply message. - *@author Mike K. Bennett - */ -class AwayMessageDialog : public KDialogBase +/** + * A dialog to let the user set a message, which is then sent automatically when + * contacts start chatting with the user. + * + * @author Mike K. Bennett + * @ingroup Dialogs + */ +class AwayMessageDialog : public KDialog, private Ui::AwayMessageDialog { Q_OBJECT public: // The constructor - AwayMessageDialog(QWidget *parent=0, const char *name=0); + AwayMessageDialog( QWidget *parent = 0 ); // The destructor - ~AwayMessageDialog(); + ~AwayMessageDialog(); // Show the dialog - bool useMessage(QString &message); - - protected slots: // Protected slots - // The Cancel button was pressed. - void slotCancel(); - // The OK button was pressed. - void slotOk(); - - private: // Private attributes - // The edit box for the away message - QTextEdit* messageEdit_; - // Whether or not OK was pressed. - bool ok_; + bool useMessage( QString &message ); }; #endif diff --git a/src/dialogs/awaymessagedialog.ui b/src/dialogs/awaymessagedialog.ui new file mode 100644 index 0000000..b4ed6ad --- /dev/null +++ b/src/dialogs/awaymessagedialog.ui @@ -0,0 +1,46 @@ + + AwayMessageDialog + + + + 0 + 0 + 400 + 300 + + + + + + + + + + Enter a message to be automatically sent to people who try to message you. + + + &Specify an automatic away message: + + + messageEdit_ + + + + + + + true + + + false + + + + + + + + + + + diff --git a/src/dialogs/chathistorydialog.cpp b/src/dialogs/chathistorydialog.cpp new file mode 100644 index 0000000..fc082a8 --- /dev/null +++ b/src/dialogs/chathistorydialog.cpp @@ -0,0 +1,773 @@ + /*************************************************************************** + 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/chatmessagestyle.h" +#include "../chat/chatmessageview.h" +#include "../utils/kmessconfig.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG +// #define KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE +#endif + + +// Constructor +ChatHistoryDialog::ChatHistoryDialog( QWidget *parent ) +: KDialog( parent ) +, logParser_( 0 ) +, model_( new QStandardItemModel( this ) ) +, proxyModel_( new QSortFilterProxyModel( this ) ) +, reloadingLogs_( false ) +, reloadLogsTimer_(0) +{ + // Set up the dialog + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + setButtons( Close ); + setWindowTitle( i18nc( "Dialog window title", "Chat History" ) ); + loadingLabel_->hide(); + + // 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( toBox_, SIGNAL( toggled(bool) ), + this, SLOT ( reloadLogs() ) ); + connect( fromDate_, SIGNAL( changed(const QDate&) ), + this, SLOT ( checkDates() ) ); + connect( toDate_, SIGNAL( changed(const QDate&) ), + this, SLOT ( checkDates() ) ); + connect( conversationRadio_, SIGNAL( toggled(bool) ), + this, SLOT ( reloadLogs() ) ); + connect( conversationComboBox_, SIGNAL( currentIndexChanged(int) ), + this, SLOT ( reloadLogs() ) ); + + // Register QDomElement as a meta type to allow the thread to send signals here + qRegisterMetaType( "QDomElement" ); + + // Save the dialog and splitters sizes + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "ChatHistoryDialog" ); + 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( "ChatHistoryDialog" ); + saveDialogSize( group ); + group.writeEntry( "mainSplitterSizes", mainSplitter_ ->sizes() ); + group.writeEntry( "rightSplitterSizes", rightSplitter_->sizes() ); +} + + + +// A conversation has been parsed by the thread +void ChatHistoryDialog::addConversation( int timestamp, const QDomElement &newConversation ) +{ +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Adding new conversation on" << timestamp; +#endif + + QMutexLocker lock( &addConversationLock_ ); + const QDateTime &date = QDateTime::fromTime_t( timestamp ); + + // Add this conversation to the internal list + conversations_[ timestamp ] = newConversation; + + // Add the chat to the chat selection combo box, keeping it sorted by date (most recent first) + // The first item (index 0) is skipped as it is a temporary item ("Loading...") which + // should remain the first + int index; + for( index = 1; index < conversationComboBox_->count(); ++index ) + { + int currentTimestamp = conversationComboBox_->itemData( index, Qt::UserRole ).toUInt(); + + if( currentTimestamp < 1 ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kWarning() << "Invalid timestamp!"; +#endif + continue; + } + + if( currentTimestamp <= timestamp ) + { + break; + } + } + + // Prevent the insertion from generating a signal which regenerates the logs + conversationComboBox_->blockSignals( true ); + conversationComboBox_->insertItem( index, + KGlobal::locale()->formatDateTime( date, KLocale::ShortDate ), + timestamp ); + conversationComboBox_->blockSignals( false ); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Added as item" << index; +#endif +} + + + +// Caches the XML for the selected contact. Makes things a lot faster +void ChatHistoryDialog::cacheContactXml( const QModelIndex &index ) +{ + const QModelIndex contactIndex( proxyModel_->mapToSource( index ) ); + if( ! contactIndex.isValid() ) + { + return; + } + + // Initially the list view emits a currentChanged() signal, but the list + // doesn't bother to highlight the selected item + listView_->setCurrentIndex( index ); + + // Reset the xml loading thread + if( logParser_ != 0 ) + { + logParser_->end(); + logParser_ = 0; + } + + // Reset the UI + xml_.clear(); + conversations_.clear(); + setLoading( true ); + // Avoid reentering while we're still loading a contact's chats + listView_->setEnabled( false ); + + // Reset the cache + xml_.setContent( QByteArray( "" ) ); + QDomNode cachedConversations( xml_.firstChildElement( "conversations" ) ); + + const QString handle( model_->itemFromIndex( contactIndex )->text() ); + QDir logsDir( KMessConfig::instance()->getAccountDirectory( CurrentAccount::instance()->getHandle() ) + + "/chatlogs" ); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "Loading conversations for contact:" << handle; +#endif + + // Filter only to read from this contact's files, if any + logsDir.setFilter( QDir::Files ); + logsDir.setNameFilters( QStringList() << ( handle + "*.xml" ) ); + + bool showDate = chatView_->getStyle()->getShowMessageDate(); + bool showTime = chatView_->getStyle()->getShowMessageTime(); + bool showSeconds = chatView_->getStyle()->getShowMessageSeconds(); + + const QFileInfoList &list = logsDir.entryInfoList(); + foreach( const QFileInfo &entry, list ) + { + QString currentHandle( entry.fileName() ); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Reading conversations from file:" << entry.fileName(); +#endif + + 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" ) ); + + setLoading( false ); + return; + } + + if( logParser_ == 0 ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Starting log parser thread..."; +#endif + logParser_ = new XmlLogParser( showDate, showTime, showSeconds ); + connect( logParser_, SIGNAL( gotConversation(int,const QDomElement&) ), + this, SLOT ( addConversation(int,const QDomElement&) ) ); + connect( logParser_, SIGNAL( finished() ), + this, SLOT ( setLoading() ) ); + } + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Adding conversation to log parser thread..."; +#endif + logParser_->addDocument( entry.fileName(), file.readAll() ); + + file.close(); + } + + if( list.isEmpty() ) + { + setLoading( false ); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "No conversations available."; +#endif + } +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + else + { + kDebug() << "Conversations are available."; + } +#endif + + // Restore the UI: the view will be reenabled by reloadLogs() + listView_->setEnabled( true ); +} + + + +// Verify whether the chat date interval is valid or not +bool ChatHistoryDialog::checkDates( bool checkAndReloadLogs ) +{ + // When the user first clicks on the "filter by date" radio button, neither the "from" + // nor the "to" checkboxes are enabled, so show no chats. + // It's better than showing *everything*, which may mean YEARS of chats. + if( ! fromBox_->isChecked() && ! toBox_->isChecked() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "No date filter chosen."; +#endif + return false; + } + + QDate fromDate( fromDate_->date() ); + QDate toDate ( toDate_ ->date() ); + + // Disallow negative date intervals + if( fromDate > toDate ) + { + toDate_->setDate( fromDate ); + + // Setting the date calls this method for another check + return false; + } + + // Allow a maximum interval of one year of chats (and this may already + // be an ENORMOUS amount of data, depending on the contact...) + static const int maxDays = 365; + int daysDifference = fromDate.daysTo( toDate ) - maxDays; + if( daysDifference > 0 ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Date difference is too long (" << maxDays << "days +" << daysDifference << "), fixing dates."; +#endif + + toDate = toDate.addDays( - daysDifference ); + toDate_->setDate( toDate ); + + // Setting the date calls this method for another check + return false; + } + + if( checkAndReloadLogs ) + { + reloadLogs(); + } + + return true; +} + + + +// 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() +{ + // Never load logs immediately: wait an instant to allow the user to do more changes. + // This makes the interface zippy and the user happy + if( reloadLogsTimer_ == 0 ) + { + reloadLogsTimer_ = new QTimer( this ); + reloadLogsTimer_->setSingleShot( true ); + connect( reloadLogsTimer_, SIGNAL( timeout() ), + this, SLOT ( reloadLogs() ) ); + } + if( reloadLogsTimer_ != sender() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "Scheduling reload..."; +#endif + reloadLogsTimer_->start( 250 ); + return; + } + + // Reloading logs may be time consuming too, protect the operation from reentrancy +// QMutexLocker lock( &addConversationLock_ ); + if( reloadingLogs_ ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "Already running, exit."; +#endif + return; + } + reloadingLogs_ = true; + + chatView_->widget()->setEnabled( false ); + + if( conversations_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kWarning() << "No cached conversations!"; +#endif + reloadingLogs_ = false; + return; + } + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "Reloading..."; +#endif + + // The text stream is used to dump the DOM nodes to an XML byte array. + QString xmlData; + QTextStream log( &xmlData ); + + // Show a specific chat + if( conversationRadio_->isChecked() ) + { + // Get the timestamp of the requested chat from the combobox. + int timestamp = conversationComboBox_->itemData( conversationComboBox_->currentIndex(), + Qt::UserRole ).toUInt(); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Conversation timestamp:" << timestamp; +#endif + + if( ! conversations_.contains( timestamp ) ) + { + kWarning() << "Chat not found!"; + reloadingLogs_ = false; + return; + } + + // Add the chat to the xml output + log << conversations_[ timestamp ]; + } + // There are two options only, but you *never* know. + else if( dateRadio_->isChecked() ) + { + // Assume the interval of dates makes sense: checkDates() fixes the dates for us. + if( ! checkDates( false /*checkAndReloadLogs */ ) ) + { + reloadingLogs_ = false; + return; + } + + // All chats in the specified time interval will be merged into one. + + // Add to the xml string the starting tag + log << "" ; + + QMapIterator it( conversations_ ); + while( it.hasNext() ) + { + it.next(); + const int timestamp = it.key(); + const QDomNode &conversation = it.value(); + const QDate &date = QDateTime::fromTime_t( timestamp ).date(); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Conversation date:" << date; +#endif + + if( fromBox_->isChecked() && date < fromDate_->date() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Filtering out conversation on:" << date << "<" << fromDate_->date(); +#endif + continue; + } + else if( toBox_->isChecked() && date > toDate_->date() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Filtering out conversation on:" << date << ">" << toDate_->date() + << "and all later ones"; +#endif + // We're at the last possible chat, skip the rest + break; + } + + // Add all messages of this conversation to the output + const QDomNodeList &messages = conversation.childNodes(); + for( int index = 0; index < messages.size(); ++index ) + { + log << messages.at( index ); + } + + // Without this, the data won't be fully sent to the byte array by the time setXml is called. + log.flush(); + } + + // Add the closing tag + log << ""; + } + else + { + kWarning() << "UI error, no chat selection choice was active!"; + reloadingLogs_ = false; + return; + } + + chatView_->setXml( xmlData ); + chatView_->widget()->setEnabled( true ); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "Reload done."; +#endif + + reloadingLogs_ = false; +} + + + +/** + * Set the contact for whom the logs will be initially shown + * + * @param handle the handle to get contact history for + * @returns whether there was history for the given contact contact + */ +bool ChatHistoryDialog::setContact( const QString &handle ) +{ + if( handle.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "Handle is empty, pretending to have logs for the contact."; +#endif + return true; + } + + QList items = model_->findItems( handle, Qt::MatchContains ); + + if( items.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << handle << "has no chat history"; +#endif + return false; + } + + listView_->setCurrentIndex( proxyModel_->mapFromSource( items.first()->index() ) ); + + return true; +} + + + +// Set whether the dialog is loading chats or not +void ChatHistoryDialog::setLoading( bool isLoading ) +{ + if( isLoading ) + { + // Show the loading animation + loadingLabel_->show(); + loadingLabel_->start(); + + // Clear the chooser + conversationComboBox_->clear(); + conversationComboBox_->insertItem( 0, i18nc( "Combo box default item", "Loading..." ), -1 ); + + // Clear the view + chatView_->clearView( true ); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "Now loading..."; +#endif + } + else + { + // Hide the loading animation + loadingLabel_->stop(); + loadingLabel_->hide(); + + if( conversationComboBox_->count() < 1 + || conversations_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "No more loading - list empty."; +#endif + conversationComboBox_->clear(); + conversationComboBox_->insertItem( 0, i18nc( "Combo box default item", "No logged chats" ), -1 ); + } + else if( conversationComboBox_->itemData( 0, Qt::UserRole ) == -1 ) + { + conversationComboBox_->removeItem( 0 ); +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kDebug() << "No more loading - removed temp item."; +#endif + } +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + else + { + kDebug() << "Wtf?"; + } +#endif + } + + chatView_->widget()->setEnabled( ! isLoading ); +} + + + + +// Worker thread's constructor +XmlLogParser::XmlLogParser( bool showDate, bool showTime, bool showSeconds ) +: end_( false ) +, showDate_( showDate ) +, showTime_( showTime ) +, showSeconds_( showSeconds ) +{ +} + + + +// Add another document to the worker thread's queue +void XmlLogParser::addDocument( const QString &fileName, const QByteArray &newDocument ) +{ + documents_[ fileName ] = newDocument; + + if( ! isRunning() ) + { + start( QThread::HighPriority ); + } +} + + + +// Stop the worker thread +void XmlLogParser::end() +{ + disconnect( this ); + end_ = true; + + quit(); + deleteLater(); +} + + + +// Worker thread's method to parse XML files into conversations +void XmlLogParser::run() +{ +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Initially present:" << documents_.count() << "documents."; +#endif + + while( ! documents_.isEmpty() ) + { + QHash::iterator it = documents_.begin(); + const QString &fileName = it.key(); + QByteArray &documentBytes = it.value(); + + QDomDocument document; + document.setContent( documentBytes ); + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "Parsing document from XML file:" << fileName; +#endif + + // There is no message root in this XML file + QDomNode messageRoot( document.firstChildElement( "messageRoot" ) ); + if( messageRoot.isNull() ) + { + kWarning() << "Invalid XML file!"; + continue; + } + + // Since in the chat logs only the message timestamps are saved, add to each message + // the date and time in the current format + const QDomNodeList &messages = document.elementsByTagName( "message" ); +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << messages.size() << "messages to parse."; +#endif + for( int indexMsg = 0; indexMsg < messages.size(); ++indexMsg ) + { + QDomElement message( messages.at( indexMsg ).toElement() ); + int timestamp = message.attribute( "timestamp" ).toUInt(); + const QDateTime &datetime = QDateTime::fromTime_t( timestamp ); + + if( ! message.hasAttribute( "timestamp" ) || timestamp == 0 ) + { + continue; + } + + if( end_ ) + { + kWarning() << "Caught end, closing."; + return; + } + + if ( showDate_ ) + { + message.setAttribute( "time", KGlobal::locale()->formatDateTime( datetime, KLocale::ShortDate, showSeconds_ ) ); + } + else + { + message.setAttribute( "time", KGlobal::locale()->formatTime( datetime.time(), showSeconds_ ) ); + } + } +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << messages.size() << "messages parsed."; +#endif + + // Add all conversations from this file to the cached XML and the UI + const QDomNodeList &fileConversations = messageRoot.childNodes(); + for( int index = 0; index < fileConversations.size(); ++index ) + { + QDomElement conversation( fileConversations.at( index ).toElement() ); + + if( conversation.nodeName() != "conversation" ) + { + kWarning() << "Unexpected element" << conversation.nodeName() << "found in the XML log:" + << fileName; + continue; + } + + + // Check if the has a valid timestamp + const QDomNode ×tampNode = conversation.attributes().namedItem( "timestamp" ); + const int timestamp = timestampNode.nodeValue().toInt(); + + if( timestampNode.isNull() ) + { +#ifdef KMESSDEBUG_CHATHISTORYDIALOG + kWarning() << "Invalid XML: invalid timestamp!"; +#endif + continue; + } + + if( end_ ) + { + kWarning() << "Caught end, closing."; + return; + } + + // Change it to a so that it'll be readily usable when selected + conversation.setTagName( "messageRoot" ); +// conversation.removeAttribute( "timestamp" ); // Ignored by ChatMessageView? + + emit gotConversation( timestamp, conversation ); + } + + // Document done, remove it from the queue + documents_.remove( fileName ); + + if( end_ ) + { + kWarning() << "Caught end, closing."; + return; + } + } + +#ifdef KMESSDEBUG_CHATHISTORYDIALOG_VERBOSE + kDebug() << "All documents have been parsed."; +#endif +} + + + +#include "chathistorydialog.moc" diff --git a/src/dialogs/chathistorydialog.h b/src/dialogs/chathistorydialog.h new file mode 100644 index 0000000..789570a --- /dev/null +++ b/src/dialogs/chathistorydialog.h @@ -0,0 +1,130 @@ + /*************************************************************************** + 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 +#include +#include +#include + +#include + +#include "ui_chathistorydialog.h" + + +// Forward declarations +class ChatMessageView; +class QSortFilterProxyModel; +class QStandardItemModel; +class QTimer; +class XmlLogParser; + + + +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 + bool setContact( const QString &handle ); + + private: + // Load the list of contacts for which logs are available + void loadContactsList(); + + private slots: + // A conversation has been parsed by the thread + void addConversation( int timestamp, const QDomElement &newConversation ); + // Verify whether the chat date interval is valid or not + bool checkDates( bool reloadLogs = true ); + // Caches the XML for the selected contact. Makes things a lot faster + void cacheContactXml(const QModelIndex &index); + // Reload the current chat log history + void reloadLogs(); + // Set whether the dialog is loading chats or not + void setLoading( bool isLoading = false ); + + private: + // Mutex to watch over the chats addition + QMutex addConversationLock_; + // View used to show the chat logs + ChatMessageView *chatView_; + // Cache to store a contact's list of available conversations + QMap conversations_; + // XML log parsing thread + XmlLogParser *logParser_; + // Model for the list of contacts + QStandardItemModel *model_; + // Filter for the list of contacts + QSortFilterProxyModel *proxyModel_; + // Flag used to avoid reloading multiple times + bool reloadingLogs_; + // Timer to reload the shown chats + QTimer *reloadLogsTimer_; + // Cache to store a contact's entire chat history + QDomDocument xml_; +}; + + + +// Service class to make use of threads to fill in the list of available chats +class XmlLogParser : public QThread +{ + Q_OBJECT + + public: + // Constructor + XmlLogParser( bool showDate, bool showTime, bool showSeconds ); + // Destructor + ~XmlLogParser() {} + // Add another document to the queue + void addDocument( const QString &fileName, const QByteArray &newDocument ); + // Stop the thread + void end(); + + protected: + // Parse XML files into conversations + void run(); + + private: + // List of documents to parse + QHash documents_; + // An order of stopping has been received + bool end_; + // Show dates in messages + bool showDate_; + // Show time in generated messages + bool showTime_; + // Show seconds in messages + bool showSeconds_; + + signals: + // A conversation has been parsed + void gotConversation( int timestamp, const QDomElement &conversation ); +}; + + + +#endif /* CHATHISTORYDIALOG_H */ diff --git a/src/dialogs/chathistorydialog.ui b/src/dialogs/chathistorydialog.ui new file mode 100644 index 0000000..636951a --- /dev/null +++ b/src/dialogs/chathistorydialog.ui @@ -0,0 +1,317 @@ + + + historyDialog + + + + 0 + 0 + 680 + 472 + + + + + + + + + + Qt::Horizontal + + + false + + + + + + + Search through contacts... + + + true + + + + + + + + 100 + 0 + + + + true + + + QAbstractItemView::SelectRows + + + + + + + + + 100 + 0 + + + + Qt::Vertical + + + false + + + + Chat Log Filter + + + + + + QFormLayout::ExpandingFieldsGrow + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + Filter by &chat + + + true + + + + + + + + + true + + + + 0 + 0 + + + + true + + + + + + + + 22 + 22 + + + + KAnimatedButton { border: 0; } + + + + 22 + 22 + + + + process-working + + + + + + + Qt::Horizontal + + + + 17 + 17 + + + + + + + + + + Filter by &date + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + false + + + from + + + + + + + false + + + + + + + false + + + to + + + + + + + false + + + + + + + + + + + + + + + + + KDateWidget + QWidget +
    kdatewidget.h
    +
    + + KAnimatedButton + QToolButton +
    kanimatedbutton.h
    +
    + + KLineEdit + QLineEdit +
    klineedit.h
    +
    + + KComboBox + QComboBox +
    kcombobox.h
    +
    +
    + + searchEdit_ + listView_ + conversationRadio_ + dateRadio_ + conversationComboBox_ + fromBox_ + toBox_ + + + + + 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 new file mode 100644 index 0000000..8ee68d1 --- /dev/null +++ b/src/dialogs/contactaddeduserdialog.cpp @@ -0,0 +1,154 @@ +/*************************************************************************** + contactaddeduserdialog.cpp - description + ------------------- + begin : Sun Apr 14 2002 + copyright : (C) 2002 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 "contactaddeduserdialog.h" +#include "../model/contactlist.h" +#include "../contact/group.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" +#include "../utils/kmessconfig.h" + + + +/** + * 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() + , 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" ) ); + + // Set up the label + if( contactHandle == contactFriendlyName ) + { + messageLabel_->setText( i18n( "%1\nhas added you to his or her contact list." + , contactHandle ) ); + } + else + { + 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 ); +} + + + +/** +* @brief Called when the user pressed the "ok" button +* +*/ +void ContactAddedUserDialog::accept() +{ + QStringList groupIds; + + if( addContactOption_->isChecked() ) + { + // 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() ) + { + emit userChoice( contactHandle_, groupIds, ALLOW ); + } + else + { + emit userChoice( contactHandle_, groupIds, BLOCK ); + } + + // Call parent + KDialog::accept(); +} + + + +/** +* @brief Called when the user pressed the "cancel" button +* +*/ +void ContactAddedUserDialog::reject() +{ + // No choice for the moment, the question will be asked the next time + + // Call parent + KDialog::reject(); +} + + +#include "contactaddeduserdialog.moc" + diff --git a/kmess/dialogs/contactaddeduserdialog.h b/src/dialogs/contactaddeduserdialog.h similarity index 53% rename from kmess/dialogs/contactaddeduserdialog.h rename to src/dialogs/contactaddeduserdialog.h index a289d00..6daa8e4 100644 --- a/kmess/dialogs/contactaddeduserdialog.h +++ b/src/dialogs/contactaddeduserdialog.h @@ -18,53 +18,50 @@ #ifndef CONTACTADDEDUSERDIALOG_H #define CONTACTADDEDUSERDIALOG_H -#include -#include +#include "ui_contactaddeduserdialog.h" -#ifndef CONTACTADDEDUSERDIALOGINTERFACE_H -// Weird but it's required: -// TODO: g++ can't find this file if it's included from kmess.cpp -#include "contactaddeduserdialoginterface.h" -#endif +#include -/**The dialog for when someone has added the user to his or her contact list. - *@author Mike K. Bennett - */ -class ContactAddedUserDialog : public ContactAddedUserDialogInterface + +/** + * The dialog for when someone has added the user to his or her contact list. + * + * @author Mike K. Bennett + * @ingroup Dialogs + */ +class ContactAddedUserDialog : public KDialog, private Ui::ContactAddedUserDialog { Q_OBJECT - public: - // Return types for the dialog - enum ReturnCode - { + // Return types for the dialog + enum ReturnCode + { ADD = 0 , ALLOW = 1 , BLOCK = 2 - }; + }; public: - ContactAddedUserDialog( const QString &contactHandle, const QString &contactFriendlyName ); - ~ContactAddedUserDialog(); + // The constructor + ContactAddedUserDialog( const QString &contactHandle, const QString &contactFriendlyName ); + // The destructor + virtual ~ContactAddedUserDialog(); - protected slots: // Protected slots - // The user picked "add contact to the friends list". - void addContactPressed(); - // The user chose to let the contact view his or her online state, but - // not to add the contact. - void allowContactPressed(); - // The user chose to block the contact. - void blockContactPressed(); + public slots: // Protected slots + // The user pressed the "ok" button + virtual void accept(); + // The user pressed the "cancel" button + virtual void reject(); - private: // private attributes + private: // Private properties // The handle of the contact who has added the user - QString contactHandle_; + QString contactHandle_; signals: // Notify of the choice made by the user - void userChoice( const QString &handle, const int code ); + void userChoice( const QString &handle, const QStringList &groupsId, const int code ); }; diff --git a/src/dialogs/contactaddeduserdialog.ui b/src/dialogs/contactaddeduserdialog.ui new file mode 100644 index 0000000..c8d001a --- /dev/null +++ b/src/dialogs/contactaddeduserdialog.ui @@ -0,0 +1,167 @@ + + + ContactAddedUserDialog + + + + 0 + 0 + 417 + 363 + + + + + + + + 0 + 0 + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 17 + 17 + + + + + + + + What would you like to do? + + + + + + &Add this person to the following groups of your contact list: + + + true + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 17 + 17 + + + + + + + + + 150 + 150 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 17 + 17 + + + + + + + + &Do not add this person, but allow him or her to see your status + + + + + + + &Block this person from contacting you and seeing your status + + + + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 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..623c421 --- /dev/null +++ b/src/dialogs/contactentry.cpp @@ -0,0 +1,147 @@ +/*************************************************************************** + 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 + handle_ = contact->getHandle(); + cleanedFriendlyName_ = contact->getFriendlyName( STRING_CLEANED ); + nameLabel_ ->setText( contact->getFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); + 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; + cleanedFriendlyName_ = 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 cleaned friendly name (stripped of all formatting, for searching etc) +const QString& ContactEntry::getCleanedFriendlyName() const +{ + return cleanedFriendlyName_; +} + + + +// 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..3229bba --- /dev/null +++ b/src/dialogs/contactentry.h @@ -0,0 +1,70 @@ +/*************************************************************************** + 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 cleaned friendly name (stripped of all formatting, for searching etc) + const QString& getCleanedFriendlyName() 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_; + // Whether this entry is selected + bool selected_; + // The friendly name stripped of all formatting (for searching etc) + QString cleanedFriendlyName_; + + 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..82c3c26 --- /dev/null +++ b/src/dialogs/contactentry.ui @@ -0,0 +1,101 @@ + + + ContactEntry + + + + 0 + 0 + 154 + 59 + + + + + + + + 0 + + + 0 + + + + + true + + + QFrame::NoFrame + + + QFrame::Raised + + + 3 + + + + + + + 48 + 48 + + + + + 48 + 48 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + true + + + + + + + + + + + + Qt::RichText + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + + + + + diff --git a/src/dialogs/contactpropertiesdialog.cpp b/src/dialogs/contactpropertiesdialog.cpp new file mode 100644 index 0000000..1747531 --- /dev/null +++ b/src/dialogs/contactpropertiesdialog.cpp @@ -0,0 +1,723 @@ +/*************************************************************************** + contactpropertiesdialog.cpp - description + ------------------- + begin : Sun Dec 15 2002 + copyright : (C) 2002 by Michael Curtis + email : magnalium@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 "contactpropertiesdialog.h" + +#include "../contact/contactextension.h" +#include "../contact/group.h" +#include "../model/contactlist.h" +#include "../utils/kmessconfig.h" +#include "../utils/kmessshared.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + + + +ContactPropertiesDialog::ContactPropertiesDialog( QWidget *parent ) + : KDialog( parent ) + , Ui::ContactProperties() + , ok_( false ) + , mediaSound_(0) +{ + // Set up the interface and the dialog + setObjectName( "ContactProperties" ); + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + + // Configure the dialog + setWindowModality( Qt::WindowModal ); + + const KIconLoader *loader = KIconLoader::global(); + + // Set the dialog size + setButtons( Ok | Cancel ); + setDefaultButton( Ok ); + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "ContactPropertiesDialog" ) ); + + // Set the icons for the buttons + playButton_->setIcon( loader->loadIcon( "media-playback-start", KIconLoader::Small ) ); + + // 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( useButton_, SIGNAL( clicked() ), this, SLOT( slotUsePicture() ) ); + connect( restoreButton_, SIGNAL( clicked() ), this, SLOT( restoreContactPicture() ) ); + 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 ); + + // Allow the user to select a local existing file. + soundSelect_->setMode( KFile::File | KFile::ExistingOnly | KFile::LocalOnly ); + + connect( soundSelect_, SIGNAL( urlSelected ( const KUrl & ) ), + this, SLOT ( checkNotificationSoundFile( const KUrl & ) ) ); +} + + + +ContactPropertiesDialog::~ContactPropertiesDialog() +{ + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "ContactPropertiesDialog" ); + saveDialogSize( group ); + + delete mediaSound_; +#ifdef KMESSDEBUG_CONTACTPROPERTIES + kDebug() << "DESTROYED."; +#endif +} + + + +// The alt name checkbox was toggled. +void ContactPropertiesDialog::alternativeNameCheckBoxToggled(bool checked) +{ + nameEdit_->setEnabled( checked ); +} + + + +// Apply all values in the widgets to the contact extension. +void ContactPropertiesDialog::applyChanges() +{ + 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. + if ( nameEdit_->text().isEmpty() ) + { + extension->setUseAlternativeName( false ); + } + else + { + extension->setUseAlternativeName( alternativeNameCheckBox_->isChecked() ); + } + + extension->setAlternativeName ( nameEdit_->text() ); + extension->setNotes ( notesEdit_->toPlainText() ); + extension->setDisableNotifications( disableNotificationsCheckBox_->isChecked() ); + extension->setContactSoundPath ( soundSelect_->url().path() ); + extension->setContactAlternativePicturePath( alternativePicturePath_ ); + + + const QStringList groupIdsList( contact_->getGroupIds() ); + QListWidgetItem *item; + + groupList_->setGridSize( QSize( 2, (int) ceil( (float) groupList_->count() / 2.0 ) ) ); + + // Search for added/removed contact group + for( int i = 0; i < groupList_->count(); i++ ) + { + item = groupList_->item( i ); + const QString& currentId( item->data( 6 ).toString() ); + + if( item->checkState() == Qt::Checked ) + { + // If item is checked and the groupIdsList doesn't contain + // the currentId, it means the user want to add the contact in other group + if( ! groupIdsList.contains( currentId ) ) + { + emit addContactToGroup( contact_->getHandle(), currentId ); + } + // else the user is already in the group + continue; + } + else + { + // If item is unchecked and the groupIdsList contains + // the currentId, it means the user want to remove the contact from the group + if( groupIdsList.contains( currentId ) ) + { + emit removeContactFromGroup( contact_->getHandle(), currentId ); + } + // else the user isn't already in the group + } + } + + // Save the changed settings + CurrentAccount::instance()->getContactList()->saveProperties( contact_ ); +} + + + +// Choose a picture file (KFile dialog) +void ContactPropertiesDialog::choosePicture() +{ + const KUrl& file( KFileDialog::getImageOpenUrl( alternativePicturePath_ , this ) ); + + if ( ! file.isEmpty() ) + { + const QPixmap& pixmap( file.toLocalFile() ); + + // If it's a valid image + if( ! pixmap.isNull() ) + { + imageContact_->setPixmap( pixmap ); + alternativePicturePath_ = file.toLocalFile(); + } + } +} + + + +// 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_ ) + { + QString image; + if( alternativePicturePath_.isEmpty() ) + { + image = contact_->getExtension()->getContactPicturePath(); + + if( image.isEmpty() ) + { + image = contact_->getContactDefaultPicturePath(); + } + } + else + { + image = alternativePicturePath_; + } + + int eventType = event->type(); + + if( eventType == QEvent::Enter ) + { + QImage glowingImage( image ); + KIconEffect::toGamma( glowingImage, 0.8f ); + imageContact_->setPixmap( QPixmap::fromImage( glowingImage ) ); + } + else if( eventType == QEvent::Leave ) + { + imageContact_->setPixmap( image ); + } + else if( eventType == QEvent::MouseButtonRelease ) + { + choosePicture(); + } + } + + return false; +} + + + +// Show the dialog and obtain the contact handle. +bool ContactPropertiesDialog::launch( Contact *contact, DefaultTab defaultTab ) +{ +#ifdef KMESSDEBUG_CONTACTPROPERTIES + kDebug() << "Launch with contact " << contact->getHandle(); +#endif + + // 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 + setCaption( i18n( "Contact Properties for %1", contact->getHandle() ) ); + + // Setup the dialog + setupWidgets(); + + // If openNotesTab is true, set the current index to notes tab + switch ( defaultTab ) + { + case Information: + tabs_->setCurrentIndex(0); + break; + + case Images: + tabs_->setCurrentIndex(1); + break; + + case Notes: + tabs_->setCurrentIndex(2); + notesEdit_->setFocus(); + break; + + case Emoticons: + tabs_->setCurrentIndex(3); + break; + + default: + tabs_->setCurrentIndex(0); + } + /* + if( openNotesTab ) + { + tabs_->setCurrentIndex( 2 ); + notesEdit_->setFocus(); + } + // Else, just open first tab + else + { + tabs_->setCurrentIndex( 0 ); + } +*/ + // Show the dialog modally + exec(); + + // If the ok button was pressed.. + if ( ok_ ) + { + applyChanges(); + } + + return ok_; +} + + + +// The disable notification checkbox was toggled +void ContactPropertiesDialog::disableNotificationsCheckBoxToggled( bool checked ) +{ + soundSelect_->setDisabled( checked ); + playButton_ ->setDisabled( checked ); +} + + + +// Restore the original contact picture +void ContactPropertiesDialog::restoreContactPicture() +{ + // Restore the contact's picture + QString originalPicture( contact_->getExtension()->getContactPicturePath() ); + + if( originalPicture.isEmpty() ) + { + originalPicture = contact_->getContactDefaultPicturePath(); + } + + const QPixmap& pixmap( originalPicture ); + + if( ! pixmap.isNull() ) + { + imageContact_->setPixmap( pixmap ); + alternativePicturePath_ = ""; + } + + restoreButton_->hide(); +} + + + +// Setup the dialog's widgets +void ContactPropertiesDialog::setupWidgets() +{ + // Use bold font for the friendly name of the contact + QFont font; + font.setBold(true); + ContactExtension *extension = contact_->getExtension(); + + // Set the button default view to hide + restoreButton_->hide(); + + trueNameLabel_->setFont( font ); + trueNameLabel_->setText( contact_->getTrueFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); + + // Set the informations about contact + const QString& pm( contact_->getPersonalMessage( STRING_LIST_SETTING_ESCAPED ) ); + if( pm.isEmpty() ) + { + // Hide to avoid blank space + personalMessageLabel_->hide(); + } + else + { + personalMessageLabel_->setText( pm ); + } + + QString lastSeenString, lastMessageString; + + if( contact_->isOnline() ) + { + lastSeenString = i18n( "Connected" ); + } + else if( extension->getLastSeen().toTime_t() == 0 || extension->getLastSeen().isNull() ) + { + lastSeenString = i18n( "Not seen yet" ); + } + else + { + lastSeenString = extension->getLastSeen().toString(); + } + + if( extension->getLastMessageDate().toTime_t() == 0 || extension->getLastMessageDate().isNull() ) + { + lastMessageString = i18n( "No messages yet" ); + } + else + { + lastMessageString = extension->getLastMessageDate().toString(); + } + + 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_->getClientName() ) ); + nameEdit_ ->setText( extension->getAlternativeName( STRING_ORIGINAL ) ); + notesEdit_ ->setPlainText( extension->getNotes() ); + + alternativeNameCheckBox_->setChecked( extension->getUseAlternativeName() ); + alternativeNameCheckBoxToggled( extension->getUseAlternativeName() ); + + disableNotificationsCheckBox_->setChecked( extension->getDisableNotifications() ); + disableNotificationsCheckBoxToggled( extension->getDisableNotifications() ); + + // Set the contact picture + QPixmap pixmap( contact_->getContactPicturePath() ); + + // If pixmap is null set the default contact picture + if( pixmap.isNull() ) + { + pixmap.load( contact_->getContactDefaultPicturePath() ); + } + + imageContact_->setPixmap( pixmap ); + + alternativePicturePath_ = extension->getContactAlternativePicturePath(); + + // If the alternative picture is used, show the restore button + if( ! alternativePicturePath_.isEmpty() ) + { + restoreButton_->show(); + } + + soundSelectLabel_->setBuddy(soundSelect_); + soundSelect_->setUrl( extension->getContactSoundPath() ); + + // Set the group list + const QStringList& groupIdsList( contact_->getGroupIds() ); + const QList& groupContactList( CurrentAccount::instance()->getContactList()->getGroupList() ); + QListWidgetItem *item; + + foreach( const Group *group, groupContactList ) + { + if( ! group->isSpecialGroup() ) + { + item = new QListWidgetItem( group->getName(), groupList_ ); + item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); + item->setData( 6, group->getId() ); + + if( groupIdsList.contains( group->getId() ) ) + { + item->setCheckState( Qt::Checked ); + } + else + { + item->setCheckState( Qt::Unchecked ); + } + } + } + + // If contact isn't in FL disable the group list + if( ! contact_->isFriend() ) + { + groupList_->setEnabled( false ); + } + + // 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 ) ) + { + continue; + } + + // Set the new item and put it into pictures list + 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 ); + item->setText( in.readLine() ); + fileDat.close(); + } + + 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 ); + } +} + + + +// The Ok or Cancel button has been pressed +void ContactPropertiesDialog::slotButtonClicked( int button ) +{ + // If the Cancel button has been pressed, close without saving + if( button != Ok ) + { + KDialog::slotButtonClicked( button ); + return; + } + + ok_ = true; + accept(); +} + + + +// The "Clear cache" button has been pressed +void ContactPropertiesDialog::slotClearCache() +{ + if( pictureList_->count() != 0 ) + { + ContactExtension *extension = contact_->getExtension(); + extension->clearCache(); + pictureList_->clear(); + } +} + + + +// 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() +{ + const QString& currentFile( soundSelect_->url().url() ); + if( currentFile.isEmpty() ) + { + return; + } + + // Initialize the media sound object and connect it with slot sound finished + if( mediaSound_ == 0 ) + { + mediaSound_ = Phonon::createPlayer( Phonon::NotificationCategory ); + connect( mediaSound_, SIGNAL( finished() ), this, SLOT( slotSoundFinished() ) ); + } + + // If the state is playing, stop the sound media and reset the icon + if( mediaSound_->state() == Phonon::PlayingState ) + { + mediaSound_->stop(); + playButton_->setIcon( KIcon( "media-playback-start" ) ); + return; + } + + // Play the sound and change the icon + mediaSound_->setCurrentSource( currentFile ); + mediaSound_->play(); + playButton_->setIcon( KIcon( "media-playback-stop" ) ); +} + + + +// 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() +{ + // When sound finished, change reset the icon + playButton_->setIcon( KIcon( "media-playback-start" ) ); +} + + + +// 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 ); +} + + + +// Check if the fileformat is supported by Phonon +bool ContactPropertiesDialog::checkNotificationSoundFile( const KUrl &url ) { + +#ifdef KMESSDEBUG_CONTACTPROPERTIES + kDebug() << "Checking filetype"; +#endif + + if( Phonon::BackendCapabilities::availableMimeTypes().contains( + KMimeType::findByUrl( url.url() )->name()) ) + { + return true; + } + + KMessageBox::sorry( this, i18n( "The selected filetype is not supported by Phonon." ), i18n( "Unsupported filetype" ) ); + soundSelect_->setUrl( KUrl( contact_->getExtension()->getContactSoundPath() ) ); + return false; +} + + + +#include "contactpropertiesdialog.moc" diff --git a/src/dialogs/contactpropertiesdialog.h b/src/dialogs/contactpropertiesdialog.h new file mode 100644 index 0000000..a87b164 --- /dev/null +++ b/src/dialogs/contactpropertiesdialog.h @@ -0,0 +1,108 @@ +/*************************************************************************** + contactpropertiesdialog.h - description + ------------------- + begin : Sun Dec 15 2002 + copyright : (C) 2002 by Michael Curtis + email : magnalium@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 CONTACTPROPERTIESDIALOG_H +#define CONTACTPROPERTIESDIALOG_H + +#include "ui_contactpropertiesdialog.h" + +#include +#include + + +class Contact; + + + +/** + * The dialog for modifying contact properties (ContactExtension). + * + * @author Michael Curtis + * @ingroup Dialogs + */ +class ContactPropertiesDialog : public KDialog, private Ui::ContactProperties +{ + Q_OBJECT + + public: + enum DefaultTab + { + Information, + Notes, + Emoticons, + Images + }; + + 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, DefaultTab defaultTab = Information ); + + protected: + bool eventFilter(QObject *obj, QEvent *event); + + private: // Private methods + void applyChanges(); + void setupWidgets(); + + private slots: + // The alt name checkbox was toggled. + void alternativeNameCheckBoxToggled(bool checked); + // Choose a picture file (KFile dialog) + void choosePicture(); + // Choose a sound file (KFile dialog) + void disableNotificationsCheckBoxToggled(bool checked); + // Restore the original contact picture + void restoreContactPicture(); + // The Ok or Cancel button has been pressed + 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(); + // Check if the fileformat is supported by Phonon + bool checkNotificationSoundFile( const KUrl &url ); + + private: // Private attributes + // Alternative picture path + QString alternativePicturePath_; + // Contact + Contact *contact_; + // Whether or not OK was pressed. + bool ok_; + // Sound media object + Phonon::MediaObject *mediaSound_; + + signals: + void addContactToGroup ( QString contact, QString id ); + void removeContactFromGroup( QString contact, QString id ); +}; + +#endif diff --git a/src/dialogs/contactpropertiesdialog.ui b/src/dialogs/contactpropertiesdialog.ui new file mode 100644 index 0000000..6acc30c --- /dev/null +++ b/src/dialogs/contactpropertiesdialog.ui @@ -0,0 +1,508 @@ + + + ContactProperties + + + + 0 + 0 + 461 + 472 + + + + + + + + + + 0 + + + + &Information + + + + + + + + + + + 96 + 96 + + + + + 96 + 96 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + true + + + Qt::AlignCenter + + + + + + + Click this button to restore the display picture of this contact + + + &Restore + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + Qt::RichText + + + true + + + + + + + + + + + + + + + + + + + + + + + + Qt::RichText + + + true + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 250 + 10 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 10 + 20 + + + + + + + + + + &Groups: + + + groupList_ + + + + + + + + 0 + 0 + + + + + 0 + 100 + + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::MultiSelection + + + Qt::ElideNone + + + true + + + + + + + Use an &alternative name for this contact + + + + + + + + + + Disable notifications for this contact + + + + + + + + + &Sound: + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + &Display Pictures + + + + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::SingleSelection + + + + 96 + 96 + + + + QListView::Static + + + QListView::Adjust + + + QListView::IconMode + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Click here to use the selected picture as your display picture + + + Use As Display Picture + + + + + + + &Clear Cache + + + + + + + + + + &Notes + + + + + + + + + + &Emoticons + + + + + + <html>You can choose to hide any emoticon received from this contact. Just right-click on a received emoticon and choose "Hide this Emoticon". With this page, you can restore the hidden emoticons.</html> + + + 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 restore the selected emoticon + + + Resto&re + + + Alt+V + + + + + + + + + + + + + + KUrlRequester + QFrame +
    kurlrequester.h
    +
    +
    + + + + alternativeNameCheckBox_ + toggled(bool) + nameEdit_ + setEnabled(bool) + + + 105 + 340 + + + 82 + 373 + + + + + disableNotificationsCheckBox_ + toggled(bool) + playButton_ + setDisabled(bool) + + + 44 + 400 + + + 413 + 433 + + + + + disableNotificationsCheckBox_ + toggled(bool) + soundSelect_ + setDisabled(bool) + + + 230 + 404 + + + 276 + 437 + + + + +
    diff --git a/src/dialogs/invitedialog.cpp b/src/dialogs/invitedialog.cpp new file mode 100644 index 0000000..1517ccd --- /dev/null +++ b/src/dialogs/invitedialog.cpp @@ -0,0 +1,273 @@ +/*************************************************************************** + 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 + const 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() +{ + const QString& text( searchEdit_->text().toLower() ); + ContactEntry *contactEntry; + + foreach( contactEntry, contactEntryList_ ) + { + if( contactEntry->getHandle() .toLower().contains( text ) + || contactEntry->getCleanedFriendlyName().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; + const CurrentAccount *currentAccount = CurrentAccount::instance(); + QHashIterator it( currentAccount->getContactList()->getContactList() ); + + // Interate to add each contact + const QString& currentHandle( currentAccount->getHandle() ); + while ( it.hasNext() ) + { + contact = it.next().value(); + const QString& handle( contact->getHandle() ); + + // If the current user is already in multi-chat, jump to next + if( usersAlreadyInChat.contains( handle ) ) + { + continue; + } + + // don't show ourselves in the invite list. + if ( handle == currentHandle ) + { + 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..e815b27 --- /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 person not on your contact list: + + + otherEdit_ + + + + + + + + + Enter the email address of a person 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/kmess/dialogs/networkwindow.cpp b/src/dialogs/networkwindow.cpp similarity index 50% rename from kmess/dialogs/networkwindow.cpp rename to src/dialogs/networkwindow.cpp index 774aa95..2311d70 100644 --- a/kmess/dialogs/networkwindow.cpp +++ b/src/dialogs/networkwindow.cpp @@ -16,83 +16,119 @@ ***************************************************************************/ #include "../kmessdebug.h" -#include "../network/p2pmessage.h" #include "networkwindow.h" -#include -#include -#include -#include -#include +#include "../network/mimemessage.h" +#include "../network/msnnotificationconnection.h" +#include "../network/p2pmessage.h" +#include "../utils/kmessconfig.h" -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include - -#if KDE_IS_VERSION(3,2,0) -#include -#else -#include -#endif +#include +#include +#include +#include +#include +#include // Declare the instance NetworkWindow * NetworkWindow::instance_(0); + // Constructor -NetworkWindow::NetworkWindow(QWidget *parent, const char *name) - : KDialogBase(parent, name, false, i18n("Network Window"), - KDialogBase::Close | KDialogBase::User1 | KDialogBase::User2 | KDialogBase::User3, - KDialogBase::Close, - true, - i18n("Save tab"), - i18n("Clear tab"), - i18n("Close tab") ) - , connectionTabs_(0) +NetworkWindow::NetworkWindow( QWidget *parent ) + : KDialog( parent, Qt::Dialog ) // Explicitly set the window type to disable the destructive close behavior + , Ui::NetworkWindow() { -#ifdef KMESS_NETWORK_WINDOW + // Set up the dialog and its buttons + setObjectName( "Network" ); + setButtons( Close | User1 | User2 | User3 ); + setDefaultButton( Close ); + setCaption( i18n("Network Window") ); + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "NetworkWindow" ) ); - // Create main tab layout. - // KTabBar is suppored as of KDE 3.2, so revert to QTabBar for KDE 3.1 - #if KDE_IS_VERSION(3,2,0) - connectionTabs_ = new KTabWidget(this, "ConnectionTabs"); - #else - connectionTabs_ = new QTabWidget(this, "ConnectionTabs"); - #endif - - setMainWidget(connectionTabs_); - setInitialSize( QSize(800, 600) ); - - connectionViews_.setAutoDelete(true); + // Load the ui file in a main qwidget + QWidget *mainWidget = new QWidget(this); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + // Set up the behavior of the Tab Widget +#if KDE_IS_VERSION(4,1,0) + connectionTabs_->setCloseButtonEnabled( true ); +#else + connectionTabs_->setHoverCloseButton( true ); #endif + connect( connectionTabs_, SIGNAL( closeRequest(QWidget*) ), this, SLOT( closeTab(QWidget*) ) ); + connect( connectionTabs_, SIGNAL( currentChanged(int) ), this, SLOT( slotUpdateWidgets(int) ) ); + + // Set up the behavior of the Send button + 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( 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 ); } -#ifdef KMESS_NETWORK_WINDOW +// Destructor +NetworkWindow::~NetworkWindow() +{ + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "NetworkWindow" ); + saveDialogSize( group ); + + // Disconnect all signals, prevent i.e. slotUpdateWidgets from being called + disconnect( connectionTabs_, 0, this, 0 ); + disconnect( sendCommandButton_, 0, this, 0 ); + disconnect( this, 0, this, 0 ); + + foreach( ConnectionEntry *entry, connectionViews_ ) + { + delete entry->logView; + delete entry; + } + connectionViews_.clear(); +} // The internal function to add a message void NetworkWindow::addMessage(ConnectionEntry *entry, QString html) { - html = html.replace( " ", "  ").replace( QRegExp("[\r\n] "), "\n "); + html = html.replace( " ", "  ") + .replace( QRegExp("[\r\n] "), "\n "); // Add spacer if previous message was some time ago. QDateTime now = QDateTime::currentDateTime(); if( entry->lastMessage.secsTo( now ) > 20 ) { - entry->logView->append( "
    " ); + entry->logView->append( "

     

    " ); } - entry->logView->append(html); + entry->logView->append( html.toUtf8() ); entry->lastMessage = now; + + // Update the widgets for the currently visible tab + slotUpdateWidgets(); } @@ -101,7 +137,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) void NetworkWindow::addLogMessage(QObject *connection, const QString &message) { ConnectionEntry *entry = getConnectionEntry(connection); - QString html = "  " + message + "\n"; + QString html( "

      " + message + "

    \n" ); addMessage( entry, html ); } @@ -111,7 +147,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) 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); } @@ -121,7 +157,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) 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); } @@ -132,9 +168,9 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) { // Add the message ConnectionEntry *entry = getConnectionEntry(connection); - entry->logView->append("

    the connection was closed
    " + getTime() + "

    \n"); + entry->logView->append("

    the connection was closed
    " + getTime() + "

    \n"); entry->lastMessage = QDateTime::currentDateTime(); - + entry->isClosed = true; // // Unregister the connection, so new attempts from the same class generate a new object. // connectionViews_.remove(browser); } @@ -144,67 +180,152 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) // Return a log description for a standard command. QString NetworkWindow::describeCommand(const QString &command) { - if( command.startsWith("VER ") ) + QString firstPart( command.left(3) ); // command[0] in normal code. + int errorCode = firstPart.toInt(); + + if( errorCode != 0 ) { - return formatDescription("Protocol version negotiation"); - } - else if ( command.startsWith("CVR ") ) - { - return formatDescription("Application version exchange"); - } - else if ( command.startsWith("XFR ") ) - { - return formatDescription("Server transfer request"); - } - else if ( command.startsWith("USR ") ) - { - return formatDescription("User login information"); - } - else if ( command.startsWith("SYN ") ) - { - return formatDescription("Contactlist sync request"); - } - else if ( command.startsWith("CHG ") ) - { - return formatDescription("Client status message (change of online state, client capabilities or msn object)"); - } - else if ( command.startsWith("CHL ") ) - { - return formatDescription("Challenge query"); - } - else if ( command.startsWith("IRO ") ) - { - return formatDescription("Contact already in chat"); - } - else if ( command.startsWith("CAL ") ) - { - return formatDescription("Calling a contact to join chat"); - } - else if ( command.startsWith("RNG ") ) - { - return formatDescription("Invitation for a chat"); - } - else if ( command.startsWith("ANS ") ) - { - return formatDescription("Chat invitation answer with user login information"); - } - else if ( command.startsWith("JOI ") ) - { - return formatDescription("Contact joins chat"); - } - else if ( command.startsWith("FIL ") ) - { - return formatDescription("Indicates the size of the entire file"); - } - else if ( command.startsWith("TFR ") ) - { - return formatDescription("Start of file transfer"); + switch( errorCode ) + { + // Command is a 3 digit error code. + case 200: return formatDescription("Error: Invalid syntax"); + case 201: return formatDescription("Error: Invalid parameter"); + case 205: return formatDescription("Error: Invalid principal; not an MSN account"); + case 206: return formatDescription("Error: Domain name missing"); + case 207: return formatDescription("Error: Already logged in"); + case 208: return formatDescription("Error: Invalid principal; not an MSN account"); + case 209: return formatDescription("Error: Nickname change illegal"); + case 210: return formatDescription("Error: Principal list full"); + case 213: return formatDescription("Error: Invalid rename request"); + case 215: return formatDescription("Error: Principal already on list"); + case 216: return formatDescription("Error: Principal not on list"); + case 217: return formatDescription("Error: Principal not online"); + case 218: return formatDescription("Error: Already in this mode"); + case 219: return formatDescription("Error: Principal is in the opposite list"); + case 223: return formatDescription("Error: Too many groups"); + case 224: return formatDescription("Error: Invalid group"); + case 225: return formatDescription("Error: Principal not in group"); + case 227: return formatDescription("Error: Group not empty"); + case 228: return formatDescription("Error: Group with same name already exists"); + case 229: return formatDescription("Error: Group name too long"); + case 230: return formatDescription("Error: Cannot remove group zero"); + case 231: return formatDescription("Error: Invalid group"); + case 240: return formatDescription("Error: Empty domain"); + case 280: return formatDescription("Error: Switchboard server failed"); + case 281: return formatDescription("Error: Transfer to switchboard failed"); + case 282: return formatDescription("Error: P2P header error"); + case 300: return formatDescription("Error: Required field missing"); + case 302: return formatDescription("Error: Not logged in"); + case 402: // same as 403 + case 403: return formatDescription("Error: Error accessing contact list"); + case 420: return formatDescription("Error: Invalid account permissions"); // CVR with unofficial client, non beta service tester + case 500: return formatDescription("Error: Service Temporarily Unavailable"); + case 501: return formatDescription("Error: Database server error"); + case 502: return formatDescription("Error: Protocol command is disabled"); + case 510: return formatDescription("Error: File operation failed"); + case 511: return formatDescription("Error: Account is banned"); + case 520: return formatDescription("Error: Memory allocation failed"); + case 540: return formatDescription("Error: Challenge response failed"); + case 600: return formatDescription("Error: Server is busy"); + case 601: return formatDescription("Error: Server is unavailable"); + case 602: return formatDescription("Error: Peer nameserver is down"); + case 603: return formatDescription("Error: Database connection failed"); + case 604: return formatDescription("Error: Server is going down"); + case 605: return formatDescription("Error: Server unavailable"); + case 700: return formatDescription("Error: Connection failed"); + case 710: return formatDescription("Error: Bad command parameter"); + case 711: return formatDescription("Error: Write is blocking"); + case 712: return formatDescription("Error: Session is overloaded"); + case 713: return formatDescription("Error: Opening chat sessions too fast"); + case 714: return formatDescription("Error: Too many chat sessions open"); + case 715: return formatDescription("Error: Unexpected command value"); + case 717: return formatDescription("Error: Bad friend file"); + case 731: return formatDescription("Error: Not expected"); + case 800: return formatDescription("Error: Changing names too fast"); + case 911: return formatDescription("Error: Authentication ticket was incorrect"); + case 913: return formatDescription("Error: not allowed when hidden"); + case 923: return formatDescription("Error: Kids' Passport without parental consent"); + case 924: return formatDescription("Error: passport account not verified yet"); + case 928: return formatDescription("Error: bad ticket"); + case 931: return formatDescription("Error: account not on this server"); // if using a cached NS instead of the main dispatch point. + + case 900: + case 912: + case 918: + case 919: + case 921: + case 922: return formatDescription("Error: Server too busy"); + + case 914: + case 915: + case 916: return formatDescription("Error: Server unavailable"); + case 917: return formatDescription("Error: authentication failed"); + default: return formatDescription("Error, type is unknown!"); + } } else { -// return QString::null; - return formatDescription( QString::null ); // always add time. + if( firstPart == "VER" ) + { + return formatDescription("Protocol version negotiation"); + } + else if ( firstPart == "CVR" ) + { + return formatDescription("Application version exchange"); + } + else if ( firstPart == "XFR" ) + { + return formatDescription("Server transfer request"); + } + else if ( firstPart == "USR" ) + { + return formatDescription("User login information"); + } + else if ( firstPart == "SYN" ) + { + return formatDescription("Contactlist sync request"); + } + else if ( firstPart == "CHG" ) + { + return formatDescription("Client status message (change of online state, client capabilities or msn object)"); + } + else if ( firstPart == "CHL" ) + { + return formatDescription("Challenge query"); + } + else if ( firstPart == "IRO" ) + { + return formatDescription("Contact already in chat"); + } + else if ( firstPart == "CAL" ) + { + return formatDescription("Calling a contact to join chat"); + } + else if ( firstPart == "RNG" ) + { + return formatDescription("Invitation for a chat"); + } + else if ( firstPart == "ANS" ) + { + return formatDescription("Chat invitation answer with user login information"); + } + else if ( firstPart == "JOI" ) + { + return formatDescription("Contact joins chat"); + } + else if ( firstPart == "FIL" ) + { + return formatDescription("Indicates the size of the entire file"); + } + else if ( firstPart == "TFR" ) + { + return formatDescription("Start of file transfer"); + } } + + // Default +// return QString::null; + return formatDescription( QString::null ); // always add time. } @@ -237,13 +358,13 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) QString NetworkWindow::describeMimeMessage(const QString &mimeMessage) { QRegExp rx("Content-Type: ([^\r\n; ]+)"); - if( rx.search(mimeMessage) == -1 ) + if( rx.indexIn(mimeMessage) == -1 ) { return formatDescription("Message could not be parsed!"); } // Return a description based on the content type - QString contentType = rx.cap(1); + QString contentType( rx.cap(1) ); // Notification server messages @@ -255,17 +376,17 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) 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" ) { @@ -275,7 +396,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) 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" ) { @@ -307,7 +428,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) else if( contentType == "image/gif" || contentType == "application/x-ms-ink" ) { // Ink (drawing) message - return formatDescription("Handwritten Ink message"); + return formatDescription("Ink drawing message"); } else if( contentType == "text/x-clientcaps" ) { @@ -346,18 +467,18 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) QString NetworkWindow::describeP2PMessage(const QByteArray &message, const int headerStart) { // Prepare to extract certain P2P header fields - QDataStream binaryStream(message, IO_ReadOnly); + QDataStream binaryStream( message ); binaryStream.setByteOrder( QDataStream::LittleEndian ); // 0 4 8 16 24 28 32 36 40 48 // |....|....|....|....|....|....|....|....|....|....|....|....| // |sid |mid |offset |totalsize|size|flag|asid|auid|a-datasz | - Q_UINT32 sessionId, messageId, dataSize, flags, ackSessionId, ackUniqueId; - Q_UINT64 dataOffset, totalSize, ackDataSize; + quint32 sessionId, messageId, dataSize, flags, ackSessionId, ackUniqueId; + quint64 dataOffset, totalSize, ackDataSize; // Get header fields - bool posFound = binaryStream.device()->at( headerStart ); + bool posFound = binaryStream.device()->seek( headerStart ); if( ! posFound ) { return formatDescription("Message could not be parsed!"); @@ -377,22 +498,45 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) { 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" ); + return formatDescription("Ink message over P2P, " + partName); + } + else + { + return formatDescription("Ink message over P2P"); + } + } + + // 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. - if( dataSize == 4 ) + if( dataSize == 4 && dataOffset == 0 ) { return formatDescription("P2P Data preparation message"); } 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 ") ) { @@ -476,7 +620,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) "ackSid " + QString::number(ackSessionId) + ", session should terminate"); case 0x20: - case 0x1000020: + case 0x1000020: // since WLM 2009 return formatDescription("P2P MsnObject data," " bytes " + QString::number(dataOffset) + "-" + QString::number(dataOffset + dataSize) + " of " + QString::number(totalSize)); @@ -501,6 +645,21 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) + // Destroy the singleton. + void NetworkWindow::destroy() + { + if( ! instance_ ) + { + // The singleton has already been destroyed, or was never used + return; + } + + delete instance_; + instance_ = 0; + } + + + // Format the description to be displayed QString NetworkWindow::formatDescription(const QString &description) { @@ -540,7 +699,8 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) 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; } @@ -549,7 +709,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) // If no type is found, assume it's a standard MSN connection. if( entry->type == TYPE_UNKNOWN ) { - kdWarning() << "NetworkWindow: Could not determine connection type for message: " << message.data() << endl; + kWarning() << "Could not determine connection type for message: " << message.data(); entry->type = TYPE_NS; } } @@ -606,18 +766,18 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) // 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") ) { // Find end of Mime, start of binary P2P - int mimeEnd = utf8Message.find("\r\n\r\n"); + int mimeEnd = utf8Message.indexOf("\r\n\r\n"); if( mimeEnd != -1 ) { // Extract the first utf-8 mime part, locate start of p2p header - QString p2pMimePart = utf8Message.left(mimeEnd + 4); - int headerStart = p2pMimePart.utf8().size() - 1; // convert mimeEnd index, utf-8 may have double characters + 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 logMessage += formatString( p2pMimePart ); @@ -627,27 +787,24 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) } else { + // Whole message is in utf-8 + // First hide things we don't want to log. if( entry->type == TYPE_HTTP ) { // Hide passwords from the passport login, if they are included in the message - int passStart = utf8Message.find(""); + int passStart = utf8Message.indexOf(""); if( passStart != -1 ) { passStart += 15; // size of xml tag - int passEnd = utf8Message.find("", passStart); + int passEnd = utf8Message.indexOf("", passStart); int passLen = ( passEnd - passStart ); - QString replacement; - replacement.fill( '*', passLen ); - utf8Message = utf8Message.replace( passStart, passLen, replacement ); + utf8Message = utf8Message.replace( passStart, passLen, QString( passLen, '*' ) ); } } // Convert to HTML. // Remove last
    because KTextBrowser::append() already adds it. - - // Whole message is in utf-8 - // remove last
    because KTextBrowser::append() already adds it. logMessage = formatString( utf8Message ); logMessage = logMessage.replace(QRegExp("
    $"), QString::null); @@ -688,7 +845,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) QString logMessage; // Prepare to extract certain P2P header fields - QDataStream binaryStream(message, IO_ReadOnly); + QDataStream binaryStream( message ); binaryStream.setByteOrder( QDataStream::LittleEndian ); int p2pDataStart = headerStart + 48; bool posFound; @@ -697,11 +854,11 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) // |....|....|....|....|....|....|....|....|....|....|....|....| // |sid |mid |offset |totalsize|size|flag|asid|auid|a-datasz | - Q_UINT32 sessionId, messageId, dataSize, flags, ackSessionId, ackUniqueId; - Q_UINT64 dataOffset, totalSize, ackDataSize; + quint32 sessionId, messageId, dataSize, flags, ackSessionId, ackUniqueId; + quint64 dataOffset, totalSize, ackDataSize; // Get header fields - posFound = binaryStream.device()->at( headerStart ); // return value ignored. + posFound = binaryStream.device()->seek( headerStart ); // return value ignored. binaryStream >> sessionId; binaryStream >> messageId; binaryStream >> dataOffset; @@ -713,7 +870,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) binaryStream >> ackDataSize; #ifdef KMESSTEST - ASSERT( posFound ); + KMESS_ASSERT( posFound ); #endif // If the data size is completely wrong, we're dealing with partially sent data here, @@ -724,7 +881,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) } // Show header information - logMessage += formatRawData(incoming, message, headerStart, 48, 16); + logMessage += formatRawData(incoming, message, headerStart, 48, 4, 16); // Add header debug details logMessage += ""; @@ -749,31 +906,51 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) logMessage += ""; // The message a utf-8 (MSNSLP) payload if the session id is zero. - bool hasSlpPayload = ( sessionId == 0 && dataSize > 0 ); + const char *dataPtr = ( message.data() + p2pDataStart ); + bool hasSlpPayload = ( sessionId == 0 && dataSize > 0 ); + int safeEnd = qMin( message.size(), (int) ( p2pDataStart + dataSize ) ); + int safeSize = qMin( (int) dataSize, ( message.size() - p2pDataStart ) ); if( hasSlpPayload ) { - QString slpMessage = QString::fromUtf8( message.data() + p2pDataStart, QMIN(dataSize, message.size() - p2pDataStart)); - logMessage += "\n
    " + formatString(slpMessage); + // See if the SLP body is terminated with a final null character (should be). + int slpLength = safeSize; + bool hasSlpNullEnd = ( message[ p2pDataStart + slpLength - 1 ] == 0x00 ); + if( hasSlpNullEnd ) + { + slpLength--; + } + + // Display the SLP body + QString slpMessage( QString::fromUtf8( dataPtr, slpLength ) ); + logMessage += "\n
    " + formatString( slpMessage ); + + // Add message footer + if( hasSlpNullEnd ) + { + // 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. logMessage += "\n
    (" + QString::number(dataSize) + " bytes of binary data)"; } - // Add message footer - int messageEnd = p2pDataStart + dataSize; - int remainingBytes = message.size() - messageEnd; - if( hasSlpPayload && message[ messageEnd - 1 ] == 0x00 ) - { - // Display the \0 that QString::fromUtf8() silently dropped - logMessage += formatRawData( incoming, message, messageEnd - 1, 1 ); - } - // Display the remaining bytes, if any. // This is the footer when the p2p message is sent over the SB. - if( remainingBytes > 0 ) + if( safeEnd < message.size() ) { - logMessage += "
    " + formatRawData( incoming, message, messageEnd, remainingBytes ); + logMessage += "
    " + formatRawData( incoming, message, safeEnd, message.size() - safeEnd ); } return logMessage; @@ -782,7 +959,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) // 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 += ""; // If length field is corrupt (e.g. 432712149, avoid looping though 4GB of memory.. - int safeLength = QMIN( (uint) length, message.size() - start ); + int safeLength = qMin( length, message.size() - start ); for(int i = 0; i < safeLength; i++) { @@ -801,7 +978,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) { logMessage += "
    "; } - else if( i % 4 == 0 ) + else if( i % bytesPerCol == 0 ) { logMessage += " "; } @@ -826,7 +1003,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) QString NetworkWindow::formatString(const QString &message) { // Parse any HTML characters. - QString logMessage = QStyleSheet::escape( message ); + QString logMessage( Qt::escape( message ) ); // Format newline characters logMessage = logMessage.replace("\r\n", "\\r\\n
    "); @@ -842,27 +1019,33 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) NetworkWindow::ConnectionEntry * NetworkWindow::getConnectionEntry(QObject *connection) { #ifdef KMESSTEST - ASSERT( connection != 0 ); // no KMESS_NULL(), this is debug code already. + KMESS_ASSERT( connection != 0 ); // no KMESS_NULL(), this is debug code already. #endif // Find the entry - ConnectionEntry *entry = connectionViews_.find( connection ); + ConnectionEntry *entry = connectionViews_.value( connection, 0 ); // If the view didn't exist before, create a new one. if( entry == 0 ) { // Create new entry entry = new ConnectionEntry; - entry->logView = new KTextBrowser( connectionTabs_, QString(connection->name()) + "_log" ); - entry->logView->setTextFormat( Qt::RichText ); + entry->logView = new KTextBrowser( connectionTabs_ ); + entry->logView->setObjectName( connection->objectName() + "_log" ); entry->type = TYPE_UNKNOWN; entry->lastMessage = QDateTime::currentDateTime(); connectionViews_.insert( connection, entry ); // Add new tab - connectionTabs_->addTab( entry->logView, connection->name() ); + 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 + entry->isClosed = false; + return entry; } @@ -882,10 +1065,10 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) ConnectionEntry *entry = getConnectionEntry(connection); // If empty, set the initial label. Otherwise add a IRC-like rename message - if( entry->logView->length() == 0 ) + if( entry->type == TYPE_UNKNOWN ) { - connectionTabs_->setTabLabel( entry->logView, title ); - entry->logView->append("

    Log started by " + QString(connection->name()) + "

    "); + connectionTabs_->setTabText( connectionTabs_->indexOf( entry->logView ), title ); + entry->logView->append("

    Log started by " + QString(connection->objectName()) + "

    "); } else { @@ -898,84 +1081,121 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) // Show the window if there are connection logs to show void NetworkWindow::show() { - if( connectionTabs_ == 0 || connectionTabs_->count() < 1 ) + if( connectionTabs_->count() < 1 ) { - KMessageBox::error( this, i18n("No connections are present. Cannot open the Network Window.") ); + KMessageBox::error( this, i18n("No connections are present.\nCannot open the Network Window.") ); return; } - KDialogBase::show(); + KDialog::show(); } // The 'save tab' button was pressed. - void NetworkWindow::slotUser1() + void NetworkWindow::saveCurrentTab() { - if( connectionTabs_ == 0 ) + if( connectionTabs_->currentWidget() == 0 ) return; QString path; - QString name = connectionTabs_->tabLabel( connectionTabs_->currentPage() ); + QString name( connectionTabs_->tabText( connectionTabs_->currentIndex() ) ); - path = KFileDialog::getSaveFileName( name + ".html" ); - if( path.isNull() ) + path = KFileDialog::getSaveFileName( KUrl(), "*.html" ); + if( path.isEmpty() ) return; -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL - kdDebug() << "NetworkWindow - saving network log for window '" << name << "' to '" << path << "'." << endl; -#endif + kDebug() << "NetworkWindow - saving network log for window '" << name << "' to '" << path << "'."; bool failed = false; // Create and open the file. QFile file( path ); - if( ! file.open( IO_WriteOnly ) ) + if( ! file.open( QIODevice::WriteOnly ) ) { failed = true; - kdWarning() << "NetworkWindow: File save failed - couldn't open file." << endl; + kWarning() << "File save failed - couldn't open file."; } // Output the HTML with the right text encoding - QString text = ( (KTextBrowser *)connectionTabs_->currentPage() )->text(); + QString text( static_cast( connectionTabs_->currentWidget() )->toHtml() ); QTextStream textStream( &file ); textStream.setCodec( QTextCodec::codecForLocale() ); textStream << text; file.close(); file.flush(); - if( failed || !file.exists() ) + if( failed || ! file.exists() ) { - KMessageBox::sorry( this, i18n("Could not save the Network Window log. Make sure you have permission to write for folder where the log is being saved.") ); + KMessageBox::sorry( this, i18n("Could not save the Network Window log. Make sure you have permission to write in the folder where it is being saved.") ); } } // The 'clear tab' button was pressed. - void NetworkWindow::slotUser2() + void NetworkWindow::clearCurrentTab() { - if( connectionTabs_ == 0 ) + if( connectionTabs_->currentWidget() == 0 ) return; - ( (KTextBrowser *)connectionTabs_->currentPage() )->clear(); + static_cast( connectionTabs_->currentWidget() )->clear(); } - // The 'close tab' button was pressed. - void NetworkWindow::slotUser3() + // The 'close all tabs' button was pressed. + void NetworkWindow::closeAllTabs() { - if( connectionTabs_ == 0 ) - return; + // Activate the tab of the main connection + connectionTabs_->setCurrentIndex( 0 ); - if( connectionTabs_->currentPageIndex() == 0 ) + // Get the main connection widget + QWidget *mainConnectionWidget = connectionTabs_->widget( 0 ); + + // Loop through all tabs + foreach( ConnectionEntry *entry, connectionViews_ ) + { + // 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 ) + { + if( connectionTabs_->indexOf( removedWidget ) == 0 ) { KMessageBox::information( this, i18n("Cannot close the main connection tab.") ); return; } - emit connectionTabs_->removePage( connectionTabs_->currentPage() ); + // Remove the widget from the list of views + QHashIteratorit( connectionViews_ ); + while( it.hasNext() ) + { + it.next(); + if( it.value()->logView == removedWidget ) + { + connectionViews_.remove( it.key() ); + delete it.value(); + break; + } + } + + // 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 ) ); } @@ -986,7 +1206,7 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) // Create on demand if( instance_ == 0 ) { - instance_ = new NetworkWindow(0, "NetworkWindow"); + instance_ = new NetworkWindow(); } // Return active instance @@ -994,4 +1214,172 @@ NetworkWindow::NetworkWindow(QWidget *parent, const char *name) } -#endif // KMESS_NETWORK_WINDOW + // A tab was selected. + void NetworkWindow::slotUpdateWidgets( int selectedTab ) + { + bool enable = false; + + // Automatically obtain the tab index instead of getting it as a parameter + if( selectedTab < -1 ) + { + selectedTab = connectionTabs_->currentIndex(); + } + + // If there are open tabs, find out which one is selected. + // If there are none, just disable the command sending group + if( selectedTab != -1 ) + { + QWidget *currentWidget = connectionTabs_->currentWidget(); + QHashIterator it( connectionViews_ ); + + // Iterate through all connections to find whether the current one is connected or not + while( it.hasNext() ) + { + it.next(); + if( it.value()->logView == currentWidget ) + { + // The active tab's connection is active, enable the widgets + if( ! it.value()->isClosed ) + { + enable = true; + } + break; + } + } + } + + commandSendingGroup_->setEnabled( enable ); + } + + + + // Send a command + void NetworkWindow::slotSendCommand() + { + // Get the text fields' text + QString command( commandEdit_->text().toUpper() ); + QString payload( payloadEdit_->toPlainText() ); + + // Empty commands can't be sent + if( command.isEmpty() || connectionTabs_->currentIndex() == -1 ) + { + commandEdit_->setFocus(); + return; + } + + + // 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 do not 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?" ), + i18n( "Network Window" ), + KStandardGuiItem::cont(), + KStandardGuiItem::cancel(), + "sendServerCommandWarning" ); + // Bail out, just in time + if( result != KMessageBox::Continue ) + { + return; + } + + // The developer knows what he or she is doing, send the command + + // Replace all newlines with the kind used by the server + payload.replace( QRegExp( "\r?\n" ), "\r\n" ); + + // Empty payloads can, and will be replaced with a single newline + if( payload.isEmpty() ) + { + payload = "\r\n"; + } + else if( ! payload.endsWith( "\r\n" ) ) + { + // Warn the developer that the payloads must end with a newline + int result = KMessageBox::warningYesNo( this, + i18n( "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?" ), + i18n( "Network Window" ), + KStandardGuiItem::yes(), + KStandardGuiItem::no(), + "noPayloadWarning" ); + // Append the missing newline to the payload + if( result == KMessageBox::Yes ) + { + payload.append( "\r\n" ); + } + } + + // Find the currently active tab + QWidget *currentWidget = connectionTabs_->currentWidget(); + QHashIterator it( connectionViews_ ); + void *connection; + const ConnectionEntry *entry; + + // Iterate through all connections to find out which one's tab is selected in the UI + while( it.hasNext() ) + { + it.next(); + + // Save the entry, we'll need it later + entry = it.value(); + + // If the current tab is for this connection.. + if( entry->logView == currentWidget ) + { + // .. disallow sending commands to disconnected connections + if( entry->isClosed ) + { + commandEdit_->setFocus(); + return; + } + + // ..save the tab's connection to send commands there + connection = it.key(); + break; + } + } + + // Send the command to the right type of connection + MsnNotificationConnection *nsConnection; + switch( entry->type ) + { + case TYPE_NS: + case TYPE_SB: + nsConnection = static_cast( connection ); + + // Disallow sending commands to disconnected connections + if( ! nsConnection->isConnected() ) + { + return; + } + + // Send the type of command the developer wants + if( sendStandardCmdRadio_->isChecked() ) + { + nsConnection->sendCommand( command, payload ); + } + else + { + nsConnection->sendMimeMessage( MsnNotificationConnection::ACK_ALWAYS, MimeMessage( payload ) ); + } + return; + + // TODO: Enable sending commands to these types of connections. + case TYPE_UNKNOWN: + case TYPE_FTP: + case TYPE_FTP_RAW: + case TYPE_DC: + case TYPE_HTTP: + default: + KMessageBox::error( 0, i18n( "Cannot send commands to this kind of connection!" ) ); + return; + } + } + + +#include "networkwindow.moc" diff --git a/kmess/dialogs/networkwindow.h b/src/dialogs/networkwindow.h similarity index 78% rename from kmess/dialogs/networkwindow.h rename to src/dialogs/networkwindow.h index 1004f29..7a39b45 100644 --- a/kmess/dialogs/networkwindow.h +++ b/src/dialogs/networkwindow.h @@ -16,18 +16,22 @@ ***************************************************************************/ +#include "../kmessdebug.h" + #ifndef NETWORKWINDOW_H #define NETWORKWINDOW_H -#include "../kmessdebug.h" +#include "ui_networkwindow.h" -#include -#include +#include +#include -#include // a hashmap with key and value pointers. -#include +#include + +// Forward declarations +class KTabWidget; +class KTextBrowser; -class QTabWidget; /** @@ -35,26 +39,15 @@ class QTabWidget; * Based on the original work of Michael Jarrett, but totally revised. * * @author Diederik van der Boor + * @ingroup Dialogs */ -class NetworkWindow : public KDialogBase +class NetworkWindow : public KDialog, private Ui::NetworkWindow { + Q_OBJECT + public: - // Constructor - NetworkWindow(QWidget *parent = 0, const char *name = 0); - - // List of connection types - enum ConnectionType - { - TYPE_UNKNOWN = 0, - TYPE_NS = 1, - TYPE_SB = 2, - TYPE_FTP = 3, - TYPE_FTP_RAW = 4, - TYPE_DC = 5, - TYPE_HTTP = 6 - }; - -#ifdef KMESS_NETWORK_WINDOW + // Return the primary instance of the network window. + static void destroy(); // Show the window if there are connection logs to show void show(); // Add a log message to the last log entry @@ -70,8 +63,28 @@ class NetworkWindow : public KDialogBase // Set the title of the connection in the display void setConnectionTitle(QObject *connection, const QString &title); - private: + private: // Private forward declarations struct ConnectionEntry; + + private slots: // Private slots + // The 'save tab' button was pressed. + 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. + void slotUpdateWidgets( int selectedTab = -2 ); + // Send a command + void slotSendCommand(); + + private: // Private methods + // Constructor + NetworkWindow( QWidget *parent = 0 ); + // Destructor + virtual ~NetworkWindow(); // The internal function to add a message void addMessage(ConnectionEntry *entry, QString html); // Return a log description for a standard command. @@ -90,41 +103,41 @@ class NetworkWindow : public KDialogBase 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. QString getTime() const; // Find the tab for the connection, or create a new one. - ConnectionEntry * getConnectionEntry(QObject *connection); + ConnectionEntry *getConnectionEntry(QObject *connection); - private slots: // Private slots - // The 'save tab' button was pressed. - void slotUser1(); - // The 'clear tab' button was pressed. - void slotUser2(); - // The 'close tab' button was pressed. - void slotUser3(); + private: // Private properties + // List of connection types + enum ConnectionType + { + TYPE_UNKNOWN = 0, + TYPE_NS = 1, + TYPE_SB = 2, + TYPE_FTP = 3, + TYPE_FTP_RAW = 4, + TYPE_DC = 5, + TYPE_HTTP = 6 + }; -#endif - - private: // The connection types struct ConnectionEntry { KTextBrowser *logView; ConnectionType type; QDateTime lastMessage; + bool isClosed; }; // The html view for each connection - QPtrDict connectionViews_; // void* keys, KTextBrowser* values - // The tab bar with all connections - QTabWidget *connectionTabs_; + QHash connectionViews_; // The instance of the network window static NetworkWindow *instance_; }; - #endif diff --git a/src/dialogs/networkwindow.ui b/src/dialogs/networkwindow.ui new file mode 100644 index 0000000..437a66d --- /dev/null +++ b/src/dialogs/networkwindow.ui @@ -0,0 +1,198 @@ + + NetworkWindow + + + + 0 + 0 + 350 + 376 + + + + Network Window + + + + + + + 0 + 0 + + + + Command to Current Tab + + + + + + + 0 + 0 + + + + Command: + + + + + + + Qt::Vertical + + + + + + + + + Type: + + + + + + + Standard + + + + + + + MIME + + + + + + + Qt::Vertical + + + + 20 + 18 + + + + + + + + + 0 + 0 + + + + Send + + + + + + + + + + + + 0 + 0 + + + + 3 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Command payload (can be empty): + + + + + + + + 0 + 0 + + + + + 0 + 45 + + + + + 16777215 + 45 + + + + false + + + + + + + + + + + 0 + 100 + + + + Qt::ElideRight + + + true + + + true + + + true + + + + + + + + KTabWidget + QTabWidget +
    ktabwidget.h
    + 1 +
    +
    + + +
    diff --git a/kmess/dialogs/transferentry.cpp b/src/dialogs/transferentry.cpp similarity index 54% rename from kmess/dialogs/transferentry.cpp rename to src/dialogs/transferentry.cpp index 25b51fa..9e418b4 100644 --- a/kmess/dialogs/transferentry.cpp +++ b/src/dialogs/transferentry.cpp @@ -15,52 +15,52 @@ * * ***************************************************************************/ -#include "transferentryinterface.h" #include "transferentry.h" #include "../kmessdebug.h" -#include -#include -#include +#include -#include -#include +#include +#include +#include +#include +#include -#include -#include -#include - -#include -#include -#include -#include // Constructor -TransferEntry::TransferEntry( QWidget *parent, const QString filename, uint filesize, +TransferEntry::TransferEntry( QWidget *parent, const QString filename, const ulong filesize, bool incoming, const QImage preview) -: TransferEntryInterface(parent, "TransferEntry"), +: QWidget( parent ), + Ui::TransferEntry(), isDone_(false), incoming_(incoming), filename_(filename), filesize_(filesize), - preview_(preview), previousPercentage_(-1), + previousTransferred_(0), transferID_(-1) { + // Set up the user interface + setupUi( this ); + + // Get the preview from the caller + preview_ = QPixmap::fromImage( preview ); + #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::TransferEntry() - Initializing, file='" << filename_ + kDebug() << "Initializing, file='" << filename_ << "', preview=" << ( preview_.isNull() ? "null" : "set" ) << "." << endl; #endif + KIconLoader *loader = KIconLoader::global(); + // Set pixmap and filename if( preview_.isNull() ) { // Get a default icon pixmap - KIconLoader *loader = KGlobal::iconLoader(); - QString iconTitle = KMimeType::iconForURL( KURL( filename_) ); - preview_ = loader->loadIcon( iconTitle, KIcon::NoGroup, iconLabel_->width() ); + QString iconTitle( KMimeType::iconNameForUrl( KUrl( filename_) ) ); + preview_ = loader->loadIcon( iconTitle, KIconLoader::NoGroup, iconLabel_->width() ); if( ! preview_.isNull() ) { @@ -73,7 +73,7 @@ TransferEntry::TransferEntry( QWidget *parent, const QString filename, uint file if( preview_.width() > iconLabel_->width() || preview_.height() > iconLabel_->height() ) { - preview_ = preview_.smoothScale( iconLabel_->width(), iconLabel_->height(), QImage::ScaleMin ); + preview_ = preview_.scaled( iconLabel_->width(), iconLabel_->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation ); } iconLabel_->setPixmap( preview_ ); @@ -81,15 +81,27 @@ TransferEntry::TransferEntry( QWidget *parent, const QString filename, uint file filenameLabel_->setText("" + filename_ + ""); + QPixmap pixmapTransfer; // Enable urls? if(incoming_) { // Can't open it yet. openLabel_->hide(); openLabel_->setEnabled(false); + pixmapTransfer = loader->loadIcon( "go-down", KIconLoader::Small ); + } + else + { + pixmapTransfer = loader->loadIcon( "go-up", KIconLoader::Small ); } cancelLabel_->setEnabled(true); + iconTransferLabel_->setPixmap( pixmapTransfer ); + + // Set the timer to update the transfer rate and eta + timer_ = new QTimer(); + connect( timer_ , SIGNAL( timeout() ), this, SLOT( updateTransferRate() ) ); + timer_->start( 3000 ); } @@ -98,8 +110,9 @@ TransferEntry::TransferEntry( QWidget *parent, const QString filename, uint file TransferEntry::~TransferEntry() { #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "DESTROYED TransferEntry [file=" << filename_ << "]" << endl; + kDebug() << "DESTROYED. [file=" << filename_ << "]"; #endif + delete timer_; } @@ -108,7 +121,7 @@ TransferEntry::~TransferEntry() void TransferEntry::cancelClicked() { #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::cancelClicked() - Notifying listeners." << endl; + kDebug() << "Notifying listeners."; #endif emit cancelTransfer( transferID_ ); @@ -131,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 { @@ -140,18 +161,18 @@ QString TransferEntry::getFileName() const // Mark the transfer as failed -void TransferEntry::failTransfer(const QString &message) +void TransferEntry::failTransfer( const QString &message ) { if( isDone_ ) { #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::failTransfer() - already done." << endl; + kDebug() << "already done."; #endif return; } #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::failTransfer() - Displaying error message." << endl; + kDebug() << "Displaying error message."; #endif // Update the widgets @@ -161,9 +182,11 @@ void TransferEntry::failTransfer(const QString &message) } else { - statusLabel_->setText(message); + statusLabel_->setText( message ); } + timer_->stop(); + // Make sure the widget does not resize when the progressbar hides setMinimumHeight( height() ); @@ -180,19 +203,19 @@ void TransferEntry::failTransfer(const QString &message) void TransferEntry::finishTransfer() { #ifdef KMESSTEST - ASSERT( ! isDone_ ); + KMESS_ASSERT( ! isDone_ ); #endif if( isDone_ ) { #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::finishTransfer() - already done." << endl; + kDebug() << "already done."; #endif return; } #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::finishTransfer() - Displaying success message." << endl; + kDebug() << "Displaying success message."; #endif // Make sure the widget does not resize when the progressbar hides @@ -200,11 +223,13 @@ void TransferEntry::finishTransfer() // Update the widgets statusLabel_->setText( i18n("Completed") ); + progressBar_->hide(); cancelLabel_->setEnabled(false); cancelLabel_->hide(); - openLabel_->setEnabled(true); - openLabel_->show(); + openLabel_ ->setEnabled(true); + openLabel_ ->show(); + timer_ ->stop(); isDone_ = true; } @@ -214,15 +239,14 @@ void TransferEntry::finishTransfer() // Called when open is clicked void TransferEntry::openClicked() { - if( filename_.startsWith("/") ) + // The file:// prefix must be followed by a full path + if( ! filename_.startsWith( "file://" ) ) { - // Using "file://" causes problems. - // It makes KDE think we want a smb //hostname/path file. A bit weird though. - new KRun("file:" + filename_); // This class has "autodelete". + new KRun( "file://" + filename_, window() ); } else { - new KRun("file:/" + filename_); // This class has "autodelete". + new KRun( filename_, window() ); } } @@ -235,100 +259,131 @@ void TransferEntry::setTransferID( int transferID ) } + // Convert a string to some more readable form -QString TransferEntry::toReadableBytes(uint bytes) +QString TransferEntry::toReadableBytes( ulong bytes ) { QString format; if(bytes > 1048576) { // Using '%.2f' instead of '%.1f' removes the ".0" part, but it's less pretty. format.sprintf("%.1f", (double) bytes / 1048576.0); - return i18n("%1 MB").arg(format); + return i18n( "%1 MB", format ); } else if(bytes > 1024) { format.sprintf("%.1f", (double) bytes / 1024.0); - return i18n("%1 kB").arg(format); + return i18n( "%1 kB", format ); } else { - return i18n("%1 bytes").arg(bytes); + return i18n( "%1 bytes", bytes ); } } // Set a status message -void TransferEntry::setStatusMessage(const QString &message) +void TransferEntry::setStatusMessage( const QString &message ) { #ifdef KMESSTEST - ASSERT( ! isDone_ ); + KMESS_ASSERT( ! isDone_ ); #endif if( isDone_ ) { #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::setStatusMessage() - already done." << endl; + kDebug() << "already done."; #endif return; } #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::setStatusMessage() - displaying '" << message << "'." << endl; + kDebug() << "displaying '" << message << "'."; #endif - statusLabel_->setText(message); + statusLabel_->setText( message ); } // Update the progress bar -void TransferEntry::updateProgress( uint bytesTransferred ) +void TransferEntry::updateProgress( ulong bytesTransferred ) { #ifdef KMESSTEST - ASSERT( ! isDone_ ); + KMESS_ASSERT( ! isDone_ ); #endif if( isDone_ ) { #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::updateProgress() - already done." << endl; + kDebug() << "already done."; #endif return; } + bytesTransferred_ = bytesTransferred; - int percent = (int) ( ( (double) bytesTransferred * 1000.0 ) / (double) filesize_ ); + int percent = (int) ( ( (double) bytesTransferred * 100.0 ) / (double) filesize_ ); + QString transferred( toReadableBytes( bytesTransferred ) ); + QString total ( toReadableBytes( filesize_ ) ); // Avoid useless repaints - if( percent == previousPercentage_ ) + if( ! ( percent == previousPercentage_ ) ) { - return; + previousPercentage_ = percent; + progressBar_->setValue( percent ); } #ifdef KMESSDEBUG_TRANSFERENTRY - kdDebug() << "TransferEntry::updateProgress() - transfer is at " << ((float)percent/10) << " percent." << endl; + kDebug() << "transfer is at " << ((float)percent/10) << " percent."; #endif - progressBar_->setProgress( percent ); - - QString statusLabel; - QString transfered = toReadableBytes(bytesTransferred); - QString complete = toReadableBytes(filesize_); - - previousPercentage_ = percent; - if( incoming_ ) { - statusLabel = i18n("%1 of %2 received"); + statusText_ = i18n( "%1 of %2 received.", transferred, total ); } else { - statusLabel = i18n("%1 of %2 sent"); + statusText_ = i18n( "%1 of %2 sent.", transferred, total ); } - statusLabel_->setText( statusLabel.arg(transfered).arg(complete) ); + statusLabel_->setText( statusText_ + " " + speedText_ ); } +// Update the transfer rate and ETA +void TransferEntry::updateTransferRate() +{ + // To avoid to works with different transferred bytes + ulong tempTransferred = bytesTransferred_; + + // Calculate the bytes transferred from the last calling + ulong bytesTransferredFromLast = tempTransferred - previousTransferred_; + + QString speed, eta; + + // Approximate the speed with the timeout of timer (3) + int bytesSpeed = (int)( bytesTransferredFromLast / 3 ); + int currentEta; + + // Verify if the bytesSpeed is 0 + if( ! ( bytesSpeed == 0 ) ) + { + currentEta = (int) ( ( filesize_ - tempTransferred ) / bytesSpeed ); + QTime timeEta; + eta = timeEta.addSecs( currentEta ).toString(); + previousTransferred_ = tempTransferred; + } + else + { + // Is impossible to calculate ETA + eta = i18n( "infinite" ); + } + + speedText_ = QString("Speed: %1, ETA: %2").arg( toReadableBytes( bytesSpeed ) ).arg( eta ); + + statusLabel_->setText( statusText_ + " " + speedText_ ); +} + #include "transferentry.moc" diff --git a/kmess/dialogs/transferentry.h b/src/dialogs/transferentry.h similarity index 59% rename from kmess/dialogs/transferentry.h rename to src/dialogs/transferentry.h index 0e4a348..702a374 100644 --- a/kmess/dialogs/transferentry.h +++ b/src/dialogs/transferentry.h @@ -18,55 +18,60 @@ #ifndef TRANSFERENTRY_H #define TRANSFERENTRY_H -#ifndef TRANSFERENTRYINTERFACE_H -// Weird but it's required, g++ can't find this file -// if it's included from applications/transferfile.cpp -#include "transferentryinterface.h" -#endif - -#include +#include "ui_transferentry.h" -class TransferEntry : public TransferEntryInterface + +/** + * @brief One transfer entry in the transfer window. + * + * @author Diederik van der Boor + * @ingroup Dialogs + */ +class TransferEntry : public QWidget, private Ui::TransferEntry { Q_OBJECT public: // Constructor - TransferEntry( QWidget *parent, const QString filename, const uint filesize, bool incoming = false, + TransferEntry( QWidget *parent, const QString filename, const ulong filesize, bool incoming = false, const QImage preview = QImage() ); // Destructor - ~TransferEntry(); + 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( uint 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( uint 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(); 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) @@ -76,11 +81,21 @@ private: // The file name QString filename_; // The file size - uint filesize_; + ulong filesize_; // The image preview - QImage preview_; + QPixmap preview_; // The previous percentage int previousPercentage_; + // The current trasferred bytes + ulong bytesTransferred_; + // The timer for estimated the trasfer rate + QTimer *timer_; + // The previous trasferred bytes + ulong previousTransferred_; + // The current status text + QString statusText_; + // The current speed text + QString speedText_; // The ID of this transfer, used by the Transfer Window int transferID_; }; diff --git a/src/dialogs/transferentry.ui b/src/dialogs/transferentry.ui new file mode 100644 index 0000000..0e26d58 --- /dev/null +++ b/src/dialogs/transferentry.ui @@ -0,0 +1,305 @@ + + + TransferEntry + + + + 0 + 0 + 502 + 90 + + + + + 0 + 0 + + + + + 350 + 90 + + + + + 16777215 + 100 + + + + + + + + + + + + 0 + 0 + + + + + 48 + 48 + + + + + 48 + 48 + + + + Qt::AlignCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 20 + 0 + + + + + + + + + + 2 + + + 2 + + + 2 + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 16 + 16 + + + + + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + KSqueezedTextLabel + + + + + + + + + 0 + + + false + + + + + + + + 0 + 0 + + + + KSqueezedTextLabel + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 235 + 0 + + + + + + + + + + 2 + + + + + + 0 + 0 + + + + Open + + + + + + + + + + + + + + 0 + 0 + + + + Cancel + + + + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 20 + 0 + + + + + + + + + + + + Qt::Horizontal + + + + + + + qPixmapFromMimeSource + + + KSqueezedTextLabel + QLabel +
    ksqueezedtextlabel.h
    +
    + + KUrlLabel + QLabel +
    kurllabel.h
    +
    +
    + + KUrlLabel + KSqueezedTextLabel + KProgressDialog + + + + + openLabel_ + leftClickedUrl() + TransferEntry + openClicked() + + + 325 + 18 + + + 20 + 20 + + + + + cancelLabel_ + leftClickedUrl() + TransferEntry + cancelClicked() + + + 325 + 40 + + + 20 + 20 + + + + +
    diff --git a/kmess/dialogs/transferwindow.cpp b/src/dialogs/transferwindow.cpp similarity index 52% rename from kmess/dialogs/transferwindow.cpp rename to src/dialogs/transferwindow.cpp index 751c3b7..403f74d 100644 --- a/kmess/dialogs/transferwindow.cpp +++ b/src/dialogs/transferwindow.cpp @@ -16,16 +16,13 @@ ***************************************************************************/ #include "transferwindow.h" -#include "transferentry.h" -#include "transferwindowinterface.h" + +#include "../utils/kmessconfig.h" #include "../kmessdebug.h" +#include "transferentry.h" -#include +#include -#include -#include -#include -#include // Initialize the entries counter @@ -37,42 +34,37 @@ TransferWindow* TransferWindow::onlyInstance_(0); // Constructor TransferWindow::TransferWindow( QWidget *parent ) - : KMainWindow( parent, "TransferWindow", WType_Dialog ) // Explicitly set the window type to disable - // the destructive close behavior + : KMainWindow( parent ) + , Ui::TransferWindow() { - // Create the interface and connect it to our event handlers - interface_ = new TransferWindowInterface( this ); + // Set up the interface and the window + setObjectName( "Transfer" ); + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setCentralWidget( mainWidget ); - connect( interface_->closeButton_, SIGNAL( clicked() ), - this, SLOT( hide() ) ); - connect( interface_->cleanUpButton_, SIGNAL( clicked() ), - this, SLOT( cleanUp() ) ); - // Create a layout to expand the scrollview to the maximum space available - QVBoxLayout *frameLayout = new QVBoxLayout( interface_->frame_, 2, 0 ); - - // Make the central list for entries, capable of scrolling vertically - QScrollView *scrollView = new QScrollView( interface_->frame_ ); - scrollView->viewport()->setPaletteBackgroundColor( paletteBackgroundColor() ); - scrollView->setHScrollBarMode( QScrollView::AlwaysOff ); // Disable horizontal scrolllbar - scrollView->setResizePolicy( QScrollView::AutoOneFit ); // Stretch contents - scrollView->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding, false ); // Stretch widget - - // Add it to the layout - frameLayout->addWidget( scrollView ); - - // Create a container for all download entries, to lay them out vertically - mainWidgets_ = new QWidget( scrollView->viewport() ); - mainWidgets_->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred, false ); // Stretch widget - scrollView->addChild( mainWidgets_ ); - - // Create the layout and a spacer, to sort out the individual transfers - mainLayout_ = new QVBoxLayout( mainWidgets_, 2, 0 ); - mainLayout_->addItem( new QSpacerItem( 20, 0, QSizePolicy::Ignored, QSizePolicy::Ignored ) ); + // Get the scroll area's layout and add a flexible space to it, so our entries will stay at the top + layout_ = static_cast( transfersArea_->layout() ); + layout_->addStretch(); // Set up the window setCaption( i18n("File Transfers") ); - setCentralWidget( interface_ ); + applyMainWindowSettings( KMessConfig::instance()->getGlobalConfig( "TransferWindow" ) ); + + // Set up the Clean Up and close button + closeButton_->setFocus(); + 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 ) ) ); + } @@ -80,44 +72,36 @@ TransferWindow::TransferWindow( QWidget *parent ) // Destructor TransferWindow::~TransferWindow() { -#ifdef KMESSDEBUG_TRANSFERWINDOW - kdDebug() << "DESTROYED TransferWindow" << endl; -#endif - - // Clean up the list of transfers - int id; - TransferEntry *entry; - QMapConstIterator it; - for( it = entryList_.begin(); it != entryList_.end(); ) + if( ! onlyInstance_ ) { - // Copy the data before deleting, to avoid crashes - id = it.key(); - entry = it.data(); - ++it; - - // Delete the entry from the GUI and our list - mainLayout_->remove( entry ); - entryList_.remove( id ); - delete entry; + // The singleton has already been destroyed + return; } +#ifdef KMESSDEBUG_TRANSFERWINDOW + kDebug() << "DESTROYED."; +#endif + + // Save the window size and position + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "TransferWindow" ); + saveMainWindowSettings( group ); + // Destroy the instance data - delete mainLayout_; - delete interface_; + entryList_.clear(); onlyInstance_ = 0; } // Add an entry to the transfer manager -int TransferWindow::addEntry( const QString filename, uint filesize, bool incoming, const QImage preview ) +int TransferWindow::addEntry( const QString filename, ulong filesize, bool incoming, const QImage preview ) { #ifdef KMESSDEBUG_TRANSFERWINDOW - kdDebug() << "TransferWindow::addEntry() - adding entry for '" << filename << "'." << endl; + kDebug() << "adding entry for '" << filename << "'."; #endif // Create a new entry - TransferEntry *entry = new TransferEntry( mainWidgets_, filename, filesize, incoming, preview ); + TransferEntry *entry = new TransferEntry( transfersArea_, filename, filesize, incoming, preview ); // Add it to the transfers list entryList_[ ++currentEntryID_ ] = entry; @@ -128,16 +112,15 @@ int TransferWindow::addEntry( const QString filename, uint filesize, bool incomi this, SIGNAL( cancelTransfer(int) ) ); #ifdef KMESSDEBUG_TRANSFERWINDOW - kdDebug() << "TransferWindow::addEntry() - Adding entry to layout, showing it." << endl; + kDebug() << "Adding entry to layout, showing it."; #endif // Add it to the list of entries - mainLayout_->insertWidget( 0, entry ); - entry->show(); + layout_->insertWidget( 0, entry ); - // Update and show the window - update(); - show(); + // Show the window + showMinimized(); + KWindowSystem::demandAttention( winId() ); return currentEntryID_; } @@ -184,7 +167,7 @@ void TransferWindow::setStatusMessage( int transferID, const QString &message ) // Update the progress bar of a transfer -void TransferWindow::updateProgress( int transferID, uint bytesTransferred ) +void TransferWindow::updateProgress( int transferID, ulong bytesTransferred ) { if( ! entryList_.contains( transferID ) ) { @@ -221,30 +204,30 @@ void TransferWindow::destroy() void TransferWindow::cleanUp() { #ifdef KMESSDEBUG_TRANSFERWINDOW - kdDebug() << "TransferWindow::cleanUp() - Cleaning up" << endl; + kDebug() << "Cleaning up"; #endif int id; TransferEntry *entry; + QMapIterator it( entryList_ ); - // Remove the entries from the dialog - QMapConstIterator it; - for( it = entryList_.begin(); it != entryList_.end(); ) + // Clean up the list of transfers + while( it.hasNext() ) { + it.next(); + // Copy the data before deleting, to avoid crashes id = it.key(); - entry = it.data(); - ++it; + entry = it.value(); // Remove the entry only if it's an ended transfer and we don't need it anymore if( entry->isDone() ) { // Delete the entry from the GUI and our list - mainLayout_->remove( entry ); entryList_.remove( id ); #ifdef KMESSDEBUG_TRANSFERWINDOW - kdDebug() << "TransferWindow::cleanUp() - Removed " << entry->getFileName() << endl; + kDebug() << "Removed " << entry->getFileName(); #endif delete entry; @@ -252,9 +235,84 @@ void TransferWindow::cleanUp() } // Issue an update to the UI, just to be sure - interface_->update(); + update(); } +// 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/kmess/dialogs/transferwindow.h b/src/dialogs/transferwindow.h similarity index 78% rename from kmess/dialogs/transferwindow.h rename to src/dialogs/transferwindow.h index f4856bf..cd8736e 100644 --- a/kmess/dialogs/transferwindow.h +++ b/src/dialogs/transferwindow.h @@ -18,21 +18,26 @@ #ifndef TRANSFERMANAGER_H #define TRANSFERMANAGER_H -#include +#include "ui_transferwindow.h" -#include +#include -class TransferEntry; -class TransferWindowInterface; -class QFrame; -class QScrollView; +#include + + +// Forward declarations class QVBoxLayout; +class TransferEntry; + + /** * A file transfer manager (aka download manager) singleton. + * * @author Diederik van der Boor + * @ingroup Dialogs */ -class TransferWindow : public KMainWindow +class TransferWindow : public KMainWindow, private Ui::TransferWindow { Q_OBJECT @@ -40,11 +45,11 @@ class TransferWindow : public KMainWindow // Constructor TransferWindow( QWidget *parent = 0 ); // Destructor - ~TransferWindow(); + virtual ~TransferWindow(); public: // Add a new entry - int addEntry( const QString filename, uint filesize, bool incoming = false, + int addEntry( const QString filename, ulong filesize, bool incoming = false, const QImage preview = QImage() ); // Destroy the current instance static void destroy(); @@ -59,31 +64,33 @@ class TransferWindow : public KMainWindow // Set the status message of a transfer void setStatusMessage( int transferID, const QString &message ); // Update the progress bar of a transfer - void updateProgress( int transferID, uint bytesTransferred ); + void updateProgress( int transferID, ulong bytesTransferred ); 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_; - // Instance to the singleton - static TransferWindow *onlyInstance_; - - private: // List of all entries QMap entryList_; - // Interface of the Transfer Window GUI - TransferWindowInterface *interface_; - // Main widget for entries - QWidget *mainWidgets_; - // Layout manager - QVBoxLayout *mainLayout_; + // Layout + QVBoxLayout *layout_; + // Instance to the singleton + static TransferWindow *onlyInstance_; }; #endif diff --git a/src/dialogs/transferwindow.ui b/src/dialogs/transferwindow.ui new file mode 100644 index 0000000..164a1eb --- /dev/null +++ b/src/dialogs/transferwindow.ui @@ -0,0 +1,153 @@ + + + TransferWindow + + + + 0 + 0 + 418 + 269 + + + + + 2 + + + 0 + + + + + + 400 + 150 + + + + Qt::NoFocus + + + Qt::ScrollBarAsNeeded + + + Qt::ScrollBarAlwaysOff + + + true + + + Qt::AlignHCenter|Qt::AlignTop + + + + + 0 + 0 + 412 + 234 + + + + + 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 + + + + + + + + + qPixmapFromMimeSource + + + diff --git a/src/dialogs/userpicturesdialog.cpp b/src/dialogs/userpicturesdialog.cpp new file mode 100644 index 0000000..7ee1bfc --- /dev/null +++ b/src/dialogs/userpicturesdialog.cpp @@ -0,0 +1,209 @@ +/*************************************************************************** + userpicturesdialog.cpp - description + ------------------- + begin : Fri Jul 7 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 "userpicturesdialog.h" + +#include "../utils/kmessconfig.h" +#include "../kmessdebug.h" + +#include + +#include + + + +// Constructor +UserPicturesDialog::UserPicturesDialog( QWidget *parent ) + : KDialog( parent ) +{ + // Setup the user interface + setObjectName( "UserPictures" ); + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + + 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() ) ); +} + + + +// Destructor +UserPicturesDialog::~UserPicturesDialog() +{ + clearList(); + kDebug() << "DESTROYED"; +} + + + +// 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 + 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 this display picture?", + i18nc( "Dialog box title", "Delete Display Picture" ) ) ); + if( result != KMessageBox::Yes ) + { + return; + } + + // Check if the file exists and remove it + const QString& filename( currentItem->data( 6 ).toString() ); + if( QFile::exists( filename ) ) + { + QFile::remove( filename ); + } + + // Update the list + updateWidgets( handle_ ); +} + + + +// Update the widgets +void UserPicturesDialog::updateWidgets( const QString &handle ) +{ + int number = 0; + const QDir dir( KMessConfig::instance()->getAccountDirectory( handle ) + "/displaypics" ); + const QString& dirPath( dir.absolutePath() ); + + QListWidgetItem *item; + + // Clear the list + clearList(); + + QString path; + QPixmap pixmap; + foreach( const QString &file, dir.entryList( QDir::Files | QDir::NoDotAndDotDot ) ) + { + // To avoid listing of temporary picture file + if( file.contains( "temporary-picture" ) ) + { + continue; + } + + path = dirPath + "/" + file; + if( pixmap.load( path ) ) + { + item = new QListWidgetItem( pixmap, QString::number( ++number ), listPictures_ ); + item->setData( 6, path ); + } + } + + 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 new file mode 100644 index 0000000..be2c93c --- /dev/null +++ b/src/dialogs/userpicturesdialog.h @@ -0,0 +1,65 @@ +/*************************************************************************** + userpicturesdialog.h - description + ------------------- + begin : Fri Jul 7 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 USERPICTURESDIALOG_H +#define USERPICTURESDIALOG_H + +#include "ui_userpicturesdialog.h" + +#include + + + +/** + * + * @author Antonio Nastasi + * @ingroup Dialogs + */ +class UserPicturesDialog : public KDialog, private Ui::UserPicturesDialog +{ + Q_OBJECT + + public: + // Constructor + UserPicturesDialog( QWidget *parent = 0 ); + // Destructor + ~UserPicturesDialog(); + // Update the widgets + void updateWidgets( const QString &handle ); + + 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 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: + void pictureUpdate( bool resize, QString picture ); +}; + +#endif diff --git a/src/dialogs/userpicturesdialog.ui b/src/dialogs/userpicturesdialog.ui new file mode 100644 index 0000000..20945c2 --- /dev/null +++ b/src/dialogs/userpicturesdialog.ui @@ -0,0 +1,51 @@ + + UserPicturesDialog + + + + 0 + 0 + 400 + 300 + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + + 64 + 64 + + + + QListView::Static + + + QListView::Adjust + + + QListView::Batched + + + QListView::IconMode + + + true + + + + + + + + diff --git a/kmess/emoticon.cpp b/src/emoticon.cpp similarity index 76% rename from kmess/emoticon.cpp rename to src/emoticon.cpp index b385eaa..3b9fbe9 100644 --- a/kmess/emoticon.cpp +++ b/src/emoticon.cpp @@ -17,21 +17,20 @@ #include "emoticon.h" -#include -#include -#include -#include -#include -#include - -#include -#include - - +#include "utils/kmessshared.h" #include "kmessdebug.h" +#include "currentaccount.h" + +#include +#include +#include +//#include + +#include + #ifdef KMESSDEBUG_EMOTICONS -#define KMESSDEBUG_EMOTICONS_GENERAL + #define KMESSDEBUG_EMOTICONS_GENERAL #endif @@ -40,7 +39,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) @@ -63,7 +62,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 ) @@ -85,9 +84,7 @@ Emoticon::Emoticon( const QString &pictureName, const QString &tooltip, const QS /** * Create an exact copy of another emoticon * - * @param pictureName The picture file name - * @param tooltip The name of this emoticon, which will be displayed as tooltip in the Emoticon Sidebar - * @param pictureDirectory The folder where this emoticon's image is located + * @param other The object to copy */ Emoticon::Emoticon( const Emoticon &other ) : QObject() @@ -118,9 +115,9 @@ Emoticon::~Emoticon() /** * Add a text shortcut which will translate to this emoticon * - * @param text Shortcut text + * @param shortcut Shortcut text */ -void Emoticon::addShortcut( QString shortcut ) +void Emoticon::addShortcut( const QString &shortcut ) { shortcuts_.append( shortcut ); } @@ -147,6 +144,14 @@ const QString& Emoticon::getPicturePath() const +// Get the data hash for the picture file contents +const QString& Emoticon::getDataHash() const +{ + return dataHash_; +} + + + /** * Get a suitable bit of HTML which represents the emoticon * @@ -163,13 +168,13 @@ QString Emoticon::getHtml( bool small ) const // Enforce minimum and maximum size limits if( small ) { - width = width_; // QMIN( EMOTICONS_DEFAULT_SIZE, width_ ); // Require only a max height - height = QMIN( EMOTICONS_DEFAULT_SIZE, height_ ); + width = width_; // qMin( EMOTICONS_DEFAULT_SIZE, width_ ); // Require only a max height + height = qMin( EMOTICONS_DEFAULT_SIZE, height_ ); } else { - width = width_; // QMIN( EMOTICONS_MAX_SIZE, width_ ); // Require only a max height - height = QMIN( EMOTICONS_MAX_SIZE, height_ ); + width = width_; // qMin( EMOTICONS_MAX_SIZE, width_ ); // Require only a max height + height = qMin( EMOTICONS_MAX_SIZE, height_ ); } // Resize the image so the aspect ratio is kept, and its dimensions don't exceed the enforced @@ -192,8 +197,9 @@ QString Emoticon::getHtml( bool small ) const emoticonClass = "standardEmoticon"; } - return "" + shortcuts_.first() + ""; } @@ -207,11 +213,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 ); } @@ -281,7 +287,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 ); @@ -294,7 +300,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; @@ -344,54 +350,44 @@ 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. - QStringList::Iterator itType = allowedTypes.begin(); - do + foreach( const QString &pictureType, allowedTypes ) { if( isCustomEmoticon_ ) { - picturePath_ = emoticonPath + pictureName_ + "." + *itType; + picturePath_ = emoticonPath + '/' + pictureName_ + '.' + pictureType; } else { - picturePath_ = dirs->findResource( "emoticons", emoticonPath + "/" + pictureName_ + "." + *itType ); + picturePath_ = dirs->findResource( "emoticons", emoticonPath + '/' + pictureName_ + '.' + pictureType ); } - if( ! picturePath_.isNull() && KStandardDirs::exists( picturePath_ ) ) { found = true; break; } - - ++itType; } - while( itType != allowedTypes.end() ); - // If this emoticon does not exist in this theme, try again loading the default KMess emoticon if( ! found ) { - itType = allowedTypes.begin(); - do + foreach( const QString &pictureType, allowedTypes ) { - // Search in Kmess' default theme folder - picturePath_ = dirs->findResource( "emoticons", "KMess-new/" + originalPictureName_ + "." + *itType ); + // Search in KMess' default theme folder + picturePath_ = dirs->findResource( "emoticons", "KMess-new/" + originalPictureName_ + "." + pictureType ); if( ! picturePath_.isNull() && KStandardDirs::exists( picturePath_ ) ) { break; } - - ++itType; } - while( itType != allowedTypes.end() ); } // Fail if the path isn't valid, or if the emoticon can't be loaded if( picturePath_.isEmpty() || ! emoticonData.load( picturePath_ ) || emoticonData.isNull() ) { #ifdef KMESSDEBUG_EMOTICONS_GENERAL - kdDebug() << "Emoticon::updatePath() - Update failed: " << originalPictureName_ << " (" << (isCustomEmoticon_?"custom":"standard") << ")" << endl; + kDebug() << "Update failed: " << picturePath_ << "(" << (isCustomEmoticon_?"custom":"standard") << ", shortcut" << originalPictureName_ << ")"; #endif valid_ = false; return; @@ -403,6 +399,23 @@ void Emoticon::update() width_ = emoticonData.width(); height_ = emoticonData.height(); + // Try to read the data hash from the filename + if( isCustomEmoticon_ ) + { + QFileInfo fileInfo( picturePath_ ); + dataHash_ = fileInfo.baseName(); + dataHash_.replace( "_", "/" ); + // if this dataHash_ ever turns out to be incorrect, this is the way to regenerate it: + // QFile emoticonFile( picturePath_ ); + // emoticonFile.open( QIODevice::ReadOnly() ); + // dataHash_ = QCryptographicHash::hash( emoticonFile.readAll(), QCryptographicHash::Sha1 ).toBase64(); + // emoticonFile.close(); + +#ifdef KMESSDEBUG_EMOTICONS_GENERAL + kDebug() << "Read data hash from filename for " << picturePath_ << ": " << dataHash_; +#endif + } + emit changed(); } diff --git a/kmess/emoticon.h b/src/emoticon.h similarity index 87% rename from kmess/emoticon.h rename to src/emoticon.h index cca8c95..fb7ef16 100644 --- a/kmess/emoticon.h +++ b/src/emoticon.h @@ -18,21 +18,17 @@ #ifndef EMOTICON_H #define EMOTICON_H -#include -#include - - -#include "currentaccount.h" - +#include /** * 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 /** @@ -46,10 +42,11 @@ #endif - // Forward declarations class CurrentAccount; + + /** * @brief Data class for an emoticon definition. * @@ -84,16 +81,18 @@ class Emoticon : public QObject // Create an exact copy of this emoticon Emoticon( const Emoticon &other ); // Destructor - ~Emoticon(); + 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 const QString &getPicturePath() const; + // Get the data hash for the picture file contents (may be empty) + const QString &getDataHash() const; // Get a suitable bit of HTML which represents the emoticon - QString getHtml( bool small ) const; + QString getHtml( bool isSmall ) const; // Get a regular expression pattern which will match any of the text shortcuts of the emoticon QString getPattern() const; // Get the first shortcut associated to this emoticon @@ -107,9 +106,9 @@ 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 @@ -122,6 +121,8 @@ class Emoticon : public QObject QString pictureName_; // Contains the full path for the current emoticon picture, present for convenience QString picturePath_; + // The hash for this emoticon (sha1d) - used to compare with other emoticons + QString dataHash_; // The height of the emoticon int height_; // Whether this Emoticon represents a standard KMess emoticon or a custom (personal) one @@ -132,13 +133,13 @@ class Emoticon : public QObject QStringList shortcuts_; // A name for the emoticon, eg "Happy" QString tooltip_; - // Does the image exists and can be used? + // Does the image exist and can it be used? bool valid_; // The width of the emoticon 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/kmess/emoticonmanager.cpp b/src/emoticonmanager.cpp similarity index 62% rename from kmess/emoticonmanager.cpp rename to src/emoticonmanager.cpp index 960bce5..3e9768c 100644 --- a/kmess/emoticonmanager.cpp +++ b/src/emoticonmanager.cpp @@ -3,7 +3,7 @@ ------------------- begin : Tue April 10 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -17,20 +17,17 @@ #include "emoticonmanager.h" -#include -#include -#include - -#include -#include - #include "emoticon.h" #include "emoticontheme.h" -#include "kmessdebug.h" #include "currentaccount.h" +#include "kmessdebug.h" + +#include +#include + #ifdef KMESSDEBUG_EMOTICONS -#define KMESSDEBUG_EMOTICONS_GENERAL + #define KMESSDEBUG_EMOTICONS_GENERAL #endif @@ -44,15 +41,17 @@ EmoticonManager* EmoticonManager::instance_(0); * Constructor */ EmoticonManager::EmoticonManager() - : QObject(0, "EmoticonManager") + : QObject(0) , customTheme_(new EmoticonTheme()) , shouldSaveTheme_(false) , standardTheme_(new EmoticonTheme()) { + setObjectName("EmoticonManager"); + // Create the default KMess standard theme, to always have a fallback theme if( ! standardTheme_->loadTheme( "KMess-new", false ) ) { - kdWarning() << "EmoticonManager::EmoticonManager() - Cannot create standard emoticon theme!" << endl; + kWarning() << "Cannot create standard emoticon theme!"; } else { @@ -112,7 +111,7 @@ void EmoticonManager::connected( QString handle ) } #ifdef KMESSDEBUG_EMOTICONS_GENERAL - kdDebug() << "EmoticonManager::connected() - Loading custom emoticon theme of: " << themeName << endl; + kDebug() << "Loading custom emoticon theme of: " << themeName; #endif // When this call fails, it'll give feedback about the cause. No need to do it here too. @@ -140,7 +139,7 @@ void EmoticonManager::destroy() void EmoticonManager::disconnected() { #ifdef KMESSDEBUG_EMOTICONS_GENERAL - kdDebug() << "EmoticonManager::disconnected() - Destroying custom emoticon theme." << endl; + kDebug() << "Destroying custom emoticon theme."; #endif // Only save the theme when the account is not temporary @@ -154,17 +153,9 @@ void EmoticonManager::disconnected() // NOTE If a guest user adds emoticons, there will be its folder with the relative images. // I don't delete nor move them, since it may be a registered account which, for once, has // been made not to remember changes. - kdDebug() << "EmoticonManager::disconnected() - Guest account - do not save the theme." << endl; + kDebug() << "Guest account - do not save the theme."; } #endif - - - // Change theme and connect its update signal - delete customTheme_; - customTheme_ = new EmoticonTheme(); - connect( customTheme_, SIGNAL( updated() ), this, SIGNAL( updated() ) ); - - emit updated(); } @@ -172,16 +163,17 @@ 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(); +} + + + +// Return a QHash to map shortcut to data hash +const QHash& EmoticonManager::getHashes() +{ + return customTheme_->getHashes(); } @@ -189,16 +181,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(); } @@ -206,16 +191,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(); } @@ -223,16 +211,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(); } @@ -240,16 +221,9 @@ const QRegExp& EmoticonManager::getPattern( bool getCustomTheme ) const /** * Return one replacement code for the given emoticon */ -const 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 ); } @@ -257,16 +231,9 @@ const QString & EmoticonManager::getReplacement( const QString &code, bool small /** * 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 ); } @@ -293,14 +260,15 @@ EmoticonTheme *EmoticonManager::getTheme( bool getCustomTheme ) */ const QString& EmoticonManager::getThemePath( bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getThemePath(); - } - else - { - return standardTheme_->getThemePath(); - } + return getTheme( getCustomTheme )->getThemePath(); +} + + + +// Returns true if a custom emoticon has already been added +bool EmoticonManager::emoticonIsAdded( QString dataHash ) +{ + return customTheme_->emoticonIsAdded( dataHash ); } @@ -314,67 +282,19 @@ EmoticonManager* EmoticonManager::instance() if ( instance_ == 0 ) { instance_ = new EmoticonManager(); - connect( CurrentAccount::instance(), SIGNAL(changedEmoticonSettings() ), - instance_, SLOT(slotChangedEmoticonSettings() ) ); } return instance_; } -/** - * Replace the emoticons in the text with the urls to the emoticon pngs. - */ -void EmoticonManager::parseEmoticons( QString &text, bool small, bool useCustomTheme ) -{ - int pos = 0; - - EmoticonTheme *usedTheme; - - if( useCustomTheme ) - { - usedTheme = customTheme_; - } - else - { - usedTheme = standardTheme_; - } - - const QRegExp &pattern = usedTheme->getPattern(); - const QMap &replacements = usedTheme->getReplacements( small ); - - while( pos != -1 ) - { - pos = pattern.search(text, pos); - - if( pos != -1 ) - { - // Found a emoticon - QString code = text.mid(pos, pattern.matchedLength()); - if( replacements.contains(code) ) - { - QString replacement = replacements[code]; - text = text.replace(pos, pattern.matchedLength(), replacement); - pos += replacement.length(); - } - else - { - // No replacement found, preserve original code, move to next - pos++; - } - } - } -} - - - /** * Replace the custom emoticon theme with a new one */ void EmoticonManager::replaceCustomTheme( EmoticonTheme *newTheme ) { #ifdef KMESSDEBUG_EMOTICONS_GENERAL - kdDebug() << "EmoticonManager::replaceCustomTheme() - Replacing custom emoticon theme with a new one." << endl; + kDebug() << "Replacing custom emoticon theme with a new one."; #endif delete customTheme_; @@ -399,21 +319,19 @@ void EmoticonManager::replaceCustomTheme( EmoticonTheme *newTheme ) void EmoticonManager::slotChangedEmoticonSettings() { #ifdef KMESSDEBUG_EMOTICONS_GENERAL - kdDebug() << "EmoticonManager::slotChangedEmoticonSettings() - Emoticon theme changed, updating emoticons." << endl; + kDebug() << "Emoticon theme changed, updating emoticons."; #endif - bool isLoaded; - // Find out which theme is used now. const QString ¤tStyle = CurrentAccount::instance()->getEmoticonStyle(); // And load it - isLoaded = standardTheme_->loadTheme( currentStyle, false ); + bool isLoaded = standardTheme_->loadTheme( currentStyle, false ); // Warn if something has gone wrong if( ! isLoaded ) { - kdWarning() << "EmoticonManager::slotChangedEmoticonSettings() - Cannot set standard emoticon theme '" << currentStyle << "'." << endl; + kWarning() << "Cannot set standard emoticon theme '" << currentStyle << "'."; return; } diff --git a/kmess/emoticonmanager.h b/src/emoticonmanager.h similarity index 74% rename from kmess/emoticonmanager.h rename to src/emoticonmanager.h index 11209b2..d8aba3b 100644 --- a/kmess/emoticonmanager.h +++ b/src/emoticonmanager.h @@ -3,7 +3,7 @@ ------------------- begin : Tue April 10 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -18,12 +18,11 @@ #ifndef EMOTICONMANAGER_H #define EMOTICONMANAGER_H -#include -#include - #include "emoticon.h" #include "emoticontheme.h" +#include + /** @@ -31,7 +30,7 @@ * * This class maintains the list of the global/standard emoticons. * MSN Messenger uses a fixed set of emoticon/smiley codes and replacements. - * The parseEmoticons() method can be used to replace all emoticons in a message. + * The rich text parser can be used to replace all emoticons in a message. * To implement a custom search-replace algorithm, use the getPattern() / getReplacements() methods * to retrieve all needed data. * @@ -44,23 +43,27 @@ 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 a QHash to map shortcut to data hash + const QHash &getHashes(); // 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 isSmall = 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 - const QString& getReplacement( const QString &code, bool small = false, bool getCustomTheme = false ) const; + QString getReplacement( const QString &code, bool isSmall = 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 isSmall = 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 ); - // Replace the standard emoticons in the text with the urls to the emoticon pngs. - void parseEmoticons( QString &text, bool small = false, bool useCustomTheme = false ); + const QString &getThemePath( bool getCustomTheme = false ); + // Returns true if a custom emoticon has already been added + bool emoticonIsAdded( QString dataHash ); // Replace the custom emoticon theme with a new one void replaceCustomTheme( EmoticonTheme *newTheme ); @@ -80,7 +83,7 @@ class EmoticonManager : public QObject // Constructor EmoticonManager(); // Destructor - ~EmoticonManager(); + virtual ~EmoticonManager(); private slots: // The emoticon theme has changed, update our settings diff --git a/kmess/emoticontheme.cpp b/src/emoticontheme.cpp similarity index 63% rename from kmess/emoticontheme.cpp rename to src/emoticontheme.cpp index 2c454a5..c4f7570 100644 --- a/kmess/emoticontheme.cpp +++ b/src/emoticontheme.cpp @@ -3,7 +3,7 @@ ------------------- begin : Tue April 10 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -16,23 +16,24 @@ ***************************************************************************/ #include "emoticontheme.h" + +#include "utils/kmessconfig.h" +#include "utils/kmessshared.h" #include "kmessdebug.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include + +#include +#include +#include -#include -#include -#include -#include -#include #ifdef KMESSDEBUG_EMOTICONS -#define KMESSDEBUG_EMOTICON_THEMES + #define KMESSDEBUG_EMOTICON_THEMES #endif @@ -41,12 +42,10 @@ * Constructor */ EmoticonTheme::EmoticonTheme() - : QPtrList() + : QObject() , loadingTheme_(false) , isCustomTheme_(false) { - clear(); - setAutoDelete( true ); } @@ -61,28 +60,20 @@ EmoticonTheme::EmoticonTheme() */ EmoticonTheme::EmoticonTheme( const EmoticonTheme &other ) : QObject() - , QPtrList() , loadingTheme_(other.loadingTheme_) , isCustomTheme_(other.isCustomTheme_) , themePath_(other.themePath_) { - clear(); - setAutoDelete( true ); - // Duplicate one by one the other theme's emoticons - Emoticon *emoticon; - QPtrListIteratorit( other ); - while( ( emoticon = it.current() ) != 0 ) + const QListemoticonList( other.getEmoticons() ); + foreach( Emoticon *emoticon, emoticonList ) { - ++it; - emoticon = new Emoticon( *emoticon ); emoticon->update(); - - append( emoticon ); + 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(); } @@ -93,6 +84,8 @@ EmoticonTheme::EmoticonTheme( const EmoticonTheme &other ) */ EmoticonTheme::~EmoticonTheme() { + qDeleteAll( emoticons_ ); + emoticons_.clear(); } @@ -105,7 +98,7 @@ EmoticonTheme::~EmoticonTheme() * @param pictureFile The file name of the emoticon, without path and without extension (will be guessed) * @param shortcuts A list of text shortcuts which will be translated to the pictureFile image */ -void EmoticonTheme::addEmoticon( QString pictureFile, QStringList shortcuts ) +void EmoticonTheme::addEmoticon( const QString& pictureFile, const QStringList& shortcuts ) { Emoticon *emoticon; @@ -120,7 +113,7 @@ void EmoticonTheme::addEmoticon( QString pictureFile, QStringList shortcuts ) emoticon->setShortcuts( shortcuts ); - append( emoticon ); + emoticons_.append( emoticon ); // Only update the caches if we're adding a new custom emoticon if( ! loadingTheme_ && isCustomTheme_ ) @@ -138,10 +131,9 @@ void EmoticonTheme::addEmoticon( QString pictureFile, QStringList shortcuts ) */ bool EmoticonTheme::contains( QString shortcut ) { - Emoticon *emoticon; - for( emoticon = first(); emoticon != 0; emoticon = next() ) + foreach( Emoticon *emoticon, emoticons_ ) { - if( emoticon->getShortcuts().contains( shortcut ) ) + if( emoticon->getShortcuts().indexOf( shortcut ) != -1 ) { return true; } @@ -159,20 +151,20 @@ bool EmoticonTheme::contains( QString shortcut ) * * @param themeDir The absolute path where the theme's emoticons.xml definition file is located */ -bool EmoticonTheme::createTheme( QString themeDir ) +bool EmoticonTheme::createTheme( const QString& themeDir ) { - QString themeFileName( themeDir + "emoticons.xml" ); + const QString themeFileName( themeDir + "emoticons.xml" ); QFile xmlFile( themeFileName ); #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::createTheme() - Loading emoticons from theme XML: '" << themeFileName << "'" << endl; + kDebug() << "Loading emoticons from theme XML: '" << themeFileName << "'"; #endif // Try to read the XML - if( ! xmlFile.open( IO_ReadOnly ) ) + if( ! xmlFile.open( QIODevice::ReadOnly ) ) { #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::createTheme() - Could not open '" << themeFileName << "'" << endl; + kDebug() << "Could not open '" << themeFileName << "'"; #endif return false; } @@ -183,47 +175,47 @@ bool EmoticonTheme::createTheme( QString themeDir ) if( ! xml.setContent( xmlFile.readAll(), false, &xmlError ) ) { #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::createTheme() - Failure parsing '" << themeFileName << "': " << xmlError << endl; + kDebug() << "Failure parsing '" << themeFileName << "': " << xmlError; #endif xmlFile.close(); return false; } - clear(); + // Clean the current list + qDeleteAll( emoticons_ ); + emoticons_.clear(); - // Loop through all tags - QDomNode xmlChild = xml.documentElement().firstChild(); - while( ! xmlChild.isNull() ) + int i, l; + QStringList shortcuts; + QString shortcut; + const QDomNodeList& allEmoticons( xml.elementsByTagName( "emoticon" ) ); + + for( i = 0; i < allEmoticons.count(); i++ ) { - // tag found - QDomElement emoticonTag = xmlChild.toElement(); - if( ! emoticonTag.isNull() && emoticonTag.tagName() == "emoticon" ) + const QDomElement& node( allEmoticons.at( i ).toElement() ); + const QString& emoticonFile( node.attribute( "file" ) ); + + const QDomNodeList& shortcutNodes( node.elementsByTagName( "string" ) ); + shortcuts.clear(); + + // Load all the shortcut for the current emoticons + for( l = 0; l < shortcutNodes.count(); l++ ) { - QString emoticonFile = emoticonTag.attribute( "file" ); - - // Loop through all tags - QStringList shortcuts; - QDomNode xmlChild2 = emoticonTag.firstChild(); - while( ! xmlChild2.isNull() ) - { - // tag found - QDomElement stringTag = xmlChild2.toElement(); - if( ! stringTag.isNull() && stringTag.tagName() == "string" ) - { - // Force the shortcuts to be at most 7 characters long, as MSN does. - stringTag.text().truncate( 7 ); - shortcuts.append( stringTag.text() ); - } - xmlChild2 = xmlChild2.nextSibling(); - } + const QDomElement& shortcutNode( shortcutNodes.at( l ).toElement() ); + shortcut = shortcutNode.text(); + shortcut.truncate( 7 ); + shortcuts.append( shortcut ); + } + // If is a valid emoticon, add it to the current theme + if( ! emoticonFile.isEmpty() && ! shortcuts.isEmpty() ) + { addEmoticon( emoticonFile, shortcuts ); } - xmlChild = xmlChild.nextSibling(); } #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::createTheme() - Added " << count() << " emoticons." << endl; + kDebug() << "Added " << emoticons_.count() << " emoticons."; #endif return true; @@ -231,16 +223,71 @@ bool EmoticonTheme::createTheme( QString themeDir ) +// Returns true if a custom emoticon has already been added +bool EmoticonTheme::emoticonIsAdded( QString dataHash ) +{ + foreach( Emoticon *emoticon, emoticons_ ) + { + if( emoticon->getDataHash() == dataHash ) + { + return true; + } + } + + return false; +} + + + +/** + * Obtain an emoticon by its shortcut + * + * @param shortcut Text shortcut of the emoticon to get. + * @return Pointer to the emoticon. Zero on failure. + */ +const Emoticon *EmoticonTheme::getEmoticon( QString shortcut ) const +{ + foreach( Emoticon *emoticon, emoticons_ ) + { + if( emoticon->getShortcuts().contains( shortcut ) ) + { + return emoticon; + } + } + + return 0; +} + + + +/** + * Return the full list of emoticons + */ +const QList &EmoticonTheme::getEmoticons() const +{ + return emoticons_; +} + + + /** * 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_; } +// Return a QHash to map shortcut to data hash +const QHash& EmoticonTheme::getHashes() const +{ + return hashes_; +} + + + /** * Return the search pattern to find emoticons in an HTML text */ @@ -254,7 +301,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 ) { @@ -268,6 +315,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 */ @@ -281,7 +338,7 @@ const QRegExp& EmoticonTheme::getPattern() const /** * Return one replacement code for the given emoticon */ -const QString & EmoticonTheme::getReplacement( const QString &code, bool small ) const +QString EmoticonTheme::getReplacement( const QString &code, bool small ) const { if( small ) { @@ -298,7 +355,7 @@ const QString & EmoticonTheme::getReplacement( const QString &code, bool small ) /** * Return the replacement codes for all emoticons */ -const QMap& EmoticonTheme::getReplacements( bool small ) const +const QHash& EmoticonTheme::getReplacements( bool small ) const { if( small ) { @@ -329,18 +386,18 @@ QString EmoticonTheme::getThemeIcon( QString themeDir ) themeDir += "/"; } - QString themeFileName( themeDir + "emoticons.xml" ); + const QString themeFileName( themeDir + "emoticons.xml" ); QFile xmlFile( themeFileName ); #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::getThemeIcon() - Getting first emoticon from theme XML: '" << themeFileName << "'" << endl; + kDebug() << "Getting first emoticon from theme XML: '" << themeFileName << "'"; #endif // Try to read the XML - if( ! xmlFile.open( IO_ReadOnly ) ) + if( ! xmlFile.open( QIODevice::ReadOnly ) ) { #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::getThemeIcon() - Could not open '" << themeFileName << "'" << endl; + kDebug() << "Could not open '" << themeFileName << "'"; #endif return QString::null; } @@ -351,29 +408,24 @@ QString EmoticonTheme::getThemeIcon( QString themeDir ) if( ! xml.setContent( xmlFile.readAll(), false, &xmlError ) ) { #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::getThemeIcon() - Failure parsing '" << themeFileName << "': " << xmlError << endl; + kDebug() << "Failure parsing '" << themeFileName << "': " << xmlError; #endif xmlFile.close(); return QString::null; } - // Loop through all tags - QDomNode xmlChild = xml.documentElement().firstChild(); - while( ! xmlChild.isNull() ) - { - // tag found - QDomElement emoticonTag = xmlChild.toElement(); - if( ! emoticonTag.isNull() && emoticonTag.tagName() == "emoticon" ) - { - Emoticon *emoticon = new Emoticon( emoticonTag.attribute( "file" ), "", themeDir ); + const QDomNodeList& allEmoticons( xml.elementsByTagName( "emoticon" ) ); - // Search the theme until a valid emoticon is found, and return it - if( emoticon->isValid() ) - { - return emoticon->getPicturePath(); - } + for( int i = 0; i < allEmoticons.count(); i++ ) + { + const QDomElement& node( allEmoticons.at( i ).toElement() ); + const QString& emoticonFile( node.attribute( "file" ) ); + const Emoticon emoticon( emoticonFile, "", themeDir ); + + if( emoticon.isValid() ) + { + return emoticon.getPicturePath(); } - xmlChild = xmlChild.nextSibling(); } // The theme contained no valid emoticons @@ -402,58 +454,29 @@ const QString &EmoticonTheme::getThemePath() bool EmoticonTheme::loadTheme( QString themeName, bool isCustomTheme ) { bool success = false; - KStandardDirs *dirs = KGlobal::dirs(); - themePath_ = QString::null; + const QString oldThemePath( themePath_ ); isCustomTheme_ = isCustomTheme; #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::loadTheme() - Loading " << themeName << " as " << (isCustomTheme?"custom":"default") << " theme." << endl; + kDebug() << "Loading " << themeName << " as " << (isCustomTheme?"custom":"default") << " theme."; #endif - // Try to find the theme between all possible locations - QString resourceType, resourceDir; - if( isCustomTheme_ ) + // Change the theme name (where it is stored) + setThemeName( themeName ); + + if( oldThemePath == themePath_ ) { - // Custom themes are located in: [kmess app data folder]/customemoticons/[account email] - // This call creates missing directories. - themePath_ = locateLocal( "data", "kmess/customemoticons/" + themeName + "/emoticons.xml", true ); - - QFileInfo pathInfo( themePath_ ); - - // locateLocal() also returns the file name, which we don't need. - themePath_ = pathInfo.dirPath( true ) + "/"; - - // Check if the folder exists - pathInfo.setFile( themePath_ ); - if( ! pathInfo.isDir() ) - { - // The theme hasn't been created! - kdWarning() << "EmoticonTheme::loadTheme() - Couldn't create the new theme folder '" << themePath_ << "'!" << endl; - - return false; - } +#ifdef KMESSDEBUG_EMOTICON_THEMES + kDebug() << "Theme" << themeName << "was already loaded!"; +#endif + return true; } - else - { - // Standard themes can be in the KDE global emoticons dir, or in the ~/.kde/share/emoticons folder, and possibly elsewhere - themePath_ = dirs->findResourceDir( "emoticons", themeName + "/emoticons.xml" ); - - // The theme hasn't been found! - if( themePath_.isNull() ) - { - return false; - } - - // findResourceDir() only returns the base path for the file you pass to it. - themePath_ += themeName + "/"; - } - // Set the theme loading status, needed by addEmoticon() loadingTheme_ = true; - if( isCustomTheme || count() == 0 ) + if( isCustomTheme || emoticons_.isEmpty() ) { // If we're loading a standard theme, but there's none to update, we need to create it from scratch. success = createTheme( themePath_ ); @@ -488,22 +511,71 @@ bool EmoticonTheme::removeEmoticon( QString shortcut ) return false; } - Emoticon *emoticon; - for( emoticon = first(); emoticon != 0; emoticon = next() ) +#ifdef KMESSDEBUG_EMOTICON_THEMES + kDebug() << "Removing emoticon" << shortcut << "."; +#endif + + foreach( Emoticon *emoticon, emoticons_ ) { - if( emoticon->getShortcuts().contains( shortcut ) ) + // This is not the emoticon we need to delete + if( emoticon->getShortcuts().indexOf( shortcut ) == -1 ) { - // Delete the file - QFile( emoticon->getPicturePath() ).remove(); - - // Remove the emoticon from the theme - remove( emoticon ); - - // Removing a custom emoticon, update the cache - updateCache(); - - return true; + continue; } + + // Delete the file + QFile::remove( emoticon->getPicturePath() ); + + // Remove the emoticon from the theme + delete emoticons_.takeAt( emoticons_.indexOf( emoticon ) ); + + // Update the cache + updateCache(); + + return true; + } + + return false; +} + + + +/** + * Change the shortcut and the tooltip of a custom emoticon + * + * @param oldShortcut The shortcut of the emoticon to replace + * @param newShortcut The new shortcut for that emoticon + */ +bool EmoticonTheme::renameEmoticon( QString oldShortcut, QString newShortcut ) +{ + // Can't remove emoticons from a standard theme + if( ! isCustomTheme_ ) + { + return false; + } + +#ifdef KMESSDEBUG_EMOTICON_THEMES + kDebug() << "Renaming emoticon" << oldShortcut << "to" << newShortcut << "."; +#endif + + foreach( Emoticon *emoticon, emoticons_ ) + { + // This is not the emoticon we need to rename + if( emoticon->getShortcuts().indexOf( oldShortcut ) == -1 ) + { + continue; + } + + // Replace all the shortcuts with the new one + emoticon->setShortcut( newShortcut ); + + // Also update its tooltip + emoticon->setTooltip( newShortcut ); + + // Update the cache + updateCache(); + + return true; } return false; @@ -527,19 +599,32 @@ bool EmoticonTheme::saveTheme() return true; } - QString themeFileName( themePath_ + "emoticons.xml" ); + // Create any missing directories. + QDir dir; + dir.mkpath( themePath_ ); + + // Check if the folder exists + if( ! dir.exists() ) + { + // The theme hasn't been created! + kWarning() << "Couldn't create the new theme folder '" << themePath_ << "'!"; + + return false; + } + + const QString themeFileName( themePath_ + "emoticons.xml" ); QFile xmlFile( themeFileName ); #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::saveTheme() - Saving emoticons to theme XML: '" << themeFileName << "'" << endl; + kDebug() << "Saving emoticons to theme XML: '" << themeFileName << "'"; #endif // Open the destination XML file - if( ! xmlFile.open( IO_WriteOnly ) ) + if( ! xmlFile.open( QIODevice::WriteOnly ) ) { - kdWarning() << "EmoticonTheme::saveTheme() - Save failed - couldn't open file '" << themeFileName << "'." << endl; - KMessageBox::sorry( 0, i18n("Could not save the emoticon theme. Make sure you have permission to write to the theme folder '%1'.").arg( themePath_ ) ); + kWarning() << "Save failed - couldn't open file '" << themeFileName << "'."; + KMessageBox::sorry( 0, i18n("Could not save the emoticon theme. Make sure you have permission to write to the theme folder '%1'.", themePath_ ) ); return false; } @@ -547,7 +632,7 @@ bool EmoticonTheme::saveTheme() QTextCodec *codec = QTextCodec::codecForLocale(); if( codec == 0 ) { - kdWarning() << "EmoticonTheme::saveTheme() - Could not find codec '" << QTextCodec::codecForLocale() << "', special characters might not be saved correctly!" << endl; + kWarning() << "Could not find codec '" << QTextCodec::codecForLocale() << "', special characters might not be saved correctly!"; } // Start the XML output using the right text encoding @@ -560,11 +645,7 @@ bool EmoticonTheme::saveTheme() // Start the XML tree by writing the root tag xmlOutput << "" << endl << "" << endl << endl; - // Keeping those here, could maybe be useful at a later moment for the encoding process - // .replace("\"", """).replace("'", "'").replace("&", "&").replace("<", "<").replace(">", ">") - - Emoticon *emoticon; - for( emoticon = first(); emoticon != 0; emoticon = next() ) + foreach( Emoticon *emoticon, emoticons_ ) { if( ! emoticon->isValid() ) { @@ -572,22 +653,18 @@ bool EmoticonTheme::saveTheme() } // We only need base names of the emoticons: the specs - QString file = QFileInfo( emoticon->getPicturePath() ).baseName( true ); + const QString& file( QFileInfo( emoticon->getPicturePath() ).baseName() ); // New emoticon: the file name is encoded as HTML to avoid XML parsing errors - xmlOutput << "\t" << endl; + xmlOutput << "\t" << endl; // Add a for each shortcut which maps to this emoticon, - const QStringList &codes = emoticon->getShortcuts(); + const QStringList &codes( emoticon->getShortcuts() ); for( QStringList::ConstIterator it = codes.begin(); it != codes.end(); ++it ) { // Encode the shortcuts as HTML to avoid XML parsing errors - QString code = *it; - code.replace( "&", "&" ) - .replace( "<", "<" ) - .replace( ">", ">" ) - .replace( "'", "'" ) - .replace( '"', """ ); + QString code( *it ); + KMessShared::htmlEscape( code ); xmlOutput << "\t\t" << code << "" << endl; } @@ -607,68 +684,90 @@ bool EmoticonTheme::saveTheme() +/** + * @brief Change the theme name + * + * Alter the name of the theme, which is the name of the directory where the theme will + * be stored. + * + * @param newThemeName The new name + */ +void EmoticonTheme::setThemeName( const QString &newThemeName ) +{ + KStandardDirs *dirs = KGlobal::dirs(); + + // Try to find the theme between all possible locations + if( isCustomTheme_ ) + { + // Custom themes are located in: //customemoticons + themePath_ = KMessConfig::instance()->getAccountDirectory( newThemeName ) + "/customemoticons/"; + } + else + { + // Standard themes can be in the KDE global emoticons dir, or in the ~/.kde/share/emoticons folder, and possibly elsewhere + themePath_ = dirs->findResourceDir( "emoticons", newThemeName + "/emoticons.xml" ); + + // findResourceDir() only returns the base path for the file you pass to it. + themePath_ += newThemeName + "/"; + } +} + + + /** * Rebuild the search&replace caches */ void EmoticonTheme::updateCache() { QStringList::const_iterator it; - Emoticon *emoticon; QString emoticonHtmlPattern; QString emoticonTextPattern; QFileInfo file; #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateCache() - Updating the caches." << endl; + kDebug() << "Updating the caches."; #endif // Remove all replacements, some emoticons may be no longer valid + emoticonList_.clear(); smallReplacements_.clear(); largeReplacements_.clear(); smallHtmlReplacements_.clear(); largeHtmlReplacements_.clear(); themeFileNames_.clear(); + hashes_.clear(); - // HACK: Find all HTML entities followed by ")" or "-)". Since there is no replacement for this match, text - // like "&)" will not be replaced by "&" but will be skipped. See the pertinent hack - // at ChatMessageStyle::parseMsnPlus(). - // TODO: Check if this is avoidable with Qt4's HTML implementation - emoticonHtmlPattern = "\x26#?[a-z0-9]+;-?\\)|"; - - for( emoticon = first(); emoticon != 0; emoticon = next() ) + foreach( Emoticon *emoticon, emoticons_ ) { if( ! emoticon->isValid() ) { #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateCache() - Invalid emoticon '" << emoticon->getPicturePath() + kDebug() << "Invalid emoticon '" << emoticon->getPicturePath() << "' with code: " << emoticon->getShortcut() << endl; #endif continue; } // Generate the HTML tag which represents the emoticon - QString htmlSmall = emoticon->getHtml( true ); - QString htmlLarge = emoticon->getHtml( false ); + const QString& htmlSmall( emoticon->getHtml( true ) ); + const QString& htmlLarge( emoticon->getHtml( false ) ); + const QString& dataHash( emoticon->getDataHash() ); // Traverse all shortcuts of this emoticon - const QStringList &codes = emoticon->getShortcuts(); - for( it = codes.begin(); it != codes.end(); ++it) + const QStringList &codes( emoticon->getShortcuts() ); + foreach( const QString &code, codes ) { - const QString &code = *it; - // Convert to HTML the main significant HTML control characters - QString htmlCode = code; - htmlCode.replace( "&", "&" ) - .replace( "<", "<" ) - .replace( ">", ">" ) - .replace( "'", "'" ) - .replace( '"', """ ); + 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; + hashes_.insert( htmlCode, dataHash ); + smallReplacements_.insert( code, htmlSmall ); + largeReplacements_.insert( code, htmlLarge ); + smallHtmlReplacements_.insert( htmlCode, htmlSmall ); + largeHtmlReplacements_.insert( htmlCode, htmlLarge ); // ..to the filenames list.. file.setFile( emoticon->getPicturePath() ); @@ -688,7 +787,7 @@ void EmoticonTheme::updateCache() } #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateCache() - Cache contains " << largeReplacements_.count() << " emoticons." << endl; + kDebug() << "Cache contains " << largeReplacements_.count() << " emoticon shortcuts."; #endif // Cache the patterns. @@ -726,12 +825,10 @@ void EmoticonTheme::updateTitles() } #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateTitles() - Updating standard emoticons names..." << endl; + kDebug() << "Updating standard emoticons names..."; #endif - QString name; - Emoticon *emoticon; - QMap emoticonTitles; + QHash emoticonTitles; emoticonTitles[ "smile" ] = i18n( "Smile" ); emoticonTitles[ "wink" ] = i18n( "Wink" ); @@ -762,7 +859,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" ); @@ -780,7 +877,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" ); @@ -806,17 +903,17 @@ 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" ); - emoticonTitles[ "messenger" ] = i18n( "KMess Icon" ); + emoticonTitles[ "messenger" ] = i18n( "KMess icon" ); - for( emoticon = first(); emoticon != 0; emoticon = next() ) + foreach( Emoticon *emoticon, emoticons_ ) { - name = emoticon->getPictureName(); - if( emoticonTitles.contains( name ) ) + const QString& name( emoticon->getPictureName() ); + if( ! emoticonTitles.value( name, QString() ).isEmpty() ) { emoticon->setTooltip( emoticonTitles[ name ] ); } @@ -833,22 +930,21 @@ void EmoticonTheme::updateTitles() * * @param themeDir The absolute path where the theme's emoticons.xml definition file is located */ -bool EmoticonTheme::updateTheme( QString themeDir ) +bool EmoticonTheme::updateTheme( const QString& themeDir ) { - Emoticon *emoticon; - QString themeFileName( themeDir + "emoticons.xml" ); + const QString themeFileName( themeDir + "emoticons.xml" ); QFile xmlFile( themeFileName ); #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateTheme() - Updating emoticons from theme XML: '" << themeFileName << "'" << endl; + kDebug() << "Updating emoticons from theme XML: '" << themeFileName << "'"; #endif // Try to read the XML - if( ! xmlFile.open( IO_ReadOnly ) ) + if( ! xmlFile.open( QIODevice::ReadOnly ) ) { #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateTheme() - Could not open '" << themeFileName << "'" << endl; + kDebug() << "Could not open '" << themeFileName << "'"; #endif return false; } @@ -859,7 +955,7 @@ bool EmoticonTheme::updateTheme( QString themeDir ) if( ! xml.setContent( xmlFile.readAll(), false, &xmlError ) ) { #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateTheme() - Failure parsing '" << themeFileName << "': " << xmlError << endl; + kDebug() << "Failure parsing '" << themeFileName << "': " << xmlError; #endif xmlFile.close(); @@ -867,54 +963,44 @@ bool EmoticonTheme::updateTheme( QString themeDir ) } - // Load the codes in a map for efficient lookup - QMap themeFiles; + // Load the codes in a hash for efficient lookup + QHash themeFiles; - // Loop through all tags - QDomNode xmlChild = xml.documentElement().firstChild(); - while( ! xmlChild.isNull() ) + int i, l; + QString shortcut; + const QDomNodeList& allEmoticons( xml.elementsByTagName( "emoticon" ) ); + for( i = 0; i < allEmoticons.count(); i++ ) { - // tag found - QDomElement emoticonTag = xmlChild.toElement(); - if( ! emoticonTag.isNull() && emoticonTag.tagName() == "emoticon" ) - { - // Loop through all tags - QString emoticonFile = emoticonTag.attribute( "file" ); - QDomNode xmlChild2 = emoticonTag.firstChild(); - while( ! xmlChild2.isNull() ) - { - // tag found - QDomElement stringTag = xmlChild2.toElement(); - if( ! stringTag.isNull() && stringTag.tagName() == "string" ) - { - // Force the shortcuts to be at most 7 characters long, as MSN does. - stringTag.text().truncate( 7 ); + const QDomElement& node( allEmoticons.at( i ).toElement() ); + const QString& emoticonFile( node.attribute( "file" ) ); - // Insert code in the map - themeFiles.insert( stringTag.text(), emoticonFile ); - } - xmlChild2 = xmlChild2.nextSibling(); - } + const QDomNodeList& shortcutNodes( node.elementsByTagName( "string" ) ); + + for( l = 0; l < shortcutNodes.count(); l++ ) + { + const QDomElement& shortcutNode( shortcutNodes.at( l ).toElement() ); + shortcut = shortcutNode.text(); + shortcut.truncate( 7 ); + themeFiles.insert( shortcut, emoticonFile ); } - xmlChild = xmlChild.nextSibling(); } #ifdef KMESSDEBUG_EMOTICON_THEMES - kdDebug() << "EmoticonTheme::updateTheme() - Updated " << themeFiles.count() << " emoticons, setting them up." << endl; + kDebug() << "Updated " << themeFiles.count() << " emoticons, setting them up."; #endif // Loop through all current emoticons. - for( emoticon = last(); emoticon != 0; emoticon = prev() ) + foreach( Emoticon *emoticon, emoticons_ ) { // Loop through all codes of the emoticon bool codeFound = false; - const QStringList &codes = emoticon->getShortcuts(); + const QStringList &codes( emoticon->getShortcuts() ); for( QStringList::ConstIterator it = codes.begin(); it != codes.end(); ++it ) { const QString &code = *it; // If the emoticon uses that code, set it. - if( themeFiles.contains(code) ) + if( ! themeFiles.value( code, QString() ).isEmpty() ) { emoticon->setPictureName( themeFiles[code] ); // already calls update() codeFound = true; diff --git a/kmess/emoticontheme.h b/src/emoticontheme.h similarity index 65% rename from kmess/emoticontheme.h rename to src/emoticontheme.h index 4ded08b..1ce2d8f 100644 --- a/kmess/emoticontheme.h +++ b/src/emoticontheme.h @@ -3,7 +3,7 @@ ------------------- begin : Tue April 10 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -18,12 +18,10 @@ #ifndef EMOTICONTHEME_H #define EMOTICONTHEME_H -#include -#include -#include - #include "emoticon.h" +#include + /** @@ -37,7 +35,7 @@ * @author Michael Curtis, Diederik van der Boor, Valerio Pilo * @ingroup Root */ -class EmoticonTheme : public QObject, public QPtrList +class EmoticonTheme : public QObject { Q_OBJECT @@ -47,32 +45,46 @@ class EmoticonTheme : public QObject, public QPtrList // Copy constructor EmoticonTheme( const EmoticonTheme &other ); // Destructor - ~EmoticonTheme(); + virtual ~EmoticonTheme(); // Create a new emoticon and add it to the theme - void addEmoticon( QString pictureFile, QStringList shortcuts ); + void addEmoticon( const QString& pictureFile, const QStringList& shortcuts ); // Check if the theme contains a certain emoticon bool contains( QString shortcut ); + // Returns true if a custom emoticon has already been added + bool emoticonIsAdded( QString dataHash ); + // Obtain an emoticon by its shortcut + const Emoticon *getEmoticon( QString shortcut ) const; + // 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 a QHash to map shortcut to data hash + const QHash &getHashes() 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 isSmall = 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 - const QString &getReplacement( const QString &code, bool small = false ) const; + QString getReplacement( const QString &code, bool isSmall = false ) const; // Return the replacement codes for all emoticons - const QMap &getReplacements( bool small = false ) const; + const QHash &getReplacements( bool isSmall = 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 bool removeEmoticon( QString shortcut ); + // Change the shortcut and the tooltip of a custom emoticon + bool renameEmoticon( QString oldShortcut, QString newShortcut ); // Save the current theme to an XML theme definition file bool saveTheme(); + // Change the theme name + void setThemeName( const QString &newThemeName ); public: // Public static methods // Return the full path of the first emoticon of the specified theme @@ -80,35 +92,40 @@ class EmoticonTheme : public QObject, public QPtrList private: // Private methods // Create the theme from nothing - bool createTheme( QString themeDir ); + bool createTheme( const QString& themeDir ); // Rebuild the search&replace caches void updateCache(); // Update a standard theme with names for the standard MSN emoticons void updateTitles(); // Update the currently loaded theme with new images - bool updateTheme( QString themeDir ); + bool updateTheme( const QString& themeDir ); private: // Private properties + QList emoticons_; // Are we loading a theme? bool loadingTheme_; // 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 hashes for all emoticons + QHash hashes_; // 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 new file mode 100644 index 0000000..cf8ba85 --- /dev/null +++ b/src/initialview.cpp @@ -0,0 +1,875 @@ +/*************************************************************************** + initialview.cpp - description + ------------------- + begin : Sun Jan 12 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 "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() + , 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" ); + lastUsedHandle_ = config_.readEntry( "defaultHandle", "me@hotmail.com" ); + + // Enable auto completion + handleCombobox_->setCompletionMode( KGlobalSettings::CompletionPopup ); + + // Select an image to load into the main screen.. mmmm, eggs! + QString imageName; + QDate currentDate = QDate::currentDate(); + if( currentDate.month() == 12 && currentDate.day() > 15 ) + { + imageName = "kmessstrip2"; + } + else + { + imageName = "kmessstrip1"; + } + // Load the chosen icon + loader_ = KIconLoader::global(); + QPixmap icon = loader_->loadIcon( imageName, KIconLoader::User ); + kmessLogo_->setPixmap( icon ); + kmessLogo_->setMinimumSize( icon.width(), icon.height() ); + + // Add the items to the initial status combo box + QStringList states; + states << i18n("Online") + << i18n("Away") + << i18n("Be Right Back") + << i18n("Busy") + << i18n("Out to Lunch") + << i18n("On the Phone") + << i18n("Invisible"); + initialStatus_->insertItems( 0, states ); + + // Load the accounts list into our combo box + const QList accountsList = AccountsManager::instance()->getAccounts(); + foreach( Account *account, accountsList ) + { + addAccount( account ); + } + + // Connect the remaining signals + connect( handleCombobox_, SIGNAL( editTextChanged(const QString&) ), + this, SLOT ( updateView() ) ); + connect( connectButton_, SIGNAL( clicked() ), + this, SLOT ( slotConnectClicked() ) ); + connect( rememberAccountCheckBox_, SIGNAL( stateChanged(int) ), + this, SLOT ( rememberAccountStateChanged(int) ) ); + 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) ), + this, SLOT ( updateView() ) ); + + // When (if!) the passwords have been read from the user's password wallet, show them + connect( AccountsManager::instance(), SIGNAL( passwordsReady() ), + this, SLOT ( 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) ) ); + + // 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() ) ); +} + + + +// The destructor +InitialView::~InitialView() +{ +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "DESTROYED."; +#endif +} + + + +// Add an account to the list of displayed accounts from which the user can choose +void InitialView::addAccount(Account *account) +{ + const QString &handle = account->getHandle(); + + // Add account to internal list + accounts_.insert( handle, account ); + + // Add an entry for the account to the dropdown list + handleCombobox_->addItem( handle ); + handleCombobox_->completionObject()->addItem( handle ); + + // Select the account in the combobox if it's the default account. + if( handle == lastUsedHandle_ ) + { + handleCombobox_->setCurrentItem( lastUsedHandle_ ); + updateView(); + } +} + + + +// Modify an account in the list of displayed accounts from which the user can choose +void InitialView::changedAccount( QString oldName, QString newName ) +{ + if( accounts_[ oldName ] == 0 ) + { + return; + } + + Account *account = accounts_[ oldName ]; + accounts_.remove( oldName ); + accounts_.insert( newName, account ); + + // Change completion box entry + handleCombobox_->completionObject()->removeItem( oldName ); + handleCombobox_->completionObject()->addItem( newName ); + + // Remove account from qcombobox + bool foundItem = false; + for( int i = 0; i < handleCombobox_->count(); i++ ) + { + if( handleCombobox_->itemText(i).toLower() == oldName.toLower() ) + { + handleCombobox_->removeItem(i); + foundItem = true; + break; + } + } + handleCombobox_->addItem( newName ); + + if( ! foundItem ) + { + kWarning() << "Account not found in pulldown list!"; + } +} + + + +/** + * @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 + * + * This method receives KDE's Solid network connection status changes, and updates the view's widgets + * to reflect it. + * + * @param newStatus The new status of the network connection + */ +void InitialView::slotConnectionStatusChanged( Solid::Networking::Status newStatus ) +{ + networkStatus_ = newStatus; + +#ifdef KMESSDEBUG_INITIALVIEW + QString status; + switch( networkStatus_ ) + { + 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, continuing..."; +#endif + + if( ! reconnectionHandle_.isEmpty() ) + { +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Reconnection asked, scheduling."; +#endif + reconnect( reconnectionHandle_ ); + } + else + { + statusMessage(); + setEnabled( true ); + } + } + } + else + { + // Solid connection is not up. + // Reset the dialog, keep the "isConnecting" status + setEnabled( ! triedConnecting_ ); + if( triedConnecting_ ) + { + // 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" ) ); + } + } +} + + + +// 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() ); + accounts_.remove(handle); + + // Remove account from completionbox (extended qlistbox) + handleCombobox_->completionObject()->removeItem( handle ); + + // Remove account from qcombobox + bool foundItem = false; + for( int i = 0; i < handleCombobox_->count(); i++ ) + { + if( handleCombobox_->itemText(i).toLower() == handle.toLower() ) + { + handleCombobox_->removeItem(i); + foundItem = true; + break; + } + } + + if( ! foundItem ) + { + kWarning() << "Account not found in pulldown list!"; + } +} + + + +// Get the currently selected handle +QString InitialView::getSelectedHandle() const +{ + // Get handle, remove appended friendlyname if present + QString handle( handleCombobox_->currentText() ); + if( handle.contains(' ') ) + { + handle = handle.section(' ', 0, 0); + } + return handle.toLower(); +} + + + +// A profile was selected from the drop-down list, or written manually. +void InitialView::updateView() +{ + Account *account = accounts_[ getSelectedHandle() ]; + if( account != 0 ) + { + // User typed the full account name without using autocompletion. + if( ! account->getSavePassword() ) + { + rememberPasswordCheckBox_->setChecked( false ); + passwordEdit_->setText( QString() ); + } + else + { + rememberPasswordCheckBox_->setChecked( true ); + passwordEdit_->setText( account->getPassword() ); + } + + // Set the current account picture + QString picturePath; + + // Check if the user wants one picture + if( account->getShowPicture() ) + { + picturePath = account->getPicturePath(); + pictureLabel_->setEnabled( true ); + } + else + { + picturePath = KGlobal::dirs()->findResource( "data", "kmess/pics/kmesspic.png" ); + pictureLabel_->setEnabled( false ); + } + + // Check if the picture is valid + const QPixmap picture( picturePath ); + if( ! picture.isNull() ) + { + pictureLabel_->setPixmap( picture ); + } + else + { + pictureLabel_->setPixmap( QPixmap() ); + } + + rememberAccountCheckBox_->setChecked( ! account->isGuestAccount() ); + rememberAccountCheckBox_->setDisabled( ! account->isGuestAccount() ); + + // Make sure the drop down list matches the user's initial status + int index; + switch( account->getInitialStatus() ) + { + case STATUS_AWAY: index = 1; break; + case STATUS_BE_RIGHT_BACK: index = 2; break; + case STATUS_BUSY: index = 3; break; + case STATUS_INVISIBLE: index = 6; break; + case STATUS_ON_THE_PHONE: index = 5; break; + case STATUS_OUT_TO_LUNCH: index = 4; break; + case STATUS_ONLINE: + default: index = 0; break; + } + initialStatus_->setCurrentIndex( index ); + } + else + { + // User typed a new account name + + // Set the default picture + KStandardDirs *dirs = KGlobal::dirs(); + QPixmap picture( dirs->findResource( "data", "kmess/pics/kmesspic.png" ) ); + if( ! picture.isNull() ) + { + pictureLabel_->setPixmap( picture ); + } + + // Set the default options + rememberAccountCheckBox_ ->setDisabled( false ); + rememberPasswordCheckBox_->setDisabled( false ); + rememberAccountCheckBox_ ->setChecked ( true ); + rememberPasswordCheckBox_->setChecked ( false ); + + // Clear password again + passwordEdit_->setText( QString::null ); + initialStatus_->setCurrentIndex( 0 ); + } + + // Put the attention back to the email field + handleCombobox_->setFocus(); +} + + + +// Called when "remember account" change its state +void InitialView::rememberAccountStateChanged( int state ) +{ + if( state == Qt::Unchecked ) + { + rememberPasswordCheckBox_->setCheckState( Qt::Unchecked ); + rememberPasswordCheckBox_->setEnabled( false ); + } + else + { + rememberPasswordCheckBox_->setEnabled( true ); + } +} + + + +// 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 ) +{ + 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( i18nc( "Button label", "&Connect" ) ); + connectButton_->setIcon( loader_->loadIcon( "network-connect", KIconLoader::Small, KIconLoader::SizeMedium ) ); + } + else + { + connectButton_->setText( i18nc( "Button label", "&Cancel" ) ); + connectButton_->setIcon( loader_->loadIcon( "network-disconnect", KIconLoader::Small, KIconLoader::SizeMedium ) ); + } +} + + + +// The connect/disconnect button has been clicked +void InitialView::slotConnectClicked() +{ +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Connect button clicked," << ( isConnectingUI_ ? "disconnecting" : "connecting" ); +#endif + + // The button was acting as Disconnect button when it was clicked + if( isConnectingUI_ ) + { + emit disconnectClicked(); + + // Enable back the widgets to allow connecting again + reset(); + + return; + } + + // The button was acting as Connect button when it was clicked + + 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 ) +{ + const QString password( passwordEdit_->text() ); + + // If the reconnection timer is active, stop it. + if( reconnectionTimer_.isActive() ) + { + reconnectionTimer_.stop(); + } + + // 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() || password.isEmpty() ) + { + statusMessage( i18nc( "Status message on login screen", + "Please enter both your email address 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 false; + } + +#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 + lastUsedHandle_ = handle; + config_.writeEntry( "defaultHandle", handle ); + + // Find out what status has been chosen + Status initialStatus; + switch( initialStatus_->currentIndex() ) + { + case 1: initialStatus = STATUS_AWAY; break; + case 2: initialStatus = STATUS_BE_RIGHT_BACK; break; + case 3: initialStatus = STATUS_BUSY; break; + case 4: initialStatus = STATUS_OUT_TO_LUNCH; break; + case 5: initialStatus = STATUS_ON_THE_PHONE; break; + case 6: initialStatus = STATUS_INVISIBLE; break; + case 0: + 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, + password, + rememberAccountCheckBox_ ->isChecked(), + rememberPasswordCheckBox_->isChecked(), + initialStatus ); + + return true; +} + + + +// Change the connection status text +void InitialView::statusMessage( const QString text, int timeout ) +{ + statusLabel_->setText( text ); + + if( timeout > 0 ) + { + statusMessageTimer_.start( timeout ); + } + else + { + statusMessageTimer_.stop(); + } +} + + + +// Execute the browser for a clicked UI link +void InitialView::slotClickedUrl( const QString &url ) +{ + // Handle special links + if( url.startsWith( "kmess://" ) ) + { + if( url == "kmess://reconnect/" ) + { + startConnecting( reconnectionHandle_ ); + } + + return; + } + + KMessShared::openBrowser( KUrl( url ) ); +} + + + +bool InitialView::eventFilter(QObject *obj, QEvent *event) +{ + // Handle keyboard events for all widgets + const QEvent::Type& eventType( event->type() ); + + if( eventType == QEvent::KeyPress ) + { + const 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() ]; + + if( eventType == QEvent::Enter ) // Glow effect when mouse enters display picture + { + QImage glowingImage; + + if( account != 0 && account->getShowPicture() ) + { + glowingImage = QImage( account->getPicturePath() ); + } + else + { + glowingImage = QImage( KGlobal::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 && account->getShowPicture() ) + { + picture = QPixmap( account->getPicturePath() ); + } + else + { + picture = QPixmap( KGlobal::dirs()->findResource( "data", "kmess/pics/kmesspic.png" ) ); + } + + pictureLabel_->setPixmap( picture ); + } + else if( eventType == QEvent::Wheel && handleCombobox_->isEnabled() == true ) // Switch accounts using mousewheel + { + const 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. +} + + + +#include "initialview.moc" diff --git a/src/initialview.h b/src/initialview.h new file mode 100644 index 0000000..b56cf24 --- /dev/null +++ b/src/initialview.h @@ -0,0 +1,127 @@ +/*************************************************************************** + initialview.h - description + ------------------- + begin : Sun Jan 12 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 INITIALVIEW_H +#define INITIALVIEW_H + +#include "ui_initialview.h" +#include "contact/msnstatus.h" + +#include +#include +#include + +#include + + +// Forward declarations +class Account; + + + +/** + * @brief The login widget. + * + * Users can login by selecting an existing account, or entering their username/password directly. + * When the login starts, the AutoLoginView widget is displayed in the main window. + * This class implements the events defined in the inherited user interface class. + * + * @author Mike K. Bennett + * @ingroup Root + */ +class InitialView : public QWidget, private Ui::InitialView +{ + Q_OBJECT + + public: + // The constructor + InitialView( QWidget *parent ); + // The destructor + virtual ~InitialView(); + // Add an account to the list of displayed accounts from which the user can choose + void addAccount( Account *account ); + // Modify an account in the list of displayed accounts from which the user can choose + 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 + 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( 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 ); + // 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_; + // Whether the UI is set up for connection or waiting for the login data + 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 new file mode 100644 index 0000000..afa8c46 --- /dev/null +++ b/src/initialview.ui @@ -0,0 +1,603 @@ + + InitialView + + + + 0 + 0 + 293 + 509 + + + + + 0 + + + 8 + + + 0 + + + 8 + + + 0 + + + + + Qt::Horizontal + + + + 12 + 20 + + + + + + + + + 400 + 16777215 + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + Qt::Horizontal + + + + 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 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 13 + 13 + + + + + + + + + + + + 0 + 0 + + + + Email address: + + + false + + + handleCombobox_ + + + + + + + + 0 + 0 + + + + Enter here the email address of your registered Passport or Live account + + + true + + + + + + + + 0 + 0 + + + + Password: + + + false + + + passwordEdit_ + + + + + + + Enter 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 + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 13 + 13 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 60 + 16 + + + + + + + + Qt::TabFocus + + + Click this button to start using KMess, or to cancel a connection attempt + + + &Connect + + + true + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 60 + 16 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 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 + + + + 12 + 20 + + + + + + + + qPixmapFromMimeSource + + + KComboBox + QComboBox +
    kcombobox.h
    +
    + + KUrlLabel + QLabel +
    kurllabel.h
    +
    +
    + + connectButton_ + + + +
    diff --git a/src/kmess.cpp b/src/kmess.cpp new file mode 100644 index 0000000..8a437ab --- /dev/null +++ b/src/kmess.cpp @@ -0,0 +1,2036 @@ +/*************************************************************************** + kmess.cpp - description + ------------------- + begin : Sun Jan 5 15:18:36 CST 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 "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/group.h" +#include "contact/msnstatus.h" +#include "dialogs/addcontactdialog.h" +#include "dialogs/awaymessagedialog.h" +#include "dialogs/chathistorydialog.h" +#include "dialogs/contactaddeduserdialog.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/systemtraywidget.h" +#include "settings/accountsettingsdialog.h" +#include "utils/idletimer.h" +#include "utils/kmessconfig.h" +#include "utils/kmessdbus.h" +#include "utils/kmessshared.h" +#include "utils/nowlisteningclient.h" +#include "utils/richtextparser.h" +#include "account.h" +#include "accountsmanager.h" +#include "accountaction.h" +#include "currentaccount.h" +#include "emoticonmanager.h" +#include "initialview.h" +#include "kmessdebug.h" +#include "kmessinterface.h" +#include "kmessview.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef KMESSTEST + #include "dialogs/networkwindow.h" +#endif + +// The constructor +KMess::KMess( QWidget *parent ) + : KMessInterface( parent ), + chatMaster_(0), + chatNotification_(0), + contactStatusNotification_(0), + newEmailNotification_(0), + currentStatus_(STATUS_OFFLINE), + idleTimer_(0), + initialized_(false), + initialView_(0), + nowListeningClient_(0), + msnNotificationConnection_(0), + view_(0) +{ +} + + + +// The destructor +KMess::~KMess() +{ +#ifdef KMESSDEBUG_KMESS + kDebug() << "shutting down KMess..."; +#endif + + /* + * The destructor is called after closeEvent(), + * when KMess is quit by the user. + * + * If the KDE session ends, the destructor won't be called. + * only saveProperties() will be called, and the execution ends. + */ + + + // Saving properties manually. + saveProperties(); + + // Delete all chat windows + if(chatMaster_ != 0) + { + chatMaster_->disconnected(); + chatMaster_->deleteLater(); + chatMaster_ = 0; + } + + // Disconnect main connection so views can clean up/save properties. + if(msnNotificationConnection_->isConnected()) + { + // Make sure KMess::disconnected() does attempt to update + // the user interface when we're trying to kill it + disconnect(msnNotificationConnection_, SIGNAL(disconnected()), this, SLOT(disconnected()) ); + + // This also destroys all contacts + msnNotificationConnection_->closeConnection(); + } + + // Delete other created objects + delete idleTimer_; + delete chatNotification_; + delete contactStatusNotification_; + delete notificationManager_; + delete newEmailNotification_; + delete nowListeningClient_; + delete msnNotificationConnection_; + + AccountsManager::destroy(); + CurrentAccount::destroy(); + TransferWindow::destroy(); + KMessConfig::destroy(); +#ifdef KMESS_NETWORK_WINDOW + NetworkWindow::destroy(); +#endif + +#ifdef KMESSDEBUG_KMESS + kDebug() << "DESTROYED."; +#endif +} + + + +// 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 + accountAction = new AccountAction( account, this ); + connectActionMenu_->addAction( accountAction ); + connectMenuItems_[ account ] = accountAction; + + connect( accountAction, SIGNAL( activated(Account*) ), + this, SLOT ( connectWithAccount(Account*) ) ); + + // 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 ); + } +} + + + +// "Add a new contact" was selected from the menu. +void KMess::addNewContact() +{ +#ifdef KMESSTEST + KMESS_ASSERT( msnNotificationConnection_ != 0 ); +#endif + + QStringList groupsId; + QString newHandle; + + // Launch a modal dialog to get the new contact handle and, optionally, group + 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( "The 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, groupsId ); +} + + + +// "Add a new group" was selected from the menu. +void KMess::addNewGroup() +{ +#ifdef KMESSTEST + KMESS_ASSERT( msnNotificationConnection_ != 0 ); +#endif +#ifdef KMESSDEBUG_KMESS + kDebug(); +#endif + QString newGroupName; + bool okPressed = false; + + // Set a default group name + newGroupName = i18n( "New Group" ); + + // Launch a dialog to get a new group name + 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 ); + } +} + + + +// The application is closing, after queryClose() was approved +void KMess::applicationClosing() +{ + // Prepare closing, KMessInterface::queryClose() accepted the close request. + // After this method returns, KApplication::aboutToQuit() also kicks in, handled by KMessApplication. + + if( chatMaster_ != 0 ) + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "destroying chat master"; +#endif + + // Close the chat windows earlier, so logs are saved. + chatMaster_->deleteLater(); + chatMaster_ = 0; + } +} + + + +// An account's settings have been changed +void KMess::slotAccountChanged( Account *account, QString oldHandle, QString oldFriendlyName ) +{ + QString newHandle( account->getHandle() ); + +#ifdef KMESSDEBUG_KMESS + kDebug() << "Saving UI settings for" << newHandle; +#endif + + if ( msnNotificationConnection_ != 0 ) + { + // While we're saving stuff, also save the contact list settings + msnNotificationConnection_->saveProperties(); + + bool isCurrentAccount = ( oldHandle == currentAccount_->getHandle() ); + bool isConnectedCurrentAccount = ( isCurrentAccount && msnNotificationConnection_->isConnected() ); + + // If the account matches the current account and the friendly name was changed, ask the server to change it + if( isConnectedCurrentAccount && account->isVerified() && account->getFriendlyName( STRING_ORIGINAL ) != oldFriendlyName ) + { + msnNotificationConnection_->changeFriendlyName( account->getFriendlyName( STRING_ORIGINAL ) ); + } + } + + // Change the account name in the UI when it's been changed + if( oldHandle == newHandle ) + { + return; + } + + // Update it in the initial view's list of accounts + if( initialView_ ) + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "Updating initial view"; +#endif + // Notify the initial view when the account handle has changed. + initialView_->changedAccount( oldHandle, newHandle ); + } + + // Update the menu items + connectMenuItems_ [ account ]->updateText(); +} + + + +// A view pictures mode has been selected from the menu. +void KMess::changedListPictureSize( int mode ) +{ + + int newMode = 0; + switch( mode ) + { + case 0: + break; + case 1: + newMode = 32; + break; + case 2: + newMode = 40; + break; + case 3: + newMode = 48; + break; + + default: + break; + } + + currentAccount_->setListPictureSize( newMode ); +} + + + +// A status was selected from the menu. +void KMess::changeStatus( QAction *action ) +{ + QString awayMessage; + Status newStatus = (Status) action->data().toInt(); + + // The user has set Away with Auto Reply, let it choose the message + if( newStatus == STATUS_AWAY_AUTOREPLY ) + { + awayMessage = currentAccount_->getAutoreplyMessage(); + + // Create and show the away message dialog + AwayMessageDialog *awayMessageDialog = new AwayMessageDialog( this ); + bool useAutoreply = awayMessageDialog->useMessage( awayMessage ); + if( ! useAutoreply ) + { + awayMessage.clear(); + } + + delete awayMessageDialog; + } + + // The user wants to disconnect + if( newStatus == STATUS_OFFLINE ) + { + disconnectClicked(); + return; + } + + changeStatus( newStatus, awayMessage ); +} + + + +// We should change status to this right away (can be called by changeStatus() or by other code) +void KMess::changeStatus( Status newStatus, QString autoReplyMessage ) +{ +#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 ); +} + + + +// The current now listening settings have changed. +void KMess::changedNowListeningSettings() +{ + // Enable now listening if current account is online and likes to enable now listening. + Status status = currentAccount_->getStatus(); + + // Enable only if not offline or invisible + bool isOnline = ( status != STATUS_OFFLINE && status != STATUS_INVISIBLE ); + nowListeningClient_->setEnabled( currentAccount_->getShowNowListening() && isOnline ); + +#ifdef KMESSDEBUG_KMESS + kDebug() << "Now listening setting is now" + << ( currentAccount_->getShowNowListening() ? "enabled" : "disabled") << endl; +#endif +} + + + +// The currently playing song was changed. +void KMess::changedSong( const QString &artist, const QString &album, const QString &track, bool playing ) +{ + if( msnNotificationConnection_->isConnected() ) + { + if( ! playing ) + { + // Update notification connection and KMessView. + msnNotificationConnection_->removeCurrentMedia(); + } + else + { + // Update notification connection. + QStringList arguments; + arguments << track << artist << album << "" << ""; + msnNotificationConnection_->changeCurrentMedia( "", "Music", true, "{0} - {1}", arguments ); + } + + // Update KMessView + view_->changedSong( artist, album, track, playing ); + } +} + + + +// The status was changed +void KMess::changedStatus( Account *account ) +{ + Status newStatus; + + if( account != 0 ) + { + newStatus = account->getInitialStatus(); + } + else if ( currentAccount_ != 0 ) + { + newStatus = currentAccount_->getStatus(); + } + else + { + kWarning() << "Changed status dropdown without an account set!"; + return; + } + +#ifdef KMESSDEBUG_KMESS + kDebug() << "Changed status to" << MsnStatus::getCode( newStatus ) + << "from" << MsnStatus::getCode( currentStatus_ ) << ". " + << "Autoreply is" << currentAccount_->getAutoreply() << endl; +#endif + + // Make sure the drop down list matches the user's status + QList menuActions( status_->findChildren() ); + foreach( KAction *action, menuActions ) + { + if( (Status) action->data().toInt() == newStatus ) + { + action->setEnabled( false ); + } + else + { + action->setEnabled( true ); + } + } +} + + + +// A view mode has been selected from the menu. +void KMess::changeViewMode(int mode) +{ +#ifdef KMESSTEST + KMESS_ASSERT( ( mode >= 0 ) || ( mode <= 2 ) ); +#endif + + CurrentAccount::instance()->setContactListDisplayMode( (Account::ContactListDisplayMode) mode ); +} + + + +// Show a "Contact added you" dialog +void KMess::showContactAddedUserDialog( const QString handle ) +{ +#ifdef KMESSDEBUG_KMESS + 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 = new ContactAddedUserDialog( handle , handle ); + + connect( dialog, SIGNAL( userChoice(const QString&,const QStringList&,const int) ), + this, SLOT ( slotContactAddedUserDialogChoice(const QString&,const QStringList&,const int) ) ); + + dialog->show(); +} + + + +// 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(); +} + + + +#ifdef KMESS_NETWORK_WINDOW +// Opens the network window +void KMess::showNetworkWindow() +{ + NetworkWindow::instance()->show(); +} +#endif + + +// 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 ) ); + + int result = KMessageBox::warningYesNoCancel( this, message, i18n( "Remove Contact" ) + , KGuiItem(i18n("Remove"), "edit-delete") // Yes + , KGuiItem(i18n("Remove and Block"), "list-remove") // No + , KStandardGuiItem::cancel() + , QString() + , KMessageBox::Dangerous + ); + + switch( result ) + { + // User has pressed "Remove and block" + case KMessageBox::No : + msnNotificationConnection_->removeContact( handle, true ); + break; + + // User has pressed "Remove only" + case KMessageBox::Yes : + msnNotificationConnection_->removeContact( handle, false ); + break; + + // User has canceled the action, no nothing + case KMessageBox::Cancel : + default: + break; + } + +} + + +// Show a dialog before removing the group +void KMess::showRemoveGroupDialog(QString groupId) +{ + const ContactList *list = currentAccount_->getContactList(); + Group *group = list->getGroupById( groupId ); + + // If the group was not found, bail out + if(group == 0) + { + kDebug() << "Couldn't find a matching group."; + return; + } + + // If the group was not empty, bail also out. We would receive an error from the server, otherwise + if( ! list->isGroupEmpty( groupId ) ) + { + // TODO Allow the user to choose between: 1) delete or delete+block all contacts in the group; + // 2) remove all contacts from the group; 3) cancel the operation. + KMessageBox::error( this, + i18nc( "dialog text", "The group %1 is not empty! First remove all contacts from it, then try again!", + group->getName() ), + i18nc( "dialog title", "Group Removal" ) ); + return; + } + + // 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(), + KMessageBox::Dangerous + ); + + if(result == KMessageBox::Continue) + { + msnNotificationConnection_->removeGroup(groupId); + } +} + + +// Show a "Rename group" dialog +void KMess::showRenameGroupDialog( QString groupId ) +{ + Group *group = currentAccount_->getContactList()->getGroupById(groupId); + + // If the group was found + if ( group == 0 ) + { + kDebug() << "Couldn't find a matching group."; + return; + } + + // If the group is not a special group... + if( group->isSpecialGroup() ) + { + // Show a message that it can't be deleted + KMessageBox::error( 0, i18n("This is a special group, which cannot be changed.") ); + return; + } + else + { + bool okPressed = false; + + // Otherwise, get the new group name.. + const QString& currentName( group->getName() ); + + // Launch a dialog to get a new group name + const QString& newGroupName( KInputDialog::getText(i18n( "Rename Group" ), + i18n( "Enter a new name for this group:" ), + currentName, &okPressed, this ) ); + + if( okPressed && currentName != newGroupName ) + { + // Request that the group be renamed + msnNotificationConnection_->renameGroup(groupId, newGroupName); + } + } +} + + + +// 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() +{ + TransferWindow *transferWindow = TransferWindow::getInstance(); + transferWindow->show(); +} + + +// Autologin with the first account that has autologin enabled +// This method is also called when restoring the session +void KMess::checkAutologin(QString handle) +{ + Account *loginAccount = 0; + + // If no handle was given, find the default account to connect with. + if ( handle.isEmpty() ) + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "No handle was given, find an account that uses autologin."; +#endif + + const QList accountsList = AccountsManager::instance()->getAccounts(); + foreach( Account *account, accountsList ) + { + // We are searching for a saved account with the autologin flag on + if( account->isGuestAccount() || ! account->getUseAutologin() ) + { + continue; + } + + loginAccount = account; + break; + } + } + else + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "finding account: " << handle << "."; +#endif + loginAccount = AccountsManager::instance()->getAccountByHandle(handle); + } + + bool doAutoLogin = ( loginAccount != 0 ); + + // Wait for the user password if needed + AccountsManager::instance()->readPasswords( doAutoLogin ); + + if( doAutoLogin ) + { + if( loginAccount->getPassword().isEmpty() ) + { + KMessageBox::error( this, + i18nc( "dialog text", + "

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

    ", + loginAccount->getHandle() ), + i18nc( "dialog title", "Autologin Failed" ) ); + return; + } + + // Set the login info in the initial view and connect + // Using the reconnect() method here instead of startConnecting() + // so KMess waits until the network is back up. + initialView_->reconnect( loginAccount->getHandle() ); + + // FIXME for 2.1: when using --autologin, don't display ".. to reconnect" but "to connect". + } +} + + + +// A connection has been made with the notification server. +void KMess::connected() +{ + // Enable/disable the menus + enableMenus( true ); + + // Set up the toggle and view mode tools to match the account settings + showAllowedAction_ ->setChecked( currentAccount_->getShowAllowedContacts() ); + showOfflineAction_ ->setChecked( currentAccount_->getShowOfflineContacts() ); + showRemovedAction_ ->setChecked( currentAccount_->getShowRemovedContacts() ); + showEmptyAction_ ->setChecked( currentAccount_->getShowEmptyGroups () ); + showHistoryBoxAction_->setChecked( currentAccount_->getShowHistoryBox () ); + + // Set the pictures mode + int newMode = 0; + switch( currentAccount_->getListPictureSize() ) + { + case 0: + break; + case 32: + newMode = 1; + break; + case 40: + newMode = 2; + break; + case 48: + newMode = 3; + break; + + default: + break; + } + + listPictureSize_->setCurrentItem( newMode ); + + // 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 ); + + // The connection was successful, this means the supplied + // email and password were correct: save the settings now + if( ! currentAccount_->getSavePassword() ) + { + // we reset the password here if it shouldn't be saved (so accountsmanager removes it) +#ifdef KMESSDEBUG_KMESS + kDebug() << "Resetting password in currentAccount because it shouldn't be saved."; +#endif + currentAccount_->setPassword( "" ); + } + saveProperties(); + + // Notify ChatMaster we're connected + chatMaster_->connected(); + + // 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(); +} + + + +// Connect to the server with the given account +void KMess::connectWithAccount(Account *account) +{ + if(KMESS_NULL(account)) return; + +#ifdef KMESSDEBUG_KMESS + kDebug() << "Connecting account:" << account->getHandle(); +#endif + + // Update the initial view with account details and start the connection if everything is ok + if( ! initialView_->startConnecting( account->getHandle(), false /* emitConnectionSignal */ ) ) + { + show(); + return; + } + + startConnection( account ); +} + + + +// Connect to the server with the given account, possibly temporary or new. +void KMess::connectWithAccount(QString handle, QString password, bool rememberAccount, bool rememberPassword, Status initialStatus ) +{ +#ifdef KMESSDEBUG_KMESS + kDebug() << "Connecting with handle " << handle; +#endif + + // Try to find an existing account + Account *account = AccountsManager::instance()->getAccountByHandle(handle); + if( account != 0 ) + { + // Found an existing account. + // The user may enter a new password at the login dialog. + // When the login succeeds, save the new temporary password as new account password. + account->setTemporaryPassword( password ); + account->setSavePassword( rememberPassword ); + account->setInitialStatus( initialStatus ); + startConnection( account ); + return; + } + + // No account found, create a new account. + account = new Account(); + account->setLoginInformation( handle, handle, QString() ); + account->setTemporaryPassword( password ); + account->setGuestAccount( ! rememberAccount ); + account->setSavePassword( rememberPassword ); + account->setInitialStatus( initialStatus ); + AccountsManager::instance()->addAccount( account ); + + // Connect it + startConnection( account ); +} + + + +// 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() +{ +#ifdef KMESSDEBUG_KMESS + kDebug() << "Creating default directories."; +#endif + KStandardDirs *dirs = KGlobal::dirs(); + QString localKdeDir; + QDir appsDir, kmessDir; + + localKdeDir = dirs->localkdedir(); +#ifdef KMESSDEBUG_KMESS + kDebug() << "Local KDE dir is " << localKdeDir << "."; +#endif + appsDir.setPath( localKdeDir + "/share/apps" ); + + if ( appsDir.exists() ) + { + kmessDir.setPath( appsDir.absolutePath() + "/kmess" ); +#ifdef KMESSDEBUG_KMESS + kDebug() << "kmess dir should be at " << kmessDir.absolutePath() << "."; +#endif + if ( !kmessDir.exists() ) + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "Creating kmess dir."; +#endif + appsDir.mkdir( kmessDir.absolutePath() ); + } + } +#ifdef KMESSDEBUG_KMESS + else + { + kDebug() << "" << appsDir.absolutePath() << " doesn't exist!"; + } +#endif +#ifdef KMESSTEST + KMESS_ASSERT( kmessDir.exists() ); +#endif + + return true; +} + + + +// "Add new account" has been selected from the menu. +void KMess::createNewAccount() +{ + AccountsManager::instance()->showAccountSettings(); +} + + + +// Delete the given account from the UI +void KMess::slotAccountDeleted( Account *account ) +{ + AccountAction *accountAction; + if( KMESS_NULL(account) ) return; + + // Remove it from the initial screen's list + if( initialView_ ) + { + initialView_->deleteAccount( account ); + } + + // Remove from connect menu. + accountAction = connectMenuItems_[ account ]; + if( ! KMESS_NULL(accountAction) ) + { + connectActionMenu_->removeAction( accountAction ); + delete connectMenuItems_.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 + * + * This method receives KDE's Solid network connection status changes, and updates the view's widgets + * to reflect it. + * + * @param newStatus The new status of the network connection + */ +void KMess::slotConnectionStatusChanged( Solid::Networking::Status newStatus ) +{ +#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 ); +} + + + +// Disconnect was selected from the menu. +void KMess::disconnectClicked() +{ +#ifdef KMESSTEST + KMESS_ASSERT( msnNotificationConnection_ != 0 ); +#endif +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Disconnecting."; +#endif + msnNotificationConnection_->closeConnection(); +} + + + +// The program is not connected (initially) or no longer connected (after a disconnect) to the notification server. +void KMess::disconnected() +{ +#ifdef KMESSTEST + KMESS_ASSERT( chatMaster_ != 0 ); +#endif +#ifdef KMESSDEBUG_KMESS + kDebug() << "Disconnected."; +#endif + + // this method is also called when initializing the GUI, avoid mangling the settings at that point. + if( initialized_ ) + { + // ContactList is saved by the MsnNotificationConnection already. + // A nice alternative would be currentAccount_->disconnected() saving the list, + // however CurrentAccount has a const reference to the list + // because MsnNotificationConnection maintains the list instead. + + // Save the account. If it is not found, it's the initial disconnect call. + Account *account = AccountsManager::instance()->getAccountByHandle( currentAccount_->getHandle() ); + if( account ) + { + if( account->isDeleted() ) + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "Account" << account->getHandle() << "was deleted, removing menu items."; +#endif + slotAccountDeleted( account ); + } + else + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "Saving the CurrentAccount."; +#endif + + // Transfer account settings + account->copyAccount( currentAccount_ ); + } + } + } + + // Update the GUI + disconnect_->setEnabled( false ); + enableMenus(false); + 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() ) + { + statusBar()->hide(); + } + + // Inform the chat master that we're disconnected + chatMaster_->disconnected(); + + // Update the current account + currentAccount_->setStatus( STATUS_OFFLINE ); + currentAccount_->setAutoreply( false ); +#ifdef KMESSDEBUG_KMESS + kDebug() << "Swap views."; +#endif + + // Show the screen where to insert login details to log back in + switchViewToInitialScreen(); + +#ifdef KMESSDEBUG_KMESS + kDebug() << "Blank the caption."; +#endif + + // Set the caption + setCaption( QString::null ); +} + + + +// Initialize the class +bool KMess::initialize() +{ + if ( initialized_ ) + { + kDebug() << "Already initialized."; + return false; + } + +#ifdef KMESSDEBUG_KMESS + kDebug() << "initializing main class."; +#endif + + // Initialize the Rich Text parser engine + RichTextParser::initialize(); + + // Create current account instance + currentAccount_ = CurrentAccount::instance(); + if ( currentAccount_ == 0 ) + { + kDebug() << "Couldn't get a pointer to the instance of the current account."; + return false; + } + if ( !KMessInterface::initialize() ) + { + kDebug() << "Couldn't initialize ancestor."; + return false; + } + if ( !initMsnNotificationConnection() ) + { + kDebug() << "Couldn't initialize the MsnNotificationConnection class."; + return false; + } + if ( !initIdleTimer() ) + { + kDebug() << "Couldn't initialize the IdleTimer class."; + return false; + } + if ( !initChatMaster() ) + { + kDebug() << "Couldn't initialize the Chat master."; + return false; + } + if ( !initNotifications() ) + { + kDebug() << "Couldn't initialize the notifications."; + return false; + } + if ( !initNowListening() ) + { + kDebug() << "Couldn't initialize the now listening support."; + return false; + } + if ( !initEmoticonManager() ) + { + 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."; + return false; + } + + // Use Solid to find out whether we're connected or not, and disable the Connect menu if we are not + connect( Solid::Networking::notifier(), SIGNAL( statusChanged(Solid::Networking::Status) ), + this, SLOT ( slotConnectionStatusChanged(Solid::Networking::Status) ) ); + slotConnectionStatusChanged( Solid::Networking::status() ); + + // Connect current account signals for Now Listening + connect( currentAccount_, SIGNAL( accountInvisible() ), + this, SLOT ( changedNowListeningSettings() )); + connect( currentAccount_, SIGNAL( accountOffline() ), + this, SLOT ( changedNowListeningSettings() )); + connect( currentAccount_, SIGNAL( accountOnline() ), + this, SLOT ( changedNowListeningSettings() )); + + // Connect current account + connect( currentAccount_, SIGNAL( changedFriendlyName() ), + this, SLOT ( setCaptionToUser() )); + connect( currentAccount_, SIGNAL( changedNowListeningSettings() ), + this, SLOT ( changedNowListeningSettings() )); + connect( currentAccount_, SIGNAL( changedStatus() ), + this, SLOT ( changedStatus() )); + connect( currentAccount_, SIGNAL( changedMsnObject() ), + msnNotificationConnection_, SLOT( changedMsnObject() )); + connect( currentAccount_, SIGNAL( changedEmoticonSettings() ), + EmoticonManager::instance(),SLOT(slotChangedEmoticonSettings() ) ); + + // Connect the account management signals + AccountsManager *accountsManager = AccountsManager::instance(); + connect( accountsManager, SIGNAL( accountAdded(Account*) ), + this, SLOT ( slotAccountAdded(Account*) ) ); + connect( accountsManager, SIGNAL( accountChanged(Account*,QString,QString) ), + 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(); + + // Start disconnected. + // Added debug here because this has a potential to cause problems.. + // It would be better if each class got things right from it's construtor or initialize method. +#ifdef KMESSDEBUG_KMESS + kDebug() << "faking disconnect signal."; +#endif + disconnected(); + + // Setting up DBus + dbus_ = new KMessDBus( this ); + + // All done, mark as initialized +#ifdef KMESSDEBUG_KMESS + kDebug() << "main class is initialized."; +#endif + + initialized_ = true; + return true; +} + + + +// Initialize the chat master +bool KMess::initChatMaster() +{ +#ifdef KMESSTEST + KMESS_ASSERT( chatMaster_ == 0 ); +#endif + if ( msnNotificationConnection_ == 0 ) + { + kDebug() << "The notification connection must be initialized before the chat master."; + return false; + } + chatMaster_ = new ChatMaster( this ); + if ( chatMaster_ == 0 ) + { + kDebug() << "Couldn't create the chat master."; + return false; + } + if ( !chatMaster_->initialize() ) + { + kDebug() << "Couldn't initialize the chat master."; + return false; + } + + // Make the chat master's connections + connect( chatMaster_, SIGNAL( requestSwitchboard(QString,ChatInformation::ConnectionType) ), + msnNotificationConnection_, SLOT ( requestSwitchboard(QString,ChatInformation::ConnectionType) )); + connect( chatMaster_, SIGNAL( blockContact(QString) ), + msnNotificationConnection_, SLOT ( blockContact(QString) ) ); + connect( chatMaster_, SIGNAL( unblockContact(QString) ), + msnNotificationConnection_, SLOT ( unblockContact(QString) ) ); + connect( chatMaster_, SIGNAL( addContact(QString) ), + msnNotificationConnection_, SLOT ( addNewContact(QString) ) ); + connect( chatMaster_, SIGNAL( removeContact(QString,bool) ), + msnNotificationConnection_, SLOT ( removeContact(QString,bool) ) ); + connect( chatMaster_, SIGNAL( allowContact(QString) ), + msnNotificationConnection_, SLOT ( allowContact(QString) ) ); + + connect( msnNotificationConnection_, SIGNAL( startSwitchboard(const ChatInformation&) ), + chatMaster_, SLOT ( startSwitchboard(const ChatInformation&) ) ); + connect( msnNotificationConnection_, SIGNAL( offlineMessage(const ChatMessage&) ), + chatMaster_, SLOT ( showSpecialMessage(const ChatMessage&) )); + connect( msnNotificationConnection_, SIGNAL( pingSent() ), + chatMaster_, SLOT ( timedUpdate() )); + + connect( chatMaster_, SIGNAL( reconnect() ), + this, SLOT ( reconnect() )); + +#ifdef KMESSTEST + KMESS_ASSERT( chatMaster_ != 0 ); +#endif + return true; +} + + + +// Initialize the emoticon manager +bool KMess::initEmoticonManager() +{ + if ( msnNotificationConnection_ == 0 ) + { + kDebug() << "MsnNotificationConnection must be initialized before EmoticonManager"; + return false; + } + + EmoticonManager *manager = EmoticonManager::instance(); + + connect( msnNotificationConnection_, SIGNAL( connected() ), + manager, SLOT ( connected() ) ); + connect( msnNotificationConnection_, SIGNAL( disconnected() ), + manager, SLOT ( disconnected() ) ); + + return true; +} + + + +// Initialize the idle timer +bool KMess::initIdleTimer() +{ +#ifdef KMESSTEST + KMESS_ASSERT( idleTimer_ == 0 ); +#endif + idleTimer_ = new IdleTimer(); + if ( idleTimer_ == 0 ) + { + kDebug() << "Couldn't create the idle timer."; + return false; + } + // Connect the timer to signal when the user is away. + connect( idleTimer_, SIGNAL( timeout() ), + this, SLOT ( userIsIdle() ) ); + connect( idleTimer_, SIGNAL( activity() ), + this, SLOT ( userIsNotIdle() ) ); +#ifdef KMESSTEST + KMESS_ASSERT( idleTimer_ != 0 ); +#endif + return true; +} + + + +// Initialize the MSN notification connection +bool KMess::initMsnNotificationConnection() +{ + bool initialized; + + msnNotificationConnection_ = new MsnNotificationConnection(); + + initialized = msnNotificationConnection_->initialize(); + if ( !initialized ) + { + kDebug() << "Couldn't initialize MsnNotificationConnection."; + return false; + } + + // Connect the signals + connect( msnNotificationConnection_, SIGNAL( connected() ), // Connected to msn + this, SLOT ( connected() ) ); + connect( msnNotificationConnection_, SIGNAL( disconnected() ), // Disconnected from msn + this, SLOT ( disconnected() ) ); + 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) ) ); + + return true; +} + + + +// Initialize notification objects +bool KMess::initNotifications() +{ +#ifdef KMESSTEST + KMESS_ASSERT( currentAccount_ != 0 ); + KMESS_ASSERT( systemTrayWidget_ != 0 ); + KMESS_ASSERT( msnNotificationConnection_ != 0 ); + + KMESS_ASSERT( chatNotification_ == 0 ); + KMESS_ASSERT( contactStatusNotification_ == 0 ); + KMESS_ASSERT( newEmailNotification_ == 0 ); +#endif + + const ContactList *contactList; + + if ( systemTrayWidget_ == 0 ) + { + kDebug() << "The system tray widget must be initialized before the notifications!"; + return false; + } + if ( msnNotificationConnection_ == 0 ) + { + kDebug() << "The notification connection must be initialized before the notifications!"; + return false; + } + + + // Add check whether the 'eventsrc' file can be found. + // 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() ).join("/kmess
    ") ); + if( ! dirs.isEmpty() ) + { + 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. + kWarning() << "Sounds and notifications will not be available, the file 'kmess/kmess.notifyrc' could not be found."; + + // 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, + 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" ); + } + + + contactList = currentAccount_->getContactList(); + notificationManager_ = NotificationManager::instance(); + notificationManager_->setTrayObject( systemTrayWidget_ ); + + // Create the notifiers + chatNotification_ = new ChatNotification ( notificationManager_ ); + contactStatusNotification_ = new ContactStatusNotification( notificationManager_ ); + newEmailNotification_ = new NewEmailNotification ( notificationManager_ ); + + // Connect the chat messages notification signals + connect( chatMaster_, SIGNAL( newChatMessage(const ChatMessage&, Chat*) ), + chatNotification_, SLOT ( notify(const ChatMessage&, Chat*) ) ); + connect( chatNotification_, SIGNAL( raiseChat(Chat*,bool) ), + chatMaster_, SLOT ( raiseChat(Chat*,bool) ) ); + + // Connect the status change notification signals + connect( contactList, SIGNAL( contactOnline(Contact*,bool) ), + contactStatusNotification_, SLOT ( notify(Contact*,bool) ) ); + connect( contactList, SIGNAL( contactOffline(Contact*,bool) ), + contactStatusNotification_, SLOT ( notify(Contact*,bool) ) ); + connect( contactList, SIGNAL( contactChangedStatus(Contact*,bool) ), + contactStatusNotification_, SLOT ( notify(Contact*,bool) ) ); + + // Connect the "Email notification" signals + connect( msnNotificationConnection_, SIGNAL( newEmail(QString, QString, bool, QString, QString, QString) ), + newEmailNotification_, SLOT ( notify(QString, QString, bool, QString, QString, QString) ) ); + + // Connect the "Chat request" signals + connect( contactStatusNotification_, SIGNAL( startChat(QString) ), + chatMaster_, SLOT ( requestChat(QString) ) ); + + +#ifdef KMESSTEST + KMESS_ASSERT( chatNotification_ != 0 ); + KMESS_ASSERT( contactStatusNotification_ != 0 ); + KMESS_ASSERT( newEmailNotification_ != 0 ); +#endif + + return true; +} + + + +// Initialize the now listening support. +bool KMess::initNowListening() +{ + if ( msnNotificationConnection_ == 0 ) + { + kDebug() << "The notification connection must be initialized before the now listening support!"; + return false; + } + + // Create and connect client. + 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; +} + + + +// Check if the connection to the server is active +bool KMess::isConnected() +{ + if( KMESS_NULL(msnNotificationConnection_) ) + { + return false; + } + + return msnNotificationConnection_->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 + if( &config == 0 ) + { + group = KMessConfig::instance()->getGlobalConfig( "General" ); + } + else + { + group = config; + } + + KMessInterface::readProperties( group ); +} + + + +// Save account and other properties +void KMess::saveProperties( KConfigGroup &config ) +{ + KConfigGroup group; + + // Choose the config group if it was not given + if( &config == 0 ) + { + group = KMessConfig::instance()->getGlobalConfig( "General" ); + } + else + { + group = config; + } + + // Save the UI configuration + KMessInterface::saveProperties( group ); + +#ifdef KMESSDEBUG_KMESS + kDebug() << "saving properties"; +#endif + + // Have all the accounts save their properties + const QList accountsList = AccountsManager::instance()->getAccounts(); + foreach( Account *account, accountsList ) + { + // Avoid saving guest accounts + if( account->isGuestAccount() || account->isDeleted() ) + { + continue; + } + + // If the account is the current account... + if ( account->getHandle() == currentAccount_->getHandle() ) + { + // Move the settings from the current account to the account +#ifdef KMESSDEBUG_KMESS + kDebug() << "copying settings from CurrentAccount to the Account object."; +#endif + account->copyAccount( currentAccount_ ); + } + + // Save properties of accounts + account->saveProperties(); + } + + // Save the accounts' passwords (blocking, or KMess may quit before it's done) + AccountsManager::instance()->savePasswords( true ); + + // Write data now! + group.sync(); +} + + + +// Set the caption +void KMess::setCaptionToUser() +{ + // On start, use the default caption + if( currentAccount_ == 0 ) + { + 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 ) ); +} + + + +// Show the settings dialog for a given account +void KMess::showSettingsForAccount( Account *account ) +{ + AccountsManager::instance()->showAccountSettings( account ); +} + + + +// Show the settings dialog for the current account. +void KMess::showSettingsForCurrentAccount() +{ + // Use the Account object so it's consistent with the other AccountAction events. + Account *accountData = AccountsManager::instance()->getAccountByHandle( CurrentAccount::instance()->getHandle() ); + if( KMESS_NULL(accountData) ) return; + showSettingsForAccount( accountData ); +} + + + +// Show the user's MSN profile. +void KMess::showUserProfile() +{ + if( currentAccount_ == 0 ) + { + return; + } + + const QString url( currentAccount_->getUrlInformation().value( "PROFILE" ) ); + KMessShared::openBrowser( KUrl( url ) ); +} + + + +// Initiate a connection to the server. Use connectWithAccount() to connect, not this method. +void KMess::startConnection( Account *account ) +{ + if( KMESS_NULL(account) ) return; + + // First disconnect, to unregister all contacts + if( msnNotificationConnection_->isConnected() ) + { + msnNotificationConnection_->closeConnection(); + } + + // Update the main view's controls to match this account's details. + changedStatus( account ); + + // Copy the account to the current account +#ifdef KMESSDEBUG_KMESS + kDebug() << "copying data of account" << account->getHandle() << "to the CurrentAccount object."; +#endif + currentAccount_->copyAccount( account ); + + // Allow users to cancel the login attempt + disconnect_->setEnabled( true ); + + // Set UI state of any open chat tabs to "Connecting" + chatMaster_->connecting(); + + // Connect to the server + msnNotificationConnection_->openConnection(); +} + + + +// Switch the view to the contact list +void KMess::switchViewToContactList() +{ + // If the view was already set, reload it + if( view_ ) + { + delete view_; + } + +#ifdef KMESSTEST + KMESS_ASSERT( msnNotificationConnection_ != 0 ); +#endif + + // Create and initialize the view's widgets + view_ = new KMessView( this ); + view_->initialize( msnNotificationConnection_->getContactListModel() ); + 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 + msnNotificationConnection_, SLOT ( allowContact(QString) ) ); + connect( view_, SIGNAL( blockContact(QString) ), // Block the contact + msnNotificationConnection_, SLOT ( blockContact(QString) ) ); + connect( view_, SIGNAL( changePersonalMessage(QString) ), // Change the personal message. + msnNotificationConnection_, SLOT ( changePersonalMessage(QString) ) ); + 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 + msnNotificationConnection_, SLOT ( moveContact(QString, QString, QString) ) ); + connect( view_, SIGNAL( showSettings() ), // Show settings + this, SLOT ( showSettingsForCurrentAccount() ) ); + connect( view_, SIGNAL(requestChat( QString ) ), // Start a chat + chatMaster_, SLOT (requestChat( QString ) ) ); + connect( view_, SIGNAL( removeContact(QString) ), // Remove the contact + this, SLOT ( showRemoveContactDialog(QString) ) ); + connect( view_, SIGNAL( removeContactFromGroup(QString, QString) ), + msnNotificationConnection_, SLOT ( removeContactFromGroup(QString, QString) ) ); + connect( view_, SIGNAL( removeGroup(QString) ), // Remove the group + 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_ ); + + // Make sure the other views' pointers are zero: setCentralWidget deletes the old central widget + initialView_ = 0; +} + + + +// Switch the view to the initial login screen +void KMess::switchViewToInitialScreen() +{ + // 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_->show(); + + // Connect it so it triggers the login process + connect( initialView_, SIGNAL( connectWithAccount(QString,QString,bool,bool,Status) ), + this, SLOT ( connectWithAccount(QString,QString,bool,bool,Status) ) ); + 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) ) ); + + + // Set it as the window's main widget + setCentralWidget( initialView_ ); + + // Make sure the other views' pointers are zero: setCentralWidget deletes the old central widget + view_ = 0; +} + + + +// The "show allowed contacts" menu item has been toggled. +void KMess::toggleShowAllowed(bool show) +{ + currentAccount_->setShowAllowedContacts( show ); +} + + + +// The "show empty groups" menu item has been toggled. +void KMess::toggleShowEmpty( bool show ) +{ + currentAccount_->setShowEmptyGroups( 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) +{ + if( view_ != 0 ) + { + view_->toggleShowSearchFrame( show ); + } +} + + +// The "show offline contacts" menu item has been toggled. +void KMess::toggleShowOffline(bool show) +{ + currentAccount_->setShowOfflineContacts( show ); +} + + + +// The "show removed contacts" menu item has been toggled. +void KMess::toggleShowRemoved(bool show) +{ + currentAccount_->setShowRemovedContacts( 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_IDLETIMER + kDebug(); +#endif + if ( ( currentAccount_ != 0 ) && ( msnNotificationConnection_ != 0 ) ) + { +#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_IDLETIMER + kDebug() << "Change status to Idle."; +#endif + // Request a status change to Idle + msnNotificationConnection_->changeStatus( STATUS_IDLE ); + isIdleForced_ = false; + } + } +} + + + +// The user is no longer idle +void KMess::userIsNotIdle() +{ +#ifdef KMESSDEBUG_IDLETIMER + kDebug(); +#endif + if ( ( currentAccount_ != 0 ) && ( msnNotificationConnection_ != 0 ) ) + { +#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_IDLETIMER + kDebug() << "Change status to Online"; +#endif + // Request a status change to Online + msnNotificationConnection_->changeStatus( STATUS_ONLINE ); + } + } +#ifdef KMESSDEBUG_IDLETIMER + kDebug() << "Done userIsNotIdle()."; +#endif +} + + +// return NS Connection +// HACK: Remove after 2.0-final. +MsnNotificationConnection *KMess::getNsConnection() +{ + return msnNotificationConnection_; +} +#include "kmess.moc" diff --git a/kmess/kmess.dox b/src/kmess.dox similarity index 93% rename from kmess/kmess.dox rename to src/kmess.dox index fa5640e..526ac90 100644 --- a/kmess/kmess.dox +++ b/src/kmess.dox @@ -18,7 +18,7 @@ * the class structure KMess uses. This API documentation was created to lower that bar, * so it becomes easier to contribute code back to KMess. * A global introduction to KMess development process can be found online at: - * - http://www.kmess.org/development/ + * - http://trac.kmess.org/ * * These pages document the classes and functions KMess is build from. * The documentation also provides insight in the relation and @@ -26,8 +26,8 @@ * and aids developers to determine how code can be written. * Because KMess is built on top of the KDE and Qt libraries, * it's important to have a general understanding of the KDE and Qt libraries too: - * - http://developer.kde.org/documentation/library/3.4-api/ - * - http://doc.trolltech.com/3.3/index.html + * - http://api.kde.org/ + * - http://doc.trolltech.com/4.3/index.html * * * @section protocol About the MSN protocol @@ -35,7 +35,8 @@ * There is no official documentation about how things are supposed to operate, * and how clients should respond in certain situations. * - * Parts of the protocol are being documentated in a wiki-style site at: http://msnpiki.msnfanatic.com/ + * Parts of the protocol are being documentated in a wiki-style site at: http://msnpiki.msnfanatic.com/. + * We also have a small introduction at http://trac.kmess.org/. * Other sites scattered arround the net also provide documentation about * specialized parts of the protocol. These sites are listed at our development page, * but hopefully this information will be merged with the msnpiki documentation soon. @@ -48,7 +49,7 @@ * Working with an undocumented protocol also means developers need to take care of * situations that can't be forseen. It's impossible to make guesses about error handling; * e.g. having a list of things which the server may send differently. - * Code needs to verify it's boundaries, and warn (e.g. with kdWarning()) + * Code needs to verify it's boundaries, and warn (e.g. with kWarning()) * when received data can't be processed correctly. * * The code is filled with assertion tests and strict validations of the data being parsed. @@ -59,8 +60,8 @@ * * To prevent crashes in unexpected situations, tests are added to detect null-pointers and warn appropriately. * As rule of thumb: - * - Normal debugging messages are displayed with kdDebug(). - * - Serious errors are displayed with kdWarning(). + * - Normal debugging messages are displayed with kDebug(). + * - Serious errors are displayed with kWarning(). * - Debugging messages should only be displayed when the program is compiled in debug mode. * - Warning messages may also be displayed by the final packaged executable. * - Null pointers are checked using: if(KMESS_NULL(..)) return;. @@ -69,7 +70,7 @@ * The macros for these statements are found in kmessdebug.h. * The debug mode can be enabled in two ways: * - in KDevelop, select the 'debug' build configuration. - * - for manual compiling, use CXXFLAGS="-g -ansi -pedantic -Wall" ./configure --enable-debug-output --enable-debug=full. + * - for manual compiling, use CXXFLAGS="-g -ansi -pedantic -Wall" ./configure --enable-debug-output --build-type=debugfull. * * The debug mode adds: * - filenames and line numbers to crash dumps. @@ -100,8 +101,8 @@ * When KMess is compiled in debug mode, the debug code between * the \#ifdef KMESSTEST and \#ifdef KMESSDEBUG_... statements will be compiled. * Most macro's are simple defines to enable debug output for certain classes. - * Debug messages are outputed with kdDebug(). For warnings visible to the end-user, - * the kdWarning() function is used instead. These warnings are not embedded in \#ifdef blocks. + * Debug messages are outputed with kDebug(). For warnings visible to the end-user, + * the kWarning() function is used instead. These warnings are not embedded in \#ifdef blocks. * * Macros are also use to optionally wrap function calls to handle debug output. * The KMESS_NULL macro is used to prevent crashes in unexpected situations. @@ -267,3 +268,12 @@ * @todo write detailed documentation */ +/** + * @defgroup Utils utils + * @brief Utility functions used by various classes. + * @todo write detailed documentation + * + * A package to store utility classes. + * By keeping the utilities here, these classes won't clutter up other modules. + */ + diff --git a/kmess/kmess.h b/src/kmess.h similarity index 66% rename from kmess/kmess.h rename to src/kmess.h index 48c506e..89f4bb1 100644 --- a/kmess/kmess.h +++ b/src/kmess.h @@ -18,35 +18,37 @@ #ifndef KMESS_H #define KMESS_H -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include -#include "kmessinterface.h" #include "kmessdebug.h" +#include "kmessinterface.h" + +#include +#include + +#include + // Forward declarations class Account; class AccountAction; -class AutologinView; class ChatMaster; class Contact; class ContactList; class NotificationManager; -class NotificationChat; -class NotificationContactStatus; -class NotificationNewEmail; +class ChatNotification; +class ContactStatusNotification; +class NewEmailNotification; class CurrentAccount; class IdleTimer; class InitialView; +class LoginView; +class KMessDBus; class KMessTest; class KMessView; class MsnNotificationConnection; class NowListeningClient; +class QItemSelection; + + /** * @brief The main window of the application. @@ -61,73 +63,79 @@ class KMess : public KMessInterface { Q_OBJECT + friend class KMessDBus; friend class KMessTest; public: // Public methods // The construtor - KMess(QWidget* parent=0, const char *name=0); + KMess( QWidget* parent=0 ); // The destructor - ~KMess(); + virtual ~KMess(); // Autologin with the first account that has autologin enabled void checkAutologin(QString handle); // Initialize the class 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() ); + + //HACK: Remove after 2.0-final + MsnNotificationConnection *getNsConnection(); protected: // Protected methods + // Load the application's global state + virtual void readGlobalProperties( KConfig *sessionConfig ); // Read in account and other properties - virtual void readProperties(KConfig *config); + 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(KConfig *config); + virtual void saveProperties( KConfigGroup &config = *((KConfigGroup *)0) ); private: // Private methods - // Add the account and create the GUI elements - void addAccount(Account *account); - // The application is closing, after queryExit() was approved + // The application is closing, after queryClose() was approved void applicationClosing(); // Create the program's default directories in .kde/share/apps/ bool createDirectories(); - // Return the account for a given handle - Account * getAccountByHandle( const QString &handle ); - // Initialize the autologin view - bool initAutologinView(); // Initialize the chat master bool initChatMaster(); // Initialize the emoticon manager bool initEmoticonManager(); // Initialize the idle timer bool initIdleTimer(); - // Initialize the initial view - bool initInitialView(); - // Initialize the main view - bool initKMessView(); // Initialize the MSN notification connection bool initMsnNotificationConnection(); // Initialize notification objects bool initNotifications(); // Initialize the now listening support. bool initNowListening(); - // Validate a contact email - bool isValidEmail( QString email ); - // Set the caption - void setCaptionToUser(); + // Initialize the proxy support. + bool initProxy(); + // Initiate a connection to the server. Use connectWithAccount() to connect, not this method. + void startConnection( Account *account ); + // Switch the view to the contact list + void switchViewToContactList(); + // Switch the view to the initial login screen + void switchViewToInitialScreen(); + + 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 - // The account changed it's status to invisible - void accountInvisible(); - // The account changed it's status to offline - void accountOffline(); - // The account changed it's status to online - void accountOnline(); // "Add a new contact" was selected from the menu. void addNewContact(); // "Add a new group" was selected from the menu. void addNewGroup(); - // An account's settings have been changed - void changedAccountSettings( Account *account, QString oldHandle, QString oldFriendlyName ); + // A view pictures mode has been selected from the menu. + void changedListPictureSize( int mode ); // A status was selected from the menu. - void changeStatus(const QString &statusName); - // 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. @@ -137,8 +145,14 @@ class KMess : public KMessInterface // 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 @@ -149,22 +163,22 @@ class KMess : public KMessInterface // 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 int code ); + 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 rememberMe, QString initialStatus ); - // The current account changed its name, so set the corresponding account's name - void currentAccountChangedName(); + void connectWithAccount(QString handle, QString password, bool rememberAccount, bool rememberPassword, Status initialStatus ); // "Add new account" has been selected from the menu. void createNewAccount(); - // Delete the given account - void deleteAccount(Account *account); // Disconnect was selected from the menu. void disconnectClicked(); // The program is not connected (initially) or no longer connected (after @@ -176,12 +190,14 @@ class KMess : public KMessInterface void showSettingsForCurrentAccount(); // Show the user's MSN profile. void showUserProfile(); - // We're about to shutdown, apparently - void shutDown(); - // The "show display pictures" menu item has been toggled. - void toggleDisplayPictures(bool show); // The "show allowed contacts" menu item has been toggled. 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. void toggleShowOffline(bool show); // The "Show removed contacts" menu item has been toggled. @@ -190,28 +206,28 @@ class KMess : public KMessInterface 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 - // A list of user accounts - QPtrList accounts_; - // The autologin view widget - AutologinView *autologinView_; // The chat master - the object that controls the chat window ChatMaster *chatMaster_; // The menu items of the connect menu - QDict connectMenuItems_; + QHash connectMenuItems_; // The notifications manager instance NotificationManager *notificationManager_; // The notification object for when a contact sends us a message - NotificationChat *notificationChat_; + ChatNotification *chatNotification_; // The notification object for when a contact changes its status - NotificationContactStatus *notificationContactStatus_; + ContactStatusNotification *contactStatusNotification_; // The notification object for when a new email is received - NotificationNewEmail *notificationNewEmail_; + NewEmailNotification *newEmailNotification_; // A pointer to the instance of the current account CurrentAccount *currentAccount_; // The current account status - QString currentStatus_; + Status currentStatus_; // The idle timer IdleTimer *idleTimer_; // Whether or not the object has been initialized @@ -224,10 +240,11 @@ class KMess : public KMessInterface NowListeningClient* nowListeningClient_; // The connection to the msn notification server MsnNotificationConnection *msnNotificationConnection_; - // The menu items of the settings menu - QDict settingsMenuItems_; // The main view widget KMessView *view_; + // The DBus class + KMessDBus *dbus_; + }; #endif diff --git a/src/kmessapplication.cpp b/src/kmessapplication.cpp new file mode 100644 index 0000000..6ab9fdd --- /dev/null +++ b/src/kmessapplication.cpp @@ -0,0 +1,282 @@ +/*************************************************************************** + kmessapplication.cpp - description + ------------------- + begin : Wed 7 13 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 "kmessapplication.h" + +#include "accountsmanager.h" +#include "kmess.h" +#include "kmesstest.h" +#include "kmessdebug.h" +#include "utils/crashhandler.h" + +#include "config-kmess.h" + +#include +#include +#include + + +#if ( ENABLE_BINRELOC != 0 ) + // Required for autopackage support. + // Handles detection of paths at run time. + #include "binreloc.h" +#endif + + + +/** + * The application constructor + */ +KMessApplication::KMessApplication() + : KApplication() + , contactListWindow_(0) + , quitSelected_(false) +{ + // KMessApplication is created from main.cpp. + // It continues the initialisation of the application. + + // Install a message handler, so KMESS_ASSERT won't do a exit(1) or abort() + // It makes debugging output on Windows disappear, so don't use it there +#ifndef Q_OS_WIN + qInstallMsgHandler( kmessDebugPrinter ); +#endif + +#ifdef KMESSTEST + kDebug() << "Starting KMess " KMESS_VERSION " on" << QDateTime::currentDateTime().toString( Qt::ISODate ); + kDebug() << "Compiled with KDE" KDE_VERSION_STRING ", Qt" QT_VERSION_STR; + kDebug() << "Running on KDE" << KDE::versionString() << ", Qt" << qVersion(); +#endif + + // Install our crash handler. + CrashHandler::activate(); + + // Start remaining initialisation + initializePaths(); + initializeMainWindow(); +} + + + +/** + * Destructor + */ +KMessApplication::~KMessApplication() +{ + // automatically destroyed + contactListWindow_ = 0; +} + + + +/** + * Return the contact list window + */ +KMess* KMessApplication::getContactListWindow() const +{ + return contactListWindow_; +} + + +/** + * Initialisation of the main window. + */ +void KMessApplication::initializeMainWindow() +{ + // Fetch the command line arguments + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + 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 ); + if( ! contactListWindow_->initialize() ) + { + exit(1); + return; + } + + // Initialize KApplication + setTopWidget( contactListWindow_ ); + + // Apply our own quit policy. + // Only quit when the user wanted to, or KDE is logging out. + setQuitOnLastWindowClosed( false ); + connect( this, SIGNAL(lastWindowClosed()), this, SLOT(slotLastWindowClosed()) ); + connect( this, SIGNAL(aboutToQuit()), this, SLOT(slotAboutToQuit()) ); + +#if ( KMESS_DEBUG == 1 ) + // The debug build allows to run tests from the command line. + QString testName( args->getOption( "runtest" ) ); + if( ! testName.isEmpty() ) + { + // KMessTest is deleted when the app closes + KMessTest *kmessTest = new KMessTest( contactListWindow_ ); + kmessTest->runTest( testName ); + kmessTest->endTest(); + return; + } +#endif + + // We found session data for the Contact List, to restore it + if( kapp->isSessionRestored() && restoredWindow != -1 ) + { + // Wait for the user passwords + AccountsManager::instance()->readPasswords( true ); + + contactListWindow_->restore( restoredWindow, false ); + } + else + { + // Start auto login if needed, then show the login screen + contactListWindow_->checkAutologin( autologinHandle ); + + if( ! args->isSet( "hidden" ) ) + { + contactListWindow_->show(); + } + } +} + + + +/** + * Initialize additional paths + */ +void KMessApplication::initializePaths() +{ +#if ( ENABLE_BINRELOC != 0 ) + // Register run-time detected paths for Autopackage support. + // This also prevents the "square boxes images" problem from happening + // if the --prefix of ./configure was incorrect. + BrInitError brError; + if( br_init( &brError ) == 0 && brError != BR_INIT_ERROR_DISABLED) + { + kWarning() << "BinReloc failed to initialize (error code " << brError << ")"; + kDebug() << "Will fallback to hardcoded compile-time path (" << KMESS_PREFIX << ")."; + } + + // Detect run-time paths, fallback to KMESS_PREFIX of configure + KGlobal::dirs() -> addPrefix( br_find_prefix( KMESS_PREFIX ) ); + KIconLoader::global() -> addAppDir( br_find_data_dir( KMESS_PREFIX "/share" ) ); +#else + // Add compile time paths as fallback + KGlobal::dirs() -> addPrefix( KMESS_PREFIX ); + KIconLoader::global() -> addAppDir( KMESS_PREFIX "/share" ); +#endif + + // Test whether the prefix is correct. + 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; + } +} + + + +/** + * Called when QCoreApplication notifies the app is really quitting now. + */ +void KMessApplication::slotAboutToQuit() +{ + // No user-interaction is possible here anymore..! + +#ifdef KMESSDEBUG_KMESSAPPLICATION + kDebug() << "KMess is about to quit..."; +#endif +} + + + +/** + * Called when the last window is closed. + * + * Also see: KMessInterface::queryClose(). + */ +void KMessApplication::slotLastWindowClosed() +{ +#ifdef KMESSTEST + KMESS_ASSERT( quitOnLastWindowClosed() == false ); +#endif + + if( quitSelected_ || sessionSaving() ) + { +#ifdef KMESSDEBUG_KMESSAPPLICATION + kDebug() << "Last window closed, user really wants to quit now. Initiate quit() call."; +#endif + + quit(); + } + else + { +#ifdef KMESSDEBUG_KMESSAPPLICATION + kDebug() << "User closed last window, but keep KMess running with all windows closed."; +#endif + } +} + + + +/** + * Return true if quit was selected + */ +bool KMessApplication::quitSelected() const +{ + return quitSelected_; +} + + + +/** + * Tell the application that quit was selected + */ +void KMessApplication::setQuitSelected(bool quitSelected) +{ + quitSelected_ = quitSelected; +} + + +#include "kmessapplication.moc" diff --git a/kmess/kmessapplication.h b/src/kmessapplication.h similarity index 82% rename from kmess/kmessapplication.h rename to src/kmessapplication.h index af6a884..ceb5e4e 100644 --- a/kmess/kmessapplication.h +++ b/src/kmessapplication.h @@ -18,11 +18,13 @@ #ifndef KMESSAPPLICATION_H #define KMESSAPPLICATION_H -#include -#include +#include + class KMess; + + /** * @brief KApplication subclass to handle quit requests. * @@ -37,6 +39,10 @@ class KMess; */ class KMessApplication : public KApplication { + Q_OBJECT + + friend class KMessTest; + public: // Constructor KMessApplication(); @@ -44,23 +50,24 @@ class KMessApplication : public KApplication // Destructor virtual ~KMessApplication(); -#if KDE_IS_VERSION(3,1,1) - // KDE has a sessionSaving() method -#else - // QApplication wants to save the session - virtual void commitData(QSessionManager &sm); - // Return true if we're saving the session (for queryExit()) - bool sessionSaving() const; -#endif - + // Return the contact list window + KMess* getContactListWindow() const; // Return true if quit was selected bool quitSelected() const; // Tell the application that quit was selected void setQuitSelected(bool quitSelected); + private slots: + void slotAboutToQuit(); + void slotLastWindowClosed(); + + private: // private methods + void initializeMainWindow(); + void initializePaths(); + private: - // True when entering the commitData() method - bool savingSession_; + // Reference to the contact list window + KMess *contactListWindow_; // True when quit was selected bool quitSelected_; }; diff --git a/kmess/kmessdebug.cpp b/src/kmessdebug.cpp similarity index 65% rename from kmess/kmessdebug.cpp rename to src/kmessdebug.cpp index 506d9a9..6ddf1aa 100644 --- a/kmess/kmessdebug.cpp +++ b/src/kmessdebug.cpp @@ -18,6 +18,11 @@ #include "kmessdebug.h" +#include +#include + +#include + // kmessdebug.h adds a KMESS_NULL macro to detect // and display null pointer warnings. This is used @@ -42,8 +47,11 @@ */ bool _kmessWarnNull(bool isNull, const char *var, const char *funcinfo, const char *file, int line) { - if(isNull) - kdWarning() << "'" << var << "' should not be null in " << funcinfo << ", " << file << " (" << line << ")!" << endl; + if( isNull ) + { + kWarning().nospace() << "'" << var << "' should not be null in " << funcinfo << ", " << file << " (" << line << ")!"; + } + return isNull; } @@ -61,7 +69,7 @@ bool _kmessWarnNull(bool isNull, const char *var, const char *funcinfo) { if(isNull) - kdWarning() << "'" << var << "' should not be null in " << funcinfo << "!" << endl; + kWarning() << "'" << var << "' should not be null in " << funcinfo << "!"; return isNull; } @@ -69,6 +77,27 @@ +/** + * @brief Warns when a pre- or post- condition fails. + * + * This function is called from the KMESS_ASSERT macro. + * It outputs a warning when a test fails. + * Unlike Q_ASSERT(), this function won't crash KMess, + * since it could be trigged by an invalid client + * + * @param assertion The source code of the condition passed to the KMESS_ASSERT macro. + * @param file The filename where the KMESS_ASSERT macro is called from. + * @param line The line number where the KMESS_ASSERT macro is called from. + * @ingroup Debug + */ +bool _kmessAssert( const char *assertion, const char *file, int line ) +{ + qWarning( "ASSERT: \"%s\" in file %s, line %d", assertion, file, line ); + return false; +} + + + #ifdef KMESS_NETWORK_WINDOW // The network window can optionally be compiled. @@ -121,3 +150,65 @@ } #endif + + +/** + * @brief A Qt debug message handler. + * + * This function can be installed using @code qInstallMsgHandler( kmessDebugPrinter ); @endcode + * It's used to avoid unwanted exit(1) or abort() calls. + * + * @param type The debug message type, generated by qDebug(), qFatal(), etc.. + * @param message The message to print. + * @ingroup Debug + */ +void kmessDebugPrinter( QtMsgType type, const char *message ) +{ + bool isAssert = ( strncmp( message, "ASSERT", 7 ) == 0 ); // 'ASSERT failure' or 'ASSERT: ' + static QTime timer; + if( ! timer.isValid() ) + timer.start(); + float elapsed = (float)timer.elapsed() / (float)1000; + + if( isAssert ) + { + // can be qWarning() by us or qFatal() from Qt. + fprintf( stderr, "%.3f> kmess(%d) %s\n", elapsed, getpid(), message ); + +#ifdef KMESSTEST + // Crash on qFatal() from Qt, called from Q_ASSERT() + // Don't crash on qWarning() from KMESS_ASSERT(). Could be triggered by bad P2P clients for example. + if( type == QtFatalMsg ) + { + abort(); + } +#endif + } + else + { + switch( type ) + { + case QtDebugMsg: + fprintf( stderr, "%.3f> %s\n", elapsed, message ); + break; + + case QtWarningMsg: + fprintf( stderr, "%.3f> WARNING: %s\n", elapsed, message ); + break; + + case QtCriticalMsg: + fprintf( stderr, "%.3f> CRITICAL: %s\n", elapsed, message ); + break; + + case QtFatalMsg: + fprintf( stderr, "%.3f> FATAL: %s\n", elapsed, message ); + +#ifdef KMESSTEST + abort(); +#endif + + break; + } + } +} + diff --git a/kmess/kmessdebug.h b/src/kmessdebug.h similarity index 53% rename from kmess/kmessdebug.h rename to src/kmessdebug.h index c892146..12a5fd8 100644 --- a/kmess/kmessdebug.h +++ b/src/kmessdebug.h @@ -18,30 +18,56 @@ #ifndef KMESSDEBUG_H #define KMESSDEBUG_H -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif +#include "config-kmess.h" -// Since all debugging code uses kdDebug(), this is also a good +// Since all debugging code uses kDebug(), this is also a good // reason to include this file by default so no one else has to. -#include +#include + + +#if ( KMESS_DEBUG == 1 ) + + + /** + * Local mode switch + * + * This switching option must be used with the KMess Test Server application. + * The test server is a standalone Qt-only GUI application (meaning it can be + * also used to test other projects and even WLM itself, with some fiddling) + * which emulates locally all the functions of MSN's servers, to allow fast + * verification of the user interface, quick testing of the protocol code + * behavior, and effective testing in extreme conditions (for example, huge + * contact lists, or sudden network loss). + * The test server code is available in the KMess SVN: + * + * svn checkout https://kmess.svn.sourceforge.net/svnroot/kmess/trunk/kmesstestserver + * + * It is directly executable with (on *nixes): + * {kmesstestserver build folder}/kmesstestserver + * and takes no command line arguments (it's a GUI app, after all). + * + * Set this define to 1 to switch KMess to the local connection mode: + * it will connect to the Test Server addresses, which are all on the local + * host. + * Set it to 0 for normal operation. + */ + #define KMESS_ENABLE_LOCAL_MODE 0 + -#if ( KMESS_DEBUG == 1) #define KMESSTEST #define KMESS_NETWORK_WINDOW -// #define KMESSDEBUG_KMESS -// #define KMESSDEBUG_KMESSINTERFACE -// #define KMESSDEBUG_KMESSVIEW -// #define KMESSDEBUG_KMESSVIEWINTERFACE -// #define KMESSDEBUG_KMESSLISTVIEWITEM -// #define KMESSDEBUG_CONTACTLISTVIEWITEM -// #define KMESSDEBUG_GROUPLISTVIEWITEM -// #define KMESSDEBUG_INITIALVIEW -// #define KMESSDEBUG_SETTINGSDIALOG -// #define KMESSDEBUG_CONTACTPROPERTIES -// #define KMESSDEBUG_TRANSFERENTRY -// #define KMESSDEBUG_TRANSFERWINDOW + #define KMESSDEBUG_KMESS + #define KMESSDEBUG_LIKEBACK + #define KMESSDEBUG_KMESSAPPLICATION + #define KMESSDEBUG_KMESSINTERFACE + #define KMESSDEBUG_KMESSVIEW + #define KMESSDEBUG_INITIALVIEW + #define KMESSDEBUG_SETTINGSDIALOG + #define KMESSDEBUG_CONTACTPROPERTIES + #define KMESSDEBUG_TRANSFERENTRY + #define KMESSDEBUG_TRANSFERWINDOW + #define KMESSDEBUG_CHATHISTORYDIALOG #define KMESSDEBUG_CONNECTION @@ -57,53 +83,72 @@ #define KMESSDEBUG_ACCOUNT #define KMESSDEBUG_CURRENTACCOUNT + #define KMESSDEBUG_ACCOUNTSMANAGER #define KMESSDEBUG_CONTACT #define KMESSDEBUG_CONTACTBASE #define KMESSDEBUG_CONTACTEXTENSION #define KMESSDEBUG_CONTACTLIST +// #define KMESSDEBUG_CONTACTLISTMODELTEST +// #define KMESSDEBUG_CONTACTLISTMODEL #define KMESSDEBUG_GROUP #define KMESSDEBUG_CHATMASTER + #define KMESSDEBUG_CHAT #define KMESSDEBUG_CHATWINDOW #define KMESSDEBUG_CHATVIEW #define KMESSDEBUG_CHATMESSAGEVIEW - #define KMESSDEBUG_CONTACTSIDEBAR + #define KMESSDEBUG_CONTACTSWIDGET + #define KMESSDEBUG_EMOTICONSWIDGET + #define KMESSDEBUG_WINKSWIDGET #define KMESSDEBUG_CONTACTFRAME -// #define KMESSDEBUG_CONTACTACTION #define KMESSDEBUG_INVITEDCONTACT + #define KMESSDEBUG_INKEDIT -// #define KMESSDEBUG_EMOTICONS + #define KMESSDEBUG_EMOTICONS +// #define KMESSDEBUG_RICHTEXTPARSER // #define KMESSDEBUG_IDLETIMER -// #define KMESSDEBUG_NOWLISTENINGCLIENT -// #define KMESSDEBUG_XSLTRANSFORMATION + #define KMESSDEBUG_AUTOLOCK + #define KMESSDEBUG_NOWLISTENINGCLIENT + #define KMESSDEBUG_XSLTRANSFORMATION #define KMESSDEBUG_THUMBNAILPROVIDER + #define KMESSDEBUG_SYSTEMTRAY + #define KMESSDEBUG_CRASHHANDLER + #define KMESSDEBUG_SHAREDMETHODS + #define KMESSDEBUG_KMESSDBUS + #define KMESSDEBUG_KMESSSENDPLUGIN -// #define KMESSDEBUG_MIMEMESSAGE + #define KMESSDEBUG_MIMEMESSAGE + #define KMESSDEBUG_MULTIPACKETMESSAGE + #define KMESSDEBUG_P2PMESSAGE #define KMESSDEBUG_APPLICATION #define KMESSDEBUG_APPLICATIONLIST #define KMESSDEBUG_MIMEAPPLICATION #define KMESSDEBUG_P2PAPPLICATION #define KMESSDEBUG_FILETRANSFER_P2P - #define KMESSDEBUG_PICTURETRANSFER_P2P + #define KMESSDEBUG_MSNOBJECTTRANSFER_P2P #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 -// #define KMESSDEBUG_NOTIFICATIONMANAGER -// #define KMESSDEBUG_NOTIFICATIONCONTACTSTATUS -// #define KMESSDEBUG_NOTIFICATIONCHAT -// #define KMESSDEBUG_NOTIFICATIONNEWEMAIL + #define KMESSDEBUG_PASSIVEPOPUP + #define KMESSDEBUG_NOTIFICATIONMANAGER + #define KMESSDEBUG_CONTACTSTATUSNOTIFICATION + #define KMESSDEBUG_CHATNOTIFICATION + #define KMESSDEBUG_NEWEMAILNOTIFICATION +#else + // silences a compile time warning if enable-debug-output = 0 in configure + #define KMESS_ENABLE_LOCAL_MODE 0 #endif @@ -125,17 +170,28 @@ #ifdef KMESSTEST // Warns that a pointer was null, full debug version bool _kmessWarnNull(bool isNull, const char *var, const char *funcinfo, const char *file, int line); + // Warn if a pre- or post- condition fails + bool _kmessAssert(const char *condition, const char *file, int line); // Wrapper macro for warn-if-null methods. // This idea was taken from Q_ASSERT (qglobal.h). // Using KDE_ISUNLIKELY so the compiler optimizes branching. // Silent version: #define KMESS_NULL(x) (x != 0) - #define KMESS_NULL(x) ( KDE_ISUNLIKELY(x == 0) && _kmessWarnNull(x == 0, #x, c_funcinfo, __FILE__, __LINE__) ) + #define KMESS_NULL(x) ( KDE_ISUNLIKELY((x) == 0) && _kmessWarnNull((x) == 0, #x, c_funcinfo, __FILE__, __LINE__) ) + + // Warn if a pre- or post- condition fails + // Idea taken from Q_ASSERT, too, but without terminating the application; + // this is often useful with P2P code, some details may change and using KMESS_ASSERT + // KMess would die a lot. + #define KMESS_ASSERT(cond) ( KDE_ISUNLIKELY((cond) == 0) && _kmessAssert( #cond, __FILE__, __LINE__) ) #else // Warns that a pointer was null bool _kmessWarnNull(bool isNull, const char *var, const char *funcinfo); - #define KMESS_NULL(x) ( KDE_ISUNLIKELY(x == 0) && _kmessWarnNull(x == 0, #x, c_funcinfo) ) + #define KMESS_NULL(x) ( KDE_ISUNLIKELY((x) == 0) && _kmessWarnNull((x) == 0, #x, c_funcinfo) ) + + // Avoid asserts in release versions + #define KMESS_ASSERT(cond) #endif @@ -163,9 +219,13 @@ #else #define KMESS_NET_CLOSE(c) #define KMESS_NET_INIT(c,t) - #define KMESS_NET_RECEIEVED(c,d) + #define KMESS_NET_RECEIVED(c,d) #define KMESS_NET_SENT(c,d) #endif +// A Qt debug message handler to avoid unwanted exit(1) or abort() calls. +void kmessDebugPrinter( QtMsgType type, const char *msg ); + + #endif // KMESSDEBUG_H diff --git a/src/kmessinterface.cpp b/src/kmessinterface.cpp new file mode 100644 index 0000000..43faf16 --- /dev/null +++ b/src/kmessinterface.cpp @@ -0,0 +1,818 @@ +/*************************************************************************** + kmessinterface.cpp - description + ------------------- + begin : Sun Dec 29 2002 + copyright : (C) 2002 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 "kmessinterface.h" + +#include "notification/systemtraywidget.h" +#include "settings/globalsettingsdialog.h" +#include "utils/likeback/likeback.h" +#include "utils/kmessconfig.h" +#include "utils/kmessshared.h" +#include "kmessapplication.h" +#include "kmessdebug.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +// The constructor +KMessInterface::KMessInterface( QWidget *parent ) + : KXmlGuiWindow( parent ) + , actionCollection_( actionCollection() ) + , isErrorStatus_( true ) + , initialized_( false ) +{ + setObjectName( "ContactList" ); +} + + + +// The destructor +KMessInterface::~KMessInterface() +{ + delete statusLabel_; + delete systemTrayWidget_; +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "DESTROYED."; +#endif +} + + + +// "Add a new contact" was selected from the menu. +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() +{ + kDebug() << "not implemented"; +} + + +// The application is closing, after queryExit() was approved +void KMessInterface::applicationClosing() +{ + kDebug() << "not implemented"; +} + + + +// A view pictures mode has been selected from the menu. +void KMessInterface::changedListPictureSize( int /*mode*/ ) +{ + kDebug() << "not implemented"; +} + + + +// A status was selected from the menu. +void KMessInterface::changeStatus( QAction *action ) +{ + Q_UNUSED( action ); + + kDebug() << "not implemented"; +} + + + +// A view mode has been selected from the menu. +void KMessInterface::changeViewMode(int /*mode*/) +{ + kDebug() << "not implemented"; +} + + + +void KMessInterface::showListExportDialog() +{ + kDebug() << "not implemented"; +} + + + +void KMessInterface::showNetworkWindow() +{ + kDebug() << "not implemented"; +} + + +void KMessInterface::showTransferWindow() +{ + kDebug() << "not implemented"; +} + + + +// Create the menus +void KMessInterface::createMenus() +{ + KAction *close, *quit; + KAction *newAccount; + 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 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 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 ); + 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 ); + + // Populate PictureSize select + listPictureSizes << i18n( "Do Not Display" ) + << i18n( "Small" ) + << i18n( "Medium" ) + << i18n( "Large" ); + listPictureSize_->setItems( listPictureSizes ); + + // Populate ViewMode select + viewModes << i18n("Group") // Account::VIEW_BYGROUP + << i18n("Online/Offline") // Account::VIEW_BYSTATUS + << i18n("Mixed"); // Account::VIEW_MIXED + viewMode_->setItems(viewModes); + + + // 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( 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( "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() ) ); + + actionCollection_->addAction( "showNetwork", showNetworkAction_ ); +#endif +} + +// "Add new account" has been selected from the menu. +void KMessInterface::createNewAccount() +{ + kDebug() << "not implemented"; +} + + + +// Disconnect was selected from the menu. +void KMessInterface::disconnectClicked() +{ + kDebug() << "not implemented"; +} + + + +// Enable/disable menus based on whether or not the application is +// connected to the server. +void KMessInterface::enableMenus(bool connected) +{ + if ( connected ) + { + disconnect_->setIcon( KIcon("network-connect") ); + stateChanged("connected"); + } + else + { + disconnect_->setIcon( KIcon("network-disconnect") ); + stateChanged("disconnected"); + } +} + + + +// Initialize the class +bool KMessInterface::initialize() +{ +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "initializing"; +#endif + if ( initialized_ ) + { + kDebug() << "already initialized."; + return false; + } + + // Initialize the status bar + statusLabel_ = new KSqueezedTextLabel( this ); + statusBar()->addWidget( statusLabel_, 2 ); + + statusTimer_ = new QLabel( this ); + statusTimer_->setText( "00:00" ); + statusBar()->addPermanentWidget( statusTimer_, 0 ); + + // Only show the status bar when we're connected + statusBar()->hide(); + + // Create the online timer + onlineTimer_ = new QTimer( this ); + connect( onlineTimer_, SIGNAL( timeout() ), + this, SLOT( updateOnlineTimer() ) ); + +#if KMESS_DISABLE_LIKEBACK == 0 + + // Enable LikeBack. + // The bar will only be enabled by default in debugging builds. + bool showLikeBackBar = false; +#ifdef KMESSTEST + showLikeBackBar = true; +#endif + + LikeBack *likeBack = new LikeBack( LikeBack::AllButtons, showLikeBackBar ); + likeBack->setServer( "www.kmess.org", "/likeback/send.php", 80 ); + likeBack->setWindowNamesListing( LikeBack::AllWindows ); + + QStringList acceptedLocales; + acceptedLocales << "en" << "nl" << "it" << "fr" << "de"; + likeBack->setAcceptedLanguages( acceptedLocales ); + likeBack->createActions( 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."; + return false; + } + +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "initialized"; +#endif + return true; +} + + + +// Initialize the system tray widget +bool KMessInterface::initSystemTrayWidget() +{ + // Create the widget + systemTrayWidget_ = new SystemTrayWidget( this ) ; + if ( systemTrayWidget_ == 0 ) + { + kDebug() << "Couldn't create 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->addMenu( status_ ); + menu->addSeparator(); + menu->addAction( showSettingsAction_ ); + menu->addAction( globalSettings_ ); + + // Make the connections for the system tray widget + connect( systemTrayWidget_, SIGNAL( quitSelected() ), + this, SLOT ( menuQuit() ) ); + + systemTrayWidget_->show(); + +#ifdef KMESSTEST + KMESS_ASSERT( systemTrayWidget_ != 0 ); + KMESS_ASSERT( systemTrayWidget_->isVisible() ); +#endif + return true; +} + + + +// Close has been selected from the menu. +void KMessInterface::menuClose() +{ +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "'Close' was selected from the menu."; +#endif + + // Hide the window + // Tell that KMess is still visible in the tray + hide(); + systemTrayWidget_->displayCloseMessage(); + +#ifdef KMESSTEST + KMESS_ASSERT( isHidden() ); +#endif +} + + + +// Quit was selected from the menu. +void KMessInterface::menuQuit() +{ +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "'Quit' was selected from the menu."; +#endif + + // Tell the application manager we want to quit + KMessApplication *app = static_cast(kapp); + app->setQuitSelected(true); + + close(); // Close this window, initiates quit +} + + + +// Reject quitting unless the quit menu was pressed Called automatically by KMainWindow::closeEvent +bool KMessInterface::queryExit() +{ + KMessApplication *kmessApp = static_cast(kapp); + + // With KDE 4 this function is also called when another KMainWindow (like the network window) closes. + // Reject an attempt to quit if the user didn't select quit manually, or is logging out from KDE. + // If a window still causes KMess to quit, use setAttribute( Qt::WA_QuitOnClose, false ) on it. + if( kmessApp->quitSelected() || + kmessApp->sessionSaving() ) + { +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Accepting exit request."; +#endif + + return true; + } + else + { + // For some reason, KDE keeps bugging us when the chat window closes. + // Reject the request again. + +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Rejecting exit request! Keep running with all windows hidden."; +#endif + + return false; + } +} + + + +// Tell the user that KMess hides in the systray Called automatically by KMainWindow::closeEvent +bool KMessInterface::queryClose() +{ + KMessApplication *kmessApp = static_cast(kapp); + + // Only allow KMess to quit if: + // - the "quit" option was used from the menu + // - the session manager wants to quit (we're called from KApplication::commitData()) + if( kmessApp->quitSelected() || + kmessApp->sessionSaving() ) + { +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Accepting quit request."; +#endif + + // Make sure that substituent also return true + kmessApp->setQuitSelected(true); + + // Make sure the derived class can prepare itself too. + applicationClosing(); + + // Allow the request + return true; + } + else + { + // Tell that KMess is still visible in the tray + systemTrayWidget_->displayCloseMessage(); + +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Rejecting quit request, hiding window"; +#endif + + // Only hide, disallow event + hide(); + return false; + } +} + + + +// Restore the window properties (called by KMainWindow) +void KMessInterface::readProperties( const KConfigGroup &config ) +{ +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Reading properties"; +#endif + + KConfigGroup group; + + // Choose the config group if it was not given + if( &config == 0 ) + { + group = KMessConfig::instance()->getGlobalConfig( "ContactListWindow" ); + } + else + { + 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()) + { + resize(windowsize); + } + QPoint position = group.readEntry( "Position", QPoint() ); + if(!position.isNull()) + { + move(position); + } + + bool bViewMenubar = group.readEntry( "ShowMenuBar", true ); + showMenuBar_->setChecked( bViewMenubar ); + menuBar()->setVisible( bViewMenubar ); + + // Commented for future work +/* // bar status settings + bool bViewToolbar = group.readEntry( "Show Toolbar", true ); + showToolBar_->setChecked(bViewToolbar); + showToolBar(); +*/ + + showStatusBar_->setChecked( group.readEntry( "ShowStatusBar", true ) ); + showStatusBar(); + + // bar position settings + /* KConfigGroup mainToolBarGroup = group.group( "mainToolBar" ); + toolBar( "mainToolBar" )->applySettings( mainToolBarGroup ); + toolBar( "mainToolBar" )->setToolBarsLocked( group.readEntry( "Lock Toolbar", false ) );*/ +} + + + +// Save the window properties (called by KMainWindow) +void KMessInterface::saveProperties(KConfigGroup &config) +{ +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Saving properties"; +#endif + + KConfigGroup group; + + // Choose the config group if it was not given + if( &config == 0 ) + { + group = KMessConfig::instance()->getGlobalConfig( "ContactListWindow" ); + } + else + { + group = config; + } + + group.writeEntry("Size", size() ); + group.writeEntry("Position", pos() ); +// group.writeEntry("Show Toolbar", showToolBar_->isChecked() ); + group.writeEntry("ShowMenuBar", showMenuBar_ ->isChecked() ); + group.writeEntry("ShowStatusBar", showStatusBar_->isChecked() ); + + // save the toolbar settings + /* KConfigGroup mainToolBarGroup = group.group( "mainToolBar" ); + toolBar( "mainToolBar" )->saveSettings( mainToolBarGroup ); + group.writeEntry("Lock Toolbar", toolBar( "mainToolBar" )->toolBarsLocked());*/ + +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Done saving properties"; +#endif +} + + + +// The "Show Global Settings" option was clicked. +void KMessInterface::showGlobalSettings() +{ + GlobalSettingsDialog *globalSettingsDialog = GlobalSettingsDialog::instance(); + + globalSettingsDialog->show(); + globalSettingsDialog->raise(); +} + + + +// "Show menu bar" was toggled. +void KMessInterface::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 status bar" was toggled. +void KMessInterface::showStatusBar() +{ + statusBar()->setVisible( showStatusBar_->isChecked() ); +} + + + +// "Show toolbar" was toggled. +/*void KMessInterface::showToolBar() +{ + if(!showToolBar_->isChecked()) + { + toolBar("mainToolBar")->hide(); + } + else + { + toolBar("mainToolBar")->show(); + } +}*/ + + + +// Show the user's MSN profile. +void KMessInterface::showUserProfile() +{ + kDebug() << "not implemented"; +} + +// Change the status bar message. +void KMessInterface::statusMessage( QString message, bool isError ) +{ + if( message != message_ ) + { + statusLabel_->setText( message ); + message_ = message; + +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Changed message to" << message; +#endif + } + + // Do not alter the online timer when the status has not changed + if( isError == isErrorStatus_ ) + { + return; + } + + if( isError ) + { + onlineTimer_->stop(); + statusTimer_->setText( "00:00" ); + } + else + { + onlineTime_ = 0; + onlineTimer_->start( 60000 ); + } + + isErrorStatus_ = isError; +} + + + +// The "show allowed contacts" menu item has been toggled. +void KMessInterface::toggleShowAllowed(bool /*show*/) +{ + kDebug() << "not implemented"; +} + + + +// The "show empty groups" menu item has been toggled. +void KMessInterface::toggleShowEmpty(bool /*show*/) +{ + kDebug() << "not implemented"; +} + + + +// 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*/) +{ + kDebug() << "not implemented"; +} + + + +// The "show offline contacts" menu item has been toggled. +void KMessInterface::toggleShowOffline(bool /*show*/) +{ + kDebug() << "not implemented"; +} + + + +// The "show removed contacts" menu item has been toggled. +void KMessInterface::toggleShowRemoved(bool /*show*/) +{ + kDebug() << "not implemented"; +} + + +// Increment and update the online timer. +void KMessInterface::updateOnlineTimer() +{ + QString timeText; + + onlineTime_ ++; + + timeText.sprintf( "%02i:%02i", onlineTime_ / 60, onlineTime_ % 60 ); + + statusTimer_->setText( timeText ); +} + +#include "kmessinterface.moc" diff --git a/kmess/kmessinterface.h b/src/kmessinterface.h similarity index 62% rename from kmess/kmessinterface.h rename to src/kmessinterface.h index 2976968..9530349 100644 --- a/kmess/kmessinterface.h +++ b/src/kmessinterface.h @@ -18,24 +18,29 @@ #ifndef KMESSINTERFACE_H #define KMESSINTERFACE_H -#include - -#include -#include +#include "contact/msnstatus.h" #include "kmessdebug.h" +#include +#include +#include + + // Forward declarations class QHBox; class QLabel; +class KAction; class KActionMenu; class KConfig; class KHelpMenu; class KMessTest; -class KPopupMenu; +class KMenu; class KSelectAction; class KToggleAction; class SystemTrayWidget; + + /** * @brief User interface of the KMess class. * @@ -45,23 +50,15 @@ class SystemTrayWidget; * @author Mike K. Bennett * @ingroup Root */ -class KMessInterface : public KMainWindow +class KMessInterface : public KXmlGuiWindow { Q_OBJECT public: // Public methods - // Message Types shown in the Status Bar - enum ConnectionStatus - { - TYPE_MESSAGE, - TYPE_WARNING, - TYPE_ERROR - }; - friend class KMessTest; // The constructor - KMessInterface(QWidget *parent=0, const char *name=0); + KMessInterface( QWidget *parent=0 ); // The destructor virtual ~KMessInterface(); @@ -75,19 +72,23 @@ class KMessInterface : public KMainWindow virtual bool initialize(); // Restore the window properties (called by KMainWindow) - virtual void readProperties(KConfig *config); + virtual void readProperties( const KConfigGroup &config = *((const KConfigGroup *)0) ); // Save the window properties (called by KMainWindow) - virtual void saveProperties(KConfig *config); + virtual void saveProperties( KConfigGroup &config = *((KConfigGroup *)0) ); protected slots: // Protected slots // "Add a new contact" was selected from the menu. virtual void addNewContact(); // "Add a new group" was selected from the menu. virtual void addNewGroup(); + // 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(const QString &statusName); + 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. @@ -96,14 +97,22 @@ 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, KMessInterface::ConnectionStatus connectStatus = TYPE_ERROR ); - // The "show display pictures" menu item has been toggled. - virtual void toggleDisplayPictures(bool show); + 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. virtual void toggleShowOffline(bool show); // The "Show removed contacts" menu item has been toggled. @@ -112,39 +121,44 @@ 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 KAction *disconnect_; - KAction *configureNotifications_; - // The menu for "settings..." with a profile - KActionMenu *settingsActionMenu_; - // Toggle actions for showing allowed, offline, and removed contacts. - KToggleAction *showAllowedAction_, *showOfflineAction_, *showRemovedAction_; + // The menu for global settings + KAction *globalSettings_; + // View list pictures mode + KSelectAction *listPictureSize_; + // 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 KAction *showNetworkAction_; - // Toggle actions for showing display pictures in contact list. - KToggleAction *showPicturesAction_; + // Toggle actions for showing and hiding the menu bar + KToggleAction *showMenuBar_; + // Toggle actions for showing and hiding the status bar + 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. KSelectAction *viewMode_; + // ActionCollection + 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 @@ -153,49 +167,43 @@ 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 notifications dialog - void configureNotifications(); - // Show the user manual for KMess. - void helpContents(); // Close has been selected from the menu. void menuClose(); // Quit was selected from the menu. void menuQuit(); - // Open up the URL for hotmail's contact search page. - void searchForContact(); - // Open up the URL to MSN's "search by interest" page. - void searchForContactByInterest(); - // "Show status bar" was toggled. - void showStatusBar(); + // 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 toolbar" was toggled. - void showToolBar(); + // void showToolBar(); private: // Private attributes - // The current connection state - ConnectionStatus connectState_; - // The help menu launcher - KHelpMenu *helpMenu_; + // Export list action + KAction *exportList_; + // Whether the status is a warning or not + bool isErrorStatus_; // Whether or not the object was initialized - bool 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_; + unsigned int onlineTime_; // Online interval timer - QTimer *onlineTimer_; - // Toggle actions for showing and hiding the toolbars and statusbars. - KToggleAction *showStatusBar_, *showToolBar_; + QTimer *onlineTimer_; + // Toggle actions for showing and hiding the toolbar + // KToggleAction *showToolBar_; // Status messages - QLabel *statusLabel_; + KSqueezedTextLabel *statusLabel_; // Online timer - QLabel *statusTimer_; + QLabel *statusTimer_; // The view menu - stored here because it needs to be enabled/disabled - KPopupMenu *viewMenu_; + KMenu *viewMenu_; }; #endif diff --git a/src/kmessinterfaceui.rc b/src/kmessinterfaceui.rc new file mode 100644 index 0000000..47cde3b --- /dev/null +++ b/src/kmessinterfaceui.rc @@ -0,0 +1,100 @@ + + + + + &Connect + + + + + + + + + + + &View + + + + + + + + + + + + + + + + + + &Actions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/kmesstest.cpp b/src/kmesstest.cpp new file mode 100644 index 0000000..e79dc62 --- /dev/null +++ b/src/kmesstest.cpp @@ -0,0 +1,893 @@ +/*************************************************************************** + kmesstest.cpp - description + ------------------- + begin : Sun Jan 5 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 "kmesstest.h" + +#include "chat/chat.h" +#include "chat/chatmaster.h" +#include "chat/chatview.h" +#include "chat/chatwindow.h" +#include "chat/contactswidget.h" +#include "chat/xsltransformation.h" +#include "contact/contact.h" +#include "contact/contactbase.h" +#include "contact/contactextension.h" +#include "contact/group.h" +#include "contact/specialgroups.h" +#include "dialogs/addcontactdialog.h" +#include "dialogs/chathistorydialog.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/systemtraywidget.h" +#include "settings/accountsettingsdialog.h" +#include "utils/nowlisteningclient.h" +#include "utils/richtextparser.h" +#include "accountsmanager.h" +#include "kmessviewdelegate.h" +#include "currentaccount.h" +#include "emoticonmanager.h" +#include "kmess.h" +#include "kmessapplication.h" +#include "kmessview.h" +#include "../tests/old_richtextparser.h" + +#include +#include +#include + +#include + + + +// The constructor +KMessTest::KMessTest(KMess *kmess) + : QObject(kmess) + , quitAfterTest_(false) + , kmess_(kmess) +{ + // Used to quit. Could also be useful to the tests + kmessApp_ = static_cast( kapp ); + + setObjectName("KMessTest"); +} + + + +// The destructor +KMessTest::~KMessTest() +{ + kDebug() << "DESTROYED"; +} + + + +#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 argument. + */ +void KMessTest::runTest( const QString &testName ) +{ + // Add the tests, which can be run from debug builds using: + // ./kmess --runtest + + kDebug() << "Running test:" << testName; + kDebug() << "----------------------------------------"; + kDebug(); + + QStringList testcases; + + TESTCASE( "transferwindow", testTransferWindow() ); + TESTCASE( "chathistory", testChatHistoryDialog() ); + 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_ ) + { + // 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() ) ); + } +} + + + +void KMessTest::testChatHistoryDialog() +{ + testGroupsAndContacts(); + CurrentAccount::instance()->setLoginInformation("amroth@coldshock.net", "Testing Account", "test" ); + + ChatHistoryDialog *dialog = new ChatHistoryDialog( kmess_ ); + +// dialog->setContact( "test@test.com" ); + dialog->exec(); + + quitAfterTest_ = true; +} + + + +void KMessTest::testTransferWindow() +{ + int id; + KIconLoader *loader = KIconLoader::global(); + TransferWindow *instance = TransferWindow::getInstance(); + + id = instance->addEntry( "Filename1", 1234567890, true, QImage( loader->iconPath( "list-add", 48, false ) ) ); + kDebug() << "Added ID: " << id; + + id = instance->addEntry( "Filename2", 34567890, false, QImage( loader->iconPath( "list-remove", 48, false ) ) ); + kDebug() << "Added ID: " << id; + + id = instance->addEntry( "Filename3", 567890, true ); + kDebug() << "Added ID: " << id; + +// TransferWindow::destroy(); +} + + +void KMessTest::testChatWindow() +{ + testGroupsAndContacts(); + + 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" ) ); + + // Contact-started chat + if( 1 ) + { + MsnSwitchboardConnection *sb2 = new MsnSwitchboardConnection(); + sb2 = kmess_->chatMaster_->createSwitchboardConnection( sb2, "contact7@kmess.org" ); + // 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 ); +// Chat *chat = kmess_->chatMaster_->createChat( sb2 ); + sb2->parseChatMessage( "contact7@kmess.org", "Contact 7", "", message ); + } + + // User-started chat + if( 0 ) + { + MsnSwitchboardConnection *sb1 = new MsnSwitchboardConnection(); + kmess_->chatMaster_->switchboardConnections_.append( sb1 ); + ChatInformation chatInfo1( kmess_->msnNotificationConnection_, "contact1@kmess.org", -1, ChatInformation::CONNECTION_OFFLINE ); + sb1->initialize( "contact1@kmess.org" ); + sb1->start( chatInfo1 ); + + kmess_->chatMaster_->createChat( sb1 ); +// sb1->parseChatMessage( "contact1@kmess.org", "Contact 1", "", message ); + } + + // Contact-started group chat + if( 0 ) + { + 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 ); + } + + // Wink + if( 0 ) + { + MsnSwitchboardConnection *sb4 = new MsnSwitchboardConnection(); + sb4 = kmess_->chatMaster_->createSwitchboardConnection( sb4, "contact7@kmess.org" ); + // kmess_->chatMaster_->switchboardConnections_.append( sb4 ); + ChatInformation chatInfo4( kmess_->msnNotificationConnection_, "contact7@kmess.org", "127.0.0.1", 1234, "5678.8765", "-1", ChatInformation::CONNECTION_CHAT ); + sb4->initialize( "contact7@kmess.org" ); + sb4->start( chatInfo4 ); + sb4->contactJoined( "contact7@kmess.org", "Contact 7", 0 ); + Chat *chat = kmess_->chatMaster_->createChat( sb4 ); + + // This is the wink "guitar smash" + MimeMessage winkMessage( QString( + "MIME-Version: 1.0\r\nContent-Type: text/x-msnmsgr-datacast\r\n\r\nID: 2\r\nData: \r\n" ) ); + chat->getChatWindow()->resize( 800, 650 ); + sb4->parseMimeMessage( QStringList()<<"MSG"<<"contact7@kmess.org"<<"%5Bb%5D%5Bc%3D%2333A%5DVale%E2%84%A2%5B%2Fc%3D%233A3%5D%5B%2Fb%5D"<<"1523", winkMessage ); + } + + 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" ) ); +// kmess_->chatMaster_->chats_.first()->contactLeft( CurrentAccount::instance()->getContactList()->getContactByHandle( "contact1@kmess.org" ),false ); + + 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; + object->objectName(); +} + + +void KMessTest::testAddContactDialog() +{ + QString handle; + QStringList groupsId; + new AddContactDialog( handle, groupsId ); + + 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() +{ + //set up groups to populate listwidget + testGroupsAndContacts(); + + 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; + } +} + + +void KMessTest::testNotifications() +{ + testGroupsAndContacts(); + + ContactList *list = kmess_->msnNotificationConnection_->contactList_; + Contact *contact1 = list->getContactByHandle( "contact1@kmess.org" ); + Contact *contact2 = list->getContactByHandle( "contact2@kmess.org" ); + Contact *contact3 = list->getContactByHandle( "contact3@kmess.org" ); + + contact1->setStatus( STATUS_ONLINE ); + contact2->setStatus( STATUS_OFFLINE ); + contact3->setStatus( STATUS_BUSY ); + + ContactStatusNotification *cs = new ContactStatusNotification( kmess_->notificationManager_ ); + cs->notify( contact1, true ); + cs->notify( contact2, true ); + cs->notify( contact3, true ); +} + + +void KMessTest::testNowListening() +{ + NowListeningClient *client = new NowListeningClient(); + client->setEnabled( true ); +} + + +void KMessTest::testNotificationConnection() { quitAfterTest_ = true; } +void KMessTest::testConnect() { quitAfterTest_ = true; } +void KMessTest::testSettings() { quitAfterTest_ = true; } +void KMessTest::testSwitchboardConnection() { quitAfterTest_ = true; } + + + +void KMessTest::testGroupsAndContacts() +{ + CurrentAccount *account = CurrentAccount::instance(); + + AccountsManager::instance()->addAccount(account); + EmoticonManager::instance()->connected(); + + account->setLoginInformation("test@test.com", "Testing Account", "test" ); + account->setPersonalMessage( "omg! this [u]rocks![/u] :D " ); + account->setGuestAccount( true ); + account->setStatus( STATUS_ON_THE_PHONE ); + account->setStatusOptions( true, 5, true ); + + account->setShowContactListBird( true ); + account->setContactListOptions( true, false, true ); + account->setEmailSupported( false ); + account->setContactListDisplayMode( Account::VIEW_MIXED ); // VIEW_MIXED VIEW_BYSTATUS VIEW_BYGROUP + account->setShowAllowedContacts( false ); + account->setShowEmptyGroups( false ); + account->setShowOfflineContacts( true ); + account->setShowRemovedContacts( false ); + + account->setShowChatUserPicture( true ); + account->setFontColor( "#ff9900" ); + account->setShowSessionInfo( true ); + account->setChatInformation( true, true, true, true, true, true, true, true, true, true, 0, "Fresh" ); + account->setChatLoggingInformation( true, false, Account::EXPORT_HTML, "/home/valerio/kmess/logs", Account::SINGLEDIRECTORY ); + + + Group *group; + Contact *contact; + ContactList *list = kmess_->msnNotificationConnection_->contactList_; + + list->reset( true ); + + 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 ", 1342210084, QString(), false ); + contact->setPersonalStatus( "Contact 7 Status", "Music", "KMess - The KMess Song" ); + 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 ); +} + + + +void KMessTest::testContactList() +{ + testGroupsAndContacts(); + +// ContactList *list = kmess_->msnNotificationConnection_->contactList_; +// list->dump(); + + kmess_->connected(); + kmess_->window()->show(); + + // Show the Now Listening field +// kmess_->view_->changedSong( "White Stripes, The", "Elephant", "Seven Nation Army", true ); + kmess_->view_->slotUpdateEmailDisplay(); + + QTimer *test = new QTimer(this); + 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::testContactListSlot() +{ + kDebug() << "TEST - Switching contact status"; + ContactList *list = kmess_->msnNotificationConnection_->contactList_; + + static int i=0; + static bool statusSwitch = true; + 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++; + + 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]" ); + strings << QString::fromUtf8( "[c=50][a=50]Opera[/a][/c][c=0][a=0]tore ec[/a][/c][c=4][a=4]ologico[/a][/c]" ); + strings << QString::fromUtf8( "[c=4]t[a=#0000]est[/c=44][/a]" ); + strings << QString::fromUtf8( "[c=3]te[a=2]st:)[/a=12]er[/c=4]" ); + strings << QString::fromUtf8( "[a=red]test[a=green]:DeroWithCo[/a=blue]lorssadfasd dfg sdfsdaf sdf [/a=yellow]"); + strings << QString::fromUtf8( "[c=#660000],.-~*'¨¯¨'*·~-.¸-).[i]Simo[/i].(-,.-~*'¨¯¨'*·~-.¸[/c=#00FFF]" ); + strings << QString::fromUtf8( "[b][a=1][c=4]- Emet -:) [/c][/a][/b]" ); + strings << QString::fromUtf8( "[b][a=1][c=10]- :) [T]ester boldExploit :P -[/c][/a][/b]" ); + strings << QString::fromUtf8( "[b][c=green]Vale - New kid on the block! :D[/c=blue][/b]" ); + // strings << QString::fromUtf8( "�$#F37AF0Vanitosa �$ �$#0A79F5Da strega cattiva a principessa..." ); + foreach( QString str, strings ) + { + QString original( str ); + QString cleaned ( str ); + QString str2 ( str ); + RichTextParser::getCleanString( cleaned ); + RichTextParser::parseMsnString( str, true, true, true, true ); + RichTextParser::getFormattedString( str ); + OldRichTextParser::getCleanString( cleaned ); + OldRichTextParser::parseMsnString( str2, true, true, true, true ); + OldRichTextParser::getFormattedString( str2 ); + KMessageBox::information( kmess_, "" + original + "

    " + cleaned + "

    " + str + "

    " + str2 + "" ); + } +} + + + +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() +{ + static bool initialized = false; + + if( !initialized ) + { + testGroupsAndContacts(); + } + + 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(); + appDir->queryServiceList( MsnAppDirectoryService::GAMES ); +} + + + +void KMessTest::testSystemTray() +{ + quitAfterTest_ = true; + + kmess_->systemTrayWidget_->displayCloseMessage(); +} + + + +void KMessTest::testUpnpConnection() +{ + UPnP::Manager *manager = UPnP::Manager::instance(); + + Q_UNUSED(manager); +} + + +void KMessTest::testXslTransformation() +{ + // A simple test using XSL/XML data of the KMess website + QString wwwRoot( "/srv/www/vhosts/kmess/htdocs" ); + + // Load XSL + XslTransformation *xsl = new XslTransformation(); + xsl->setStylesheet( wwwRoot + "/resources/xsl/kmess.xsl" ); + + // Open XML + QFile file( wwwRoot + "/index.xml" ); + bool open = file.open(QIODevice::ReadOnly); + if( ! open) + { + kWarning() << "Could not open file: " << file.fileName(); + return; + } + + // Load XML + QByteArray fileData = file.readAll(); + QString xml( QString::fromUtf8(fileData.data(), fileData.size()) ); + file.close(); + + // Transform XML + kDebug() << "XSL transformation result:"; + kDebug() << xsl->convertXmlString(xml); + + delete xsl; +} + + + +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/kmess/kmesstest.h b/src/kmesstest.h similarity index 67% rename from kmess/kmesstest.h rename to src/kmesstest.h index 3464907..4b7a68a 100644 --- a/kmess/kmesstest.h +++ b/src/kmesstest.h @@ -20,10 +20,16 @@ #include "kmessdebug.h" // for KMESSTEST -#include +#include + // forward declarations +class Chat; class KMess; +class KMessApplication; +class ChatWindow; + + /** * @brief A class responsible for testing the other classes. @@ -35,39 +41,60 @@ class KMess; * so they are not compiled in the release version. * * @author Mike K. Bennett - * @ingroup Root + * @ingroup Debug */ class KMessTest : public QObject { + // No signals/slots yet, but keep the option open Q_OBJECT public: // The constructor KMessTest(KMess *kmess); // The destructor - ~KMessTest(); + virtual ~KMessTest(); // The main testing function - void test(); + void runTest( const QString &testname ); + // Cleans up and exits kmess if necessary + void endTest(); -#ifdef KMESSTEST private: // Private methods - void testTransferWindow(); + void testAddContactDialog(); + void testChatHistoryDialog(); + void testChallengeHandler(); void testChatWindow(); - void testNotificationConnection(); - void testContactListWithNotificationConnection(); void testConnect(); - void testSettings(); - void testSwitchboardConnection(); + void testContactAddedUserDialog(); + void testContactList(); + void testCrash(); + void testGroupsAndContacts(); + void testMsnPlus(); + void benchmarkParser(); + void testNotificationConnection(); void testNotifications(); void testNowListening(); + void testSettings(); void testSoapConnection(); + void testSwitchboardConnection(); + void testSystemTray(); + void testTransferWindow(); void testUpnpConnection(); void testXslTransformation(); -#endif + void testOfflineMessages(); + + private slots: + 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 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 new file mode 100644 index 0000000..99c867b --- /dev/null +++ b/src/kmessview.cpp @@ -0,0 +1,2101 @@ +/*************************************************************************** + kmessview.cpp - description + ------------------- + begin : Thu Jan 9 2003 + copyright : (C) 2003 by Mike K. Bennett + (C) 2005 by Diederik van der Boor + email : mkb137b@hotmail.com + 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 "kmessview.h" + +#include "contact/contact.h" +#include "contact/group.h" +#include "contact/msnstatus.h" +#include "contact/specialgroups.h" +#include "dialogs/chathistorydialog.h" +#include "dialogs/contactpropertiesdialog.h" +#include "model/contactlist.h" +#include "model/contactlistmodelfilter.h" +#include "utils/kmessshared.h" +#include "utils/kmessconfig.h" +#include "utils/richtextparser.h" +#include "currentaccount.h" +#include "emoticonmanager.h" +#include "kmessdebug.h" +#include "kmessviewdelegate.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef KMESSDEBUG_CONTACTLISTMODELTEST + #include "../tests/modeltest/modeltest.h" +#endif + + +#ifdef KMESSDEBUG_KMESSVIEW + #define KMESSDEBUG_KMESSVIEW_GENERAL + + #ifdef KMESSDEBUG_CONTACTLISTMODEL + #define KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + #endif +#endif + + +// The constructor +KMessView::KMessView( QWidget *parent ) + : QWidget( parent ), + Ui::KMessView(), + contactCopyMapper_(0), + contactMoveMapper_(0), + currentAccount_(0), + initialized_(false), + viewModel_(0) +{ + setupUi( this ); + searchFrame_->hide(); + + // 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); + + // Windows Live Messenger 8.5 and 2009 (latter only in the chat screen) don't + // display any part further than 129 characters. + // TODO: allow further than 129, but display a warning while typing. + personalMessageInput_->setMaxLength( 129 ); + + // Set up the group update timer + updateTimer_.setSingleShot( true ); + connect( &updateTimer_, SIGNAL( timeout() ), + this, SLOT ( slotUpdateGroups() ) ); + + // Set the owner window to always show tooltips on request, + // even if it doesn't have focus. + window()->setAttribute( Qt::WA_AlwaysShowToolTips ); +} + + + +// The destructor +KMessView::~KMessView() +{ + // Delete the contact actions for copy/move to group + qDeleteAll( groupCopyActionsList_ ); + qDeleteAll( groupMoveActionsList_ ); + qDeleteAll( groupCopyLinkActionsList_ ); + delete contactCopyMapper_; + delete contactMoveMapper_; + +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +// The currently playing song was changed. +void KMessView::changedSong( const QString &artist, const QString &/*album*/, const QString &track, bool playing ) +{ + if( playing ) + { + // Show status line + if( ! nowListeningFrame_->isVisible() ) + { + nowListeningFrame_->setHidden(false); + nowListeningFrame_->setMaximumHeight(40); + } + + // Update label + bool showDash = ( ! track.isEmpty() && ! artist.isEmpty() ); + QString longTitle( track + ( showDash ? " - " : "" ) + artist ); + nowListeningLabel_->setText( longTitle ); + } + else + { + // Hide status line + nowListeningFrame_->setHidden(true); + nowListeningFrame_->setMaximumHeight(0); + } +} + + + +// Get the specified item's or the current item's data +const ModelDataList KMessView::getItemData( const QModelIndex &index ) +{ + 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 = QModelIndex( selection.first() ); + // return ModelDataList(); + } + + // 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; +#endif + return ModelDataList(); + } + + // Get the item data + const QVariant& data( itemIndex.data() ); + + // If the data is not a variant map, abort + if( ! data.canConvert( QVariant::Map ) ) + { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Skipping an item with invalid data at index:" << index; +#endif + return ModelDataList(); + } + + // Convert the variant data to a normal map + const ModelDataList& itemData( data.toMap() ); + + // Do nothing if there's no data + if( itemData.isEmpty() ) + { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Skipping an empty item at index:" << index; +#endif + return ModelDataList(); + } + + int type = itemData[ "type" ].toInt(); + + // Do nothing if the item is not of a valid type + if( type != ContactListModelItem::ItemGroup + && type != ContactListModelItem::ItemContact ) + { + return ModelDataList(); + } + + return itemData; +} + + + +// Initialize the class +bool KMessView::initialize( QAbstractItemModel *viewModel ) +{ + bool success; + KIconLoader *loader = KIconLoader::global(); + + // Get a ref to the current account + currentAccount_ = CurrentAccount::instance(); + + if ( initialized_ ) + { + kDebug() << "already initialized."; + return false; + } + + success = initContactListView( viewModel ); + if(! success) + { + kDebug() << "Couldn't initialize contact list view."; + return false; + } + + success = initContactPopup(); + if(! success) + { + kDebug() << "Couldn't initialize contact popup."; + return false; + } + + success = initGroupPopup(); + if(! success) + { + kDebug() << "Couldn't initialize group popup."; + return false; + } + + // 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 ) ); + + // 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( menu, SIGNAL( triggered(QAction*) ), + this, SLOT ( changeStatus(QAction*) ) ); + + // Enable the labels + onlineStatusLabel_->setEnabled(true); + emailLabel_->setEnabled(true); + + // Hide the now listening until something is playing + 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 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 email display settings + this, SLOT ( slotUpdateEmailDisplay() ) ); + 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(); + connect( contactList, SIGNAL( groupAdded(const Group*) ), // A group was added + this, SLOT( rebuildContactActions() ) ); + connect( contactList, SIGNAL( groupChanged(const Group*) ), // A group was modified + this, SLOT( rebuildContactActions() ) ); + connect( contactList, SIGNAL( groupRemoved(const Group*) ), // A group was removed + this, SLOT( rebuildContactActions() ) ); + + // 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 in 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) ) ); + + // 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; +} + + + +// Called when a contact is now online/offline +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; + + if( contact->isOnline() ) + { + item = i18n( "[%1] %2 goes online", QTime::currentTime ().toString( "HH:mm:ss" ) + , friendlyname ); + } + else + { + item = i18n( "[%1] %2 goes offline", QTime::currentTime ().toString( "HH:mm:ss" ) + , friendlyname ); + } + + // Remove oldest item if the count is >= 500 elements + if( historyBox_->count() >= 500 ) + { + historyBox_->removeItem( historyBox_->count() - 1 ); + } + + historyBox_->insertItem( 0, item ); + historyBox_->setCurrentIndex ( 0 ); + } +} + + + +// 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 ) +{ + if( show ) + { + searchFrame_->show(); + searchEdit_->setFocus(); + } + else + { + // Remove the query when closing the search bar + searchEdit_->clearFocus(); + searchEdit_->setText( QString() ); + + searchFrame_->hide(); + contactListView_->setFocus(); + } + + // Save the current state to the Account + currentAccount_->setShowSearchBar( show ); +} + + + +// The personal status message received an event. +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() << "'."; +#endif + return false; + } + + QEvent::Type eventType = event->type(); + + if( obj == currentAccountDisplayPic_ ) + { + if( eventType == QEvent::Enter ) + { + QImage glowingImage( currentAccount_->getPicturePath() ); + KIconEffect::toGamma( glowingImage, 0.8f ); + currentAccountDisplayPic_->setPixmap( QPixmap::fromImage( glowingImage ) ); + } + else if( eventType == QEvent::Leave ) + { + currentAccountDisplayPic_->setPixmap( QPixmap( currentAccount_->getPicturePath() ) ); + } + else if( eventType == QEvent::MouseButtonRelease ) + { + emit showSettings(); + } + } + else if( obj == contactListView_->viewport() ) + { + if( eventType == QEvent::ToolTip ) + { + showToolTip( QCursor::pos() ); + return true; + } + } + else if( obj == contactListView_ ) + { + 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 ) + { + const QModelIndexList& selection( selectionModel_->selectedIndexes() ); + + // Get the currently selected item + if( ! selection.isEmpty() ) + { + slotItemClicked( selection.first(), false ); + } + } + } + } + else if( obj == personalMessageInput_ ) + { + if( eventType == QEvent::Enter ) + { + // Mouse enters widget's boundaries + // Just a bit different from the original client, already change the background line web-forms also do. + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: base; }" ); + } + else if( eventType == QEvent::Leave ) + { + // Mouse leaves the widget. + if( ! personalMessageInput_->hasFocus() ) + { + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: transparent; }" ); + } + } + else if( eventType == QEvent::FocusIn ) + { + // Personal status mesage got the focus + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: base; }" ); + + // Clear if there is no status message, but a placeholder label + if( currentAccount_->getPersonalMessage().isEmpty() ) + { + personalMessageInput_->clear(); + } + else + { + // Select all text for editing + personalMessageInput_->selectAll(); + } + } + else if( event->type() == QEvent::FocusOut ) + { + // Lost the focus + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: transparent; }" ); + } + } + + return false; // don't stop processing. +} + + + +// Initialize the contact list view +bool KMessView::initContactListView( QAbstractItemModel *viewModel ) +{ +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "Initializing the contact list view."; +#endif + + // Create a proxy model to filter and sort the raw contact list view + viewModel_ = new ContactListModelFilter( this ); + viewModel_->setSourceModel( viewModel ); + + // Create a selection model to get data about the list selections + selectionModel_ = new QItemSelectionModel( viewModel_ ); + + // Connect the list to the models + contactListView_->setModel( viewModel_ ); + contactListView_->setSelectionModel( selectionModel_ ); + + // Activate the custom list item painter + contactListView_->setItemDelegate( new KMessViewDelegate( contactListView_ ) ); + + // Set the contact list view's properties +#if QT_VERSION >= 0x040400 + contactListView_->setHeaderHidden( true ); +#else + contactListView_->header()->hide(); +#endif + contactListView_->setAnimated( true ); + contactListView_->setDragEnabled( true ); + contactListView_->setDropIndicatorShown( true ); + contactListView_->setDragDropOverwriteMode( false ); + + // TODO: support drag/drop contacts from another application! + contactListView_->setDragDropMode( QAbstractItemView::InternalMove ); + contactListView_->viewport()->setAcceptDrops( true ); + contactListView_->setAcceptDrops( true ); + + // Set the list stylesheet + slotUpdateView(); + + // Connect the list's signals + connect( contactListView_, SIGNAL( clicked(const QModelIndex&) ), + this, SLOT( slotItemSingleClicked(const QModelIndex&) ) ); + connect( contactListView_, SIGNAL( doubleClicked(const QModelIndex&) ), + this, SLOT( slotItemDoubleClicked(const QModelIndex&) ) ); + connect( contactListView_, SIGNAL( collapsed(const QModelIndex&) ), + this, SLOT( slotGroupChanged(const QModelIndex&) ) ); + connect( contactListView_, SIGNAL( expanded(const QModelIndex&) ), + this, SLOT( slotGroupChanged(const QModelIndex&) ) ); + + // Enable the right-click context menu + contactListView_->setContextMenuPolicy( Qt::CustomContextMenu ); + connect( contactListView_, SIGNAL( customContextMenuRequested(const QPoint&) ), + this, SLOT( showContextMenu(const QPoint&) ) ); + + // Connect the selection model's signals + connect( selectionModel_, SIGNAL( selectionChanged(const QItemSelection&,const QItemSelection&) ), + this, SIGNAL( selectionChanged(const QItemSelection&) ) ); + + return true; +} + + + +// Initialize the contact popup +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 ); + msnProfile_ = new KAction( KIcon("preferences-desktop-user"), i18n("&View Profile"), this ); + chatHistory_ = new KAction( KIcon("user-identity"), i18n("Show Chat &History..."), this ); + contactProperties_ = new KAction( KIcon("user-properties"), i18n("&Properties"), this ); + + addContact_ = new KAction( KIcon("list-add"), i18n("&Add Contact"), this ); + allowContact_ = new KAction( KIcon("dialog-ok-apply"), i18n("A&llow Contact"), this ); + 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 ); + + 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("Song &Name"), this ); + + // Connect the actions + connect( chatWithContact_, SIGNAL(activated()), this, SLOT(slotForwardStartChat()) ); + connect( emailContact_, SIGNAL(activated()), this, SLOT(slotEmailContact()) ); + connect( msnProfile_, SIGNAL(activated()), this, SLOT(slotShowContactProfile()) ); + connect( chatHistory_, SIGNAL(activated()), this, SLOT(slotShowChatHistory()) ); + connect( contactProperties_, SIGNAL(activated()), this, SLOT(slotShowContactProperties()) ); + + connect( addContact_, SIGNAL(activated()), this, SLOT(slotForwardAddContact()) ); + connect( allowContact_, SIGNAL(activated()), this, SLOT(slotForwardAllowContact()) ); + connect( blockContact_, SIGNAL(activated()), this, SLOT(slotForwardBlockContact()) ); + connect( unblockContact_, SIGNAL(activated()), this, SLOT(slotForwardUnblockContact()) ); + connect( removeContact_, SIGNAL(activated()), this, SLOT(slotForwardRemoveContact()) ); + connect( removeFromGroup_, SIGNAL(activated()), this, SLOT(slotForwardRemoveFromGroup())); + + connect( popupCopyFriendlyName_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + connect( popupCopyPersonalMessage_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + connect( popupCopyHandle_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + connect( popupCopyMusic_, SIGNAL(triggered(bool)), this, SLOT( copyText() ) ); + + // Create the signal mappers needed to assign all actions to the move/copy contact slots + contactCopyMapper_ = new QSignalMapper( this ); + contactMoveMapper_ = new QSignalMapper( this ); + connect( contactCopyMapper_, SIGNAL(mapped(const QString&)), this, SLOT(slotForwardCopyContact(const QString&)) ); + connect( contactMoveMapper_, SIGNAL(mapped(const QString&)), this, SLOT(slotForwardMoveContact(const QString&)) ); + + // Initialize the sub menus to copy/move contacts + copyContactToGroup_ = new KActionMenu( i18n("&Copy to Group"), this ); + moveContactToGroup_ = new KActionMenu( i18n("&Move to Group"), this ); + + // Fill them with the current groups names + rebuildContactActions(); + + // Initialize Copy sub popups + popupCopyMenu_ = new KActionMenu( i18n("&Copy"), this ); + popupCopyMenu_ ->addAction( popupCopyFriendlyName_ ); + popupCopyMenu_ ->addAction( popupCopyPersonalMessage_ ); + popupCopyMenu_ ->addAction( popupCopyHandle_ ); + popupCopyMenu_ ->addAction( popupCopyMusic_ ); + popupCopyMenu_->addSeparator(); + + // Initialize the popup menu + // If you re-organize the menu, also consider updating ContactFrame. + contactActionPopup_ = new KMenu( "KMess", this ); + + contactActionPopup_->addAction( chatWithContact_ ); + contactActionPopup_->addAction( emailContact_ ); + contactActionPopup_->addAction( msnProfile_ ); + contactActionPopup_->addAction( chatHistory_ ); + contactActionPopup_->addAction( popupCopyMenu_ ); + + contactActionPopup_->addSeparator(); + + 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; +} + + + +// Initialize the group popup +bool KMessView::initGroupPopup() +{ + // Initialize context menu actions + moveGroupDown_ = new KAction( KIcon("arrow-down"), i18n("Move Group &Down"), this ); + moveGroupUp_ = new KAction( KIcon("arrow-up"), i18n("Move Group &Up"), this ); + removeGroup_ = new KAction( KIcon("edit-delete"), i18n("Re&move Group"), this ); + renameGroup_ = new KAction( KIcon("edit"), i18n("Re&name Group"), this ); + + // Connect the actions + connect( moveGroupDown_, SIGNAL(activated()), this, SLOT( slotMoveGroupDown()) ); + connect( moveGroupUp_, SIGNAL(activated()), this, SLOT( slotMoveGroupUp()) ); + connect( removeGroup_, SIGNAL(activated()), this, SLOT(slotForwardRemoveGroup()) ); + connect( renameGroup_, SIGNAL(activated()), this, SLOT(slotForwardRenameGroup()) ); + + // Initialize the popup menu + groupActionPopup_ = new KMenu( "KMess", this ); + + groupActionPopup_->addAction( moveGroupUp_ ); + groupActionPopup_->addAction( moveGroupDown_ ); + groupActionPopup_->addSeparator(); + + groupActionPopup_->addAction( renameGroup_ ); + groupActionPopup_->addAction( removeGroup_ ); + + return true; +} + + + +// Generate the lists of actions for the "copy/move contact to group" menus +void KMessView::rebuildContactActions() +{ + // Remove all copy and move actions + foreach( KAction *action, groupCopyActionsList_ ) + { + copyContactToGroup_->removeAction( action ); + groupCopyActionsList_.removeAll( action ); + delete action; + } + foreach( KAction *action, groupMoveActionsList_ ) + { + moveContactToGroup_->removeAction( action ); + groupMoveActionsList_.removeAll( action ); + delete action; + } + + // Create the list of groups between which contacts can be moved & copied + QListgroupsList( currentAccount_->getContactList()->getGroupList() ); + foreach( Group *group, groupsList ) + { + // Disallow copying and moving to special groups + if( group->isSpecialGroup() ) + { + continue; + } + + // 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 + const QString& id( group->getId() ); + KAction *copyAction = new KAction( group->getName(), copyContactToGroup_ ); + KAction *moveAction = new KAction( group->getName(), moveContactToGroup_ ); + copyAction->setObjectName( id ); + moveAction->setObjectName( id ); + + copyContactToGroup_->addAction( copyAction ); + moveContactToGroup_->addAction( moveAction ); + + connect( copyAction, SIGNAL(triggered(bool)), contactCopyMapper_, SLOT(map()) ); + connect( moveAction, SIGNAL(triggered(bool)), contactMoveMapper_, SLOT(map()) ); + contactCopyMapper_->setMapping( copyAction, id ); + contactMoveMapper_->setMapping( moveAction, id ); + + groupCopyActionsList_.append( copyAction ); + groupMoveActionsList_.append( moveAction ); + } +} + + + +// The email label was clicked so open the user's preferred email url +void KMessView::slotEmailLabelClicked() +{ + currentAccount_->openMailAtInbox(); +} + + + +// 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 + const ModelDataList& itemData( index.data().toMap() ); + + // Do nothing if the input index was not valid + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemGroup ) + { + return; + } + + Group *group = currentAccount_->getContactList()->getGroupById( itemData[ "id" ].toString() ); + + // Bail out if the group had not been found + if( ! group ) + { + return; + } + + group->setExpanded( contactListView_->isExpanded( index ) ); + + // Save the changed setting + currentAccount_->getContactList()->saveProperties( group ); +} + + + +// Show the context menu +void KMessView::showContextMenu( const QPoint &point ) +{ + const ContactList *contactList = currentAccount_->getContactList(); + + // Get the data from the selected index + const ModelDataList& itemData( getItemData( contactListView_->indexAt( point ) ) ); + + // The index was empty + if( itemData.isEmpty() ) + { + return; + } + + // Depending on the item type, show the appropriate menu + if( itemData[ "type" ] == ContactListModelItem::ItemContact ) + { + const QString& handle( itemData[ "handle" ].toString() ); + const Contact *contact = contactList->getContactByHandle( handle ); + + bool isBlocked = contact->isBlocked(); + bool isFriend = contact->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 && ! contact->isAllowed() && ! isBlocked ); + + // Only one of these is enabled: + blockContact_ ->setVisible( ! isBlocked ); + unblockContact_ ->setVisible( isBlocked ); + + removeContact_ ->setVisible( isFriend ); + + // 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 ) + { + 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 + { + moveContactToGroup_->setVisible( isFriend ); + copyContactToGroup_->setVisible( isFriend ); + removeFromGroup_ ->setVisible( isFriend ); + } + + // Show all copy and move actions + foreach( KAction *action, groupCopyActionsList_ ) + action->setVisible( true ); + foreach( KAction *action, groupMoveActionsList_ ) + action->setVisible( true ); + + // Then hide only the invalid choices + int enabledCopyActions = groupCopyActionsList_.count(); + int enabledMoveActions = groupMoveActionsList_.count(); + foreach( const QString &groupId, contactGroups ) + { + foreach( KAction *action, groupCopyActionsList_ ) + { + // See initContactPopup() for the choice of using objectName to store the group ID + if( action->objectName() == groupId ) + { + enabledCopyActions--; + action->setVisible( false ); + break; + } + } + foreach( KAction *action, groupMoveActionsList_ ) + { + // See initContactPopup() for the choice of using objectName to store the group ID + if( action->objectName() == groupId ) + { + enabledMoveActions--; + action->setVisible( false ); + break; + } + } + } + + // If no actions have been enabled in a menu, disable it too + if( enabledCopyActions <= 0 ) + { + copyContactToGroup_ ->setVisible( false ); + } + if( enabledMoveActions <= 0 ) + { + moveContactToGroup_ ->setVisible( false ); + } + + // Clear the previous actions to avoid duplication of links + qDeleteAll( groupCopyLinkActionsList_ ); + groupCopyLinkActionsList_.clear(); + + // If detailed contact information is available, search for links + if( contact != 0 ) + { + // Append friendly name and personal message so cycle only one time to search links + 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; + 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(); + + // 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 + groupCopyLinkActionsList_.append( popupCopyLink_ ); + + // Add action to copy menu + popupCopyMenu_->addAction( popupCopyLink_ ); + } + } + + // 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 ) + { + const Group *group = contactList->getGroupById( itemData[ "id" ].toString() ); + + // No context menu for special groups + if( ! group || group->isSpecialGroup() ) + { + return; + } + + int pos = group->getSortPosition(); + + moveGroupUp_ ->setEnabled( contactList->getGroupBySortPosition( pos - 1, false ) != 0 ); + moveGroupDown_ ->setEnabled( contactList->getGroupBySortPosition( pos + 1, true ) != 0 ); + + // Show the popup + groupActionPopup_->popup( QCursor::pos() ); + } + else + { + kWarning() << "Invalid type of list item" << itemData[ "type" ]; + } +} + + + +// Copy some details of the contact to the clipboard. +void KMessView::copyText() +{ + // Grep the action sender for copy the tooltip that contains the information + KAction *action = static_cast( const_cast( sender() ) ); + kapp->clipboard()->setText( action->toolTip() ); +} + + + +// Show the contact & group tool tip +void KMessView::showToolTip( const QPoint &point ) +{ + const QModelIndex& index( contactListView_->indexAt( contactListView_->mapFromGlobal( point ) ) ); + QString tipText; + + // Read the actual data off the model index + const ModelDataList& itemData( index.data().toMap() ); + + // Do nothing if the index is not valid + if( ! index.isValid() || itemData.isEmpty() ) + { + return; + } + + // Paint the different types of list items + // see ContactListModelItem::data() for a list of itemData elements (role == DataRole) + switch( itemData[ "type" ].toInt() ) + { + case ContactListModelItem::ItemContact: + { + tipText = "" + "" + "" + "" + "" + "" + "" + "" + "
    " + "" + "" + "
    " + "
    " + "%2 (%3)
    " + "%4 %5 %6" + "

    " + "" + "%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 + 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 + QString personalMessage( itemData[ "personalMessage" ].toString() ); + if( ! personalMessage.isEmpty() ) + { + // Escape HTML, replace standard emoticons, but no links and formatting + RichTextParser::parseMsnString( personalMessage, true, true, false, false ); + tipText = tipText.arg( "" + personalMessage + "
    " ); + } + else + { + tipText = tipText.arg( "" ); + } + + // If the contact is listening to music, show it + const QString& mediaType ( itemData[ "mediaType" ].toString() ); + const QString& mediaString( itemData[ "mediaString" ].toString() ); + if( ! mediaString.isEmpty() ) + { + QString mediaEmoticon; + + // Determine icon for special media types + if( mediaType == "Music" ) + { + mediaEmoticon = EmoticonManager::instance()->getReplacement( "(8)", true ); + } + else if( mediaType == "Gaming" ) + { + mediaEmoticon = EmoticonManager::instance()->getReplacement( "(xx)", true ); + } + + 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 contact 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( propertyLine.arg( i18nc( "Contact email label in list tooltip", "Email address" ) ) + .arg( itemData[ "handle" ].toString() ) ); + + // Add client identifier + const QString& clientName( itemData[ "clientName" ].toString() ); + if( ! clientName.isEmpty() ) + { + tipText = tipText.arg( propertyLine.arg( i18nc( "Contact Live Messenger client label in list tooltip", "Client" ) ) + .arg( Qt::escape( clientName ) ) ); + } + else + { + tipText = tipText.arg( "" ); + } + + //add info whether the contact is blocked + QString blockedString; + if( itemData[ "isBlocked" ].toBool() ) + { + blockedString = i18n( "Yes" ); + } + else + { + blockedString = i18n( "No" ); + } + + tipText = tipText.arg( propertyLine.arg( i18nc( "Contact blocked status label in list tooltip", "Blocked" ) ) + .arg( blockedString ) ); + + // Add last seen date + const QDateTime& lastSeen( itemData[ "lastSeen" ].toDateTime() ); + QString lastSeenString; + + 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(); + } + + 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)
    "; + + // Add the group name + tipText = tipText.arg( i18nc( "Group name in group tooltip", "Group %1", itemData[ "name" ].toString() ) ); + + // Non-empty and non-special groups also have an Online contacts count. + // (Individuals is treated as a non-special group) + if( ( ! itemData[ "isSpecialGroup" ].toBool() || itemData[ "id" ].toString() == SpecialGroups::INDIVIDUALS ) + && itemData[ "totalContacts" ].toInt() > 0 ) + { + tipText = tipText.arg( "%1%2" ).arg( i18ncp( "Contact counters in normal group tooltip, first part", + "%1 contact, ", "%1 contacts, ", + itemData[ "totalContacts" ].toInt() ) ) + .arg( i18ncp( "Contact counters in normal group tooltip, second part", + "%1 online", "%1 online", + itemData[ "onlineContacts" ].toInt() ) ); + } + else + { + tipText = tipText.arg( i18ncp( "Contacts count in special group tooltip", + "%1 contact", "%1 contacts", itemData[ "totalContacts" ].toInt() ) ); + } + break; + + + default: + // Nothing to do! + return; + } + + // Show the tooltip + QToolTip::showText( point, tipText, contactListView_, contactListView_->visualRect( index ) ); +} + + + +// Email the current contact +void KMessView::slotEmailContact() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not valid, do nothing + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Send mail to that account + currentAccount_->openMailAtCompose( itemData[ "handle" ].toString() ); +} + + +// An item was double clicked +void KMessView::slotItemDoubleClicked( const QModelIndex &index ) +{ + // Detect accidental clicks + if( KGlobalSettings::singleClick() ) + { +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "Accidental double click detected, skipping click event."; +#endif + return; + } + + slotItemClicked( index ); +} + + + +void KMessView::slotItemSingleClicked( const QModelIndex &index ) +{ + bool accidental = false; + if( ! KGlobalSettings::singleClick() ) + { +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "Accidental single click detected, skipping click event."; +#endif + + accidental = true; + } + + slotItemClicked( index, accidental ); +} + + + +// An item was clicked +void KMessView::slotItemClicked( const QModelIndex &index, const bool accidental ) +{ + // Get the data from the selected index + const ModelDataList& itemData( getItemData( index ) ); + + // The index was empty + if( itemData.isEmpty() ) + { + kWarning() << "Invalid list index given!"; + return; + } + + switch( itemData[ "type" ].toInt() ) + { + // Expand/collapse the groups when clicked + case ContactListModelItem::ItemGroup: + contactListView_->setExpanded( index, ! itemData[ "isExpanded" ].toBool() ); + break; + + + // Request a chat with that contact + case ContactListModelItem::ItemContact: + if( ! accidental ) + { + // Tell the Chat Master we'd like to start a chat. + emit requestChat( itemData[ "handle" ].toString() ); + } + break; + + + default: +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kWarning() << "Nothing to do!"; +#endif + break; + } +} + + + +// Move down the selected group +void KMessView::slotMoveGroupDown() +{ + const ContactList *contactList = currentAccount_->getContactList(); + + // Get the group data from the selected index + const ModelDataList& itemData( getItemData() ); + Group *group = contactList->getGroupById( itemData[ "id" ].toString() ); + if( ! group || itemData.isEmpty() ) + { + return; + } + + // Obtain the next listed group + Group *nextGroup = contactList->getGroupBySortPosition( group->getSortPosition() + 1, true ); + if( ! nextGroup ) + { + 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(); + + // Swap them + group ->setSortPosition( newGroupPos ); + nextGroup->setSortPosition( oldGroupPos ); + + // Reset old sort value so KMess is not confused (XXX HACK FIXME OMG) + group ->setOldSortPosition( 0 ); + nextGroup->setOldSortPosition( 0 ); +} + + + +// Move up the selected group +void KMessView::slotMoveGroupUp() +{ + const ContactList *contactList = currentAccount_->getContactList(); + + // Get the group data from the selected index + const ModelDataList& itemData( getItemData() ); + Group *group = contactList->getGroupById( itemData[ "id" ].toString() ); + if( ! group || itemData.isEmpty() ) + { + return; + } + + // Obtain the previous listed group + Group *prevGroup = contactList->getGroupBySortPosition( group->getSortPosition() - 1, false ); + if( ! prevGroup ) + { + 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(); + + // Swap them + group ->setSortPosition( newGroupPos ); + prevGroup->setSortPosition( oldGroupPos ); + + // Save the changed setting + contactList->saveProperties( group ); + contactList->saveProperties( prevGroup ); + + // Reset old sort value so KMess is not confused (XXX HACK FIXME OMG) + group ->setOldSortPosition( 0 ); + prevGroup->setOldSortPosition( 0 ); +} + + + +// Forward the "add contact" menu action +void KMessView::slotForwardAddContact() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Add that contact + emit addContact( itemData[ "handle" ].toString() ); +} + + + +// Forward the "allow contact" menu action +void KMessView::slotForwardAllowContact() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Allow that contact + emit allowContact( itemData[ "handle" ].toString() ); +} + + + +// Forward the "block contact" menu action +void KMessView::slotForwardBlockContact() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Block that contact + emit blockContact( itemData[ "handle" ].toString() ); +} + + + +// Called when a contact should be copied +void KMessView::slotForwardCopyContact( const QString &newGroupId ) +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Copy that contact + emit copyContact( itemData[ "handle" ].toString(), newGroupId ); +} + + + +// Called when a contact should be moved +void KMessView::slotForwardMoveContact( const QString &newGroupId ) +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The selection was not valid + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Get the old group ID, and if it's not valid, set it to zero + QString oldGroupId; + if( itemData[ "isInSpecialGroup" ].toBool() == false ) + { + oldGroupId = itemData[ "group" ].toString(); + } + else + { + oldGroupId = "0"; + } + + // If the old and new groups are the same one, do nothing + if( oldGroupId == newGroupId ) + { + return; + } + + // Move that contact + emit moveContact( itemData[ "handle" ].toString(), oldGroupId, newGroupId ); +} + + + +// Forward the "remove contact" menu action +void KMessView::slotForwardRemoveContact() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Remove that contact + emit removeContact( itemData[ "handle" ].toString() ); +} + + +void KMessView::slotForwardRemoveFromGroup() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was invalid + if( itemData.isEmpty() ) + { + return; + } + + // Get the ID of the group which contained this instance of the contact + const ModelDataList& parentItemData( getItemData( selectionModel_->selectedIndexes().first().parent() ) ); + if( parentItemData.isEmpty() || parentItemData[ "type" ] != ContactListModelItem::ItemGroup ) + { + return; + } + + // Remove that contact + emit removeContactFromGroup( itemData[ "handle" ].toString(), parentItemData[ "id" ].toString() ); +} + + +// Forward the "remove group" menu action +void KMessView::slotForwardRemoveGroup() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was invalid + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemGroup ) + { + return; + } + + // Remove that group + emit removeGroup( itemData[ "id" ].toString() ); +} + + + + +// Forward the "rename group" menu action +void KMessView::slotForwardRenameGroup() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was invalid + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemGroup ) + { + return; + } + + // Rename that group + emit renameGroup( itemData[ "id" ].toString() ); +} + + + +// Forward the "start chat" menu action +void KMessView::slotForwardStartChat() +{ + // Only one index can be returned at once by the contact list (has single selection mode) + slotItemClicked( selectionModel_->selectedIndexes().first() ); +} + + + +// Forward the "unblock contact" menu action +void KMessView::slotForwardUnblockContact() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Unblock that contact + emit unblockContact( itemData[ "handle" ].toString() ); +} + + + +// Called when the enter key is pressed on the personal message input +void KMessView::slotPersonalMessageEnterPressed() +{ + personalMessageInput_->clearFocus(); +} + + + +/** + * @brief Called when the personal message input looses focus + * + * Sends to the server the new personal message selected by the user. + * + * @param refreshOnly When true, the PM widget is only updated with the + * current account's message, or with the default + * message, and nothing is sent to the server. + */ +void KMessView::slotPersonalMessageLostFocus( bool refreshOnly ) +{ + 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(); + + // When refreshing the message or when the focus losing isn't voluntary, don't update it on the server + if( refreshOnly || ! isActiveWindow() || ! topLevelWidget()->isActiveWindow() ) + { +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "Refreshing message only: initial update or non-intentional focus lose."; +#endif + + // Refresh the message + const QString &message( currentAccount_->getPersonalMessage( STRING_ORIGINAL ) ); + if( message.isEmpty() ) + { + personalMessageInput_->setToolTip( defaultTooltip ); + personalMessageInput_->setText( defaultMessage ); + } + else + { + personalMessageInput_->setToolTip( message ); + personalMessageInput_->setText( message ); + } + + return; + } + + // Get message + const QString& message( personalMessageInput_->text() ); + +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "Updating personal message to:" << message; +#endif + + // Protect against weird situations where the label is seen as text. + // The lost focus event is also sent when the while window looses focus + if( message == defaultMessage ) + { + kWarning() << "Personal message label was about to be used as personal message!"; + return; + } + + // Only update the message if it's been changed + 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(); + + // Notify changes to the MSN server + emit changePersonalMessage( message ); + } + + // 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:" ); + + // If the search string starts with "regexp:", allow searching with a regexp :) + if( searchFor.startsWith( regexpMagic ) ) + { + searchExpression = searchFor.mid( regexpMagic.length() ); + + // Colorize the search bar when using regexps, according to if they're valid or invalid + if( QRegExp( searchExpression ).isValid() ) + { + searchEdit_->setStyleSheet( "background-color: #bbffbb" ); + } + else + { + searchEdit_->setStyleSheet( "background-color: #ffbbbb" ); + } + } + else + { + // Remove trailing spaces and other unneeded (invisible) characters, then escape the searchstring + searchExpression = QRegExp::escape( searchFor.simplified() ); + searchEdit_->setStyleSheet( "" ); + } + + viewModel_->setFilterRegExp( searchExpression ); + + // Show or hide groups which do or do not contain results + + for( int row = viewModel_->rowCount() - 1; row >= 0; --row ) + { + 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 + 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 isHidden = ( ! viewModel_->hasChildren( index ) ); + + contactListView_->setRowHidden( row, QModelIndex(), isHidden ); + contactListView_->setExpanded( index, true ); + } + // When the search terms are removed, enable back all groups + else + { + contactListView_->setRowHidden( row, QModelIndex(), false ); + contactListView_->setExpanded( index, itemData[ "isExpanded" ].toBool() ); + } + } +} + + + +// Display the chat history of the current contact +void KMessView::slotShowChatHistory() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + ChatHistoryDialog *dialog = new ChatHistoryDialog( this ); + + // Show the selected contact. If no log exists + // (no chats with that person yet), then don't show the History dialog + if( dialog->setContact( itemData[ "handle" ].toString() ) ) + { + dialog->show(); + } + else + { + if( currentAccount_->getSaveChats() ) + { + KMessageBox::sorry( this, + i18n( "No chat logs could be found for this contact." ), + i18n( "No chat history found" ) ); + } + else + { + KMessageBox::sorry( this, + i18n( "No chat logs could be found for this contact. Note that new chats are not logged; if you want your chats to be logged, you can enable it in your account settings." ), + i18n( "No chat history found") ); + } + + delete dialog; + } +} + + + +// Display the profile of the current contact +void KMessView::slotShowContactProfile() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + const QString& handle ( itemData[ "handle" ].toString() ); + KMessShared::openBrowser( KUrl( "http://members.msn.com/default.msnw?mem=" + handle + "&mkt=" + KGlobal::locale()->language() + "&pgmarket" ) ); +} + + + +// Display the properties of the current contact +void KMessView::slotShowContactProperties() +{ + // Get the data from the currently selected index + const ModelDataList& itemData( getItemData() ); + + // The index was not empty + if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) + { + return; + } + + // Get the contact data to pass to the properties dialog + Contact *contact = currentAccount_->getContactList()->getContactByHandle( itemData[ "handle" ].toString() ); + + // If no corresponding contact has been found, do nothing + if( ! contact ) + { + return; + } + + ContactPropertiesDialog *dialog = new ContactPropertiesDialog( this ); + connect( dialog, SIGNAL( removeContactFromGroup(QString,QString) ), + this, SIGNAL( removeContactFromGroup(QString,QString) ) ); + connect( dialog, SIGNAL( addContactToGroup(QString,QString) ), + this, SIGNAL( copyContact(QString,QString) ) ); + dialog->launch( contact ); + delete dialog; +} + + + +// Update the users display pic +void KMessView::slotUpdateDisplayPicture() +{ + // 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() ) ) + { + size = 64; + } + + 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 ); +} + + + +// Change whether or not the email label is displayed based on account settings. +void KMessView::slotUpdateEmailDisplay() +{ + if ( currentAccount_->getShowEmail() && currentAccount_->getEmailSupported() ) + { + emailFrame_->setHidden(false); + //emailFrame_->setMargin(statusLayout_->margin()); + emailFrame_->setMaximumHeight(40); + } + else + { + emailFrame_->setHidden(true); + //emailFrame_->setMargin(0); + emailFrame_->setMaximumHeight(0); + } +} + + + +// Update the expanded status of the list groups +void KMessView::slotUpdateGroups() +{ + // 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" << viewModel_->rowCount() << "rows"; +#endif + + for( int row = viewModel_->rowCount() - 1; row >= 0; row-- ) + { + 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() + || ! viewModel_->hasIndex( row, 0, QModelIndex() ) + || ! index.data().canConvert( QVariant::Map ) ) + { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Skipping an invalid item at row" << row << ":" << index; +#endif + continue; + } + + // Access the index's data + const ModelDataList& itemData( index.data().toMap() ); + + // Skip items which have no children + if( itemData.isEmpty() || itemData[ "type" ].toInt() != ContactListModelItem::ItemGroup ) + { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Skipping a non-group at row" << row << ":" << index; + kDebug() << "Skipped item's details:" << itemData; +#endif + continue; + } + + // 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" ); +#endif + } +} + + + +// Update the email count. +void KMessView::slotUpdateNoEmails() +{ + const QString& message( i18np( "%1 new email message", + "%1 new email messages", + currentAccount_->getNoEmails() ) ); + + // Update the label + emailLabel_->setText( message ); + + // Set the user's preferred email website. + emailLabel_->setUrl( currentAccount_->getEmailUrl() ); +} + + + +// Update the user's status. +void KMessView::slotUpdateUserStatus() +{ + const Status status( currentAccount_->getStatus() ); + + // Avoid newlines, which cause problems to the layout. + 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 ) + ')' ); + onlineStatusLabel_->setText( friendlyName ); + onlineStatusPixmapLabel_->setPixmap( MsnStatus::getIcon( status ) ); +} + + + +// Update the contact list widgets +void KMessView::slotUpdateView() +{ + QString birdStyle; + + // Hide the tree branches + QString listStyle( "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 a background pixmap (but allow not to, by popular request) + if( currentAccount_->getShowContactListBird() ) + { + birdStyle = "QTreeView { " + " background-attachment: fixed; " + " background-origin: content; " + " background-position: bottom right; " + " background-repeat: no-repeat; " + " background-image: url(" + + KIconLoader::global()->iconPath( "background", KIconLoader::User ) + ");" + "}" + ; + } + + contactListView_->setStyleSheet( listStyle + birdStyle ); +} + + + +#include "kmessview.moc" diff --git a/kmess/kmessview.h b/src/kmessview.h similarity index 60% rename from kmess/kmessview.h rename to src/kmessview.h index a97ba1e..31cbc86 100644 --- a/kmess/kmessview.h +++ b/src/kmessview.h @@ -20,24 +20,31 @@ #ifndef KMESSVIEW_H #define KMESSVIEW_H -#include -#include -#include -#include "kmessviewinterface.h" +#include "model/contactlistmodelitem.h" +#include "ui_kmessview.h" + +#include +#include +#include +#include + // Forward declarations class CurrentAccount; class Contact; +class ContactListModelFilter; class Group; -class QListViewItem; -class QToolTip; -class ContactListViewItem; -class GroupListViewItem; class KMessView; +class QItemSelectionModel; +class QSignalMapper; +class QToolTip; + class KAction; class KActionMenu; -class KPopupMenu; +class KMenu; + + /** * @brief The main view area, displaying the user status area and contact list. @@ -49,77 +56,63 @@ class KPopupMenu; * @author Mike K. Bennett * @ingroup Root */ -class KMessView : public KMessViewInterface +class KMessView : public QWidget, private Ui::KMessView { Q_OBJECT + friend class KMessTest; + public: // The constructor - KMessView(QWidget *parent=0, const char *name=0); + KMessView( QWidget *parent=0 ); // The destructor virtual ~KMessView(); // The currently playing song was changed. void changedSong( const QString &artist, const QString &album, const QString &track, bool playing ); - // The program is connected to the server. Store the user account and - // update the user information. - void connected(); - // Called when the program has disconnected from the server. - void disconnected(); // Initialize the class - bool initialize(); + 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 ); protected: // The personal status message received an event. bool eventFilter(QObject *obj, QEvent *ev); private: // Private methods - // Fix the sort positions, by making them incremental again. - void fixGroupSortPositions(); - // Return the contact associated with the given item - Contact * getContactByItem(QListViewItem *item) const; - // Find out whether the contact is added to the group item - ContactListViewItem * getContactItemInGroup(const QListViewItem *groupItem, const Contact *contact) const; - // Return the group associated with the given item - Group * getGroupByItem(QListViewItem *item) const; - // Return the special group the contact should be placed in. - QString getMetaGroupId(const Contact *contact) const; - // Find the first group in the first - GroupListViewItem *findFirstGroup() const; - // Find the next group in the list - GroupListViewItem *findNextGroup(GroupListViewItem *previousGroup) const; + // Get the specified item's or the current item's data + const ModelDataList getItemData( const QModelIndex &index = QModelIndex() ); // Initialize the contact list view - bool initContactListView(); + bool initContactListView( QAbstractItemModel *viewModel ); // Initialize the contact popup - bool initContactPopup(); + bool initContactPopup(); // Initialize the group popup - bool initGroupPopup(); - // Rebuild the contents of the copy-contact menu. - void rebuildCopyMenu(const Contact *contact); - // Rebuild the contents of the move-contact menu. - void rebuildMoveMenu(const Contact *contact); + bool initGroupPopup(); + public slots: // Public slots + // Show the context menu + void showContextMenu( const QPoint &point ); private slots: // Private slots - // Send an e-mail to the current contact. + // Called when a contact is now online/offline + void slotContactChangedStatus( Contact *contact, bool showNotify ); + // Show the contact & group tool tip + void showToolTip( const QPoint &point ); + // 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(); - // Called when a contact was added. - void slotContactAdded(Contact *contact); - // Called when a contact went online or offline - void slotContactChangedOnline(Contact *contact); - // Called when a contact is moved - void slotContactMoved(Contact *contact); - // Called when a contact is removed - void slotContactRemoved(const Contact *contact); - // A list item was right clicked. - void slotContextMenu(QListViewItem *item, const QPoint &point, int col); + // A group was expanded or collapsed + void slotGroupChanged( const QModelIndex &index ); // An item was clicked - void slotItemClicked(QListViewItem *item); - // An item was double-clicked - void slotItemDoubleClicked(QListViewItem *item); - // A list item was executed - void slotItemExecuted(QListViewItem *item); + void slotItemClicked( const QModelIndex &index, const bool accidental = false ); + // An item was single clicked + void slotItemSingleClicked( const QModelIndex &index ); + // An item was double clicked + void slotItemDoubleClicked( const QModelIndex &index ); // Forward the "add contact" menu action void slotForwardAddContact(); // Forward the "allow contact" menu action @@ -127,9 +120,9 @@ class KMessView : public KMessViewInterface // Forward the "block contact" menu action void slotForwardBlockContact(); // Called when a contact should be copied - void slotForwardCopyContact(Group* group); + void slotForwardCopyContact( const QString &groupId ); // Called when a contact should be moved - void slotForwardMoveContact(Group *group); + void slotForwardMoveContact( const QString &groupId ); // Forward the "remove contact" menu action void slotForwardRemoveContact(); // Forward the "remove group" menu action @@ -142,35 +135,40 @@ class KMessView : public KMessViewInterface void slotForwardStartChat(); // Forward the "unblock contact" menu action void slotForwardUnblockContact(); - // Called when a group was added - void slotGroupAdded(Group *group); - // Called when a group was removed - void slotGroupRemoved(const Group *group); - // Called when a group should move down + // Move down the selected group void slotMoveGroupDown(); - // Called when a group should move up + // Move up the selected group void slotMoveGroupUp(); // Called when the enter key is pressed on the personal message input void slotPersonalMessageEnterPressed(); // Called when the personal message input looses focus - void slotPersonalMessageLostFocus(); + 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 chat history of the current contact + void slotShowChatHistory(); // Display the profile of the current contact void slotShowContactProfile(); // Display the properties of the current contact void slotShowContactProperties(); // Update the users display pic - void slotUpdateDisplayPicture(); - // Change whether the allowed,removed groups are displayed. - void slotUpdateDisplaySettings(); + void slotUpdateDisplayPicture(); // Change whether the email label is displayed based on account settings. void slotUpdateEmailDisplay(); + // Update the expanded status of the list groups + void slotUpdateGroups(); // Update the email count. 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(); private: // Private attributes // KActions used in the contact popup menu @@ -180,6 +178,7 @@ class KMessView : public KMessViewInterface KAction *unblockContact_; KAction *chatWithContact_; KAction *msnProfile_; + KAction *chatHistory_; KAction *removeContact_; KAction *removeFromGroup_; KAction *emailContact_; @@ -189,37 +188,41 @@ class KMessView : public KMessViewInterface KAction *moveGroupUp_; KAction *removeGroup_; KAction *renameGroup_; + // KAction uses in the copy popup menu + KActionMenu *popupCopyMenu_; + KAction *popupCopyFriendlyName_; + KAction *popupCopyPersonalMessage_; + KAction *popupCopyHandle_; + KAction *popupCopyMusic_; + QList groupCopyLinkActionsList_; + KAction *popupCopyLink_; // The menu of actions possible to perform on a given contact - KPopupMenu *contactActionPopup_; + KMenu *contactActionPopup_; // The menu of actions possible to perform on a given group - KPopupMenu *groupActionPopup_; + KMenu *groupActionPopup_; // KSelectActions used in the contact popup menu KActionMenu *moveContactToGroup_; KActionMenu *copyContactToGroup_; - // Whether the user is connected. - bool connected_; + // Signal mapper needed to identify the single copy actions + QSignalMapper *contactCopyMapper_; + // Signal mapper needed to identify the single move actions + QSignalMapper *contactMoveMapper_; // A pointer to the instance of the current account CurrentAccount *currentAccount_; + // List of groups between which the user can copy contacts + QList groupCopyActionsList_; + // List of groups between which the user can move contacts + QList groupMoveActionsList_; // Whether or not the object has been initialized bool initialized_; // The background pixmap QPixmap backgroundPixmap_; - - - // Private class for tooltips - class ToolTip : public QToolTip - { - public: - ToolTip( KMessView *kmessView, QToolTipGroup *group = 0 ); - virtual ~ToolTip(); - protected: - void maybeTip(const QPoint &p); - private: - KMessView *kmessView_; - }; - - // Reference to the current tooltip - ToolTip *toolTip_; + // 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_; signals: // Request to add a contact @@ -230,6 +233,8 @@ class KMessView : public KMessViewInterface void blockContact(QString handle); // Request to change the personal message. void changePersonalMessage(QString personalMessage); + // 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. @@ -246,6 +251,8 @@ class KMessView : public KMessViewInterface 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 new file mode 100644 index 0000000..d9affd8 --- /dev/null +++ b/src/kmessview.ui @@ -0,0 +1,621 @@ + + + KMessView + + + + 0 + 0 + 460 + 483 + + + + + 0 + 0 + + + + + 275 + 100 + + + + + 2 + + + 1 + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 96 + 96 + + + + + 96 + 96 + + + + PointingHandCursor + + + QFrame::StyledPanel + + + QFrame::Sunken + + + 1 + + + true + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 0 + + + + + + + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 16 + 16 + + + + true + + + false + + + 1 + + + + + + + + 0 + 0 + + + + + + + Qt::RichText + + + + + + + + + + QToolButton::MenuButtonPopup + + + Qt::ToolButtonTextOnly + + + true + + + + + + + + + + + + 9 + + + + PointingHandCursor + + + Qt::ClickFocus + + + false + + + 256 + + + false + + + false + + + true + + + 1 + + + true + + + + + + + true + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 16 + 16 + + + + true + + + false + + + 1 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 2 + 0 + + + + + + + + true + + + + 0 + 0 + + + + + + + 0 + + + + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 3 + + + 0 + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 16 + 16 + + + + true + + + false + + + 1 + + + + + + + + 0 + 0 + + + + KSqueezedTextLabel + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 0 + + + + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + 16 + 16 + + + + + 16 + 32 + + + + + + + + + + + 50 + + + true + + + true + + + + + + + + + + true + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + 0 + + + 0 + + + + + QWidget#backgroundWidget_ {background-color: palette(alternate-base); } + + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + Qt::ScrollBarAsNeeded + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + QAbstractItemView::ScrollPerPixel + + + false + + + false + + + true + + + true + + + true + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + + KSqueezedTextLabel + QLabel +
    ksqueezedtextlabel.h
    +
    + + KLineEdit + QLineEdit +
    klineedit.h
    +
    + + KUrlLabel + QLabel +
    kurllabel.h
    +
    +
    + + KLineEdit + KSqueezedTextLabel + KUrlLabel + + + + + personalMessageInput_ + returnPressed() + KMessView + slotPersonalMessageEnterPressed() + + + 20 + 20 + + + 20 + 20 + + + + + personalMessageInput_ + lostFocus() + KMessView + slotPersonalMessageLostFocus() + + + 20 + 20 + + + 20 + 20 + + + + + emailLabel_ + leftClickedUrl() + KMessView + slotEmailLabelClicked() + + + 20 + 20 + + + 20 + 20 + + + + +
    diff --git a/src/kmessviewdelegate.cpp b/src/kmessviewdelegate.cpp new file mode 100644 index 0000000..88d8da0 --- /dev/null +++ b/src/kmessviewdelegate.cpp @@ -0,0 +1,372 @@ +/*************************************************************************** + kmessviewdelegate.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 "kmessviewdelegate.h" + +#include "currentaccount.h" +#include "emoticonmanager.h" +#include "contact/msnstatus.h" +#include "contact/specialgroups.h" +#include "model/contactlistmodelitem.h" +#include "utils/richtextparser.h" +#include "kmessdebug.h" + +#include +#include +#include + +#include +#include + + + +/** + * Constructor + * + * Creates two labels which will be used to paint the contact list elements at the location of every item + * + * @param parent The parent object, usually a QTreeView + */ +KMessViewDelegate::KMessViewDelegate( QWidget *parent ) + : QStyledItemDelegate( parent ) + , iconLoader_( KIconLoader::global() ) +{ + // Create test document + textDocument_ = new QTextDocument(); + + // 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 ); +} + + + +/** + * Destructor + */ +KMessViewDelegate::~KMessViewDelegate() +{ + delete textDocument_; +} + + + +/** + * Paint an item of the contact list + * + * This method is called whenever a contact list item needs do be drawn. + * The 'index' parameter is used to extract the data from the list item, and depending on the list item type + * (contact or group mainly) it decides what needs to be drawn and how. + * + * @param painter Painter item, we'll use it to draw our item's contents + * @param option Contains some details about the item we have to draw + * @param index Points to the actual data to be represented + */ +void KMessViewDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const +{ + 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( 0, 0 ); + painter->setRenderHints( QPainter::Antialiasing | QPainter::SmoothPixmapTransform | + QPainter::TextAntialiasing , true ); + + // Read the actual data off the model index + 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. + QPoint position( option.rect.topLeft() ); + position.rx()++; + position.ry()++; + + // Paint the different types of list items + switch( itemData[ "type" ].toInt() ) + { + case ContactListModelItem::ItemGroup: + { + QString groupIconName; + bool showOfflineContacts = currentAccount_->getShowOfflineContacts(); + + // Only show the expansion arrow if there are contacts to show + if( ( showOfflineContacts && itemData[ "totalContacts" ].toInt() > 0 ) + || ( ! showOfflineContacts && itemData[ "onlineContacts" ].toInt() > 0 ) ) + { + groupIconName = ( itemData[ "isExpanded" ].toBool() ? "arrow-down" : "arrow-right" ); + } + else + { + // Show only arrow down if there aren't contacts to show in group + groupIconName = "arrow-down"; + } + + // Get the contact's picture + const QPixmap& pixmap( iconLoader_->loadIcon( groupIconName + , KIconLoader::NoGroup + , KIconLoader::SizeSmall ) ); + + painter->drawPixmap( position, pixmap ); + + // Leave a small margin next to the arrow (even if it's not drawn, so we align the group names anyway) + position.rx() += pixmap.width() + 2; + position.ry() += pixmap.height() -3; + + // Prepare and paint the group name + 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)" + , Qt::escape( itemData[ "name" ].toString() ) + , 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 + painter->setFont( fontBold_ ); + painter->drawText( position, text ); + break; + } + + + case ContactListModelItem::ItemContact: + { + int displayPictureSize = currentAccount_->getListPictureSize(); + + // 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 ); + + painter->drawPixmap( position, pixmap ); + + // If the display picture is enough, show small status icon over the picture + if( displayPictureSize >= 48 ) + { + oldPosition = position; + position.ry() += displayPictureSize - KIconLoader::SizeSmall; + } + else + { + // Leave a small margin next to the display picture + position.rx() += displayPictureSize + 2; + } + } + + // Determine which status image to load + Flags statusFlags = FlagNone; + if( itemData[ "isBlocked" ].toBool() ) + { + statusFlags = FlagBlocked; + } + + painter->drawPixmap( position, MsnStatus::getIcon( (Status) itemData[ "status" ].toInt(), statusFlags ) ); + + if( displayPictureSize >= 48 ) + { + position = oldPosition; + position.rx() += displayPictureSize + 4; + } + else + { + // Leave a small margin next to the status picture + position.rx() += KIconLoader::SizeSmall + 4; + } + + // Get the contact information. + QString friendlyName, personalMessage; + + // Parse the name and message of the contact, adding emoticons and formatting + if( currentAccount_->getUseListFormatting() ) + { + if( ! currentAccount_->getShowContactEmail() ) + { + friendlyName = itemData[ "friendlyFormatted" ].toString(); + } + else + { + friendlyName = itemData[ "handle" ].toString(); + } + + personalMessage = itemData[ "personalMessageFormatted" ].toString(); + } + else + { + 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 + const QString& mediaType ( itemData[ "mediaType" ].toString() ); + if( mediaType == "Music" ) + { + messageString = mediaEmoticonMusic_ + "" + Qt::escape( mediaString ) + ""; + } + else if( mediaType == "Gaming" ) + { + messageString = mediaEmoticonGaming_ + "" + Qt::escape( mediaString ) + ""; + } + } + else if( ! personalMessage.isEmpty() ) // When there's no media, show the PM + { + messageString = "" + personalMessage + ""; + } + + // Draw the text widget + if( messageString.isEmpty() ) + { + // Only person name + text = friendlyName; + } + else if( ! displayPictureSize ) + { + // Person with message after it + text = friendlyName + " - " + messageString + ""; + } + else + { + // Message below, + text = friendlyName + "
    " + messageString + ""; + } + + textDocument_->setHtml( text ); + painter->translate( position.x(), option.rect.topLeft().y() - 2 ); + textDocument_->drawContents( painter ); + break; + } + + default: + kWarning() << "Unknown type of item:" << itemData[ "type" ].toInt(); + kWarning() << "Index:" << index; + kWarning() << "Data:" << itemData; + break; + } + + // Restore the painter to the previous state + painter->restore(); +} + + + +/** + * Return an hint about the size of an item + * + * @param option Contains some details about the item we have to determine size of + * @param index Points to the actual list item + * @return The ize for the given index + */ +QSize KMessViewDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const +{ + Q_UNUSED( option ); + + // Read the actual data off the model index + const ModelDataList& itemData( index.data().toMap() ); + + const QSize size( KIconLoader::SizeSmall + 2, KIconLoader::SizeSmall + 4 ); + + if( itemData.isEmpty() ) + { + return size; + } + + int picturesDimension = currentAccount_->getListPictureSize(); + switch( itemData[ "type" ].toInt() ) + { + case ContactListModelItem::ItemContact: + if( picturesDimension > 0 ) + { + QSize pictureSize( size ); + if( picturesDimension <= 32 ) + { + // Fix the margin + pictureSize.rheight() = 36; + } + else + { + pictureSize.rheight() = picturesDimension + 2; + } + + return pictureSize; + } + else + { + return size; + } + + case ContactListModelItem::ItemGroup: + default: + return size; + } +} + diff --git a/src/kmessviewdelegate.h b/src/kmessviewdelegate.h new file mode 100644 index 0000000..b962612 --- /dev/null +++ b/src/kmessviewdelegate.h @@ -0,0 +1,78 @@ +/*************************************************************************** + kmessviewdelegate.h - 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. * + * * + ***************************************************************************/ + +#ifndef KMESSVIEWDELEGATE_H +#define KMESSVIEWDELEGATE_H + +#include + + +// Forward declarations +class CurrentAccount; +class KIconLoader; +class QTextDocument; +class QFont; + + + +/** + * Displays a contact list item using its model + * + * This class is used by a Contact List view to display a single contact + * or group. It receives the data to display from the Contact List model and paints + * it directly. + * + * @author Valerio Pilo + * @ingroup Root + */ +class KMessViewDelegate : public QStyledItemDelegate +{ + public: + + // Constructor + KMessViewDelegate( QWidget *parent = 0 ); + // Destructor + ~KMessViewDelegate(); + + + public: // Public methods + + // Paint an item of the contact list + 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; + + + private: // Private properties + + // Reference to the current account's properties + CurrentAccount *currentAccount_; + // 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 new file mode 100644 index 0000000..75f38af --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,218 @@ +/*************************************************************************** + main.cpp - description + ------------------- + begin : Sun Jan 5 15:18:36 CST 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 "utils/crashhandler.h" +#include "config-kmess.h" +#include "kmessapplication.h" +#include "kmessdebug.h" + +#include +#include +#include + + + +/** + * @brief Main starting point of KMess. + * @param argc Number of arguments entered at the command line. + * @param argv Array of command line arguments. + * @returns Exit code of the application. + * @ingroup Root + */ +int main(int argc, char *argv[]) +{ + // Init about dialog. + // Tab 1: General + KAboutData aboutData( "kmess", // internal name + 0, // catalog name + ki18n("KMess"), // program name + KMESS_VERSION, // app version from config-kmess.h + ki18n("A Live Messenger client for KDE"), // short description + KAboutData::License_GPL, // license + ki18n("(c) 2002-2009, Mike K. Bennett\n" // copyright + "(c) 2005-2009, Diederik van der Boor\n" + "(c) 2007-2009, Valerio Pilo\n" + "(c) 2008-2009, Antonio Nastasi\n" + "(c) 2008-2009, Ruben Vandamme\n"), + KLocalizedString(), + "http://www.kmess.org/", // home page + "bugs" "@" "kmess" "." "org" // address for bugs + ); + + // 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( 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"), "valerio" "@" "kmess" "." "org" ); + aboutData.addAuthor( ki18n("Antonio Nastasi"), ki18n("Current developer"), "sifcenter" "@" "gmail" "." "com" ); + aboutData.addAuthor( ki18n("Ruben Vandamme"), ki18n("Current developer"), "vandammeru" "@" "gmail" "." "com" ); + aboutData.addAuthor( ki18n("Sjors Gielen"), ki18n("Current developer"), "sjors" "@" "kmess" "." "com" ); + aboutData.addAuthor( ki18n("Adam Goossens"), ki18n("Current developer"), "fontknocker""@" "gmail" "." "com" ); + + // Tab 3: Credits + 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( 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("Sergio Rafael Lemke"), ki18n("More Brazilian Portuguese translation"), "bedi" "." "com" "@" "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( ki18n("Adrià Arrufat"), ki18n("More Catalan translation"), "swiftscythe" "@" "gmail" "." "com"); + + 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( 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( ki18n("Heimen Stoffels"), ki18n("More Dutch translation"), "djmusic121" "@" "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( 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( ki18n("Antony Hussi"), ki18n("More Finnish translation"), "antony.hussi" "@" "tranciend" "." "com"); + + 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( ki18n("Scias"), ki18n("More French translation"), "shining" "." "scias" "@" "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("Andrea Decorte"), ki18n("More Italian translation, Group selection in 'contact added user' dialog"), "adecorte" "@" "gmail" "." "com"); + 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( 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("Manuel Ramírez"), ki18n("More Spanish translation"), "elpreto" "@" "kde" "." "org" "." "ar"); + + 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( 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("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( 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( 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( 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")); + aboutData.addCredit( ki18n("Quassel"), ki18n("KNotify not giving focus bug fix and KWin focus stealing prevention workaround")); + + // 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 forum!\nIf you feel your name is missing here, please contact us too!"), "you@kmess.org"); + + // Add the translation names from the .po file: + aboutData.setTranslator( ki18nc("NAME OF TRANSLATORS", "Your names"), + ki18nc("EMAIL OF TRANSLATORS", "Your email addresses") ); + + + // 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, + // make sure we can run tests fast. +#ifdef KMESSTEST + options.add( "runtest ", ki18n("Run a debug test (developer build only)") ); +#endif + + + // Initialize the crash handler first. + if( argc > 0 ) + { + CrashHandler::setAppName( QLatin1String( argv[0] ) ); + } + + // Parse command line + // Also pass about data for the arguments help dialog. + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); + + // Create the KApplication object + // and start the event loop + KMessApplication kmessApp; + + return kmessApp.exec(); +} diff --git a/src/model/contactlist.cpp b/src/model/contactlist.cpp new file mode 100644 index 0000000..6c39a01 --- /dev/null +++ b/src/model/contactlist.cpp @@ -0,0 +1,2015 @@ +/*************************************************************************** + contactlist.cpp - description + ------------------- + begin : Sun Jan 5 2003 + copyright : (C) 2003 by Mike K. Bennett + (C) 2005 by Diederik van der Boor + 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 "contactlist.h" + +#include "../contact/contact.h" +#include "../contact/contactextension.h" +#include "../contact/group.h" +#include "../contact/msnobject.h" +#include "../contact/specialgroups.h" +#include "../utils/kmessconfig.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include +#include + +#include + + +#ifdef KMESSDEBUG_CONTACTLIST + #define KMESSDEBUG_CONTACTLIST_GENERAL + #define KMESSDEBUG_CONTACTLIST_TOOLTIP + #define KMESSDEBUG_CONTACTLIST_DISCONNECTION +#endif + + + +// The constructor +ContactList::ContactList() +: rootNode_(0) +{ +} + + + +// 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 ); + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +// Add a contact to the contact list +Contact * ContactList::addContact( const QString& handle, const QString& friendlyName, int lists, + QStringList groupIds, const QString& guid ) +{ + // Ignore call if we are closing... + // TODO: prevent this issue from happening in the first place. + if( KMESS_NULL(rootNode_) ) return 0; + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "Adding to list contact" << handle << " in groups" << groupIds; +#endif + +#ifdef KMESSTEST + KMESS_ASSERT( ! handle.isEmpty() ); +#endif + + if( handle.isEmpty() ) + { + return 0; + } + + // 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_.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; + } + else + { + if( contact->isAllowed() ) + { + groupIds << SpecialGroups::ALLOWED; + } + else + { + groupIds << SpecialGroups::REMOVED; + } + } + + // Add it to the nodes it belongs to + foreach( const QString &id, groupIds ) + { + ContactListModelItem *groupNode = rootNode_->childGroup( id ); + if( ! groupNode ) + { + kWarning() << "Contact's group" << id << "doesn't exist!"; + continue; + } + + // form a QModelIndex for the group which will parent this contact + const QModelIndex& groupIdx( index( groupNode->row(), 0, QModelIndex() ) ); + + if ( !groupIdx.isValid() ) + { + kWarning() << "Formed invalid index for group " << id << " for contact " << handle << ", not adding to group"; + continue; + } + + beginInsertRows( groupIdx, groupNode->childCount(), groupNode->childCount() ); + + new ContactListModelItem( contact, groupNode ); + + endInsertRows(); + } + + // Attach the signals + connect( contact, SIGNAL( changedMsnObject(Contact*) ), // Contact changed msnobject + this, SIGNAL( contactChangedMsnObject(Contact*) )); + connect( contact, SIGNAL( contactOffline(Contact*,bool) ), // Contact went offline + this, SLOT ( slotForwardContactOffline(Contact*,bool) )); + connect( contact, SIGNAL( contactOnline(Contact*,bool) ), // Contact went online + this, SLOT ( slotForwardContactOnline(Contact*,bool) )); + connect( contact, SIGNAL( changedGroup(Contact*) ), // Contact moved + this, SLOT ( slotContactMoved(Contact*) )); + 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( const QString& groupId, const QString& groupName ) +{ + // Ignore call if we are closing... + // TODO: prevent this issue from happening in the first place. + if( KMESS_NULL(rootNode_) ) return 0; + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << groupName << "(" << groupId << ")"; +#endif + + // Check if the group already exists + if ( groupExists( groupId ) ) + { + kDebug() << "Group " << groupId << " already exists."; + return 0; + } + + // Create the group + Group *group = new Group( groupId, groupName ); + groups_.append( group ); + + if( group->isSpecialGroup() ) + { + group->setSortPosition( 9999 ); + } + else + { + // Set a temporary sort position; if we're initializing this will be changed + // later when reading the contactlist file (see ContactList::readProperties()), + // otherwise this will be the initial sP for this group so it's added at the end + group->setSortPosition( groups_.count() - 1 ); + connect( group, SIGNAL( changedPosition( Group*, int, int ) ), + this, SLOT( slotGroupMoved( Group*, int, int ) ) ); + } + + // Insert the new + beginInsertRows( QModelIndex(), rootNode_->childCount(), rootNode_->childCount() ); + + new ContactListModelItem( group, rootNode_ ); + + endInsertRows(); + + // Signal the UI + emit groupAdded( group ); + + return group; +} + + + +// Change a contact's status (and update the friendly name) +void ContactList::changeContactStatus( const QString& handle, Status status, const QString& friendlyName, + uint capabilities, const QString& msnObjectString, bool showBaloon ) +{ + // Ignore call if we are closing... + // TODO: prevent this issue from happening in the first place. + if( KMESS_NULL(rootNode_) ) return; + + // Get the contact + Contact *contact = getContactByHandle( handle ); + if ( contact == 0 ) + { + kWarning() << "changeContactStatus - Couldn't find contact " << handle << " in the contact list."; + return; + } + + // Store the old online state to detect a change + bool wasOnline = contact->isOnline(); + Status oldStatus = contact->getStatus(); + + // Update the settings + if( ! friendlyName.isEmpty() ) + { + contact->setFriendlyName( friendlyName ); + } + contact->setStatus( status, showBaloon ); + + // If the contact gone offline/online, don't remove the msnobject and leave the current picture + if( ! msnObjectString.isNull() ) + { + contact->loadMsnObject( msnObjectString ); + } + + contact->setCapabilities( capabilities ); // also resets clientName if the caps have changed. + + // 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() ) + { + const MsnObject *msnObject = contact->getMsnObject(); + contact->detectClientName( capabilities, msnObject ); + } + + // The contact is changing status but not switching between online/offline + if( wasOnline == isOnline || ! contact->isFriend() ) + { + 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 it has connected or disconnected + + // Get references to both the Online and Offline groups + ContactListModelItem *sourceGroup, *destinationGroup; + if( contact->isOnline() ) + { + // 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(); +} + + + +/** + * Get the number of columns present in an index + * + * 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; + } + + return rootNode_->columnCount(); +} + + + +// Return whether or not the contact with the given handle exists +bool ContactList::contactExists( QString handle ) +{ + return getContactByHandle( handle ) != 0; +} + + + +/** + * Return the data contained by an index in the model + * + * @param index Points to the actual data to be returned + * @param role Indicates what data from the index needs to be obtained. + * @see http://doc.trolltech.com/4.3/qt.html#ItemDataRole-enum for available roles + */ +QVariant ContactList::data( const QModelIndex &index, int role ) const +{ + const ContactListModelItem *item = static_cast( index.internalPointer() ); + + // If the index isn't valid or contained non valid data, do nothing + if( ! index.isValid() || ! item ) + { + return QVariant(); + } + + return item->data( role ); +} + + + +// Insert dropped data in the model (move/copy stuff around, 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 from 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; + } + + Group *targetGroup = static_cast( targetItem->object() ); + + // Avoid moving the contact where it already is + if( contact->getGroupIds().contains( targetGroup->getId() ) ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact where it already is."; +#endif + continue; + } + + // Avoid moving contacts to special groups - which have no counterpart on the server + if( targetGroup->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact to a special group."; +#endif + continue; + } + +#ifdef KMESSDEBUG_CONTACTLIST + kDebug() << "Moving contact from group" << sourceGroup->getId() << "to" << targetGroup->getId(); +#endif + emit dndMoveContactToGroup( contact->getHandle(), sourceGroup->getId(), targetGroup->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 *targetGroup = static_cast( targetItem->parent()->object() ); + + // Avoid moving the contact where it already is + if( contact->getGroupIds().contains( targetGroup->getId() ) ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact where it already is."; +#endif + continue; + } + + // Avoid moving contacts to special groups - which have no counterpart on the server + if( targetGroup->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact to a special group."; +#endif + continue; + } + +#ifdef KMESSDEBUG_CONTACTLIST + kDebug() << "Moving contact from group" << sourceGroup->getId() << "to" << targetGroup->getId(); +#endif + emit dndMoveContactToGroup( contact->getHandle(), sourceGroup->getId(), targetGroup->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; + } + + Group *targetGroup = static_cast( targetItem->object() ); + + // Avoid moving contacts to special groups - which have no counterpart on the server + if( targetGroup->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move to a special group."; +#endif + continue; + } + +#ifdef KMESSDEBUG_CONTACTLIST + kDebug() << "Swapping groups" << sourceGroup->getName() << "and" << targetGroup->getName(); +#endif + // Get the group sorting position for both groups + int oldGroupPos = targetGroup->getSortPosition(); + int newGroupPos = sourceGroup->getSortPosition(); + + // Swap them + targetGroup->setSortPosition( newGroupPos ); + sourceGroup->setSortPosition( oldGroupPos ); + + // Save the changed setting + saveProperties( targetGroup ); + saveProperties( sourceGroup ); + + // Reset the oldSortPosition (XXX HACK FIXME OMG) + targetGroup->setOldSortPosition( 0 ); + sourceGroup->setOldSortPosition( 0 ); + break; + } + + // Group dropped to a contact + case ContactListModelItem::ItemContact: + { + 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; + } + +#ifdef KMESSDEBUG_CONTACTLIST + kDebug() << "Swapping groups" << sourceGroup->getName() << "and" << targetGroup->getName(); +#endif + + // Get the group sorting position for both groups + int oldGroupPos = targetGroup->getSortPosition(); + int newGroupPos = sourceGroup->getSortPosition(); + + // Swap them + targetGroup->setSortPosition( newGroupPos ); + sourceGroup->setSortPosition( oldGroupPos ); + + // Save the changed setting + saveProperties( targetGroup ); + saveProperties( sourceGroup ); + + // Reset the oldSortPosition (XXX HACK FIXME OMG) + targetGroup->setOldSortPosition( 0 ); + sourceGroup->setOldSortPosition( 0 ); + break; + } + } + + break; + } + // End of handling of dropped groups + + case ContactListModelItem::ItemRoot: + { + /** + * Root can't be moved, let alone dropped anywhere :) + */ + break; + } + } + } + + return true; +} + + + +/** + * Dumps the contact list contents to the debug output + * + * 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 + */ +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(); + kDebug() << "Rows:" << rowCount(); + kDebug() << "Root group Columns:" << rootNode_->columnCount(); + kDebug() << "Root group Rows:" << rootNode_->childCount(); + kDebug(); + kDebug() << "Contact List model dump"; + kDebug() << "--------------------------------------"; + kDebug() << "Root @" << (void*)rootNode_; + started = true; + } + + QString spacer( QString().fill( '-', 2 * depth ) + ">" ); + int sortRole = ContactListModelItem::SortRole; + + // Print the current node's contents, and manage children recursively + for( int i = 0; i < start->childCount(); i++ ) + { + ContactListModelItem* item = start->child( i ); + int type = item->getType(); + + switch( type ) + { + case ContactListModelItem::ItemContact: + kDebug() << spacer << (i+1) << ") Contact:" + << item->data( 0 ).toMap()["handle"].toString() + << "(" << item->data( sortRole ).toInt() << ") " + "@" << (void*)item; + break; + + case ContactListModelItem::ItemGroup: + kDebug() << spacer << (i+1) << ") Group:" + << item->data( 0 ).toMap()["id"].toString() + << "(" << item->data( sortRole ).toInt() << ") " + "@" << (void*)item; + dump( item, depth + 1 ); + break; + + default: + kDebug() << spacer << "Unknown type of item: " + type << "@" << (void*)item; + break; + } + } + + if( started ) + { + kDebug() << "--------------------------------------"; + } +#else + Q_UNUSED( start ); + Q_UNUSED( depth ); +#endif +} + + + +// Remove gaps and duplicates in the groups list +// This is necessary to keep all group moving code working +void ContactList::ensureGroupListValid() +{ + QList newGroupList; + QList matches; + Group *group; + int fillOffset = 0; + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "Checking the group list against duplicates and gaps..."; + int gaps = 0, duplicates = 0; +#endif + + // fix any non-special groups with a position below 5 to have a position above 5 + // we will assume the special groups (pos 0 .. 4) are correct, since they are set by the code itself. + for( int j = 0; j < groups_.count(); ++j ) + { + group = groups_.at( j ); + if( group->getSortPosition() < 5 && ! group->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kWarning() << "Found a non-special group with sortPosition < 5, resetting to " << group->getSortPosition() + 5; +#endif + // the part below will automatically fix any duplicates caused by this: + group->setSortPosition( group->getSortPosition() + 5 ); + } + else if( group->isSpecialGroup() ) + { + // add it to the list + newGroupList << group; + } + } + + // Find the highest position (this is *not* groups_.count(), because the list can be invalid at this point) + // highestPosition + fillOffset, below, is the highest position in the new groups list, so we can use that + // to check if we're done below. + int highestPosition = 0; + for( int i = 0; i < groups_.count(); ++i) + { + if( groups_.at( i )->getSortPosition() > highestPosition) + { + highestPosition = groups_.at( i )->getSortPosition(); + } + } + + // check for duplicates and gaps (only check non-special groups) + for( int pos = 5; pos < groups_.count(); ++pos ) + { + matches.clear(); + + // Check sortPosition pos, is there exactly *one* group with this sortPosition? + for( int j = 0; j < groups_.count(); ++j ) + { + group = groups_.at( j ); + if( group->isSpecialGroup() ) + { + // Skip special groups + continue; + } + if( newGroupList.contains( group ) ) + { + // Skip already handled groups + continue; + } + + if( group->getSortPosition() == pos ) + { + matches << group; + } + } + + if( matches.count() == 1 ) + { + // it's OK, just copy this group + matches.at( 0 )->setSortPosition( pos + fillOffset ); + newGroupList << matches.at( 0 ); + } + else if( matches.count() == 0 ) + { +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kWarning() << "Gap found in group list for position " << pos << ", fixing."; + gaps++; +#endif + // there's a gap, lower all other indices in the group list + fillOffset--; + } + else + { +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kWarning() << "Duplicate found in group list for position " << pos << ", fixing."; + duplicates++; +#endif + + // don't increase the fillOffset for the first one + matches.at( 0 )->setSortPosition( pos + fillOffset ); + newGroupList << matches.at( 0 ); + + // add all the others, incrementing the index fix for every add + for( int dup = 1; dup < matches.count(); ++dup ) + { + fillOffset++; + matches.at( dup )->setSortPosition( pos + fillOffset ); + newGroupList << matches.at( dup ); + } + } + } + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "Done checking the contact list. " << duplicates << " duplicates, " << gaps << " gaps fixed."; +#endif + + groups_.clear(); + groups_ << newGroupList; +} + + + +// Find out if a model index contains other indices +bool ContactList::hasChildren( const QModelIndex &parent ) const +{ + if( parent.column() > 0 ) + { + return false; + } + + if( ! parent.isValid() ) + { + if( rootNode_ == 0 ) + { + return false; + } + + return ( rootNode_->childCount() > 0 ); + } + + const ContactListModelItem *item = static_cast( parent.internalPointer() ); + + if( ! item ) + { + return false; + } + + return ( item->childCount() > 0 ); +} + + + +// Find out if the model contains a valid index at the specified position +bool ContactList::hasIndex( int row, int column, const QModelIndex &parent ) const +{ + if( ! parent.isValid() ) + { + if( rootNode_ == 0 ) + { + return false; + } + + return ( ( row >= 0 && row < rootNode_-> childCount() ) + && ( column >= 0 && column < rootNode_->columnCount() ) ); + } + + if( parent.column() > 0 ) + { + return false; + } + + const ContactListModelItem *item = static_cast( parent.internalPointer() ); + + if( ! item ) + { + return false; + } + + return ( ( row >= 0 && row < item-> childCount() ) + && ( column >= 0 && column < item->columnCount() ) ); +} + + + +// Find out if a group contains contacts +bool ContactList::isGroupEmpty( const QString &groupId ) const +{ + ContactListModelItem *item = rootNode_->childGroup( groupId ); + if( item == 0 ) + { + kWarning() << "Cannot find group" << groupId; + return false; + } + + return ( item->childCount() <= 0 ); +} + + + +/** + * Return the flags which characterize the index + * + * @param index Points to the data to get flags of + * @return The index's flags + */ +Qt::ItemFlags ContactList::flags( const QModelIndex &index ) const +{ + if( ! index.isValid() ) + { + return 0; + } + + ContactListModelItem *item = static_cast( index.internalPointer() ); + + if( item == 0 ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Invalid target item!"; +#endif + return 0; + } + + const Group *group; + bool canBeDragged = false; + bool canBeDropped = false; + Qt::ItemFlags indexFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + + // Enable d&d only for certain kinds of items + switch( item->getType() ) + { + // You can d&d contacts in normal groups + case ContactListModelItem::ItemContact: + group = static_cast( item->parent()->object() ); + + // Dragging check: can be dragged only contacts in normal groups and in the individuals group + if( group->isSpecialGroup() == false || group->getId() == SpecialGroups::INDIVIDUALS ) + { + canBeDragged = true; + } + + // Dropping check: only contacts in normal groups can be dropped on + if( group->isSpecialGroup() == false ) + { + canBeDragged = true; + } + break; + + case ContactListModelItem::ItemGroup: + group = static_cast( item->object() ); + + // Dragging and dropping are disabled for all special groups + if( group->isSpecialGroup() == false ) + { + canBeDragged = true; + canBeDropped = true; + } + break; + + default: + break; + } + + // Add the d&d flags if necessary + if( canBeDragged ) + { + indexFlags |= Qt::ItemIsDragEnabled; + } + if( canBeDropped ) + { + indexFlags |= Qt::ItemIsDropEnabled; + } + + return indexFlags; +} + + + +/** + * Emits the Data Changed signal on one item + * + * This is only an overloaded version for the list forwardDataChanged() method + * + * @param item The item which changed + */ +void ContactList::forwardDataChanged( ContactListModelItem *item ) +{ + forwardDataChanged( ModelItemList() << item ); +} + + + +/** + * Emits the Data Changed signal on some items + * + * @param itemList The list of items which changed + */ +void ContactList::forwardDataChanged( ModelItemList itemList ) +{ + if( itemList.isEmpty() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Called with an empty list!"; +#endif + return; + } + + foreach( ContactListModelItem *item, itemList ) + { + 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 +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "--------------------------------------------------"; + kDebug() << "Item :" << item; + kDebug() << "Root item :" << rootNode_; + kDebug() << "Parent item :" << item->parent(); + kDebug() << "Index :" << changedIndex; + kDebug() << "Parent index :" << changedIndex.parent(); + if( changedIndex.parent().isValid() ) + kDebug() << "Parent index refers to:" << static_cast( changedIndex.parent().internalPointer() ); + else + kDebug() << "Parent index refers to: Root, or a broken item"; + 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 +{ + // No need to optimize, only called for ADC en REM now. + foreach( Contact *contact, contacts_ ) + { + if(contact->getGuid() == guid) + { + return contact; + } + } + + return 0; +} + + + +// Return the contact with the given handle +Contact* ContactList::getContactByHandle( QString handle ) const +{ + // Optimized with hashing because it's called a lot + return contacts_.value( handle, 0 ); +} + + + +// Return the list of contacts +const QHash& ContactList::getContactList() const +{ + return contacts_; +} + + + +// Return the group with the given id +Group* ContactList::getGroupById( QString groupId ) const +{ + foreach( Group *group, groups_ ) + { + if( group->getId() == groupId ) + { + return group; + } + } + + return 0; +} + + + +// 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 +// because of ensureGroupListValid(), there will be no gaps, so there will always +// be a group with given sort position. +Group* ContactList::getGroupBySortPosition( int sortPosition, bool next ) const +{ + Q_UNUSED( next ); + + foreach( Group *group, groups_ ) + { + if ( group->getSortPosition() == sortPosition ) + { + return group; + } + } + + return 0; +} + + + +// Return the list of groups +const QList& ContactList::getGroupList() const +{ + return groups_; +} + + + +// Return whether or not a group with the given id exists +bool ContactList::groupExists( QString groupId ) +{ + return getGroupById( groupId ) != 0; +} + + + +/** + * 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 + * @param orientation Whether the headers are horizontal or vertical + * @param role Indicates what type of text needs to be obtained. + * @return A QVariant version of the text + */ +QVariant ContactList::headerData( int section, Qt::Orientation orientation, int role ) const +{ + Q_UNUSED( section ); + Q_UNUSED( orientation ); + Q_UNUSED( role ); + + return QVariant(); +} + + + +/** + * Obtain a model index for a specifically located item + * + * @param row Row of the item + * @param column Column of the item + * @param parent Parent of the model which contains the row and column. If invalid, the root group is used. + * @return An index for the specified item, or an invalid index if it hasn't been found + */ +QModelIndex ContactList::index( int row, int column, const QModelIndex &parent ) const +{ + if( ! hasIndex( row, column, parent ) || ! rootNode_ ) + { + return QModelIndex(); + } + + ContactListModelItem *parentItem; + + if( ! parent.isValid() ) + { + parentItem = rootNode_; + } + else + { + parentItem = static_cast( parent.internalPointer() ); + } + + ContactListModelItem *childItem = parentItem->child( row ); + if( childItem ) + { + return createIndex( row, column, childItem ); + } + else + { + return QModelIndex(); + } +} + + + +/** + * Obtain a model index's parent index + * + * @param index Points to the item to find the parent of + * @return An index for the parent of the specified item, or an invalid index if it hasn't been found + */ +QModelIndex ContactList::parent( const QModelIndex &index ) const +{ + if( ! index.isValid() ) + { + return QModelIndex(); + } + + ContactListModelItem *item = static_cast( index.internalPointer() ); + + if( ! item || item == rootNode_ ) + { + return QModelIndex(); + } + + ContactListModelItem *parentItem = item->parent(); + + if( ! parentItem || parentItem == rootNode_ ) + { + return QModelIndex(); + } + + return createIndex( parentItem->row(), 0, parentItem ); +} + + + +/** + * Apply to the model a contact's movement through lists and groups + * + * This method is called when a contact changes between two lists, for example from blocked to allowed; + * and when changes group, for example when it is moved or copied from a group to another. + * First it identifies lists and groups where the contact was and will be; then the changes are applied. + * The contact's list items are then iteratively moved from the old to the new lists/groups, and any + * remaining addition and removal is performed. + * + * @param contact The contact to update in the model + */ +void ContactList::slotContactMoved( Contact *contact ) +{ + 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 + ModelItemList newNodes; + foreach( const QString &groupId, groupIds ) + { + ContactListModelItem *item = rootNode_->childGroup( groupId ); + if( item ) + { + newNodes << item; + } + } + + // 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 the Individuals group + if( groupIds.isEmpty() ) + { + newNodes << rootNode_->childGroup( SpecialGroups::INDIVIDUALS ); + } + + if( contact->isOnline() ) + { + newNodes << rootNode_->childGroup( SpecialGroups::ONLINE ); + } + else + { + newNodes << rootNode_->childGroup( SpecialGroups::OFFLINE ); + } + } + else + { + if( contact->isAllowed() ) + { + newNodes << rootNode_->childGroup( SpecialGroups::ALLOWED ); + } + else + { + newNodes << rootNode_->childGroup( SpecialGroups::REMOVED ); + } + } + + ModelItemList allGroups( rootNode_->childGroups() ); + foreach( ContactListModelItem *node, allGroups ) + { + // If new nodes doesn't contain current node, remove contact from it if it's in. + if( ! newNodes.contains( node ) ) + { + // If we found the contact, remove it + if( node->childContact( handle ) ) + { + removeContactFromGroup( handle, node ); + } + } + else + { + if( ! node->childContact( handle ) ) + { + const QModelIndex& groupIndex( index( node->row(), 0, QModelIndex() ) ); + + beginInsertRows( groupIndex, node->childCount(), node->childCount() ); + + new ContactListModelItem( contact, node ); + + endInsertRows(); + } + // else leave it + } + } +} + + + +// Forward from a group that it has moved +void ContactList::slotGroupMoved( Group *group, int oldPosition, int newPosition ) +{ + if( oldPosition == newPosition ) + { +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "A group moved to the same location, skipping handling."; +#endif + return; + } + + // Find out which group was replaced by this one + // Can't use getGroupBySortPosition, because the group list contains a duplicate at this point; + // this is a FIXME/XXX/TODO/HACK/OMG for 2.1, when we split up ContactList! + Group *oldGroup = 0; + for( int i = 0; i < groups_.size(); ++i ) + { + Group *itGroup = groups_.at(i); + if( itGroup->getSortPosition() == newPosition + && itGroup != group ) + { + oldGroup = itGroup; + break; + } + } + + // If this group doesn't exist, maybe it was just swapped? + if( oldGroup == 0 ) + { + for( int i = 0; i < groups_.size(); ++i ) + { + Group *itGroup = groups_.at(i); + if( itGroup->getOldSortPosition() == newPosition + && itGroup != group ) + { + oldGroup = itGroup; + break; + } + } + } + + if( KMESS_NULL( oldGroup ) ) + { + // This happens when newPosition > groups_.count(), i.e., invalid moving code + kWarning() << "Couldn't find a group with index " << newPosition << "!"; + return; + } + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "Moving group" << group->getName() << "(position" << oldPosition << ")" + << "to position" << newPosition << "(currently group" << oldGroup->getName() << ")"; +#endif + + // 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( index( newPosRow, 0, QModelIndex() ) ); + QModelIndex oldPosIndex( index( oldPosRow, 0, QModelIndex() ) ); + + if( oldPosRow < newPosRow ) + { + emit dataChanged( oldPosIndex, newPosIndex ); + } + else + { + 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) +{ +#ifdef KMESSTEST + KMESS_ASSERT( contact != 0 ); +#endif + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + if ( contact != 0 ) + { + kDebug() << "Forwarding that " << contact->getHandle() << " went offline."; + } +#endif + + emit contactOffline( contact, showBaloon ); +} + + + +// Forward from a contact that it is online +void ContactList::slotForwardContactOnline(Contact *contact, bool showBaloon) +{ +#ifdef KMESSTEST + KMESS_ASSERT( contact != 0 ); +#endif + +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + if ( contact != 0 ) + { + kDebug() << "Forwarding that " << contact->getHandle() << " went online."; + } +#endif + + emit contactOnline( contact, 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; + } + + // Go through the contact's groups and remove the associated + // modelitem for the contact. + foreach( const QString& groupId, contact->getGroupIds() ) + { + removeContactFromGroup( contact->getHandle(), rootNode_->childGroup( groupId ) ); + } + + // remove from internal list of contacts. + contacts_.remove( contact->getHandle() ); + + // 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 contact from a group properly. +void ContactList::removeContactFromGroup ( const QString& handle, ContactListModelItem *groupItem ) +{ + if ( ! groupItem ) + { + kWarning() << "Invalid group"; + return; + } + + const QModelIndex& groupIndex( index(groupItem->row(), 0, QModelIndex() ) ); + if ( !groupIndex.isValid() ) + { + kWarning() << "Group does not exist in the contact list"; + return; + } + + // Find the child contact + ContactListModelItem *contactItem = groupItem->childContact( handle ); + + if ( !contactItem ) + { + kWarning() << "Contact/group mismatch"; + return; + } + + // Now we can remove the contact + beginRemoveRows( groupIndex, contactItem->row(), contactItem->row() ); + + delete contactItem; + + endRemoveRows(); +} + + + +// Remove a group +void ContactList::removeGroup( const QString& groupId ) +{ + Group *group = getGroupById( groupId ); + ContactListModelItem *nodeToRemove = rootNode_->childGroup( groupId ); + + if ( group == 0 || nodeToRemove == 0 ) + { + kWarning() << "Group" << groupId << "doesn't exist in the contact list."; + return; + } + + if( nodeToRemove->childCount() ) + { + kWarning() << "Group" << groupId << "was not empty!"; + return; + } + + ContactListModelItem *gropNode = rootNode_->childGroup( groupId ); + if ( ! gropNode ) + { + kWarning() << "Group " << groupId << " does not exist in the model!"; + return; + } + + beginRemoveRows( QModelIndex(), gropNode->row(), gropNode->row() ); + + // Remove the group + delete nodeToRemove; + + // Signal the group has been removed. + endRemoveRows(); + + // Also delete it from the internal list of groups + groups_.removeAll( group ); + + // Signal the deletion to the UI + emit groupRemoved( group ); + + // When all receivers have deleted the group from their lists, we delete it too + delete group; +} + + + +// Change a contact's name +void ContactList::renameContact( QString handle, QString newName ) +{ + Contact *contact; + + contact = getContactByHandle( handle ); + if ( contact == 0 ) + { + kDebug() << "Couldn't find contact " << handle << " in the contact list."; + return; + } + + contact->setFriendlyName( newName ); + + // If the contact exists in the list, signal that it's changed + forwardDataChanged( rootNode_->childContacts( handle ) ); +} + + + +// Change a group's name +void ContactList::renameGroup( const QString& groupId, const QString& groupName ) +{ + Group *group = getGroupById( groupId ); + if( group == 0 ) + { + kWarning() << "Group" << groupId << "not found in the contact list."; + return; + } + + group->setName( groupName ); + + // If the group exists in the list, signal that it's changed + forwardDataChanged( rootNode_->childGroup( groupId ) ); + + emit groupChanged( group ); // Signal the UI +} + + + +/** + * Empty the contact list + * + * Deletes the contact list's contents and regenerates the special groups and the model. + * When exiting, the regeneration part can be skipped. + */ +void ContactList::reset( bool restore ) +{ + // Empty the model structure and reset it + if( rootNode_ ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Resetting model tree..."; +#endif + + // Delete everything from the model tree + int childItemsCount = rootNode_->childCount(); + + 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_; + rootNode_ = 0; + } + + if( contacts_.count() || groups_.count() ) + { +#ifdef KMESSDEBUG_CONTACTLIST_DISCONNECTION + kDebug() << "Resetting" << contacts_.count() << "contacts..."; +#endif + + // Delete all contacts + qDeleteAll( contacts_ ); + contacts_.clear(); + +#ifdef KMESSDEBUG_CONTACTLIST_DISCONNECTION + kDebug() << "Resetting" << groups_.count() << "groups..."; +#endif + + // Delete all groups + qDeleteAll( groups_ ); + groups_.clear(); + } + + // Do not recreate the groups + if( ! restore ) + { + return; + } + + // Regenerate the model's root node, the only one which contains groups and contacts + rootNode_ = new ContactListModelItem(); + + // Create the special groups + 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() == 5 ); + KMESS_ASSERT( rootNode_->childCount() == 5 ); +#endif +} + + + +// Read groups and contacts properties +void ContactList::readProperties() +{ +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "Loading properties for the contact list"; +#endif + + 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++ ) + { + groups_.value( i )->readProperties( config ); + } + + ensureGroupListValid(); + // From this point on, we can assume there are *no* duplicate sortPositions + // and *no* gaps in the sortPositions in groups_. + + // Flush any changes to disk + config.sync(); + config = KMessConfig::instance()->getContactListConfig( handle, "Contacts" ); + + // Load all contact extensions + foreach( Contact *contact, contacts_ ) + { + contact->readProperties( config ); + } + + config.sync(); +} + + + +/** + * Get the number of rows present in an index + * + * @param parent The index to count rows of + * @return int + */ +int ContactList::rowCount( const QModelIndex &parent ) const +{ + ContactListModelItem *parentItem = 0; + + if( rootNode_ == 0 ) + { + return 0; + } + if( ! parent.isValid() ) + { + parentItem = rootNode_; + } + else + { + parentItem = static_cast( parent.internalPointer() ); + } + + if( ! parentItem ) + { + return 0; + } + + return parentItem->childCount(); +} + + + +// Save groups and contacts properties +void ContactList::saveProperties() +{ +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "Saving properties for the contact list"; +#endif + + // Do not save account properties when it's a temporary account + if( CurrentAccount::instance()->isGuestAccount() ) + { + kWarning() << "Requested to save properties, but this is a guest account!"; + return; + } + + // Get the position of the contacts settings of this account + const QString& handle( CurrentAccount::instance()->getHandle() ); + + // 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_ ) + { + group->saveProperties( config ); + } + + // Write the data now! + config.sync(); + + // Skip saving contacts if there aren't any, as above + if( ! contacts_.isEmpty() ) + { + config = KMessConfig::instance()->getContactListConfig( handle, "Contacts" ); + + // 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() ); + + // Save all contact extensions + foreach( Contact *contact, contacts_ ) + { + pendingRemoval.removeAll( contact->getHandle() ); + contact->saveProperties( config ); + } + + // Delete the remaining contacts info, which at this point are only old contacts not in list anymore + QFile picture; + KConfigGroup contactConfig; + foreach( const QString &unusedContact, pendingRemoval ) + { + #ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "Deleting unused contact info for " << unusedContact; + #endif + + // Remove the custom picture associated with this contact, if there is any + contactConfig = config.group( unusedContact ); + picture.setFileName( contactConfig.readEntry( "pictureFile", "" ) ); + if( picture.exists() ) + { + picture.remove(); + } + config.deleteGroup( unusedContact ); + } + + // Write the data now! + config.sync(); + } +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + else + { + kDebug() << "No contacts to save"; + } +#endif +} + + + +// 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/model/contactlist.h b/src/model/contactlist.h new file mode 100644 index 0000000..76e9447 --- /dev/null +++ b/src/model/contactlist.h @@ -0,0 +1,201 @@ +/*************************************************************************** + contactlist.h - description + ------------------- + begin : Sun Jan 5 2003 + copyright : (C) 2003 by Mike K. Bennett + (C) 2005 by Diederik van der Boor + 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 CONTACTLIST_H +#define CONTACTLIST_H + +#include "contact/msnstatus.h" +#include "contactlistmodelitem.h" + +#include +#include + + +// Forward declarations +class Contact; +class CurrentAccount; +class Group; +class KMessTest; + + + +/** + * @brief Data class for the contact list. + * + * This class stores the state of the current contact list, it does not update the server. + * The MsnNotificationConnection class sends update requests to the server. + * When the server acknowledges the change, it will be updated here. + * The user interface classes repond to the signals of this class to update their view. + * + * The instance of this class is shared between the MsnNotificationConnection class, + * and re-used when the user connects with a different account. + * After the MsnNotificationConnection class is initialized, a pointer + * to the ContactList is set in the CurrentAccount class too. + * The CurrentAccount class is only used to provide access to the current contact list, + * 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 +{ + Q_OBJECT + + friend class KMessTest; + + public: // Public methods + // The constructor + ContactList(); + // The destructor + virtual ~ContactList(); + // Add a contact to the contact list + Contact * addContact( const QString& handle, const QString& friendlyName, int lists, + QStringList groupIds, const QString& guid ); + // Change a contact's status (and update the friendly name) + void changeContactStatus( const QString& handle, Status status, + const QString& friendlyName = QString(), + uint capabilities = 0, const QString& msnObjectString = QString(), bool showBaloon = true ); + // Return the contact with the given guid + Contact* getContactByGuid( QString guid ) const; + // Return the contact with the given handle + Contact* getContactByHandle( QString handle ) const; + // Return the list of contacts + 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 + const QList& getGroupList() const; + // Find out if a group contains contacts + bool isGroupEmpty( const QString &groupId ) const; + // Read groups and contacts properties + void readProperties(); + // Change a contact's name + void renameContact( QString handle, 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( const QString& groupId, const QString& groupName ); + // Remove a contact from the list completely + void removeContact( QString contactId ); + // Remove a group + void removeGroup( const QString& groupId ); + // Change a group's name + void renameGroup( const QString& groupId, const 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 + Qt::ItemFlags flags( const QModelIndex &index ) const; + // Find out if a model index contains other indices + bool hasChildren( const QModelIndex &parent ) const; + // Find out if the model contains a valid index at the specified position + bool hasIndex( int row, int column, const QModelIndex &parent = QModelIndex() ) const; + // Return the text for a list or tree column header. + 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 + bool contactExists( QString handle ); + // Remove gaps and duplicates in the groups list + void ensureGroupListValid(); + // Emits the Data Changed signal on one item + void forwardDataChanged( ContactListModelItem *item ); + // Emits the Data Changed signal on some items + void forwardDataChanged( ModelItemList itemList ); + // Return whether or not a group with the given id exists + bool groupExists( QString groupId ); + // return a QModelIndex pointing to the given group Id. + QModelIndex getIndexForGroup( QString groupId ); + // remove a contact from a group + void removeContactFromGroup( const QString& handle, ContactListModelItem *groupItem ); + + private slots: // Private slots + // Forward from a contact that it moved + void slotContactMoved( Contact *contact ); + // Forward from a group that it moved + void slotGroupMoved( Group *group, int oldPosition, int newPosition ); + // Forward from a contact that it is offline + void slotForwardContactOffline( Contact *contact, bool showBaloon ); + // Forward from a contact that it is contact is online + void slotForwardContactOnline( Contact *contact, bool showBaloon ); + + + private: // Private attributes + // The list of contacts + QHash contacts_; + // The list of groups + QList groups_; + // The root node which makes up the contact list tree + ContactListModelItem *rootNode_; + + signals: // Signals + // Signal that a contact changed it's msnobject. + void contactChangedMsnObject(Contact *contact); + // Signal that a contact changed it's status. + void contactChangedStatus( Contact *contact, bool showBaloon ); + // Signal that a contact is offline + 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 removed + void groupRemoved(const Group *group); + // Drag'n'drop operation to move a contact -- TODO post 2.0: replace with proper impl + void dndMoveContactToGroup( QString handle, QString oldGroupId, QString newGroupId ); +}; + +#endif diff --git a/src/model/contactlistmodelfilter.cpp b/src/model/contactlistmodelfilter.cpp new file mode 100644 index 0000000..5713870 --- /dev/null +++ b/src/model/contactlistmodelfilter.cpp @@ -0,0 +1,413 @@ +/*************************************************************************** + 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 *except when searching*. + */ + case Account::VIEW_BYGROUP: + isVisible = ( showOffline_ || contactStatus != STATUS_OFFLINE || ! filterRegExp().isEmpty() ); + 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; + } + + // if this is not a special group, it at least 1 contact in it (total) AND we are searching, + // we show the group since its data must be available in the model for searching. + if ( ( itemData[ "isSpecialGroup" ].toBool() == false || id == SpecialGroups::INDIVIDUALS ) && + ! filterRegExp().isEmpty() && + itemData[ "totalContacts" ].toInt() > 0 ) + { + isVisible = true; + 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/model/contactlistmodelfilter.h b/src/model/contactlistmodelfilter.h new file mode 100644 index 0000000..d76500e --- /dev/null +++ b/src/model/contactlistmodelfilter.h @@ -0,0 +1,91 @@ +/*************************************************************************** + contactlistmodelfilter.h - 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. * + * * + ***************************************************************************/ + +#ifndef CONTACTLISTMODELFILTER_H +#define CONTACTLISTMODELFILTER_H + +#include +#include "account.h" + + +// Forward declarations +class CurrentAccount; + + + +/** + * @brief Filtering class for the contact list model. + * + * This class serves as a filter for the contact list model: it reads the original list data, + * sorts and filters out the list nodes according to the current visual options, and exposes a + * different model with the changes applied. + * + * @author Valerio Pilo + * @ingroup Root + */ +class ContactListModelFilter : public QSortFilterProxyModel +{ + Q_OBJECT + + + public: // Public methods + + // The constructor + ContactListModelFilter( QObject* parent = 0 ); + // Sets the given sourceModel to be processed by the proxy model. + void setSourceModel( QAbstractItemModel *sourceModel ); + + + protected: // Protected methods + + // 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(); + + + private: // Private properties + + // Reference to the current account + CurrentAccount *currentAccount_; + // Whether or not to show the Allowed special group + bool showAllowed_; + // Whether or not to show empty groups + bool showEmpty_; + // Whether or not to show the contacts grouped by online status or group + Account::ContactListDisplayMode showGroupsMode_; + // Whether or not to show the offline contacts in groups + bool showOffline_; + // Whether or not to show the Removed special group + bool showRemoved_; + + +}; + + + +#endif diff --git a/src/model/contactlistmodelitem.cpp b/src/model/contactlistmodelitem.cpp new file mode 100644 index 0000000..12f2de5 --- /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 = 8000; // 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_IDLE: sortIndex = 3000; break; + case STATUS_AWAY: sortIndex = 4000; break; + case STATUS_OUT_TO_LUNCH: sortIndex = 5000; break; + case STATUS_ON_THE_PHONE: sortIndex = 6000; break; + case STATUS_BUSY: sortIndex = 7000; break; + case STATUS_INVISIBLE: + case STATUS_OFFLINE: + default: sortIndex = 8000; 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->getClientName(); + 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(); +} + + + +/** + * 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/model/contactlistmodelitem.h b/src/model/contactlistmodelitem.h new file mode 100644 index 0000000..6e99850 --- /dev/null +++ b/src/model/contactlistmodelitem.h @@ -0,0 +1,127 @@ +/*************************************************************************** + contactlistmodelitem.h - 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. * + * * + ***************************************************************************/ + +#ifndef CONTACTLISTMODELITEM_H +#define CONTACTLISTMODELITEM_H + +#include +#include + + +// Forward declarations +class Contact; +class Group; +class ContactListModelItem; + + +// Custom types +typedef QMap ModelDataList; +typedef QList ModelItemList; + + + +// Custom operator to display nodes and items in the debug output +QDebug operator<<( QDebug s, const ContactListModelItem *item ); + + + +/** + * 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 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 + */ +class ContactListModelItem +{ + public: // Public enumerations + enum ItemType + { + ItemRoot = -1 // This element should be unique, it contains no object + , 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 item + ContactListModelItem(); + // 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(); + + // 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( const QString &handle ); + // Return the number of children of this item + int childCount() const; + // Return a child Group identified by its 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 + const QVariant data( int role ) const; + // Return the type of the internal stored object + ItemType getType() const; + // 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; + // Get this item's position within the parent node + int row() const; + + 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 + ModelItemList childItems_; + // Pointer to the parent node + ContactListModelItem *parentNode_; + // Pointer to this item's data + void *object_; + // Type of the contained data + ItemType itemType_; +}; + +#endif diff --git a/kmess/network/applications/application.cpp b/src/network/applications/application.cpp similarity index 81% rename from kmess/network/applications/application.cpp rename to src/network/applications/application.cpp index 700be4b..e335c19 100644 --- a/kmess/network/applications/application.cpp +++ b/src/network/applications/application.cpp @@ -17,31 +17,32 @@ #include "application.h" -#include - -#include -#include - #include "../../currentaccount.h" #include "../../kmessdebug.h" #include "../mimemessage.h" +#include + +#include + + /** * @brief The constructor */ Application::Application(const QString &contactHandle) - : QObject(0, "*Application"), - chatWindow_(0), + : QObject(), + chat_(0), closing_(false), contactHandle_(contactHandle), doDelayDeletion_(false), mode_(APP_MODE_NORMAL), type_(ChatMessage::TYPE_APPLICATION), - userAccepted_(false), + userAnswered_(false), userStartedApp_(true), waitingForUser_(false) { + setObjectName("*Application"); } @@ -55,7 +56,7 @@ Application::~Application() { closing_ = true; // for consistency #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "DESTROYED Application [handle=" << contactHandle_ << "]" << endl; + kDebug() << "DESTROYED. [handle=" << contactHandle_ << "]"; #endif } @@ -73,13 +74,15 @@ Application::~Application() void Application::contactAborted(const QString &message) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::contactAborted" << endl; + kDebug(); #endif if( closing_ ) { - kdWarning() << "Application::contactAborted: Attempted to close application twice (contact=" << contactHandle_ << ")" << endl; + kWarning() << "Attempted to close application twice (contact=" << contactHandle_ << ")"; } + // Remove the accept links + modifyOfferMessage(); if( message.isEmpty() ) { @@ -107,13 +110,16 @@ void Application::contactAborted(const QString &message) void Application::contactRejected(const QString &message) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::contactRejected" << endl; + kDebug(); #endif if( closing_ ) { - kdWarning() << "Application::contactRejected: Attempted to close application twice (contact=" << contactHandle_ << ")" << endl; + kWarning() << "Attempted to close application twice (contact=" << contactHandle_ << ")"; } + // Remove the accept links + modifyOfferMessage(); + if( message.isEmpty() ) { showEventMessage( getContactRejectMessage(), ChatMessage::CONTENT_APP_CANCELED, true ); @@ -142,12 +148,12 @@ void Application::contactRejected(const QString &message) void Application::contactStarted1_ContactInvitesUser(const MimeMessage& /*message*/) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - contactStarted1_ContactInvitesUser (rejects invitation)" << endl; + kDebug() << "(rejects invitation)"; #endif // We can assume the switchboard already displayed a better error message #ifdef KMESTEST - kdWarning() << "The Application subclass didn't implement contactStarted1_ContactInvitesUser!" << endl; + kWarning() << "The Application subclass didn't implement contactStarted1_ContactInvitesUser!"; #endif // Cancel the invitation @@ -168,7 +174,7 @@ void Application::contactStarted1_ContactInvitesUser(const MimeMessage& /*messag void Application::contactStarted2_UserAccepts() { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - contactStarted2_UserAccepts" << endl; + kDebug(); #endif } @@ -183,7 +189,7 @@ void Application::contactStarted2_UserAccepts() void Application::contactStarted3_ContactConfirmsAccept(const MimeMessage& /*message*/) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - contactStarted3_ContactConfirmsAccept" << endl; + kDebug(); #endif } @@ -205,14 +211,26 @@ void Application::delayDeletion( bool doDelay ) */ void Application::endApplication() { -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::endApplication: Requesting removal" << endl; -#endif closing_ = true; // Signal that this instance should be deleted, if there are no ongoing tasks that would break if the class gets deleted. - if( ! doDelayDeletion_ ) + if( doDelayDeletion_ ) + { + // This happens when a KFileDialog or messagebox is dislayed. A sub event loop is started + // which could cause a delete signal to get through. In effect, KMess will crash because once + // the KFileDialog returns the code runs in that deleted part. +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "delayDeletion is in effect, waiting for the derived class to call endApplication() again."; +#endif + } + else + { +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "Requesting removal"; +#endif + emit deleteMe(this); + } } @@ -243,14 +261,14 @@ QString Application::generateCookie() const /** - * @brief Return the chat window the application was originally created for (may be null). + * @brief Return the chat the application was originally created for (may be null). * * This pointer is used by ChatMaster to display a MsnObject (display picture, wink or emoticon) - * in the correct chat window. + * in the correct chat. */ -ChatWindow * Application::getChatWindow() const +Chat* Application::getChat() const { - return chatWindow_; + return chat_; } @@ -386,21 +404,23 @@ QString Application::getUserRejectMessage() const void Application::gotCommand(QString command) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - gotCommand(" << command << ")" << endl; + kDebug() << "Got command " << command; #endif waitingForUser_ = false; + if( userAnswered_ ) + { +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "User has already answered this application before, ignoring."; +#endif + return; + } + + userAnswered_ = true; + if ( command == "accept" ) { - if(userAccepted_) - { -#ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - User already accepted before, ignoring." << endl; -#endif - return; - } - userAccepted_ = true; contactStarted2_UserAccepts(); } else if ( command == "cancel" ) @@ -413,7 +433,7 @@ void Application::gotCommand(QString command) } else { - kdDebug() << "Application received unhandled command " << command << "." << endl; + kWarning() << "Received unhandled command " << command << "."; } } @@ -473,6 +493,25 @@ bool Application::isWaitingForUser() const +/** + * @brief Replace an application's accept/reject/cancel links with another text + * + * Removes from the chat the confirmation links for the application, and replaces + * them with some other informative message. + * + * @param newMessage The new displayed message + */ +void Application::modifyOfferMessage( const QString& newMessage ) +{ +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "Changing offer links in chat"; +#endif + + emit updateApplicationMessage( getCookie(), newMessage ); +} + + + /** * @brief Let the user accept or reject the application. * @@ -485,27 +524,31 @@ bool Application::isWaitingForUser() const void Application::offerAcceptOrReject(const QString& appHtml) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application: Displaying accept/cancel message in ChatWindow" << endl; + kDebug() << "Displaying accept/reject message in chat"; #endif QString html; + const QString cookie( getCookie() ); + const QString handle( getContactHandle() ); // Create the message, starting with the application's particulars html += ""; html += appHtml; - html += " "; - html += i18n( "Do you want to accept or cancel?" ) - .arg( "\"kmess://application/accept/" + getContactHandle() + "?" + getCookie() + "\"" ) - .arg( "\"kmess://application/reject/" + getContactHandle() + "?" + getCookie() + "\"" ); + html += ""; + html += "
    "; + html += ""; + 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. waitingForUser_ = true; - userAccepted_ = false; + userAnswered_ = false; showEventMessage( html, ChatMessage::CONTENT_APP_INVITE, true ); #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application: Waiting for user to accept.." << endl; + kDebug() << "Waiting for user to accept.."; #endif } @@ -523,15 +566,21 @@ void Application::offerAcceptOrReject(const QString& appHtml) void Application::offerCancel(const QString& appHtml) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application: Displaying cancel link in ChatWindow" << endl; + kDebug() << "Displaying cancel link in chat"; #endif QString html; + const QString cookie( getCookie() ); // Create the message, starting with the application's particulars - html += appHtml + " "; - html += i18n("Click to cancel.") - .arg( "\"kmess://application/cancel/" + getContactHandle() + "?" + getCookie() + "\"" ); + html += ""; + html += appHtml; + html += ""; + html += "
    "; + html += ""; + html += i18n( "Click to cancel.", + "\"kmess://application/cancel/" + getContactHandle() + "?" + cookie + "\"" ); + html += ""; // Send the message to the chat window. showEventMessage( html, ChatMessage::CONTENT_APP_INVITE, false ); @@ -564,14 +613,14 @@ void Application::setApplicationType( ChatMessage::MessageType type ) /** - * @brief Set the chat window the application was originally created for. + * @brief Set the chat the application was originally created for. * * This pointer is used by ChatMaster to display a MsnObject (display picture, wink or emoticon) - * in the correct chat window. + * in the correct chat. */ -void Application::setChatWindow( ChatWindow *chatWindow ) +void Application::setChat( Chat *chat ) { - chatWindow_ = chatWindow; + chat_ = chat; } @@ -593,7 +642,7 @@ void Application::setClosing(bool closing) /** * @brief Change the current mode - * + * * This is currently used only to reject unknown messages with P2PApplication. * * @param mode The mode to set. @@ -616,10 +665,18 @@ void Application::setMode(ApplicationMode mode) * It emits the appMessage() signal * The chat themes display these messages as "notification" message. * - * @param message The message to display. + * @param message The message to display. + * @param contents A brief indication of the contents. This is used for notifications. + * @param isIncoming Whether the message is incoming (true), or outgoing (false). */ void Application::showEventMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ) { + // Error handling applications shouldn't show anything + if( mode_ == APP_MODE_ERROR_HANDLER ) + { + return; + } + emit applicationMessage( ChatMessage( type_, contents, isIncoming, message, getContactHandle() ) ); } @@ -632,10 +689,18 @@ void Application::showEventMessage( const QString &message, const ChatMessage::C * - invitation type not supported. * - the contact is offline. * - * @param message The message to display. + * @param message The message to display. + * @param contents A brief indication of the contents. This is used for notifications. + * @param isIncoming Whether the message is incoming (true), or outgoing (false). */ void Application::showSystemMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ) { + // Error handling applications shouldn't show anything + if( mode_ == APP_MODE_ERROR_HANDLER ) + { + return; + } + emit applicationMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, contents, isIncoming, message, getContactHandle() ) ); } @@ -649,7 +714,7 @@ void Application::showSystemMessage( const QString &message, const ChatMessage:: void Application::showTransferComplete() { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application: Transfer is complete." << endl; + kDebug() << "Transfer is complete."; #endif } @@ -684,10 +749,10 @@ void Application::showTransferMessage(const QString &message) * * @param bytesTransferred The number of bytes transferred. */ -void Application::showTransferProgress(const uint bytesTransferred) +void Application::showTransferProgress( const ulong bytesTransferred ) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::showTransferProgress: Transferred " << bytesTransferred << " bytes." << endl; + kDebug() << "Transferred " << bytesTransferred << " bytes."; #else Q_UNUSED( bytesTransferred ); // Avoid compiler warning #endif @@ -738,17 +803,20 @@ void Application::startByInvite(const QString &invitationCookie) void Application::userAborted() { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::userAborted" << endl; + kDebug(); #endif if( closing_ ) { - kdWarning() << "Application::userAborted: Attempted to close application twice (contact=" << contactHandle_ << ")" << endl; + kWarning() << "Attempted to close application twice (contact=" << contactHandle_ << ")"; // The application could already have been deleted, just end it before something leads to a crash. endApplication(); } closing_ = true; + + // Remove the accept links + modifyOfferMessage(); showEventMessage( getUserAbortMessage(), ChatMessage::CONTENT_APP_CANCELED, false ); sendCancelMessage( CANCEL_ABORT ); // The application should terminate automatically.. @@ -769,11 +837,11 @@ void Application::userAborted() void Application::userRejected() { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application::userRejected" << endl; + kDebug(); #endif if( closing_ ) { - kdWarning() << "Application::userRejected: Attempted to close application twice (contact=" << contactHandle_ << ")" << endl; + kWarning() << "Attempted to close application twice (contact=" << contactHandle_ << ")"; // The application could already have been deleted, just end it before something leads to a crash. endApplication(); @@ -795,7 +863,7 @@ void Application::userRejected() void Application::userStarted1_UserInvitesContact() { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - userStarted1_UserInvitesContact" << endl; + kDebug(); #endif } @@ -811,7 +879,7 @@ void Application::userStarted1_UserInvitesContact() void Application::userStarted2_ContactAccepts(const MimeMessage& /*message*/) { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - userStarted2_ContactAccepts" << endl; + kDebug(); #endif } @@ -825,7 +893,7 @@ void Application::userStarted2_ContactAccepts(const MimeMessage& /*message*/) void Application::userStarted3_UserPrepares() { #ifdef KMESSDEBUG_APPLICATION - kdDebug() << "Application - userStarted3_UserPrepares" << endl; + kDebug(); #endif } diff --git a/kmess/network/applications/application.h b/src/network/applications/application.h similarity index 86% rename from kmess/network/applications/application.h rename to src/network/applications/application.h index bea674c..580fae1 100644 --- a/kmess/network/applications/application.h +++ b/src/network/applications/application.h @@ -18,14 +18,16 @@ #ifndef APPLICATION_H #define APPLICATION_H -#include -#include +#include "../chatmessage.h" + +#include -#include "../../chat/chatmessage.h" // Forward declarations +class Chat; class MimeMessage; -class ChatWindow; + + /** * @brief Base class for all application invitations. @@ -58,9 +60,9 @@ class Application : public QObject enum ApplicationMode { - APP_MODE_NORMAL, ///< Normal mode (all messages should appear in the Chat Window) - //APP_MODE_BACKGROUND, // /< Background mode (status messages shouldn't appear) - APP_MODE_ERROR_HANDLER ///< Application instance is started to handle an error. + APP_MODE_NORMAL, ///< Normal mode (all messages should appear in the Chat Window) + APP_MODE_ERROR_HANDLER, ///< Application instance is started to handle an error. + APP_MODE_DATACAST ///< Application instance is started to emulate a datacast message (ink receiving, winks in msn6). }; // The constructor @@ -68,9 +70,9 @@ class Application : public QObject // The destructor virtual ~Application(); // The contact cancelled the session - virtual void contactAborted(const QString &message = 0); - // Return the chat window the application was originally created for (may be null). - ChatWindow * getChatWindow() const; + virtual void contactAborted(const QString &message = QString::null); + // Return the chat the application was originally created for (may be null). + Chat *getChat() const; // Return the handle of the other contact const QString& getContactHandle() const; // Return the application's identifying cookie @@ -83,8 +85,8 @@ class Application : public QObject bool isClosing() const; // Returns whether the application can operate in a multi-chat session, or requires a private chat. virtual bool isPrivateChatRequired() const; - // Set the chat window the application was originally created for. - void setChatWindow( ChatWindow *chatWindow ); + // Set the chat the application was originally created for. + void setChat( Chat *chat ); // Set the current mode of the application void setMode(ApplicationMode mode); // Start the application @@ -137,6 +139,8 @@ class Application : public QObject bool isUserStartedApp() const; // Return true if the user should press accept/cancel soon. bool isWaitingForUser() const; + // Replace an application's accept/reject/cancel links with another text + void modifyOfferMessage( const QString& newMessage = QString() ); // Let the user accept or reject the application void offerAcceptOrReject(const QString& appHtml); // Let the user cancel the application @@ -164,7 +168,7 @@ class Application : public QObject // Show a message to inform about a transfer event (shown in the transfer dialog, e.g. connecting to host) virtual void showTransferMessage(const QString &message); // Show the progress made during a transfer. - virtual void showTransferProgress(const uint bytesTransferred); + virtual void showTransferProgress( const ulong bytesTransferred ); // Set the cookie from an INVITE command void startByInvite(const QString &invitationCookie); // The user rejected the invitation @@ -177,8 +181,8 @@ class Application : public QObject virtual void userStarted3_UserPrepares(); private: // Private attributes - // The chat window the application was originally initiatialized in. - ChatWindow *chatWindow_; + // The chat the application was originally initiatialized in. + Chat *chat_; // The application is closing bool closing_; // The applications identifying cookie @@ -191,11 +195,8 @@ class Application : public QObject ApplicationMode mode_; // Current application type ChatMessage::MessageType type_; - // A list of used ports -// static QStringList usedPorts_; -// static int usedPorts_[10]; - // Whether or not the user accepted the invitation already - bool userAccepted_; + // Whether or not the user answered the invitation already + bool userAnswered_; // Whether or not the user started the app bool userStartedApp_; // True if waiting for the user to accept @@ -204,9 +205,16 @@ class Application : public QObject signals: // Signals /** * Signal that this application likes to display a message - * @param html The HTML message to display. + * @param message The message to display. */ void applicationMessage( const ChatMessage &message ); + /** + * Signal that this application needs to update its accept/cancel links with another text + * @param messageId The identifying cookie for the message + * @param newMessage The new message to display. + * @see Application::getCookie() + */ + void updateApplicationMessage( const QString &messageId, const QString &newMessage ); /** * Signal that this application's activity has ended and that it should be deleted. diff --git a/kmess/network/applications/applicationlist.cpp b/src/network/applications/applicationlist.cpp similarity index 74% rename from kmess/network/applications/applicationlist.cpp rename to src/network/applications/applicationlist.cpp index 7461317..1587c2d 100644 --- a/kmess/network/applications/applicationlist.cpp +++ b/src/network/applications/applicationlist.cpp @@ -15,42 +15,38 @@ * * ***************************************************************************/ -// General application classes #include "applicationlist.h" -#include "mimeapplication.h" -#include "p2papplication.h" -// MIME application classes +#include "../../contact/contactbase.h" +#include "../../contact/msnobject.h" +#include "../../currentaccount.h" +#include "../../kmessdebug.h" +#include "../extra/directconnectionpool.h" +#include "../extra/msndirectconnection.h" +#include "../chatmessage.h" +#include "../mimemessage.h" +#include "../msnswitchboardconnection.h" +#include "../p2pmessage.h" #include "filetransfer.h" -#include "gnomemeeting.h" -#include "msnremotedesktop.h" -#include "voiceconversation.h" - -// P2P application classes -#include "picturetransferp2p.h" #include "filetransferp2p.h" +#include "gnomemeeting.h" +#include "inktransferp2p.h" +#include "mimeapplication.h" +#include "msnobjecttransferp2p.h" +#include "msnremotedesktop.h" +#include "p2papplication.h" +#include "voiceconversation.h" #include "webapplicationp2p.h" #include "webcamtransferp2p.h" -#include "../mimemessage.h" -#include "../p2pmessage.h" -#include "../msnswitchboardconnection.h" -#include "../extra/directconnectionpool.h" -#include "../extra/msndirectconnection.h" -#include "../../currentaccount.h" -#include "../../kmessdebug.h" -#include "../../msnobject.h" -#include "../../chat/chatmessage.h" -#include "../../contact/contactbase.h" +#include -#include - -#include #ifdef KMESSDEBUG_APPLICATIONLIST #define KMESSDEBUG_APPLICATIONLIST_GENERAL #endif + #define CEIL( val ) ( (int) (val) + 1) @@ -62,15 +58,19 @@ * @param contactHandle The contact this application list is created for. */ ApplicationList::ApplicationList(const QString &contactHandle) - : QObject(0, "ApplicationList") + : QObject() , addingConnections_(false) - , contactHandle_(contactHandle.lower()) + , contactHandle_(contactHandle.toLower()) , directConnection_(0) , directConnectionPool_(0) , pauseApplications_(false) , pendingConnectionInvitation_(false) { + setObjectName("ApplicationList[" + contactHandle + "]"); + + // Configure timer connect( &sbReadyWriteTester_, SIGNAL(timeout()), this, SLOT(slotSwitchboardTestReadyWrite()) ); + sbReadyWriteTester_.setSingleShot( true ); } @@ -85,46 +85,38 @@ ApplicationList::ApplicationList(const QString &contactHandle) ApplicationList::~ApplicationList() { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList - entering destructor." << endl; + kDebug() << "Starting removal. [handle=" << contactHandle_ << "]"; #endif // See if there are remaining MIME applications if( ! mimeApplications_.isEmpty() ) { - kdWarning() << "ApplicationList - still have " << mimeApplications_.count() << - " active MimeApplication objects for " << contactHandle_ << "!" << endl; + kWarning() << "still have " << mimeApplications_.count() << + " active MimeApplication objects for " << contactHandle_ << "!"; // Remove all mime applications - QPtrListIterator it1( mimeApplications_ ); - while( it1.current() != 0 ) - { - delete it1.current(); - ++it1; - } + qDeleteAll( mimeApplications_ ); + mimeApplications_.clear(); } // See if there are remaining P2P applications if( ! p2pApplications_.isEmpty() ) { - kdWarning() << "ApplicationList - still have " << p2pApplications_.count() << - " active P2PApplication objects for " << contactHandle_ << "!" << endl; + kWarning() << "still have " << p2pApplications_.count() << + " active P2PApplication objects for " << contactHandle_ << "!"; // Remove all p2p applications - QPtrListIterator it2( p2pApplications_ ); - while( it2.current() != 0 ) - { - delete it2.current(); - ++it2; - } + qDeleteAll( p2pApplications_ ); + p2pApplications_.clear(); } - // Delete the connections directConnection_ = 0; // deleted by connection pool delete directConnectionPool_; + directConnectionPool_ = 0; #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "DESTROYED ApplicationList [handle=" << contactHandle_ << "]" << endl; + kDebug() << "DESTROYED. [handle=" << contactHandle_ << "]"; #endif } @@ -150,7 +142,7 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting if( mimeApplications_.isEmpty() && p2pApplications_.isEmpty() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::abortApplications: No applications active." << endl; + kDebug() << "No applications active."; #endif return false; } @@ -164,18 +156,15 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting const ContactBase *contact = CurrentAccount::instance()->getContactByHandle(contactHandle_); if( ! KMESS_NULL(contact) ) { - const QPtrList switchboards = contact->getSwitchboardConnections(); - QPtrListIterator switchboardIt(switchboards);; - - while( switchboardIt.current() != 0 ) + const QList switchboards = contact->getSwitchboardConnections(); + foreach( const MsnSwitchboardConnection *connection, switchboards ) { - MsnSwitchboardConnection *connection = switchboardIt.current(); if( connection != abortingConnection ) { if( connection->isExclusiveChatWithContact( contactHandle_ ) ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::abortApplications: Contact is still in another private chat, not terminating applications." << endl; + kDebug() << "Contact is still in another private chat, not terminating applications."; #endif return (! abortingApplications_.isEmpty()); // in case the function was called before } @@ -184,8 +173,6 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting hasMultiChats = true; } } - - ++switchboardIt; } } @@ -194,11 +181,11 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL if( ! hasMultiChats ) { - kdDebug() << "ApplicationList::abortApplications: Contact left all chats, aborting applications." << endl; + kDebug() << "Contact left all chats, aborting applications."; } else { - kdDebug() << "ApplicationList::abortApplications: Contact left all private chats, aborting applications that don't support multi-chats." << endl; + kDebug() << "Contact left all private chats, aborting applications that don't support multi-chats."; } #endif @@ -208,11 +195,9 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting // will leave and actually left, or two switchboard report a contact has left. // First abort all mime-based applications. - QPtrListIterator it(mimeApplications_); - while( it.current() != 0 ) + foreach( MimeApplication *app, mimeApplications_ ) { - MimeApplication *app = it.current(); - if( ( abortingApplications_.count() > 0 && ! abortingApplications_.contains( static_cast( app ) ) ) + if( ! abortingApplications_.isEmpty() && ! abortingApplications_.contains( static_cast( app ) ) && ( app->isPrivateChatRequired() || ! hasMultiChats ) ) { abortingApplications_.append(app); @@ -228,14 +213,11 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting } } } - ++it; } // Then abort all p2p-based applications. - QPtrListIterator it2(p2pApplications_); - while( it2.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { - P2PApplication *app = it2.current(); if( ! abortingApplications_.contains(app) && ( app->isPrivateChatRequired() || ! hasMultiChats ) ) { @@ -252,13 +234,12 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting } } } - ++it2; } // The application may abort really quick and update the abortingApplications_ list directly from a signal. // In this case, the list is already emty, theirby also returning 'false'. #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::abortApplications: Got " << abortingApplications_.count() << " applications left to abort." << endl; + kDebug() << "Got " << abortingApplications_.count() << " applications left to abort."; #endif return (! abortingApplications_.isEmpty()); } @@ -278,7 +259,7 @@ bool ApplicationList::abortApplications(const MsnSwitchboardConnection *aborting void ApplicationList::addApplication(MimeApplication *application) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::addApplication: connecting mime application signals." << endl; + kDebug() << "connecting mime application signals."; #endif mimeApplications_.append( application ); @@ -288,6 +269,9 @@ void ApplicationList::addApplication(MimeApplication *application) // The old-style MIME applications are directly connected here, so they don't need to have a reference to this object. connect( application, SIGNAL( putMsg(const MimeApplication*, const MimeMessage&) ), this, SLOT ( sendMessage(const MimeApplication*, const MimeMessage&) )); + + // Inform listeners about the new application (notably ChatMaster) + emit newApplication( application ); } @@ -305,11 +289,14 @@ void ApplicationList::addApplication(MimeApplication *application) void ApplicationList::addApplication(P2PApplication *application) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::addApplication: connecting p2p application signals." << endl; + kDebug() << "connecting p2p application signals."; #endif p2pApplications_.append( application ); connectApplication( application ); + + // Inform listeners about the new application (notably ChatMaster) + emit newApplication( application ); } @@ -329,7 +316,7 @@ void ApplicationList::addApplication(P2PApplication *application) * @return Whether the socket could be created or not. * Returns false if the socket could not be created. */ -bool ApplicationList::addConnection(const QString &ipAddress, const int port) +bool ApplicationList::addConnection(const QString &ipAddress, const quint16 port) { // Avoid overwriting the current directConnection_ variable. if( directConnection_ != 0 ) @@ -346,21 +333,21 @@ bool ApplicationList::addConnection(const QString &ipAddress, const int port) else { // Already connected, don't allow second connection. - kdWarning() << "ApplicationList: Refusing connection attempt, a connection has already been made " - "(contact=" << contactHandle_ << " action=return)." << endl; + kWarning() << "Refusing connection attempt, a connection has already been made " + "(contact=" << contactHandle_ << " action=return)."; return 0; } } #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::addConnection: adding new connection attempt." << endl; + kDebug() << "adding new connection attempt."; #endif // Avoid overwriting the current directConnection_ variable. if( directConnection_ != 0 ) { - kdWarning() << "ApplicationList: Refusing connection attempt, a connection has already been made " - "(contact=" << contactHandle_ << " action=return)." << endl; + kWarning() << "Refusing connection attempt, a connection has already been made " + "(contact=" << contactHandle_ << " action=return)."; return 0; } @@ -407,14 +394,14 @@ int ApplicationList::addServerConnection() else { // Already connected, don't allow second connection. - kdWarning() << "ApplicationList: Refusing server connection attempt, a connection has already been made " - "(contact=" << contactHandle_ << " action=return)." << endl; + kWarning() << "Refusing server connection attempt, a connection has already been made " + "(contact=" << contactHandle_ << " action=return)."; return 0; } } #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::addServerConnection: adding new server socket." << endl; + kDebug() << "adding new server socket."; #endif // Init direct connection pool @@ -494,14 +481,14 @@ 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() ) { // Notify the user: - kdWarning() << "ApplicationList: MIME message can't be handled, " - << "Application-GUID not found. (message dump follows)\n" << message.getFields() << endl; + kWarning() << "MIME message can't be handled, " + << "Application-GUID not found. (message dump follows)\n" << message.getFields(); return 0; } @@ -518,14 +505,11 @@ MimeApplication * ApplicationList::createApplication(const MimeMessage &message) // Connect up the application #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Connecting MimeApplication signals" << endl; + kDebug() << "Connecting MimeApplication signals"; #endif // Auto-add application addApplication(app); - - // Inform listeners about the new application (notably ChatMaster) - emit newApplication(app); return app; } @@ -540,36 +524,36 @@ MimeApplication * ApplicationList::createApplication(const MimeMessage &message) * application will be initiated to reject and close the session properly. * * @param message The P2PMessage sent by the contact. - * @returns The new application instance. + * @returns The new application instance. */ P2PApplication * ApplicationList::createApplication(const P2PMessage &message) { #ifdef KMESSTEST - ASSERT( message.getSessionID() == 0 ); - ASSERT( message.getDataSize() > 0 ); + KMESS_ASSERT( message.getSessionID() == 0 ); + KMESS_ASSERT( message.getDataSize() > 0 ); #endif #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Creating new P2PApplication instance to parse the P2P message." << endl; + kDebug() << "Creating new P2PApplication instance to parse the P2P message."; #endif P2PApplication *app = 0; // Extract the SLP data message - QString slpMessage = QString::fromUtf8( message.getData(), 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.find(":"), 20) ); - kdWarning() << "ApplicationList: P2P message can't be handled, detected SLP message but no INVITE. " + 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 << " contact=" << contactHandle_ << // TODO: get session ID from SLP body if available, it's not set in the headers. - ")." << endl; + ")."; return 0; } @@ -577,14 +561,14 @@ P2PApplication * ApplicationList::createApplication(const P2PMessage &message) // Find the EUF-GUID in the data QRegExp guidRE("EUF-GUID: (.+)\r\n"); guidRE.setMinimal(true); - int guidPos = guidRE.search(slpMessage); + int guidPos = guidRE.indexIn(slpMessage); // If no EUF-GUID is found: if( guidPos == -1 ) { // Notify the user: - kdWarning() << "ApplicationList: P2P message can't be handled, " - << "EUF-GUID not found. (message dump follows)\n" << slpMessage << endl; + kWarning() << "P2P message can't be handled, " + << "EUF-GUID not found. (message dump follows)\n" << slpMessage; return 0; } @@ -602,14 +586,11 @@ P2PApplication * ApplicationList::createApplication(const P2PMessage &message) // Connect up the application #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Connecting P2PApplication signals" << endl; + kDebug() << "Connecting P2PApplication signals"; #endif // Auto-add application addApplication(app); - - // Inform listeners about the new application (notably ChatMaster) - emit newApplication(app); return app; } @@ -623,7 +604,7 @@ P2PApplication * ApplicationList::createApplication(const P2PMessage &message) MimeApplication * ApplicationList::createApplicationByGuid(const QString &appGuid) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Creating MimeApplication for GUID " << appGuid << endl; + kDebug() << "Creating MimeApplication for GUID" << appGuid; #endif if( appGuid == GnomeMeeting::getAppId() ) @@ -646,6 +627,9 @@ MimeApplication * ApplicationList::createApplicationByGuid(const QString &appGui } else { +#ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL + kDebug() << "No MimeApplication exists for this GUID!"; +#endif return 0; } } @@ -660,12 +644,12 @@ MimeApplication * ApplicationList::createApplicationByGuid(const QString &appGui P2PApplication * ApplicationList::createApplicationByEufGuid(const QString &eufGuid) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Creating P2PApplication for GUID " << eufGuid << endl; + kDebug() << "Creating P2PApplication for GUID" << eufGuid; #endif - if( eufGuid == PictureTransferP2P::getAppId() ) + if( eufGuid == MsnObjectTransferP2P::getAppId() ) { - return new PictureTransferP2P( this ); + return new MsnObjectTransferP2P( this ); } else if( eufGuid == FileTransferP2P::getAppId() ) { @@ -685,6 +669,9 @@ P2PApplication * ApplicationList::createApplicationByEufGuid(const QString &eufG } else { +#ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL + kDebug() << "No P2PApplication exists for this GUID!"; +#endif return 0; } } @@ -699,25 +686,22 @@ P2PApplication * ApplicationList::createApplicationByEufGuid(const QString &eufG P2PApplication * ApplicationList::getApplicationByAckData(const P2PMessage &ackMessage) const { unsigned long ackUniqueID = ackMessage.getAckUniqueID(); - QPtrListIterator p2pIterator(p2pApplications_); - while( p2pIterator.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { // The application may have multiple messages unacked, see whether the ACK matches. - if( p2pIterator.current()->hasUnAckedMessage(ackMessage) ) + if( app->hasUnAckedMessage(ackMessage) ) { // Test whether the match was only partial (error displayed here because P2PApplication // calls hasUnAckedMessage() later again, causing the message to appear twice) if( ackUniqueID == 0 ) { // HACK: added for GAIM 1.5 (does not return UniqueID) - kdWarning() << "P2PApplication: Got P2P message with matching ackSessionID and no ackUniqueID set " - << "(delivering anyway, contact=" << contactHandle_ << ")!" << endl; + kWarning() << "Got P2P message with matching ackSessionID and no ackUniqueID set " + << "(delivering anyway, contact=" << contactHandle_ << ")!"; } - return p2pIterator.current(); + return app; } - - ++p2pIterator; } return 0; @@ -732,21 +716,18 @@ P2PApplication * ApplicationList::getApplicationByAckData(const P2PMessage &ackM */ P2PApplication * ApplicationList::getApplicationByCallId(const QString &callID) const { - QPtrListIterator p2pIterator(p2pApplications_); - while( p2pIterator.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Demultiplexing P2P message" - << " (CallID " << p2pIterator.current()->getCallID() << " == " << callID << " ?)" << endl; + kDebug() << "Demultiplexing P2P message" + << " (CallID " << app->getCallID() << " == " << callID << " ?)"; #endif - if( p2pIterator.current()->getCallID() == callID ) + if( app->getCallID() == callID ) { // Found it, return reference - return p2pIterator.current(); + return app; } - - ++p2pIterator; } return 0; @@ -766,29 +747,23 @@ P2PApplication * ApplicationList::getApplicationByCallId(const QString &callID) Application * ApplicationList::getApplicationByCookie(const QString &cookie) const { // First see if there is a p2p application with the cookie. - QPtrListIterator p2pIterator(p2pApplications_); - while ( p2pIterator.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { - if ( p2pIterator.current()->getCookie() == cookie ) + if( app->getCookie() == cookie ) { // Found it, return reference. - return p2pIterator.current(); + return app; } - - ++p2pIterator; } // Also look for a mime application with the cookie. - QPtrListIterator mimeIterator(mimeApplications_); - while ( mimeIterator.current() != 0 ) + foreach( MimeApplication *app, mimeApplications_ ) { - if ( mimeIterator.current()->getCookie() == cookie ) + if ( app->getCookie() == cookie ) { // Found it, return reference. - return mimeIterator.current(); + return app; } - - ++mimeIterator; } return 0; @@ -803,24 +778,21 @@ Application * ApplicationList::getApplicationByCookie(const QString &cookie) con */ P2PApplication * ApplicationList::getApplicationByLastMessage(unsigned long messageID) const { - QPtrListIterator p2pIterator(p2pApplications_); - while( p2pIterator.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - unsigned long debugMsgId = p2pIterator.current()->getLastContactMessageID(); - kdDebug() << "ApplicationList: Demultiplexing P2P message" - << " (fragment MessageID " << debugMsgId << " == " << messageID << " ?)" << endl; + unsigned long debugMsgId = app->getLastContactMessageID(); + kDebug() << "Demultiplexing P2P message" + << " (fragment MessageID " << debugMsgId << " == " << messageID << " ?)"; #endif - if(p2pIterator.current()->getLastContactMessageID() == messageID) + if( app->getLastContactMessageID() == messageID ) { // HACK: Not tested for "getLastContactAckMessageID() == ackMessageID" to support broken implementations. // Found it, save reference - return p2pIterator.current(); + return app; } - - ++p2pIterator; } return 0; @@ -835,21 +807,18 @@ P2PApplication * ApplicationList::getApplicationByLastMessage(unsigned long mess */ P2PApplication * ApplicationList::getApplicationByNonce(const QString &nonce) const { - QPtrListIterator p2pIterator(p2pApplications_); - while( p2pIterator.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Demultiplexing P2P message" - << " (Nonce " << p2pIterator.current()->getNonce() << " == " << nonce << " ?)" << endl; + kDebug() << "Demultiplexing P2P message" + << " (Nonce " << app->getNonce() << " == " << nonce << " ?)"; #endif - if( p2pIterator.current()->getNonce() == nonce ) + if( app->getNonce() == nonce ) { // Found it, return reference - return p2pIterator.current(); + return app; } - - ++p2pIterator; } return 0; @@ -864,20 +833,17 @@ P2PApplication * ApplicationList::getApplicationByNonce(const QString &nonce) co */ P2PApplication * ApplicationList::getApplicationBySessionId(unsigned long sessionID) const { - QPtrListIterator p2pIterator(p2pApplications_); - while( p2pIterator.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Demultiplexing P2P message" - << " (SessionID " << p2pIterator.current()->getSessionID() << " == " << sessionID << " ?)" << endl; + kDebug() << "Demultiplexing P2P message" + << " (SessionID " << app->getSessionID() << " == " << sessionID << " ?)"; #endif - if( p2pIterator.current()->getSessionID() == sessionID ) + if( app->getSessionID() == sessionID ) { // Found the session - return p2pIterator.current(); + return app; } - - ++p2pIterator; } return 0; @@ -920,7 +886,7 @@ MsnDirectConnection * ApplicationList::getDirectConnection() const void ApplicationList::gotMessage(const MimeMessage &message) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Parsing Mime appliation message." << endl; + kDebug() << "Parsing Mime appliation message."; message.print(); #endif Application *app = 0; @@ -943,8 +909,8 @@ void ApplicationList::gotMessage(const MimeMessage &message) app = getApplicationByCookie( message.getValue("Invitation-Cookie") ); if( app == 0 ) { - kdWarning() << "ApplicationList: Unable to handle MIME message, " - << "Invitation-Cookie not found (contact=" << contactHandle_ << ")." << endl; + kWarning() << "Unable to handle MIME message, " + << "Invitation-Cookie not found (contact=" << contactHandle_ << ")."; return; } } @@ -952,7 +918,7 @@ void ApplicationList::gotMessage(const MimeMessage &message) // Last check before casting the object. if( ! app->inherits("MimeApplication") ) { - kdWarning() << "ApplicationList::gotMessage: found application is not a mime application!" << endl; + kWarning() << "found application is not a mime application!"; return; } @@ -977,7 +943,7 @@ void ApplicationList::gotMessage(const P2PMessage &message) { // Parse the message #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Parsing received P2P message:" + kDebug() << "Parsing received P2P message:" << " sid=" << message.getSessionID() << " mid=" << message.getMessageID() << " ackSid=" << message.getAckSessionID() @@ -986,7 +952,7 @@ void ApplicationList::gotMessage(const P2PMessage &message) << " size=" << message.getDataSize() << " offset=" << message.getDataOffset() // also useful for debugging! << " total=" << message.getTotalSize() - << " no.sessions=" << p2pApplications_.count() << endl; + << " no.sessions=" << p2pApplications_.count(); #endif P2PApplication *p2pApplication = 0; @@ -1001,20 +967,38 @@ void ApplicationList::gotMessage(const P2PMessage &message) // The message has a SessionID set p2pApplication = getApplicationBySessionId( sessionID ); - // Notify the user if the message was invalid (send error-response later) + // If there is no session for this ID, there are still some special cases. if(p2pApplication == 0) { - kdWarning() << "ApplicationList: Unable to handle P2P message, Session-ID " << sessionID << " not found." << endl; + switch( sessionID ) + { + case InkTransferP2P::SESSION_ID: +#ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL + kDebug() << "Found reserved session ID for Ink transfers, creating InkTransferP2P instance."; +#endif + // Ink messages have a fixed session ID. + p2pApplication = new InkTransferP2P( this ); + addApplication( p2pApplication ); + break; + + // MSN 6 also used this system for Winks. + + default: + // Normal P2P session -> notify the user if the message was invalid. (send error-response later) + kWarning() << "Unable to handle P2P message, Session-ID " << sessionID << " not found."; + } } } - 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. if( message.isConnectionHandshake() ) { - kdWarning() << "ApplicationList: Received a direct connection handshake message at the switchboard " - "(contact=" << contactHandle_ << " action=return)." << endl; + kWarning() << "Received a direct connection handshake message at the switchboard " + "(contact=" << contactHandle_ << " action=return)."; return; } @@ -1027,15 +1011,15 @@ void ApplicationList::gotMessage(const P2PMessage &message) if(p2pApplication == 0) { // NOTE: if flags==64 (0x40), it it's possible this is actually a bug from MSN7.0. - kdWarning() << "ApplicationList: P2P message can't be handled," + kWarning() << "P2P message can't be handled," " no match for ackSessionID " << message.getAckSessionID() << - " or ackUniqueID " << message.getAckUniqueID() << " found." << endl; + " or ackUniqueID " << message.getAckUniqueID() << " found."; } } else if( message.getFlags() == 0 && message.getDataSize() == 0 && message.getAckUniqueID() == 0 ) { // HACK: added for bot Bot2k3 4.1 (sends first ack without UniqueID, flags or any other context) - kdWarning() << "SwitchBoard P2P message has no ACK fields set at all, assuming base identifier message!" << endl; + kWarning() << "SwitchBoard P2P message has no ACK fields set at all, assuming base identifier message!"; } else if( message.isSlpData() ) { @@ -1055,33 +1039,33 @@ void ApplicationList::gotMessage(const P2PMessage &message) // Find the call ID // Note this assumes that a Call-ID will be found in the first fragment. - slpMessage = QString::fromUtf8( message.getData(), message.getDataSize() ); - int callPos = callRE.search(slpMessage); + slpMessage = QString::fromUtf8( message.getData(), (int)message.getDataSize() ); + int callPos = callRE.indexIn( slpMessage ); if( callPos == -1 ) { - kdWarning() << "ApplicationList: Unable to handle P2P message, CallID field not found." << endl; + kWarning() << "Unable to handle P2P message, CallID field not found."; } 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. if( callID == "{00000000-0000-0000-0000-000000000000}" ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Found null Call-ID, using Session-ID to deliver the message." << endl; + kDebug() << "Found null Call-ID, using Session-ID to deliver the message."; #endif // HACK use the SessionID from the SLP body to route the message. // This is a bit like reading the "HTTP Host" field to route an IP packet, but MSNP2P leaves us with no other choice. QRegExp sessionRE("SessionID: ([0-9]+)\r\n"); sessionRE.setMinimal( true ); - long sessionPos = sessionRE.search( slpMessage ); + long sessionPos = sessionRE.indexIn( slpMessage ); if( sessionPos == -1 ) { - kdWarning() << "ApplicationList: Unable to handle P2P message, found null-guid CallID but no SessionID instead." << endl; + kWarning() << "Unable to handle P2P message, found null-guid CallID but no SessionID instead."; } else { @@ -1094,7 +1078,7 @@ void ApplicationList::gotMessage(const P2PMessage &message) { // Also observed in some cases. #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Also found zero Session-ID, will create an empty application instance to handle the message." << endl; + kDebug() << "Also found zero Session-ID, will create an empty application instance to handle the message."; #endif // Create it here so there won't be any message dumps. @@ -1116,10 +1100,10 @@ void ApplicationList::gotMessage(const P2PMessage &message) if( p2pApplication == 0 ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: No existing P2P session found for the MSNSLP message, " - << "must be a new session invitation." << endl; + kDebug() << "No existing P2P session found for the MSNSLP message, " + << "must be a new session invitation."; #endif - + p2pApplication = createApplication( message ); } } @@ -1129,7 +1113,7 @@ void ApplicationList::gotMessage(const P2PMessage &message) else { // Didn't reconize the flag type. - kdWarning() << "ApplicationList: P2P message can't be handled, unknown flag type found." << endl; + kWarning() << "P2P message can't be handled, unknown flag type found."; if( message.getFlags() == 0 ) { // HACK: added for broken clients who sent an empty message with a zero flag (Bot2K3 v4.1) @@ -1147,30 +1131,32 @@ void ApplicationList::gotMessage(const P2PMessage &message) { // Force logging all unknown messages, to help improving the protocol knowledge // This is not hidden, because this information is essential for debugging user problems. - kdWarning() << "ApplicationList: A message could not be delivered to an existing P2P application " + kWarning() << "A message could not be delivered to an existing P2P application " "(see previous warnings for details," " sid=" << message.getSessionID() << " flags=0x" << QString::number(message.getFlags(), 16) << " size=" << message.getDataSize() << - " contact=" << contactHandle_ << ")." << endl; + " contact=" << contactHandle_ << ")."; // Also dump the SLP message if it's there. if( ! slpMessage.isEmpty() && message.getSessionID() == 0 && message.getDataSize() > 0 ) { - kdDebug() << "ApplicationList: Dumping SLP message payload:\n" << slpMessage << "\n" << endl; + kDebug() << "Dumping SLP message payload:\n" << slpMessage << "\n"; } // 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 - kdDebug() << "ApplicationList: Not sending a P2P Error response for error message." << endl; + kDebug() << "Not sending a P2P Error response for error message."; #endif } else { - kdDebug() << "ApplicationList: Creating temporary P2PApplication instance to send error response." << endl; + kDebug() << "Creating temporary P2PApplication instance to send error response."; // Create a default application to send the correct error response (also for unknown invitation types) // Application auto-deletes itself. @@ -1234,22 +1220,16 @@ bool ApplicationList::hasDirectConnection() const */ bool ApplicationList::hasMsnObjectTransfer( const MsnObject &msnObject ) const { - QPtrListIterator it( p2pApplications_ ); - P2PApplication *app; - PictureTransferP2P *transferApp; - while( it.current() != 0 ) + foreach( P2PApplication *app, p2pApplications_ ) { - app = it.current(); - if( app->isA("PictureTransferP2P") ) + MsnObjectTransferP2P *transferApp = qobject_cast( app ); + if( transferApp != 0 ) { - transferApp = static_cast( app ); if( transferApp->getMsnObject().getDataHash() == msnObject.getDataHash() ) { return true; } } - - ++it; } return false; @@ -1288,10 +1268,10 @@ bool ApplicationList::hasPendingConnections() const void ApplicationList::initializeDirectConnectionPool() { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Initializing direct connection pool." << endl; + kDebug() << "Initializing direct connection pool."; #endif #ifdef KMESSTEST - ASSERT( directConnectionPool_ == 0 ); + KMESS_ASSERT( directConnectionPool_ == 0 ); #endif if( directConnectionPool_ == 0 ) @@ -1347,10 +1327,10 @@ void ApplicationList::pauseApplications() * This causes the application to receive requests to send new parts, * so the file transfer speed remains optimal for low and high speed network links. */ -void ApplicationList::registerDataSendingApplication( P2PApplication *application ) +void ApplicationList::registerDataSendingApplication( P2PApplicationBase *application ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::registerDataSendingApplication() - adding application to the list of active outgoing transfers." << endl; + kDebug() << "adding application to the list of active outgoing transfers."; #endif // See if it's the first app. @@ -1368,16 +1348,16 @@ void ApplicationList::registerDataSendingApplication( P2PApplication *applicatio if( ! sbReadyWriteTester_.isActive() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::registerDataSendingApplication() - no direct connection available, starting switchboard write handler instead." << endl; + kDebug() << "no direct connection available, starting switchboard write handler instead."; #endif // Start the write handler for the switchboard. - sbReadyWriteTester_.start( 10, true ); + sbReadyWriteTester_.start( 10 ); } else { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::registerDataSendingApplication() - no direct connection available, but switchboard write handler is already active." << endl; + kDebug() << "no direct connection available, but switchboard write handler is already active."; #endif } } @@ -1391,13 +1371,13 @@ void ApplicationList::registerDataSendingApplication( P2PApplication *applicatio if( isFirstApp ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::registerDataSendingApplication() - first application added, " - << "starting connection write handler." << endl; + kDebug() << "first application added, " + << "starting connection write handler."; #endif } else { - kdWarning() << "ApplicationList::registerDataSendingApplication() - there are already applications, but no write handler connected yet." << endl; + kWarning() << "there are already applications, but no write handler connected yet."; } // Connect the write handler. @@ -1417,10 +1397,10 @@ void ApplicationList::registerDataSendingApplication( P2PApplication *applicatio void ApplicationList::resumeApplications(bool /*isPrivateChat*/) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::resumeApplications() - resuming applications." << endl; + kDebug() << "resuming applications."; #endif #ifdef KMESSTEST - ASSERT( pauseApplications_ ); + KMESS_ASSERT( pauseApplications_ ); #endif // Allow slotSwitchboardTestReadyWrite() again. @@ -1430,7 +1410,7 @@ void ApplicationList::resumeApplications(bool /*isPrivateChat*/) if( dataSendingApplications_.isEmpty() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::resumeApplications() - no action taken because no appliations need to transfer data." << endl; + kDebug() << "no action taken because no appliations need to transfer data."; #endif return; } @@ -1441,18 +1421,18 @@ void ApplicationList::resumeApplications(bool /*isPrivateChat*/) if( sbReadyWriteTester_.isActive() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::resumeApplications() - switchboard write handler is already active, " - << "no special action needed." << endl; + kDebug() << "switchboard write handler is already active, " + << "no special action needed."; #endif } else { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::resumeApplications() - restarting switchboard write handler." << endl; + kDebug() << "restarting switchboard write handler."; #endif // No direct connection (as expected), restart switchboard write handler. - sbReadyWriteTester_.start( 10, true ); + sbReadyWriteTester_.start( 10 ); } } else @@ -1462,15 +1442,15 @@ void ApplicationList::resumeApplications(bool /*isPrivateChat*/) if( directConnection_->isWriteHandlerConnected() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::resumeApplications() - direct connection is available with write handler, " - << "no special action needed." << endl; + kDebug() << "direct connection is available with write handler, " + << "no special action needed."; #endif } else { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::resumeApplications() - direct connection is available, " - << "reconnecting write handler.." << endl; + kDebug() << "direct connection is available, " + << "reconnecting write handler.."; #endif // Connect the write handler to resume! @@ -1488,12 +1468,12 @@ 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. - ASSERT( messageBody[0].isLetter() ); - ASSERT( messageData.getBinaryBody().size() == 0 ); + KMESS_ASSERT( messageBody[0].isLetter() ); + KMESS_ASSERT( messageData.getBinaryBody().size() == 0 ); #endif // Deliver the message over the switchboard in a mime message @@ -1526,15 +1506,15 @@ void ApplicationList::sendMessage(const MimeApplication *source, const MimeMessa * @return Whether the message can be sent. If the socket would block, false is returned. * This only occurs for direct connections connections. */ -bool ApplicationList::sendMessage(const P2PApplication *source, const QByteArray &header, const QByteArray &messageData, uint footerCode) +bool ApplicationList::sendMessage(const P2PApplicationBase *source, const QByteArray &header, const QByteArray &messageData, uint footerCode) { // Verify whether a direct connection exists to send the message. // It needs to be connected and authorized. if( directConnection_ != 0 ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::sendMessage() - there is a direct connection object, " - "test if the socket is still connected and not timed out." << endl; + kDebug() << "there is a direct connection object, " + "test if the socket is still connected and not timed out."; #endif if( ! KMESS_NULL(directConnectionPool_) ) @@ -1554,39 +1534,26 @@ bool ApplicationList::sendMessage(const P2PApplication *source, const QByteArray { // Deliver the message over the direct connection. // The footer will not be appended to the message. - // Concatenate the message. - uint rawSize = (header.size() + messageData.size()); // header + body - char *rawData = new char[rawSize]; // create buffer - memcpy(rawData, header.data(), header.size()); // copy header - - if( messageData.size() > 0 ) - { - // Copy body - memcpy(rawData + header.size(), messageData.data(), messageData.size()); - } - - // Wrap *rawData in a QByteArray, and sent over the direct connection - QByteArray p2pMessage; - p2pMessage.assign(rawData, rawSize); // auto deletes *rawData - bool success = directConnection_->sendMessage(p2pMessage); + QByteArray p2pMessage = header + messageData; + bool success = directConnection_->sendMessage( p2pMessage ); if( success ) { return true; } else if( directConnection_->hasTemporaryWriteError() ) { - kdWarning() << "ApplicationList::sendMessage() - message could not be fully sent, " - "but the remaining part is in the send buffer." << endl; + kWarning() << "message could not be fully sent, " + "but the remaining part is in the send buffer."; return true; } else { #ifdef KMESSTEST - ASSERT( directConnection_->hasLastWriteFailed() ); + KMESS_ASSERT( directConnection_->hasLastWriteFailed() ); #endif - kdWarning() << "ApplicationList::sendMessage() - P2P message could not be sent over the direct connection, " - "using switchboard instead (contact=" << contactHandle_ << ")." << endl; + kWarning() << "P2P message could not be sent over the direct connection, " + "using switchboard instead (contact=" << contactHandle_ << ")."; // NOTE: The direct connection will still appear as connected. // Next events are not processed yet. That's why there is a check for hasLastWriteFailed() below. @@ -1682,8 +1649,8 @@ void ApplicationList::setPendingConnectionInvitation(bool state) if( failed ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Pending connection invitation was aborted by P2PApplication, " - << "informing application no direct connection is possible." << endl; + kDebug() << "Pending connection invitation was aborted by P2PApplication, " + << "informing application no direct connection is possible."; #endif emit connectionFailed(); @@ -1700,10 +1667,10 @@ void ApplicationList::setPendingConnectionInvitation(bool state) void ApplicationList::slotActiveConnectionAuthorized() { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Direct connection with '" << contactHandle_ << "' authorized." << endl; + kDebug() << "Direct connection with '" << contactHandle_ << "' authorized."; #endif #ifdef KMESSTEST - ASSERT( directConnection_ != 0 ); + KMESS_ASSERT( directConnection_ != 0 ); #endif // Inform *all* awaiting applications they can start to use the connection. @@ -1721,7 +1688,7 @@ void ApplicationList::slotActiveConnectionAuthorized() void ApplicationList::slotActiveConnectionClosed() { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: The direct connection with '" << contactHandle_ << "' was closed." << endl; + kDebug() << "The direct connection with '" << contactHandle_ << "' was closed."; #endif // Reset state variable. @@ -1747,8 +1714,8 @@ void ApplicationList::slotActiveConnectionClosed() // Active connection closed, but no pointer known. // It must be reset in slotGotDirectConnectionMessage() when the nonce was invalid. #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: The current connection was closed prematurely, " - << "signaling instead that the connection failed." << endl; + kDebug() << "The current connection was closed prematurely, " + << "signaling instead that the connection failed."; #endif // Notify the connection failed. @@ -1765,32 +1732,29 @@ void ApplicationList::slotActiveConnectionClosed() { // Build a list of sessions for debugging QString activeSessions; - QPtrListIterator it( dataSendingApplications_ ); - while( it.current() != 0 ) + foreach( P2PApplicationBase *app, dataSendingApplications_ ) { - P2PApplication *app = it.current(); if( ! activeSessions.isEmpty() ) { activeSessions += ","; } activeSessions += QString::number( app->getSessionID() ); - ++it; } // Give users some insight why transfer becomes slow. - kdWarning() << "ApplicationList::slotActiveConnectionClosed() - The direct connection closed " + kWarning() << "The direct connection closed " "while there are active file transfers over the connection. " "Switching sessions to slow indirect transfer " "(sessions=" << activeSessions << - " contact=" << contactHandle_ << ")." << endl; + " contact=" << contactHandle_ << ")."; #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotActiveConnectionClosed() - direct connection closed, " - << "starting switchboard write handler to continue transfers." << endl; + kDebug() << "direct connection closed, " + << "starting switchboard write handler to continue transfers."; #endif // No direct connection (as expected), restart switchboard write handler. - sbReadyWriteTester_.start( 10, true ); + sbReadyWriteTester_.start( 10 ); } } } @@ -1805,12 +1769,12 @@ void ApplicationList::slotActiveConnectionClosed() void ApplicationList::slotAllConnectionsFailed() { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotAllConnectionsFailed() - The direct connection with '" << contactHandle_ << "' could not be made." << endl; + kDebug() << "The direct connection with '" << contactHandle_ << "' could not be made."; #endif #ifdef KMESSTEST - ASSERT( directConnectionPool_ != 0 ); - ASSERT( ! directConnectionPool_->hasActiveConnection() ); - ASSERT( ! directConnectionPool_->hasPendingConnections() ); + KMESS_ASSERT( directConnectionPool_ != 0 ); + KMESS_ASSERT( ! directConnectionPool_->hasActiveConnection() ); + KMESS_ASSERT( ! directConnectionPool_->hasPendingConnections() ); #endif // It's possible a connection fails directly before all addConnection() calls are made. @@ -1819,7 +1783,7 @@ void ApplicationList::slotAllConnectionsFailed() if( directConnection_ == 0 && addingConnections_ ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotAllConnectionsFailed() - No connections left, but still adding connections. Ignoring event." << endl; + kDebug() << "No connections left, but still adding connections. Ignoring event."; #endif return; } @@ -1827,11 +1791,11 @@ void ApplicationList::slotAllConnectionsFailed() #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL if( directConnection_ == 0 ) { - kdDebug() << "ApplicationList::slotAllConnectionsFailed() - No remaining direct connections left" << endl; + kDebug() << "No remaining direct connections left"; } else { - kdDebug() << "ApplicationList::slotAllConnectionsFailed() - The current connection was closed prematurely" << endl; + kDebug() << "The current connection was closed prematurely"; } #endif @@ -1862,11 +1826,11 @@ void ApplicationList::slotAllConnectionsFailed() void ApplicationList::slotConnectionEstablished() { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Direct connection with '" << contactHandle_ << "' established." << endl; + kDebug() << "Direct connection with '" << contactHandle_ << "' established."; #endif #ifdef KMESSTEST - ASSERT( directConnection_ == 0 ); - ASSERT( directConnectionPool_ != 0 ); + KMESS_ASSERT( directConnection_ == 0 ); + KMESS_ASSERT( directConnectionPool_ != 0 ); #endif // Reset state variable. @@ -1893,16 +1857,16 @@ void ApplicationList::slotConnectionReadyWrite() if( KMESS_NULL(directConnection_) ) return; #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotConnectionReadyWrite() - The direct connection is ready to send more data, " - << "notifying applications." << endl; + kDebug() << "The direct connection is ready to send more data, " + << "notifying applications."; #endif // Disconnect the event handler if there are no longer applications that need to transfer data. if( dataSendingApplications_.isEmpty() || p2pApplications_.isEmpty() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotConnectionReadyWrite() - no active outgoing transfers left, " - << "disconnecting write handler." << endl; + kDebug() << "no active outgoing transfers left, " + << "disconnecting write handler."; #endif directConnection_->disconnectWriteHandler( this, SLOT(slotConnectionReadyWrite()) ); @@ -1911,15 +1875,13 @@ void ApplicationList::slotConnectionReadyWrite() // Determine the number of preferred fragments to send. // By default 3 for a direct connection, unless there are more parallel transfers. - int preferredFragments = CEIL( QMIN( 3, 4 / dataSendingApplications_.count() ) ); + int preferredFragments = CEIL( qMin( 3, 4 / dataSendingApplications_.count() ) ); // Start notifying. bool writeSuccess = true; - QPtrListIterator it( dataSendingApplications_ ); - while( it.current() != 0 ) + foreach( P2PApplicationBase *app, dataSendingApplications_ ) { // Tell the application to send the next file parts. - P2PApplication *app = it.current(); writeSuccess = app->sendNextDataParts( preferredFragments ); // Avoid freezes, don't call the app again if will fail every time. @@ -1927,8 +1889,6 @@ void ApplicationList::slotConnectionReadyWrite() { unregisterDataSendingApplication( app ); } - - ++it; } } @@ -1947,22 +1907,22 @@ void ApplicationList::slotConnectionReadyWrite() void ApplicationList::slotGotDirectConnectionMessage(const QByteArray &messageData) { #ifdef KMESSTEST - ASSERT( directConnection_ != 0 ); + KMESS_ASSERT( directConnection_ != 0 ); #endif // Last check to know this is really a P2P message. if(messageData.size() < 48) { - kdWarning() << "ApplicationList: Received an unknown message from the " - << " direct-connection-link (message dump follows).\n" << messageData.data() << endl; + kWarning() << "Received an unknown message from the " + << " direct-connection-link (message dump follows).\n" << messageData.data(); return; } // Parse the message P2PMessage message(messageData); #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Received data message from the direct connection link" - << " (flags=0x" << QString::number(message.getFlags(), 16) << ")." << endl; + kDebug() << "Received data message from the direct connection link" + << " (flags=0x" << QString::number(message.getFlags(), 16) << ")."; #endif @@ -1974,14 +1934,14 @@ void ApplicationList::slotGotDirectConnectionMessage(const QByteArray &messageDa if( app == 0 ) { // Invalid nonce! Drop connection - kdWarning() << "P2PApplication: Contact sent invalid nonce or session was already terminated, " - << "closing direct connection." << endl; + kWarning() << "Contact sent invalid nonce or session was already terminated, " + << "closing direct connection."; #ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kdDebug() << "P2PApplication: Closing connection, moving transfer to switchboard." << endl; + kDebug() << "Closing connection, moving transfer to switchboard."; #endif #ifdef KMESSTEST - ASSERT( sender() != 0 ); - ASSERT( static_cast(sender()) == directConnectionPool_->getActiveConnection() ); + KMESS_ASSERT( sender() != 0 ); + KMESS_ASSERT( static_cast(sender()) == directConnectionPool_->getActiveConnection() ); #endif // Close the connection. @@ -2019,8 +1979,8 @@ void ApplicationList::slotSwitchboardTestReadyWrite() if( pauseApplications_ ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - switchboard requested pause, " - << "postponing action." << endl; + kDebug() << "switchboard requested pause, " + << "postponing action."; #endif return; } @@ -2029,24 +1989,22 @@ void ApplicationList::slotSwitchboardTestReadyWrite() if( dataSendingApplications_.isEmpty() || p2pApplications_.isEmpty() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - no active outgoing transfers left, " - << "disconnecting write handler." << endl; + kDebug() << "no active outgoing transfers left, " + << "disconnecting write handler."; #endif return; } #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - a switchboard is ready to send more data, " - << "notifying applications." << endl; + kDebug() << "a switchboard is ready to send more data, " + << "notifying applications."; #endif // Start notifying. bool writeSuccess = true; - QPtrListIterator it( dataSendingApplications_ ); - while( it.current() != 0 ) + foreach( P2PApplicationBase *app, dataSendingApplications_ ) { // Tell the application to send the next file parts. - P2PApplication *app = it.current(); writeSuccess = app->sendNextDataParts( 1 ); // Avoid freezes, don't call the app again if will fail every time. @@ -2054,15 +2012,13 @@ void ApplicationList::slotSwitchboardTestReadyWrite() { unregisterDataSendingApplication( app ); } - - ++it; } // Find out if the applications are done now. if( dataSendingApplications_.isEmpty() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - all applications are done." << endl; + kDebug() << "all applications are done."; #endif return; } @@ -2083,8 +2039,8 @@ void ApplicationList::slotSwitchboardTestReadyWrite() { if( directConnection_->hasLastWriteFailed() ) { - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - A direct connection became available, " - "but had a error while writing. Will continue to use the switchboard." << endl; + kDebug() << "A direct connection became available, " + "but had a error while writing. Will continue to use the switchboard."; } } #endif @@ -2099,25 +2055,25 @@ void ApplicationList::slotSwitchboardTestReadyWrite() if( ! pauseApplications_ ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - scheduling next call." << endl; + kDebug() << "scheduling next call."; #endif // Instead of receiving a signal from the switchboard, // fake one right now. This is currently good enough. - sbReadyWriteTester_.start( 200, true ); + sbReadyWriteTester_.start( 200 ); } else { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - switchboard requested to pause the transfer, " - << "postponing next action." << endl; + kDebug() << "switchboard requested to pause the transfer, " + << "postponing next action."; #endif } } else { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - switching to direct connection transfer." << endl; + kDebug() << "switching to direct connection transfer."; #endif // There appears to be a direct connection! @@ -2126,8 +2082,8 @@ void ApplicationList::slotSwitchboardTestReadyWrite() if( ! directConnection_->isWriteHandlerConnected() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotSwitchboardTestReadyWrite() - no write handler connected yet, " - << "connecting write handler to direct connection." << endl; + kDebug() << "no write handler connected yet, " + << "connecting write handler to direct connection."; #endif directConnection_->connectWriteHandler( this, SLOT(slotConnectionReadyWrite()) ); } @@ -2142,47 +2098,49 @@ void ApplicationList::slotSwitchboardTestReadyWrite() */ void ApplicationList::slotTerminateApplication(Application *application) { + MimeApplication *mimeApp = qobject_cast( application ); + P2PApplicationBase *p2pApp = qobject_cast( application ); + // Update the internal lists. - if( application->qt_cast("MimeApplication") != 0 ) + if( mimeApp != 0 ) { // It's a mime application - if( ! mimeApplications_.removeRef( static_cast(application) ) ) + if( mimeApplications_.removeAll( mimeApp ) == 0 ) { - kdWarning() << "ApplicationList::slotTerminateApplication: Could not remove MimeApplication" - << " (type=" << application->className() << " contact=" << contactHandle_ << ")!" << endl; + kWarning() << "Could not remove MimeApplication" + << " (type=" << mimeApp->metaObject()->className() << " contact=" << contactHandle_ << ")!"; } } - else if( application->qt_cast("P2PApplication") != 0 ) + else if( p2pApp != 0 ) { // Remove from data sending apps too! // Use the same unregister function so the write handler will also be disconnected. - P2PApplication *p2pApplication = static_cast( application ); - if( dataSendingApplications_.containsRef( p2pApplication ) ) + if( dataSendingApplications_.contains( p2pApp ) ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotTerminateApplication() - application is terminating while sending data, unregistering as data sending application first." << endl; + kDebug() << "application is terminating while sending data, unregistering as data sending application first."; #endif - unregisterDataSendingApplication( p2pApplication ); + unregisterDataSendingApplication( p2pApp ); } // Remove from collection - if( ! p2pApplications_.removeRef( static_cast(application) ) ) + if( p2pApplications_.removeAll( static_cast( p2pApp ) ) == 0 ) { - kdWarning() << "ApplicationList::slotTerminateApplication: Could not remove P2PApplication" - << " (type=" << application->className() << " contact=" << contactHandle_ << ")!" << endl; + kWarning() << "Could not remove P2PApplication" + " (type=" << p2pApp->metaObject()->className() << " contact=" << contactHandle_ << ")!"; } } else { // Warn when there is a problem deleting the object. - kdWarning() << "ApplicationList::slotTerminateApplication: Can't determine type of application " - << " (type=" << application->className() << " contact=" << contactHandle_ << ")!" << endl; + kWarning() << "Can't determine type of application " + " (type=" << application->metaObject()->className() << " contact=" << contactHandle_ << ")!"; } #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Removing application." << endl; + kDebug() << "Removing application."; #endif // Remove the application @@ -2194,18 +2152,18 @@ void ApplicationList::slotTerminateApplication(Application *application) // This is using a QPtrList so the process is not disturbed by newly added applications or apps left active. if( ! abortingApplications_.isEmpty() ) { - if( abortingApplications_.removeRef(application) ) + if( abortingApplications_.removeAll( application ) ) { if( ! abortingApplications_.isEmpty() ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotTerminateApplication: Still " << abortingApplications_.count() << " other applications left to abort..." << endl; + kDebug() << "Still " << abortingApplications_.count() << " other applications left to abort..."; #endif } else { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::slotTerminateApplication: Signalling that applications of '" << contactHandle_ << "' have been aborted." << endl; + kDebug() << "Signalling that applications of '" << contactHandle_ << "' have been aborted."; #endif // This may cause listeners to delete this object.. @@ -2215,7 +2173,7 @@ void ApplicationList::slotTerminateApplication(Application *application) else { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList: Application was not part of the scheduelled applications to abort." << endl; + kDebug() << "Application was not part of the scheduelled applications to abort."; #endif } } @@ -2225,23 +2183,23 @@ void ApplicationList::slotTerminateApplication(Application *application) /** * @brief Remove the registration of an application which sends a file. */ -void ApplicationList::unregisterDataSendingApplication( P2PApplication *application ) +void ApplicationList::unregisterDataSendingApplication( P2PApplicationBase *application ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::unregisterDataSendingApplication() - removing application from the list of active outgoing transfers." << endl; + kDebug() << "removing application from the list of active outgoing transfers."; #endif - bool found = dataSendingApplications_.removeRef( application ); + bool found = dataSendingApplications_.removeAll( application ) > 0; if( ! found ) { - kdWarning() << "ApplicationList::unregisterDataSendingApplication() - application not found in list." << endl; + kWarning() << "application not found in list."; } // Stop write handler is all applications stopped sending a file. if( dataSendingApplications_.isEmpty() && directConnection_ != 0 ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL - kdDebug() << "ApplicationList::unregisterDataSendingApplication() - no applications remaining, disabling connection write handler." << endl; + kDebug() << "no applications remaining, disabling connection write handler."; #endif directConnection_->disconnectWriteHandler( this, SLOT(slotConnectionReadyWrite()) ); @@ -2252,11 +2210,11 @@ void ApplicationList::unregisterDataSendingApplication( P2PApplication *applicat // Debug why the write handler was not disabled yet. if( directConnection_ != 0 ) { - kdDebug() << "ApplicationList::unregisterDataSendingApplication() - connection write handler not disabled, there are still " << dataSendingApplications_.count() << " applications sending file data." << endl; + kDebug() << "connection write handler not disabled, there are still " << dataSendingApplications_.count() << " applications sending file data."; } else { - kdDebug() << "ApplicationList::unregisterDataSendingApplication() - connection write handler not disabled, no direct connection active already." << endl; + kDebug() << "connection write handler not disabled, no direct connection active already."; } } #endif diff --git a/kmess/network/applications/applicationlist.h b/src/network/applications/applicationlist.h similarity index 96% rename from kmess/network/applications/applicationlist.h rename to src/network/applications/applicationlist.h index a166b56..f41c2ba 100644 --- a/kmess/network/applications/applicationlist.h +++ b/src/network/applications/applicationlist.h @@ -18,13 +18,14 @@ #ifndef APPLICATIONLIST_H #define APPLICATIONLIST_H -#include -#include -#include +#include +#include + class Application; class MimeApplication; class P2PApplication; +class P2PApplicationBase; class P2PMessage; class MimeMessage; class ChatMessage; @@ -116,7 +117,7 @@ class ApplicationList : public QObject // Add a new application to the list. void addApplication(P2PApplication *application); // Attempt to establish a direct connection at the given ipaddress/port. - bool addConnection(const QString &ipAddress, const int port); + bool addConnection(const QString &ipAddress, const quint16 port); // Attempt to establish a direct connection by listening at an random port. int addServerConnection(); // Abort all applications, the contact is leaving a chat. @@ -150,17 +151,17 @@ class ApplicationList : public QObject // Pause all applications, avoid flooding the switchboard message queue. void pauseApplications(); // Register an application which is sending a file. - void registerDataSendingApplication( P2PApplication *application ); + void registerDataSendingApplication( P2PApplicationBase *application ); // Resume all applications, allowing messages to be sent again. void resumeApplications(bool isPrivateChat = true); // Send a message for a P2P application over one of the available connections/bridges. - bool sendMessage(const P2PApplication *source, const QByteArray &header, const QByteArray &messageData = 0, uint footerCode = 0); + bool sendMessage(const P2PApplicationBase *source, const QByteArray &header, const QByteArray &messageData = 0, uint footerCode = 0); // Whether an application is adding connections, don't send "all failed" signal. void setAddingConnections(bool state); // Set whether the transfer invitation has been sent. void setPendingConnectionInvitation(bool state); // Remove the registration of an application which sends a file. - void unregisterDataSendingApplication( P2PApplication *application ); + void unregisterDataSendingApplication( P2PApplicationBase *application ); public slots: // Send a message for a Mime application. @@ -217,21 +218,21 @@ class ApplicationList : public QObject // Whether an application is adding connections, don't send "all failed" signal. bool addingConnections_; // A list of all applications that are being aborted. - QPtrList abortingApplications_; + QList abortingApplications_; // The contact this class was initiated for. QString contactHandle_; // A list of pointers to all applications which are sending a file. - QPtrList dataSendingApplications_; + QList dataSendingApplications_; // The direct connection established with the contact MsnDirectConnection *directConnection_; // The list of direct connection attempts DirectConnectionPool *directConnectionPool_; // A list of pointers to all open mime transfers. - QPtrList mimeApplications_; + QList mimeApplications_; // Whether the application sending is paused. bool pauseApplications_; // A list of pointers to all open p2p transfers. - QPtrList p2pApplications_; + QList p2pApplications_; // The direct connection invitation is sent. bool pendingConnectionInvitation_; // The ready-write tester for the switchboard diff --git a/kmess/network/applications/filetransfer.cpp b/src/network/applications/filetransfer.cpp similarity index 56% rename from kmess/network/applications/filetransfer.cpp rename to src/network/applications/filetransfer.cpp index 0963117..d98ca42 100644 --- a/kmess/network/applications/filetransfer.cpp +++ b/src/network/applications/filetransfer.cpp @@ -19,21 +19,21 @@ #include "filetransfer.h" -#include - -#include -#include -#include - -#include "../mimemessage.h" -#include "../extra/msnftpconnection.h" +#include "../../utils/kmessconfig.h" #include "../../currentaccount.h" #include "../../kmessdebug.h" +#include "../extra/msnftpconnection.h" +#include "../mimemessage.h" + +#include +#include + +#include // It wouldn't hurt if these GUI specific features are removed here. // That would make this class GUI-independant and only emit signals for possible GUI actions. -#include -#include +#include +#include #include "../../dialogs/transferwindow.h" @@ -42,6 +42,7 @@ #endif + // The constructor without filename (sufficient for incoming sessions) FileTransfer::FileTransfer(const QString &contactHandle) : MimeApplication(contactHandle) @@ -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_ ); @@ -90,19 +95,48 @@ FileTransfer::~FileTransfer() void FileTransfer::connectMsnFtpConnection() { #ifdef KMESSTEST - ASSERT( msnFtpConnection_ != 0 ); + 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 ); + } } @@ -111,21 +145,28 @@ void FileTransfer::connectMsnFtpConnection() void FileTransfer::contactStarted1_ContactInvitesUser(const MimeMessage& message) { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::contactStarted1_ContactInvitesUser()" << endl; + 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_ = message.getValue("Connectivity").at(0).latin1(); + 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") ); + if( connectivity.size() > 0 ) + { + connectivity_ = connectivity.at(0).toLatin1(); + } + } // Send the message to the chat window. - html = i18n("Do you want to accept the file: %1 (%2)") - .arg( "" + shortFileName_ + "" ) - .arg( toReadableBytes( fileSize_ ) ); - - offerAcceptOrReject( html ); + offerAcceptOrReject( i18n( "The contact wants to send you a file: "%1" (%2).", + "" + suggestedFileName_ + "", + toReadableBytes( fileSize_ ) ) ); } @@ -134,84 +175,136 @@ void FileTransfer::contactStarted1_ContactInvitesUser(const MimeMessage& message void FileTransfer::contactStarted2_UserAccepts() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::contactStarted2_UserAccepts()" << endl; + kDebug() << "Starting."; #endif #ifdef KMESSTEST - 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 - kdDebug() << "FileTransfer::contactStarted2_UserAccepts() - User cancelled in file save dialog" << endl; + // 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; - QString shortName = fileName_.right( fileName_.length() - fileName_.findRev("/") - 1 ); + 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?").arg(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 = fileName_.left( fileName_.findRev("/") ); + 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(IO_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 the file "%1" failed. Could not save the file.", + "" + fileName_ + ""), + ChatMessage::CONTENT_APP_FAILED, false + ); + + slotMsnFtpStatusMessage( i18n( "The transfer of the file "%1" failed. Could not 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" ); @@ -220,6 +313,10 @@ void FileTransfer::contactStarted2_UserAccepts() message.addField( "Request-Data", "IP-Address:" ); sendMessage( message ); + + // Notify the user + modifyOfferMessage(); + showEventMessage( i18n("Transfer accepted."), ChatMessage::CONTENT_APP_STARTED, false ); } @@ -228,18 +325,18 @@ void FileTransfer::contactStarted2_UserAccepts() void FileTransfer::contactStarted3_ContactConfirmsAccept(const MimeMessage& message) { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::contactStarted3_ContactConfirmsAccept()" << endl; + kDebug(); #endif #ifdef KMESSTEST - ASSERT( ! fileName_.isEmpty() ); - ASSERT( ! shortFileName_.isEmpty() ); - ASSERT( file_ != 0 ); - ASSERT( msnFtpConnection_ == 0 ); + KMESS_ASSERT( ! fileName_.isEmpty() ); + KMESS_ASSERT( ! suggestedFileName_.isEmpty() ); + KMESS_ASSERT( file_ != 0 ); + KMESS_ASSERT( msnFtpConnection_ == 0 ); #endif QString ip; QString ipInternal; - int port; + quint16 port; int portXInternal; int portX; QString authCookie; @@ -248,7 +345,7 @@ void FileTransfer::contactStarted3_ContactConfirmsAccept(const MimeMessage& mess ip = message.getValue( "IP-Address" ); ipInternal = message.getValue( "IP-Address-Internal" ); // As of MSN5 portXInternal = message.getValue( "PortX-Internal" ).toInt(); // As of MSN5 - port = message.getValue( "Port" ).toInt(); + port = (quint16)message.getValue( "Port" ).toUInt(); portX = message.getValue( "PortX" ).toInt(); // As of MSN5 authCookie = message.getValue( "AuthCookie" ); @@ -272,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..! @@ -290,17 +387,16 @@ void FileTransfer::contactStarted3_ContactConfirmsAccept(const MimeMessage& mess #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::contactStarted3_ContactConfirmsAccept() - IP: " << ip << " Port: " << port << " AuthCookie: " << authCookie << endl; + kDebug() << "IP: " << ip << " Port: " << port << " AuthCookie: " << authCookie; #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 initializeProgressDialog(true); - slotMsnFtpStatusMessage( i18n("Connecting to %1, port %2").arg(ip).arg(port), MsnFtpConnection::STATUS_DIALOG ); + slotMsnFtpStatusMessage( i18n( "Connecting to %1, port %2", ip, QString::number( port ) ), MsnFtpConnection::STATUS_DIALOG ); // Start the transfer msnFtpConnection_->retrieveFile(file_, ip, port); @@ -316,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 the 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 the 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 the file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); } @@ -329,8 +449,8 @@ QString FileTransfer::getUserAbortMessage() const void FileTransfer::initializeProgressDialog(bool incoming) { #ifdef KMESSTEST - ASSERT( fileSize_ != 0 ); - ASSERT( fileName_.length() > 0 ); + KMESS_ASSERT( fileSize_ != 0 ); + KMESS_ASSERT( fileName_.length() > 0 ); #endif // Create a new entry in the tranfer window @@ -354,7 +474,7 @@ void FileTransfer::slotCancelTransfer( int transferID ) } #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::slotCancelTransfer()" << endl; + kDebug(); #endif // Call userAborted() which cleans up this object correctly @@ -373,33 +493,51 @@ 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) { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::slotMsnFtpStatusMessage() - Status message (type=" << statusType - << " message=" << message << ")." << endl; + kDebug() << "Status message (type=" << statusType + << " message=" << message << ")."; #endif 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; } @@ -407,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; } @@ -427,21 +563,28 @@ void FileTransfer::slotMsnFtpStatusMessage(QString message, int statusType) void FileTransfer::slotMsnFtpTransferComplete() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::slotMsnFtpTransferComplete() - Transfer successful." << endl; + kDebug() << "Transfer successful."; #endif // Displays the success in the transfer window TransferWindow::getInstance()->finishTransfer( transferID_ ); - QString shortName = fileName_.right( fileName_.length() - fileName_.findRev("/") - 1 ); - QString fileURL = "" + shortName + ""; + // Send an event to the chat + QString fileURL( "" + "" + fileName_ + "" + "" ); - showEventMessage( i18n("Successfully transferred file: %1") - .arg("" + fileURL + ""), - ChatMessage::CONTENT_APP_ENDED, ! isUserStartedApp() ); - - // Terminate this application - endApplication(); + // Show an appropriate message + QString message; + if( isUserStartedApp() ) + { + message = i18n( "Successfully sent the file "%1".", fileURL ); + } + else + { + message = i18n( "Successfully received the file "%1".", fileURL ); + } + showEventMessage( message, ChatMessage::CONTENT_APP_ENDED, ! isUserStartedApp() ); } @@ -450,7 +593,7 @@ void FileTransfer::slotMsnFtpTransferComplete() void FileTransfer::slotMsnFtpTransferFailed() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::slotMsnFtpTransferFailed() - Transfer failed." << endl; + kDebug() << "Transfer failed."; #endif // If MsnFtpConnection did not emit a statusMessage(.. STATUS_DIALOG_FAILED) signal @@ -482,23 +625,23 @@ void FileTransfer::slotMsnFtpTransferProgess(unsigned long bytesReceived) // Convert a string to some more readable form -QString FileTransfer::toReadableBytes(uint bytes) +QString FileTransfer::toReadableBytes( ulong bytes ) { QString format; if(bytes > 1048576) { // Using '%.2f' instead of '%.1f' removes the ".0" part, but it's less pretty. format.sprintf("%.1f", (double) bytes / 1048576.0); - return i18n("%1 MB").arg(format); + return i18n( "%1 MB", format ); } else if(bytes > 1024) { format.sprintf("%.1f", (double) bytes / 1024.0); - return i18n("%1 kB").arg(format); + return i18n( "%1 kB", format ); } else { - return i18n("%1 bytes").arg(bytes); + return i18n( "%1 bytes", bytes ); } } @@ -508,7 +651,7 @@ QString FileTransfer::toReadableBytes(uint bytes) void FileTransfer::userAborted() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::userAborted()" << endl; + kDebug(); #endif // Display the cancel state in the transfer window @@ -545,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; } @@ -569,64 +711,69 @@ void FileTransfer::userAborted() void FileTransfer::userStarted1_UserInvitesContact() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::userStarted1_UserInvitesContact()" << endl; + kDebug(); #endif #ifdef KMESSTEST - ASSERT( ! fileName_.isEmpty() ); + KMESS_ASSERT( ! filePath_.isEmpty() ); #endif QString sizeString; MimeMessage message; - // Get a short file name so slotMsnFtpStatusMessage() can use that. - shortFileName_ = fileName_.right( fileName_.length() - fileName_.findRev('/') - 1 ); + 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(IO_ReadOnly); - if( ! open ) + // Stop if the file can't be openend. + if( ! success ) { - // Notify the user, even if debug mode is not enabled. - kdWarning() << "FileTransfer::userStarted1_UserInvitesContact() - Unable to open file: " << fileName_ << "!" << endl; +#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 the 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 the 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").arg("" + shortFileName_ + "") ); + offerCancel( i18n( "Sending file "%1" (%2).", + "" + fileName_ + "", + toReadableBytes( fileSize_ ) ) ); } @@ -635,25 +782,29 @@ void FileTransfer::userStarted1_UserInvitesContact() void FileTransfer::userStarted2_ContactAccepts(const MimeMessage& /*message*/) { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::userStarted2_ContactAccepts()" << endl; + kDebug(); #endif #ifdef KMESSTEST - ASSERT( msnFtpConnection_ == 0 ); + KMESS_ASSERT( msnFtpConnection_ == 0 ); #endif QString html; QString portString; QString authCookie; + // Remove the accept links + 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 the 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 @@ -688,8 +839,8 @@ void FileTransfer::userStarted2_ContactAccepts(const MimeMessage& /*message*/) void FileTransfer::userStarted3_UserPrepares() { #ifdef KMESSTEST - ASSERT( msnFtpConnection_ != 0 ); - ASSERT( file_ != 0 ); + KMESS_ASSERT( msnFtpConnection_ != 0 ); + KMESS_ASSERT( file_ != 0 ); #endif if(file_ != 0) @@ -699,7 +850,7 @@ void FileTransfer::userStarted3_UserPrepares() else { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransfer::userStarted3_UserPrepares() Pointer file_ is null!" << endl; + kDebug() << "Pointer file_ is null!"; #endif slotMsnFtpTransferFailed(); } diff --git a/kmess/network/applications/filetransfer.h b/src/network/applications/filetransfer.h similarity index 85% rename from kmess/network/applications/filetransfer.h rename to src/network/applications/filetransfer.h index 1467a9a..e5304a9 100644 --- a/kmess/network/applications/filetransfer.h +++ b/src/network/applications/filetransfer.h @@ -21,12 +21,17 @@ #define FILETRANSFER_H #include "mimeapplication.h" -#include + +#include + +#include class MsnFtpConnection; class QFile; + + /** * The class for sending a file to a contact. * @@ -43,7 +48,9 @@ class FileTransfer : public MimeApplication // The constructor with filename to start a session FileTransfer(const QString &contactHandle, const QString &filename); // The destructor - ~FileTransfer(); + 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 @@ -59,11 +66,15 @@ 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 - QString toReadableBytes(uint bytes); + QString toReadableBytes( ulong bytes); // 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 @@ -78,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 @@ -95,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/kmess/network/applications/filetransferp2p.cpp b/src/network/applications/filetransferp2p.cpp similarity index 61% rename from kmess/network/applications/filetransferp2p.cpp rename to src/network/applications/filetransferp2p.cpp index 37ae27e..cf91e5c 100644 --- a/kmess/network/applications/filetransferp2p.cpp +++ b/src/network/applications/filetransferp2p.cpp @@ -17,24 +17,26 @@ #include "filetransferp2p.h" +#include "../../utils/thumbnailprovider.h" +#include "../../utils/kmessshared.h" +#include "../../utils/kmessconfig.h" +#include "../../contact/msnobject.h" +#include "../../dialogs/transferwindow.h" +#include "../../kmessdebug.h" #include "../mimemessage.h" #include "../p2pmessage.h" -#include "../../msnobject.h" -#include "../../kmessdebug.h" -#include "../../thumbnailprovider.h" -#include "../../dialogs/transferwindow.h" -#include -#include -#include +#include +#include +#include +#include // for Qt::escape() + +#include +#include +#include +#include +#include -#include -#include -#include -#include -#include -#include -#include /** @@ -63,7 +65,7 @@ FileTransferP2P::FileTransferP2P(ApplicationList *applicationList) FileTransferP2P::FileTransferP2P(ApplicationList *applicationList, const QString &filename) : P2PApplication(applicationList), file_(0), - fileName_(filename), + filePath_(filename), fileSize_(0), thumbnailProvider_(0), transferID_(-1) @@ -110,18 +112,18 @@ void FileTransferP2P::contactAborted(const QString &message) void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &message) { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted1_ContactInvitesUser()" << endl; + kDebug(); #endif // 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) { - kdWarning() << "FileTransferP2P::contactStarted1_ContactInvitesUser() - Received unexpected AppID: " << appID << "." << endl; + 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 file transfer invitation was cancelled. Bad data was received."), ChatMessage::CONTENT_APP_CANCELED, true ); @@ -131,16 +133,13 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess // The context field contains file transfer data. - QByteArray encodedContext; - QByteArray decodedContext; - encodedContext.duplicate(context.data(), context.length()); - KCodecs::base64Decode(encodedContext, decodedContext); + QByteArray decodedContext = QByteArray::fromBase64( context.toLatin1() ); // Just to be on the safe side, check the buffer size before we start copying. if( context.length() <= 24 ) { - kdWarning() << "KMess: File transfer context field has bad formatting, " - << "ignoring invite (context=" << context << ", contact=" << getContactHandle() << ")." << endl; + kWarning() << "File transfer context field has bad formatting, " + "ignoring invite (context=" << context << ", contact=" << getContactHandle() << ")."; showEventMessage( i18n("The file transfer invitation was cancelled. Bad data was received."), ChatMessage::CONTENT_APP_CANCELED, true ); sendCancelMessage( CANCEL_ABORT ); return; @@ -154,10 +153,10 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess unsigned int noPreview = P2PMessage::extractBytes(decodedContext, 16); // field 4: 1 if NO preview available. // Again, I don't want KMess to crash or being exploited. - if( fieldsLength > decodedContext.size() || fieldsLength < 24 ) + if( fieldsLength > (uint) decodedContext.size() || fieldsLength < 24 ) { - kdWarning() << "KMess: File transfer context field has bad formatting, rejecting invite" - << " (length=" << fieldsLength << ", contact=" << getContactHandle() << ")" << endl; + kWarning() << "File transfer context field has bad formatting, rejecting invite" + " (length=" << fieldsLength << ", contact=" << getContactHandle() << ")"; showEventMessage( i18n("The file transfer invitation was cancelled. Bad data was received."), ChatMessage::CONTENT_APP_CANCELED, true ); sendCancelMessage( CANCEL_ABORT ); return; @@ -168,14 +167,14 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess /* // TODO: fix detection of the splitter message. - unsigned in splitterPos = QMIN( 570, fieldsLength - 4 ); + unsigned in splitterPos = qMin( 570, fieldsLength - 4 ); unsigned int splitter = P2PMessage::extractBytes( decodedContext, splitterPos ); if( splitter != 0xFFFFFFFF ) { - kdWarning() << "KMess: File transfer context field has bad formatting " + kWarning() << "File transfer context field has bad formatting " "(splitter not found at byte " << splitterPos << "," " found 0x" << QString::number( splitter, 16 ) << - " contact=" << getContactHandle() << ")." << endl; + " contact=" << getContactHandle() << ")."; // sendCancelMessage( CANCEL_ABORT ); // return; @@ -186,7 +185,7 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess //unsigned int filenameLength = (fieldsLength - 40); // 24 bytes = 4 dwords, 1 qword (fields 1-4 and 6.) void *pointer = decodedContext.data() + 20; - suggestedFileName_ = QString::fromUcs2( (unsigned short*) pointer ); + suggestedFileName_ = QString::fromUtf16( (unsigned short*) pointer ); // After field 6: the preview data. @@ -196,65 +195,60 @@ 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 = KGlobal::iconLoader(); - QString iconTitle = KMimeType::iconForURL( KURL( suggestedFileName_ ) ); + KIconLoader *loader = KIconLoader::global(); + QString iconTitle ( KMimeType::iconNameForUrl( KUrl( suggestedFileName_ ) ) ); preview_ = QImage( loader->iconPath( iconTitle, 48, false ) ); // Save as PNG for encoding - QBuffer buffer( rawPreviewData ); - buffer.open( IO_WriteOnly ); + QBuffer buffer( &rawPreviewData ); + buffer.open( QIODevice::WriteOnly ); preview_.save( &buffer, "PNG" ); // Encode to Base64 for inline image. - previewData = KCodecs::base64Encode( rawPreviewData ); + previewData = rawPreviewData.toBase64(); #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted1_ContactInvitesUser() - Using icon '" << iconTitle << "' as preview." << endl; + kDebug() << "Using icon '" << iconTitle << "' as preview."; #endif } else { // Determine position of the preview data. const char *previewStart = decodedContext.data() + fieldsLength; - const uint previewLength = decodedContext.size() - fieldsLength; - - // Temporary wrap the data as QByteArray to read id. - rawPreviewData.setRawData( previewStart, previewLength ); + const int previewLength = decodedContext.size() - fieldsLength; + QByteArray rawPreviewData = QByteArray::fromRawData( previewStart, previewLength ); // wrap, does not copy // Read preview data - previewData = KCodecs::base64Encode( rawPreviewData ); - preview_ = QImage( rawPreviewData ); - - // Reset it again - rawPreviewData.resetRawData( previewStart, previewLength ); + previewData = rawPreviewData.toBase64(); + preview_ = QImage::fromData( rawPreviewData ); #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted1_ContactInvitesUser() - Encoded data size: " << previewData.length() << endl; + kDebug() << "Encoded data size: " << previewData.length(); #endif } // Everything seams OK, allow the user to accept the file. // Generate accept message - QString html = i18n( "Do you want to accept the file: %1 (%2)" ) - .arg( "" + suggestedFileName_ + "" ) - .arg( 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( "\""" + "
    " ); } // Display the accept message. #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted1_ContactInvitesUser() - File to transfer is " << suggestedFileName_ << ", " - << "waiting for user to accept." << endl; + kDebug() << "File to transfer is " << suggestedFileName_ << ", " + << "waiting for user to accept."; #endif offerAcceptOrReject( html ); @@ -268,98 +262,130 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess void FileTransferP2P::contactStarted2_UserAccepts() { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted2_UserAccepts() - Starting." << endl; + kDebug() << "Starting."; #endif #ifdef KMESSTEST - ASSERT( file_ == 0 ); - ASSERT( fileName_.isEmpty() ); + KMESS_ASSERT( file_ == 0 ); + KMESS_ASSERT( filePath_.isEmpty() ); #endif - bool success; - 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( suggestedFileName_ ); - - delayDeletion( true ); - - // Ask the user for a file. - fileName_ = KFileDialog::getSaveFileName( startDir.url() ); - - delayDeletion( false ); - if( isClosing() ) + QString suffix; + int nextNumber = 0; + fileInfo.setFile( suggestedFileName_ ); + if( KMessShared::selectNextFile( startFolder, fileInfo.baseName(), suffix, + fileInfo.completeSuffix(), nextNumber ) ) { - endApplication(); - return; + // 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_; } - 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 ) { + // 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 - kdDebug() << "FileTransferP2P::contactStarted2_UserAccepts() - User cancelled in file save dialog" << endl; + kDebug() << "User cancelled in file save dialog"; #endif - // Dialog cancelled, cancel afterall - userRejected(); - return; - } + // Dialog cancelled, cancel afterall + modifyOfferMessage(); + userRejected(); + return; + } - hasFile = true; - QString shortName = fileName_.right( fileName_.length() - fileName_.findRev("/") - 1 ); + 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?").arg(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 = fileName_.left( fileName_.findRev("/") ); + 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(); + } } } } - // Now we try to open the file - file_ = new QFile(fileName_); - success = (file_ != 0) && file_->open(IO_WriteOnly); + file_ = new QFile(filePath_); + bool success = (file_ != 0) && file_->open(QIODevice::WriteOnly); if( ! success ) { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted2_UserAccepts() - Cancelling session" << endl; + kDebug() << "Cancelling session"; #endif // Notify the user, even if debug mode is not enabled. - kdWarning() << "FileTransferP2P::contactStarted2_UserAccepts() - Unable to open file: " << fileName_ << "!" << endl; + kWarning() << "Unable to open file: " << filePath_ << "!"; // Close the file (also causes gotData() to fail) delete file_; file_ = 0; // Tell the user about it - showEventMessage( i18n("The transfer of %1 failed. Couldn't open file") - .arg("" + fileName_ + ""), ChatMessage::CONTENT_APP_FAILED, false ); + modifyOfferMessage(); + showEventMessage( i18n("The transfer of the file "%1" failed. Could not save the file.", + "" + fileName_ + ""), + ChatMessage::CONTENT_APP_FAILED, false + ); // Send 500 Internal Error back if we failed (this is still the accept stage) - sendCancelMessage(CANCEL_ABORT); + sendCancelMessage(CANCEL_FAILED); return; } #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted2_UserAccepts() - Sending accept message" << endl; + kDebug() << "Sending accept message"; #endif // Initialize the progress dialog @@ -372,6 +398,12 @@ void FileTransferP2P::contactStarted2_UserAccepts() // Send the ACCEPT message sendSlpOkMessage(message); + + // Notify the user + modifyOfferMessage(); + showEventMessage( i18n( "You have accepted the transfer of the file "%1".", fileName_ ), + ChatMessage::CONTENT_APP_STARTED, + false ); } @@ -384,7 +416,7 @@ void FileTransferP2P::contactStarted2_UserAccepts() void FileTransferP2P::contactStarted3_ContactConfirmsAccept(const MimeMessage &/*message*/) { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted3_ContactConfirmsAccept()" << endl; + kDebug(); #endif // When the 200 OK message is accepted, the contact sends @@ -404,7 +436,7 @@ void FileTransferP2P::contactStarted3_ContactConfirmsAccept(const MimeMessage &/ void FileTransferP2P::contactStarted4_ContactConfirmsPreparation() { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::contactStarted4_ContactConfirmsPreparation()" << endl; + kDebug(); #endif // NOTE: with WLM at slow computers, the contact actually started @@ -418,11 +450,10 @@ void FileTransferP2P::contactStarted4_ContactConfirmsPreparation() * * This field is used in the invitation message. * - * @param filename Full path to the filename. * @param fileData The handle to the opened file. * @param usePreview Whether to use the preview in thumbnailProvider_ */ -QString FileTransferP2P::createContextField( const QString &filename, const QFile *fileData, bool usePreview ) const +QString FileTransferP2P::createContextField( const QFile *fileData, bool usePreview ) const { // Get the thumbnail results. bool hasPreview = ( usePreview && thumbnailProvider_ != 0 && thumbnailProvider_->isSuccessful() ); @@ -435,56 +466,42 @@ QString FileTransferP2P::createContextField( const QString &filename, const QFil } #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::createContextField() - Creating context field " - << ( usePreview ? "with thumbnail." : "without thumbnail." ) << endl; + kDebug() << "Creating context field " + << ( usePreview ? "with thumbnail." : "without thumbnail." ); #endif - // Create the short name - QString shortName = filename.right( filename.length() - filename.findRev( QRegExp("/") ) - 1 ); - uint shortNameLength = shortName.length(); - - // Get the file data (preview - int 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 - uint length = 574; // Somehow MSN always uses 550 bytes for the filename (+24 for the size of fields 1-6). - uint totalLength = length + previewData.size(); + int length = 574; // Somehow MSN always uses 550 bytes for the filename (+24 for the size of fields 1-6). + int totalLength = length + previewData.size(); // Fill the context parameter - QByteArray context( totalLength ); - context.fill(0x00); - + QByteArray context( totalLength, 0x00 ); P2PMessage::insertBytes( context, length, 0 ); // Field 1: Length of fields 1-6 P2PMessage::insertBytes( context, 2, 4 ); // Field 2: somehow this is always 2 P2PMessage::insertBytes( context, filesize, 8 ); // Field 3: file size (QWord) P2PMessage::insertBytes( context, flags, 16 ); // Field 4: 1 if NO preview data // Field 5: the file name - const unsigned short * utf16Name = shortName.ucs2(); - 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 if( hasPreview ) { - memcpy( context.data() + 574, previewData.data(), previewData.size() ); + context.replace( 574, previewData.size(), previewData ); } // Encode the context - QByteArray encodedContext; - KCodecs::base64Encode( context, encodedContext ); - QString base64Context = QString::fromUtf8( encodedContext.data(), encodedContext.size() ); + QByteArray encodedContext = context.toBase64(); + QString base64Context( QString::fromUtf8( encodedContext.data(), encodedContext.size() ) ); #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::createContextField() - Context size=" << context.size() << " base64 size=" << base64Context.length() << "." << endl; + kDebug() << "Context size=" << context.size() << " base64 size=" << base64Context.length() << "."; #endif // Return it. @@ -501,7 +518,7 @@ void FileTransferP2P::endApplication() QString html; #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::endApplication()" << endl; + kDebug(); #endif // Mark the transfer as failed and terminate. @@ -527,8 +544,8 @@ QString FileTransferP2P::getAppId() */ QString FileTransferP2P::getContactAbortMessage() const { - // Application::getUserAbortMessage() returns "The contact cancelled the session". - return i18n("The contact cancelled the transfer."); + // Application::getContactAbortMessage() returns "The contact cancelled the session". + return i18n("The contact has cancelled the transfer of the file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); } @@ -539,7 +556,18 @@ QString FileTransferP2P::getContactAbortMessage() const QString FileTransferP2P::getUserAbortMessage() const { // Application::getUserAbortMessage() returns "You have cancelled the session". - return i18n("The transfer was cancelled"); + return i18n( "You have cancelled the transfer of the file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); +} + + + +/** + * 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 the file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); } @@ -554,10 +582,10 @@ void FileTransferP2P::gotData(const P2PMessage &message) { if(file_ == 0) { - kdWarning() << "FileTransferP2P::gotData() - Unable to handle file data: no file open or already closed " + kWarning() << "Unable to handle file data: no file open or already closed " << "(offset=" << message.getDataOffset() << " totalsize=" << message.getDataSize() - << " contact=" << getContactHandle() << ")!" << endl; + << " contact=" << getContactHandle() << ")!"; // Cancel if we can't receive it. // If this happens we're dealing with a very stubborn client, @@ -568,7 +596,7 @@ void FileTransferP2P::gotData(const P2PMessage &message) #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::gotData() - Data part received, saving data to file." << endl; + kDebug() << "Data part received, saving data to file."; #endif // Write the data in the file @@ -602,7 +630,7 @@ void FileTransferP2P::initializeProgressDialog(bool incoming, uint filesize) { // Create a new entry in the tranfer window TransferWindow *transferWindow = TransferWindow::getInstance(); - transferID_ = transferWindow->addEntry( fileName_, filesize, incoming, preview_ ); + transferID_ = transferWindow->addEntry( filePath_, filesize, incoming, preview_ ); // Connect the dialog so that if the user closes it, it's deleted. connect( transferWindow, SIGNAL( cancelTransfer(int) ) , @@ -619,7 +647,7 @@ void FileTransferP2P::initializeProgressDialog(bool incoming, uint filesize) void FileTransferP2P::showTransferComplete() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransferP2P::showTransferComplete() - Transfer is complete." << endl; + kDebug() << "Transfer is complete."; #endif if(file_ != 0) @@ -634,13 +662,22 @@ void FileTransferP2P::showTransferComplete() // Displays the success in the transfer window TransferWindow::getInstance()->finishTransfer( transferID_ ); - // Send an event to the switchboard: - QString shortName = fileName_.right( fileName_.length() - fileName_.findRev("/") - 1 ); - QString fileURL = "" + shortName + ""; + // Send an event to the chat + QString fileURL( "" + "" + fileName_ + "" + "" ); - showEventMessage( i18n("Successfully transferred file: %1") - .arg("" + fileURL + ""), - ChatMessage::CONTENT_APP_ENDED, ! isUserStartedApp() ); + // Show an appropriate message + QString message; + if( isUserStartedApp() ) + { + message = i18n( "Successfully sent the file "%1".", fileURL ); + } + else + { + message = i18n( "Successfully received the file "%1".", fileURL ); + } + showEventMessage( message, ChatMessage::CONTENT_APP_ENDED, ! isUserStartedApp() ); } @@ -661,7 +698,7 @@ void FileTransferP2P::showTransferMessage(const QString &message) * Show the progress made during a transfer. * This function is also called from the P2PApplication base class. */ -void FileTransferP2P::showTransferProgress(const uint bytesTransferred) +void FileTransferP2P::showTransferProgress(const ulong bytesTransferred) { // Display the progress update in the transfer window TransferWindow::getInstance()->updateProgress( transferID_, bytesTransferred ); @@ -681,7 +718,7 @@ void FileTransferP2P::slotCancelTransfer( int transferID ) } #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransferP2P::slotCancelTransfer()" << endl; + kDebug(); #endif // Use the same route as closing the chat window. @@ -701,16 +738,16 @@ QString FileTransferP2P::toReadableBytes(uint bytes) { // Using '%.2f' instead of '%.1f' removes the ".0" part, but it's less pretty. format.sprintf("%.1f", (double) bytes / 1048576.0); - return i18n("%1 MB").arg(format); + return i18n("%1 MB", format); } else if(bytes > 1024) { format.sprintf("%.1f", (double) bytes / 1024.0); - return i18n("%1 kB").arg(format); + return i18n("%1 kB", format); } else { - return i18n("%1 bytes").arg(bytes); + return i18n("%1 bytes", bytes); } } @@ -722,7 +759,7 @@ QString FileTransferP2P::toReadableBytes(uint bytes) void FileTransferP2P::userAborted() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kdDebug() << "FileTransferP2P::userAborted()" << endl; + kDebug(); #endif // Display the cancel state in the transfer window @@ -740,10 +777,10 @@ void FileTransferP2P::userAborted() void FileTransferP2P::userStarted1_UserInvitesContact() { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::userStarted1_UserInvitesContact() - starting file transfer" << endl; + kDebug() << "starting file transfer"; #endif #ifdef KMESSTEST - ASSERT( file_ == 0 ); + KMESS_ASSERT( file_ == 0 ); #endif /* @@ -751,49 +788,53 @@ void FileTransferP2P::userStarted1_UserInvitesContact() * http://siebe.bot2k3.net/docs/ */ - file_ = new QFile(fileName_); - bool success = (file_ != 0) && file_->open(IO_ReadOnly); + file_ = new QFile(filePath_); + bool success = (file_ != 0) && file_->open(QIODevice::ReadOnly); // Stop if the file can't be openend. if( ! success ) { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::userStarted1_UserInvitesContact() - Cancelling session" << endl; + kDebug() << "Cancelling session"; #endif // Notify the user, even if debug mode is not enabled. - kdWarning() << "Unable to open file: " << fileName_ << "!" << endl; + kWarning() << "Unable to open file: " << filePath_ << "!"; // Close the file delete file_; file_ = 0; // Tell the user about it - if( ! QFile::exists(fileName_) ) + if( ! QFile::exists(filePath_) ) { - showEventMessage( i18n("The transfer of %1 failed. The file does not exist.") - .arg("" + fileName_ + ""), ChatMessage::CONTENT_APP_CANCELED, false ); + showEventMessage( i18n( "The transfer of the file "%1" failed. The file does not exist.", + "" + filePath_ + ""), ChatMessage::CONTENT_APP_CANCELED, false ); } else { - showEventMessage( i18n("The transfer of %1 failed. The file could not be read.") - .arg("" + fileName_ + ""), ChatMessage::CONTENT_APP_CANCELED, false ); + showEventMessage( i18n( "The transfer of the file "%1" failed. The file could not be read.", + "" + filePath_ + ""), ChatMessage::CONTENT_APP_CANCELED, false ); } return; } + // Set the short file name + QFileInfo fileInfo( filePath_ ); + fileName_ = fileInfo.fileName(); // Read the filename parameters - fileSize_ = file_->size(); + fileSize_ = (uint)file_->size(); // Create a thumbnail, continue when it completes // Windows Live Messenger scales the received image down depending on the users settings. // The preview however, is always sent as 96x96 - thumbnailProvider_ = new ThumbnailProvider( fileName_, 96 ); + thumbnailProvider_ = new ThumbnailProvider( filePath_, 96 ); connect( thumbnailProvider_, SIGNAL(gotResult()), this, SLOT(userStarted1_gotThumbnailResult()) ); } + /** * @brief Called when the thumbnail is generated. */ @@ -801,17 +842,14 @@ void FileTransferP2P::userStarted1_gotThumbnailResult() { bool hasPreview = thumbnailProvider_->isSuccessful(); - // Create the session id and context field - QString context = createContextField( fileName_, file_, hasPreview ); - uint sessionID = P2PApplication::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 shortName = fileName_.right( fileName_.length() - fileName_.findRev( QRegExp("/") ) - 1 ); - QString html = i18n("Sending file %1 (%2)").arg("" + shortName + "").arg( toReadableBytes( fileSize_ ) ); + QString html( i18n( "Sending file "%1" (%2).", + "" + fileName_ + "", + toReadableBytes( fileSize_ ) ) ); // Generate fallback image so there is always an icon in the chat window. @@ -824,7 +862,7 @@ void FileTransferP2P::userStarted1_gotThumbnailResult() // Insert the preview image if this is available. if( hasPreview ) { - html = thumbnailProvider_->getImageTag( shortName ) + "
    " + html; + html = thumbnailProvider_->getImageTag( fileName_ ) + "
    " + html; preview_ = thumbnailProvider_->getImage(); // Save for transfer dialog later. } @@ -842,11 +880,14 @@ void FileTransferP2P::userStarted1_gotThumbnailResult() void FileTransferP2P::userStarted2_ContactAccepts(const MimeMessage & /*message*/) { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::userStarted2_ContactAccepts()" << endl; + kDebug(); #endif // Update the GUI - showEventMessage( i18n("Transfer accepted."), ChatMessage::CONTENT_APP_STARTED, true ); + modifyOfferMessage(); + showEventMessage( i18n( "The contact has accepted the transfer of the file "%1".", fileName_ ), + ChatMessage::CONTENT_APP_STARTED, + true ); initializeProgressDialog(false, fileSize_); // Send the invite to negatiate the transfer mode. @@ -861,10 +902,10 @@ void FileTransferP2P::userStarted2_ContactAccepts(const MimeMessage & /*message* void FileTransferP2P::userStarted3_UserPrepares() { #ifdef KMESSDEBUG_FILETRANSFER_P2P - kdDebug() << "FileTransferP2P::userStarted3_UserPrepares()" << endl; + kDebug(); #endif #ifdef KMESSTEST - ASSERT( file_ != 0 ); + KMESS_ASSERT( file_ != 0 ); #endif // A connection is available to send the file. diff --git a/kmess/network/applications/filetransferp2p.h b/src/network/applications/filetransferp2p.h similarity index 91% rename from kmess/network/applications/filetransferp2p.h rename to src/network/applications/filetransferp2p.h index 78397ee..6a549f2 100644 --- a/kmess/network/applications/filetransferp2p.h +++ b/src/network/applications/filetransferp2p.h @@ -20,9 +20,9 @@ #include "p2papplication.h" -#include -#include -#include +#include +#include + class MsnObject; class MimeMessage; @@ -31,6 +31,7 @@ class QFile; class ThumbnailProvider; + /** * An application class responsable for P2P file transfers between clients. * @@ -56,7 +57,7 @@ class FileTransferP2P : public P2PApplication private: // The contact cancelled the session - void contactAborted(const QString &message = 0); + void contactAborted(const QString &message = QString::null); // 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 @@ -66,13 +67,15 @@ class FileTransferP2P : public P2PApplication // Step four of a contact-started chat: the contact confirms the data-preparation message. void contactStarted4_ContactConfirmsPreparation(); // Create the context field - QString createContextField(const QString &filename, const QFile *fileData, bool usePreview) const; + QString createContextField( const QFile *fileData, bool usePreview ) const; // End the application with another message in the file transfer dialog as well (The "failTransfer"-like method) void endApplication(); // Return an reject message to display. 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 @@ -82,7 +85,7 @@ class FileTransferP2P : public P2PApplication // Show a message to inform about a transfer event (shown in the transfer dialog, e.g. connecting to host) void showTransferMessage(const QString &message); // Show the progress made during a transfer. - void showTransferProgress(const uint bytesTransferred); + void showTransferProgress(const ulong bytesTransferred); // Convert a string to some more readable form QString toReadableBytes(uint bytes); // The user cancelled the session @@ -105,8 +108,10 @@ class FileTransferP2P : public P2PApplication private: // Handle of the file. QFile *file_; - // Name of the file where the data should be stored. + // Name of the transferred file. QString fileName_; + // Full path of the file where the data should be stored. + QString filePath_; // The size of the file unsigned int fileSize_; // The file preview diff --git a/kmess/network/applications/gnomemeeting.cpp b/src/network/applications/gnomemeeting.cpp similarity index 84% rename from kmess/network/applications/gnomemeeting.cpp rename to src/network/applications/gnomemeeting.cpp index 6fd7842..f16527b 100644 --- a/kmess/network/applications/gnomemeeting.cpp +++ b/src/network/applications/gnomemeeting.cpp @@ -17,14 +17,15 @@ #include "gnomemeeting.h" -#include - -#include -#include - #include "../../kmessdebug.h" #include "../mimemessage.h" +#include + +#include + + + // The constructor GnomeMeeting::GnomeMeeting(const QString &contactHandle) : MimeApplication(contactHandle) @@ -38,7 +39,7 @@ GnomeMeeting::GnomeMeeting(const QString &contactHandle) GnomeMeeting::~GnomeMeeting() { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "DESTROYED GnomeMeeting" << endl; + kDebug() << "DESTROYED."; #endif } @@ -48,7 +49,7 @@ GnomeMeeting::~GnomeMeeting() void GnomeMeeting::contactStarted1_ContactInvitesUser(const MimeMessage& /*message*/) { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "GnomeMeeting - contactStarted1_ContactInvitesUser" << endl; + kDebug(); #endif // Send the message to the chat window. @@ -61,7 +62,7 @@ void GnomeMeeting::contactStarted1_ContactInvitesUser(const MimeMessage& /*messa void GnomeMeeting::contactStarted2_UserAccepts() { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "GnomeMeeting - contactStarted2_UserAccepts" << endl; + kDebug(); #endif // Create the accept message @@ -83,7 +84,7 @@ void GnomeMeeting::contactStarted2_UserAccepts() void GnomeMeeting::contactStarted3_ContactConfirmsAccept(const MimeMessage& message) { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "GnomeMeeting - contactStarted3_ContactConfirmsAccept" << endl; + kDebug(); #endif // Store the data from the message @@ -107,25 +108,29 @@ QString GnomeMeeting::getAppId() void GnomeMeeting::startMeeting( bool connectToRemote ) { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "GnomeMeeting - Start the meeting." << endl; + kDebug() << "Start the meeting."; #endif - // Show the user that the app is starting - showEventMessage( i18n("Starting GnomeMeeting. Connecting to %1.").arg( remoteIp_ ), ChatMessage::CONTENT_APP_INFO, ! isUserStartedApp() ); + // Remove the accept links + modifyOfferMessage(); + + // Show the user that the app is starting + showEventMessage( i18n("Starting GnomeMeeting. Connecting to %1.", remoteIp_ ), ChatMessage::CONTENT_APP_INFO, ! isUserStartedApp() ); - // Start the app - QProcess process; - process.addArgument("gnomemeeting"); // If the meeting should actively try to connect to the remote meeting.... - if ( connectToRemote ) + QStringList args; + if( connectToRemote ) { // Add the "call to" arguments - process.addArgument("-c"); - QString arg; - arg = "callto://" + remoteIp_; - process.addArgument( arg ); + args.append( "-c" ); + args.append( "callto://" + remoteIp_ ); + } + + // Start the app + if( ! QProcess::startDetached( "gnomemeeting", args ) ) + { + kWarning() << "unable to start 'gnomemeeting'!"; } - process.start(); // Delete the application (which is now finished) endApplication(); @@ -137,7 +142,7 @@ void GnomeMeeting::startMeeting( bool connectToRemote ) void GnomeMeeting::userStarted1_UserInvitesContact() { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "GnomeMeeting - userStarted1_UserInvitesContact" << endl; + kDebug(); #endif QString html; MimeMessage message; @@ -162,7 +167,7 @@ void GnomeMeeting::userStarted1_UserInvitesContact() void GnomeMeeting::userStarted2_ContactAccepts(const MimeMessage& message) { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "GnomeMeeting - userStarted2_ContactAccepts" << endl; + kDebug(); #endif // Store the data from the message @@ -187,7 +192,7 @@ void GnomeMeeting::userStarted2_ContactAccepts(const MimeMessage& message) void GnomeMeeting::userStarted3_UserPrepares() { #ifdef KMESSDEBUG_GNOMEMEETING - kdDebug() << "GnomeMeeting - userStarted3_UserPrepares" << endl; + kDebug(); #endif // Start the application diff --git a/kmess/network/applications/gnomemeeting.h b/src/network/applications/gnomemeeting.h similarity index 97% rename from kmess/network/applications/gnomemeeting.h rename to src/network/applications/gnomemeeting.h index d146552..8f6223f 100644 --- a/kmess/network/applications/gnomemeeting.h +++ b/src/network/applications/gnomemeeting.h @@ -18,12 +18,14 @@ #ifndef GNOMEMEETING_H #define GNOMEMEETING_H -#include #include "mimeapplication.h" + // Forward declarations class MimeMessage; + + /** * Start a meeting with the contact. * @@ -38,7 +40,7 @@ class GnomeMeeting : public MimeApplication // The constructor GnomeMeeting(const QString &contactHandle); // The destructor - ~GnomeMeeting(); + virtual ~GnomeMeeting(); // Return the application's GUID static QString getAppId(); diff --git a/src/network/applications/inktransferp2p.cpp b/src/network/applications/inktransferp2p.cpp new file mode 100644 index 0000000..a3d2597 --- /dev/null +++ b/src/network/applications/inktransferp2p.cpp @@ -0,0 +1,185 @@ +/*************************************************************************** + inktransferp2p.cpp - description + ------------------- + begin : Sun Mar 23 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 "inktransferp2p.h" + +#include "../../kmessdebug.h" +#include "../mimemessage.h" + +#include + + + +/** + * The constructor + */ +InkTransferP2P::InkTransferP2P( ApplicationList *applicationList ) +: P2PApplication( applicationList ) +{ + // Open the buffer directly. + // The session is only used to receive data. + inkBuffer_.open( QIODevice::ReadWrite ); + + // Set the role / session mode of this class. + // Is checked for by the ChatMaster, and P2PApplication base class. + setMode( Application::APP_MODE_DATACAST ); + setDataCastSessionID( SESSION_ID ); +} + + + +/** + * The destructor + */ +InkTransferP2P::~InkTransferP2P() +{ +} + + + +/** + * Called when data is received. + * + * This is the only method which will be called. + * Ink transfer only uses the P2P transport layer to transmit data packets. + * + * @param message P2P message with the data. + */ +void InkTransferP2P::gotData(const P2PMessage &message) +{ + kDebug() << "Received data..."; + // Write the data in the buffer. + bool success = writeP2PDataToFile( message, &inkBuffer_ ); + if( ! success ) + { + return; + } + + // When all data is received, the parent class calls showTransferComplete(). + // That method will send the msnObjectReceived() signal. +} + + + +/** + * Hide standard informative application message (e.g. user invited, cancelled). + * + * Avoid annoying messages in the chat windows about "Contact sent something KMess does not support". + * This is useful for interactive invitations, like file transfer. Since msnobject transfer happen + * in the background, it's not helping to have empty chat windows popping up with error messages. + */ +void InkTransferP2P::showEventMessage(const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ) +{ + Q_UNUSED( isIncoming ); + + kWarning() << "suppressed message:" << message << "(contact=" << getContactHandle() << ", contentsClass=" << contents << ")"; +} + + + +/** + * Show a message to notify about a system error. + * + * Notify if an Ink message could not be sent or received. + */ +void InkTransferP2P::showSystemMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ) +{ + Q_UNUSED( message ); + + QString errorMessage; + + if( isIncoming ) + { + errorMessage = i18nc( "Error message shown in chat, %1 is the contact's friendly name", + "%1 has tried to send you an handwritten message, " + "but it could not be received." ); + } + else + { + errorMessage = i18nc( "Error message shown in chat, %1 is the contact's friendly name", + "The handwritten message to %1 could not be delivered." ); + } + + emit applicationMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, contents, isIncoming, errorMessage, getContactHandle() ) ); +} + + + +/** + * Called when the transfer is complete. + * Reads the buffer, calls the inkReceived() signal. + */ +void InkTransferP2P::showTransferComplete() +{ +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Last data part received, emitting signals"; +#endif + + // 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 ) ); + + // When a MimeMessage is sent over P2P, + // there is a null-terminator after the head and body parts. + int endMime = bufferData.indexOf("\r\n\r\n"); + if( endMime == -1 ) + { + kWarning() << "Failed to find end of MIME header:" << bufferData; + return; + } + + // Get the ink header. + MimeMessage mimeHeader( bufferData.left( endMime ) ); + + // Test header. + if( mimeHeader.getValue("Content-Type") != "image/gif" && mimeHeader.getValue("Content-Type") != "application/x-ms-ink" ) + { + kWarning() << "Unable to parse incoming message of type" << mimeHeader.getValue("Content-Type") << "contact:" << getContactHandle(); + mimeHeader.print(); + return; + } + + // Jump over the null terminator + int bodyStart = endMime + 4; + if( bufferData.at( bodyStart ) == '\0' ) + { + bodyStart++; + } + + // Avoid final null terminator + int bodyEnd = bufferData.size(); + if( bufferData.at( bodyEnd - 1 ) == '\0' ) + { + bodyEnd--; + } + + // Get body + QString mimeBody( bufferData.mid( bodyStart, bodyEnd - bodyStart ) ); + + // Emit the signal. + emit inkReceived( mimeBody, getContactHandle() ); + + // ACK message will automatically be sent by the base class. + // The ChatMaster class parses and validates the ink mime body. + // Other issues (like bad message flags) are also handled. + + // Request termination + endApplication(); +} + + +#include "inktransferp2p.moc" diff --git a/src/network/applications/inktransferp2p.h b/src/network/applications/inktransferp2p.h new file mode 100644 index 0000000..b0f3192 --- /dev/null +++ b/src/network/applications/inktransferp2p.h @@ -0,0 +1,71 @@ +/*************************************************************************** + inktransferp2p.h - description + ------------------- + begin : Sun Mar 23 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 INKTRANSFERP2P_H +#define INKTRANSFERP2P_H + +#include "p2papplication.h" + +#include + + + +/** + * Ink transfer class. + * + * Windows Live Messenger 8.5 always sends winks as seperate P2P messages instead of directly + * over the switchboard. It uses image/gif as a mime type. Live Messenger 2009 just uses the + * switchboard and uses image/gif or application/x-ms-ink. Both clients allow receiving + * switchboard transfers. + * + * @author Antonio Nastasi, Diederik van der Boor + * @ingroup Applications + */ +class InkTransferP2P : public P2PApplication +{ + Q_OBJECT + + public: + // The fixed session ID used by all ink transfer sessions. + static const unsigned long SESSION_ID = 64; + + // The constructor + InkTransferP2P( ApplicationList *applicationList ); + + // The destructor + virtual ~InkTransferP2P(); + + // Hide standard informative application message (e.g. user invited, cancelled) + virtual void showEventMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ); + // Show a message to notify about a system error. + virtual void showSystemMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ); + // Read the buffer, send the inkReceived() signal. + void showTransferComplete(); + + protected: + // Called when data is received + void gotData( const P2PMessage &message ); + + signals: + // Signal that an ink image was received. + void inkReceived( const QString &base64ImageData, const QString& contact ); + + private: + QBuffer inkBuffer_; +}; + +#endif diff --git a/kmess/network/applications/mimeapplication.cpp b/src/network/applications/mimeapplication.cpp similarity index 56% rename from kmess/network/applications/mimeapplication.cpp rename to src/network/applications/mimeapplication.cpp index 6d7deb9..e15d6aa 100644 --- a/kmess/network/applications/mimeapplication.cpp +++ b/src/network/applications/mimeapplication.cpp @@ -17,10 +17,13 @@ ***************************************************************************/ #include "mimeapplication.h" + +#include "../../kmessdebug.h" #include "../mimemessage.h" -#include -#include +#include + + // Constructor MimeApplication::MimeApplication(const QString &contactHandle) @@ -37,14 +40,56 @@ 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 - kdDebug() << "MimeApplication - Generated session ID " << sessionId << "." << endl; + kDebug() << "Generated session ID " << sessionId << "."; #endif return sessionId; @@ -68,15 +113,15 @@ const QString& MimeApplication::getSessionId() void MimeApplication::gotMessage(const MimeMessage& message) { #ifdef KMESSDEBUG_MIMEAPPLICATION - kdDebug() << "MimeApplication: An application message was received" << endl; + 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); } @@ -96,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" ) { @@ -106,7 +151,7 @@ void MimeApplication::gotMessage(const MimeMessage& message) else if(cancelCode == "REJECT_NOT_INSTALLED") { // Used if the application type is not supported - contactRejected( i18n("The invitation was rejected. It's not supported by the other client.") ); + contactRejected( i18n("The invitation was rejected. It is not supported by the other client.") ); } else if(cancelCode == "CANCEL") { @@ -116,34 +161,34 @@ void MimeApplication::gotMessage(const MimeMessage& message) else if(cancelCode == "FAIL") { // The receiving client does not know any of the specified Session-protocols - contactAborted( i18n("The invitation was aborted. An internal error occured.") ); + contactAborted( i18n("The invitation was aborted. An internal error occured.") ); } else if(cancelCode == "TIMEOUT") { // The client sending an INVITE has got bored of waiting for your ACCEPT // (or the principal cancelled the request) - contactAborted( i18n("The invitation was aborted. Timeout while waiting for user to accept.") ); + contactAborted( i18n("The invitation was aborted. Timeout while waiting for user to accept.") ); } else if(cancelCode == "FTTIMEOUT") { // There was an error transferring the file itself - contactAborted( i18n("The invitation was aborted. Timeout while waiting for file data.") ); + contactAborted( i18n("The invitation was aborted. Timeout while waiting for file data.") ); } else if(cancelCode == "OUTBANDCANCEL") { // The switchboard window in which the INVITE message was sent is closing - contactAborted( i18n("The invitation was aborted. The switchboard closed the chat connection.") ); + contactAborted( i18n("The invitation was aborted. The switchboard closed the chat connection.") ); } else { // Fallback - kdDebug() << "MimeApplication got unhandled Cancel-Code " << cancelCode << "." << endl; + kDebug() << "got unhandled Cancel-Code " << cancelCode << "."; contactAborted( i18n("The invitation was aborted.") ); } } else { - kdDebug() << "MimeApplication got unhandled Invitation-Command " << invitationCommand << "."; + kDebug() << "got unhandled Invitation-Command " << invitationCommand << "."; } } @@ -186,7 +231,7 @@ void MimeApplication::sendCancelMessage(const ApplicationCancelReason cancelReas else { #ifdef KMESSDEBUG_MIMEAPPLICATION - kdDebug() << "MimeApplication: WARNING - unknown cancelReason used." << endl; + kWarning() << "Unknown cancelReason used."; #endif cancelCode = "CANCEL"; } @@ -204,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/kmess/network/applications/mimeapplication.h b/src/network/applications/mimeapplication.h similarity index 90% rename from kmess/network/applications/mimeapplication.h rename to src/network/applications/mimeapplication.h index 37b9363..b13b833 100644 --- a/kmess/network/applications/mimeapplication.h +++ b/src/network/applications/mimeapplication.h @@ -21,6 +21,8 @@ #include "application.h" + + /** * The base class for all old-style (pre-msn6) invitations. * These invitations use plain text MIME messages to exchange the invitation data. @@ -42,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 @@ -52,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/kmess/network/applications/picturetransferp2p.cpp b/src/network/applications/msnobjecttransferp2p.cpp similarity index 53% rename from kmess/network/applications/picturetransferp2p.cpp rename to src/network/applications/msnobjecttransferp2p.cpp index 3cf7bd3..b881407 100644 --- a/kmess/network/applications/picturetransferp2p.cpp +++ b/src/network/applications/msnobjecttransferp2p.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - picturetransferp2p.cpp - description + msnobjecttransferp2p.cpp - description ------------------- begin : Fri Nov 26 2004 copyright : (C) 2004 by Diederik van der Boor @@ -15,23 +15,22 @@ * * ***************************************************************************/ -#include "picturetransferp2p.h" +#include "msnobjecttransferp2p.h" -#include "../mimemessage.h" -#include "../p2pmessage.h" -#include "../../kmessdebug.h" -#include "../../crypt/sha1.h" #include "../../currentaccount.h" #include "../../emoticonmanager.h" +#include "../../kmessdebug.h" +#include "../../utils/kmessconfig.h" +#include "../../utils/kmessshared.h" +#include "../mimemessage.h" +#include "../p2pmessage.h" -#include -#include -#include -#include +#include +#include +#include +#include +#include -#include -#include -#include /** @@ -39,10 +38,10 @@ * * @param applicationList The shared sources for the contact. */ -PictureTransferP2P::PictureTransferP2P(ApplicationList *applicationList) +MsnObjectTransferP2P::MsnObjectTransferP2P(ApplicationList *applicationList) : P2PApplication(applicationList) , file_(0) - , fileName_(QString::null) + , fileName_() { } @@ -54,7 +53,7 @@ PictureTransferP2P::PictureTransferP2P(ApplicationList *applicationList) * @param applicationList The shared sources for the contact. * @param msnObject MSNObject identifying the picture to request. */ -PictureTransferP2P::PictureTransferP2P(ApplicationList *applicationList, const MsnObject &msnObject) +MsnObjectTransferP2P::MsnObjectTransferP2P(ApplicationList *applicationList, const MsnObject &msnObject) : P2PApplication(applicationList) , file_(0) , msnObject_(msnObject) @@ -66,7 +65,7 @@ PictureTransferP2P::PictureTransferP2P(ApplicationList *applicationList, const M /** * Destructor, closes the file if it's open. */ -PictureTransferP2P::~PictureTransferP2P() +MsnObjectTransferP2P::~MsnObjectTransferP2P() { if(file_ != 0) { @@ -83,41 +82,35 @@ PictureTransferP2P::~PictureTransferP2P() * * @param message The invitation message */ -void PictureTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &message) +void MsnObjectTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &message) { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::contactStarted1_ContactInvitesUser()" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug(); #endif // 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 // Just to be on the safe side, check the buffer size before we start decoding if( context.length() <= 24 ) { - kdWarning() << "PictureTransferP2P::contactStarted1_ContactInvitesUser() - " - "Picture transfer context field has bad formatting, " - "ignoring invite (context=" << context << ", contact=" << getContactHandle() << ")." << endl; + kWarning() << "MSNObject transfer context field has bad formatting, " + "ignoring invite (context=" << context << ", contact=" << getContactHandle() << ")."; sendCancelMessage( CANCEL_FAILED ); return; } // Decode the MSN Object contained in the Context field to a string - QByteArray encodedContext, decodedContext; - encodedContext.duplicate( context.data(), context.length() ); - KCodecs::base64Decode( encodedContext, decodedContext ); - // Decode that string to an MSN Object + QByteArray decodedContext = QByteArray::fromBase64( context.toLatin1() ); QString contextString( decodedContext ); msnObject_ = MsnObject( contextString ); - MsnObject testObject; - -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::contactStarted1_ContactInvitesUser() - Got context \"" << contextString << "\"." << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Got context \"" << contextString << "\"."; // Got context #endif @@ -129,11 +122,10 @@ void PictureTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &m // Test protocol compatibility. if( appID != 1 && appID != 12 ) // Display pictures - AppID 12 is used as of MSN Messenger 7.5 { - kdDebug() << "PictureTransferP2P::contactStarted1_ContactInvitesUser() - " - "Received a request for a display picture, but unexpected appID was set " - "(appid=" << appID << - " type=" << msnObject_.getType() << - " contact=" << getContactHandle() << " action=continue)." << endl; + kDebug() << "Received a request for a display picture, but unexpected appID was set " + "(appid=" << appID << + " type=" << msnObject_.getType() << + " contact=" << getContactHandle() << " action=continue)."; } // Continue at separate function @@ -146,11 +138,10 @@ void PictureTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &m if( appID != 1 // HACK: added for compatibility with Messenger for the Mac 6.0.3 and aMsn 0.97rc1 && appID != 11 ) // Custom emoticons { - kdDebug() << "PictureTransferP2P::contactStarted1_ContactInvitesUser() - " - "Received a request for an emoticon, but unexpected appID was set " - "(appid=" << appID << - " type=" << msnObject_.getType() << - " contact=" << getContactHandle() << " action=continue)." << endl; + kDebug() << "Received a request for an emoticon, but unexpected appID was set " + "(appid=" << appID << + " type=" << msnObject_.getType() << + " contact=" << getContactHandle() << " action=continue)."; } // Continue at separate function @@ -162,18 +153,21 @@ void PictureTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &m // 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: + default: break; } // Unknown application type - kdWarning() << "PictureTransferP2P::contactStarted1_ContactInvitesUser() - " - "Received an invitation for an unexpected object type " - "(appid=" << appID << - " type=" << msnObject_.getType() << - " contact=" << getContactHandle() << ")." << endl; + kWarning() << "Received an invitation for an unexpected object type " + "(appid=" << appID << + " type=" << msnObject_.getType() << + " contact=" << getContactHandle() << ")."; // Abort the contact. sendCancelMessage( CANCEL_FAILED ); @@ -184,28 +178,26 @@ void PictureTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &m /** * Step one continued, the request is for the display picture. */ -void PictureTransferP2P::contactStarted1_gotDisplayPictureRequest() +void MsnObjectTransferP2P::contactStarted1_gotDisplayPictureRequest() { // Send our display picture: check if the MSNObject the contact wants is the picture we've got. if( msnObject_.hasChanged( CurrentAccount::instance()->getMsnObjectString() ) ) { - kdWarning() << "PictureTransferP2P::contactStarted1_gotDisplayPictureRequest() - " - "Contact " << getContactHandle() << " wants a display picture we don't have!\n" - "Requested object: " << msnObject_.objectString() << "\n" - "Current object: " << CurrentAccount::instance()->getMsnObjectString() << "\n" - "Aborting invite." << endl; + kWarning() << "Contact " << getContactHandle() << " wants a display picture we don't have!\n" + "Requested object: " << msnObject_.objectString() << "\n" + "Current object: " << CurrentAccount::instance()->getMsnObjectString() << "\n" + "Aborting invite."; sendCancelMessage( CANCEL_FAILED ); return; } // The file to send is our picture - fileName_ = CurrentAccount::instance()->getImagePath(); + fileName_ = CurrentAccount::instance()->getPicturePath(); // Reject because there is no file to send if( fileName_.isEmpty() ) { - kdWarning() << "PictureTransferP2P::contactStarted1_gotDisplayPictureRequest() - " - "Got an invitation, but we don't have a picture to send." << endl; + kWarning() << "Got an invitation, but we don't have a picture to send."; sendCancelMessage( CANCEL_FAILED ); return; } @@ -219,17 +211,16 @@ void PictureTransferP2P::contactStarted1_gotDisplayPictureRequest() /** * Step one continued, the request is for an emoticon. */ -void PictureTransferP2P::contactStarted1_gotEmoticonRequest() +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() ); - if( ! pictureFile.open( IO_ReadOnly ) ) + if( ! pictureFile.open( QIODevice::ReadOnly ) ) { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::contactStarted1_gotEmoticonRequest() - " - "Couldn't open file: " << pictureFile.name() << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Couldn't open file: " << pictureFile.fileName(); #endif sendCancelMessage( CANCEL_FAILED ); return; @@ -241,62 +232,83 @@ void PictureTransferP2P::contactStarted1_gotEmoticonRequest() MsnObject testObject( CurrentAccount::instance()->getHandle(), msnObject_.getLocation(), QString::null, MsnObject::EMOTICON, data ); -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P: msnObject_: " << msnObject_.objectString() << endl; - kdDebug() << "PictureTransferP2P: testObject: " << testObject.objectString() << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "msnObject_: " << msnObject_.objectString(); + kDebug() << "testObject: " << testObject.objectString(); #endif // Test if they're the same picture if( msnObject_.hasChanged( testObject.objectString() ) ) { - kdWarning() << "PictureTransferP2P::contactStarted1_gotEmoticonRequest() - Contact " << getContactHandle() - << " wants a custom emoticon we don't have!" << endl - << "Requested object: " << msnObject_.objectString() << endl - << "Aborting invite." << endl; + kWarning() << "Contact " << getContactHandle() + << " wants a custom emoticon we don't have!" + << "Requested object: " << msnObject_.objectString() + << "Aborting invite."; sendCancelMessage( CANCEL_FAILED ); return; } -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::contactStarted1_gotEmoticonRequest() - Picture found, accepting." << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Picture found, accepting."; #endif // Everything seems OK, accept this message - fileName_ = pictureFile.name(); // Remember the name of the file to send + fileName_ = pictureFile.fileName(); // Remember the name of the file to send contactStarted2_UserAccepts(); } +// 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. */ -void PictureTransferP2P::contactStarted2_UserAccepts() +void MsnObjectTransferP2P::contactStarted2_UserAccepts() { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P - contactStarted2_UserAccepts" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug(); #endif #ifdef KMESSTEST - ASSERT( file_ == 0 ); - ASSERT( ! fileName_.isEmpty() ); + KMESS_ASSERT( file_ == 0 ); + KMESS_ASSERT( ! fileName_.isEmpty() ); #endif // Now we try to open the file file_ = new QFile(fileName_); - bool success = file_->open(IO_ReadOnly); + bool success = file_->open(QIODevice::ReadOnly); if( ! success ) { // Notify the user, even if debug mode is not enabled. - kdWarning() << "PictureTransferP2P: Unable to open file: " << fileName_ << "!" << endl; + kWarning() << "Unable to open file: " << fileName_ << "!"; // Close the file (also causes gotData() to fail) delete file_; file_ = 0; -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::contactStarted2_UserAccepts: Cancelling session" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Cancelling session"; #endif // Send 500 Internal Error back if we failed @@ -306,8 +318,8 @@ void PictureTransferP2P::contactStarted2_UserAccepts() } -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::contactStarted2_UserAccepts: Sending accept message" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Sending accept message"; #endif // Create the message @@ -325,10 +337,10 @@ void PictureTransferP2P::contactStarted2_UserAccepts() * * @param message The message of the other contact, not usefull in P2P sessions because it's an ACK. */ -void PictureTransferP2P::contactStarted3_ContactConfirmsAccept(const MimeMessage &/*message*/) +void MsnObjectTransferP2P::contactStarted3_ContactConfirmsAccept(const MimeMessage &/*message*/) { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P - contactStarted3_ContactConfirmsAccept" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug(); #endif // Send the data preparation message back. @@ -341,10 +353,10 @@ void PictureTransferP2P::contactStarted3_ContactConfirmsAccept(const MimeMessage /** * Step four in a contact-started chat: the contact confirms the data preparation message. */ -void PictureTransferP2P::contactStarted4_ContactConfirmsPreparation() +void MsnObjectTransferP2P::contactStarted4_ContactConfirmsPreparation() { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P - contactStarted4_ContactConfirmsPreparation" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug(); #endif // Send the file, the base class handles everything else here @@ -356,7 +368,7 @@ void PictureTransferP2P::contactStarted4_ContactConfirmsPreparation() /** * Return the application's GUID. */ -QString PictureTransferP2P::getAppId() +QString MsnObjectTransferP2P::getAppId() { return "{A4268EEC-FEC5-49E5-95C3-F126696BDBF6}"; } @@ -366,83 +378,27 @@ QString PictureTransferP2P::getAppId() /** * Return the msn object of the picture we're transferring */ -const MsnObject & PictureTransferP2P::getMsnObject() const +const MsnObject & MsnObjectTransferP2P::getMsnObject() const { return msnObject_; } -/** - * Determinate the path for an contact picture. - * - * @param msnObject The MSNObject the other contact uses to identify his resource. - * - * @returns A file name string. - */ -QString PictureTransferP2P::getPictureFileName(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(); - const QString safeSha1 = sha1d.replace(QRegExp("[^a-zA-Z0-9+=]"), "_"); - - // Be friendly for file managers. - QString extension; - QString path; - switch( msnObject.getType() ) - { - case MsnObject::DISPLAYPIC: - extension = ".png"; - path = "displaypics"; - break; - - case MsnObject::BACKGROUND: - extension = ".png"; - path = "backgrounds"; - break; - - case MsnObject::EMOTICON: - extension = ".png"; - path = "useremoticons"; - break; - - case MsnObject::WINK: - extension = ".cab"; - path = "winks"; - break; - - case MsnObject::VOICECLIP: - extension = ".wav"; - path = "voiceclips"; - break; - - default: - extension = ".dat"; - path = QString::null; - } - - // Locate filename - return locateLocal( "data", QString("kmess/") + path + "/" + QString::fromUtf8( safeSha1 ) + extension); -} - - - /** * Called when data is received. * Writes the received data to the output file. * * @param message P2P message with the data. */ -void PictureTransferP2P::gotData(const P2PMessage &message) +void MsnObjectTransferP2P::gotData(const P2PMessage &message) { if(file_ == 0) { - kdWarning() << "PictureTransferP2P::gotData() - Unable to handle file data: no file open or already closed " + kWarning() << "Unable to handle file data: no file open or already closed " << "(offset=" << message.getDataOffset() << " totalsize=" << message.getTotalSize() - << " contact=" << getContactHandle() << ")!" << endl; + << " contact=" << getContactHandle() << ")!"; // Cancel if we can't receive it. // If this happens we're dealing with a very stubborn client, @@ -463,7 +419,7 @@ void PictureTransferP2P::gotData(const P2PMessage &message) } // When all data is received, the parent class calls showTransferComplete(). - // That method will test the file and send the pictureReceived() signal. + // That method will test the file and send the msnObjectReceived() signal. } @@ -474,9 +430,9 @@ void PictureTransferP2P::gotData(const P2PMessage &message) * * @returns Returns true if a private chat is required for this application. */ -bool PictureTransferP2P::isPrivateChatRequired() const +bool MsnObjectTransferP2P::isPrivateChatRequired() const { - // Picture transfer can run in a multi-chat too, + // MsnObject transfer can run in a multi-chat too, // The P2P-Dest field of the p2p messages make sure other participants ignore them. // For emoticon transfers, a separate private chat is not required, @@ -490,15 +446,31 @@ bool PictureTransferP2P::isPrivateChatRequired() const /** - * Hide standard informative application message (e.g. user invited, cancelled) + * Hide standard informative application message (e.g. user invited, cancelled). + * + * Avoid annoying messages in the chat windows about "Contact sent something KMess does not support". + * This is useful for interactive invitations, like file transfer. Since msnobject transfer happen + * in the background, it's not helping to have empty chat windows popping up with error messages. */ -void PictureTransferP2P::showEventMessage(const QString &message, const ChatMessage::ContentsClass contents, bool /*isIncoming*/ ) +void MsnObjectTransferP2P::showEventMessage(const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ) { - // Avoid annoying messages in the chat windows about "Contact sent something KMess does not support". - // This is useful for interactive invitations, like file transfer. Since picture transfer happen - // in the background, it's not helping to have empty chat windows popping up with error messages. + Q_UNUSED( isIncoming ); - kdWarning() << "PictureTransferP2P::showEventMessage() - suppressed message: " << message << " (contact=" << getContactHandle() << " contentsClass=" << contents << ")" << endl; + kWarning() << "suppressed message:" << message << "(contact=" << getContactHandle() << ", contentsClass=" << contents << ")"; +} + + + +/** + * Show a message to notify about a system error. + * + * Avoid annoying messages in the chat windows. See showEventMessage(). + */ +void MsnObjectTransferP2P::showSystemMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ) +{ + Q_UNUSED( isIncoming ); + + kWarning() << "suppressed message:" << message << "(contact=" << getContactHandle() << ", contentsClass=" << contents << ")"; } @@ -507,16 +479,16 @@ void PictureTransferP2P::showEventMessage(const QString &message, const ChatMess * Called when the transfer is complete. * Closes the file, verifies the MsnObject and updates possible listeners. */ -void PictureTransferP2P::showTransferComplete() +void MsnObjectTransferP2P::showTransferComplete() { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::showTransferComplete() - Last data part received, closing file" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Last data part received, closing file"; #endif if( KMESS_NULL(file_) ) return; bool success = false; - QString pictureFileName = file_->name(); + QString pictureFileName( file_->fileName() ); // Don't send an ACK here, it's already ACK-ed // (with a special BYE-request ACK) @@ -526,36 +498,88 @@ void PictureTransferP2P::showTransferComplete() file_->close(); // Check if the received image is valid. Will cost some CPU though. - if( file_->open( IO_ReadOnly ) ) - { - Sha1 sha1; - QByteArray shaData( 20 ); // 160 bits of output - shaData.duplicate( (const char *)sha1.calcSha1( (const byte *)file_->readAll().data(), file_->size() ), 20 ); - file_->close(); - QString hash = KCodecs::base64Encode( shaData ); - success = ( msnObject_.getDataHash() == hash ); - } + QString fileHash( KMessShared::generateFileHash( pictureFileName ).toBase64() ); + success = ( msnObject_.getDataHash() == fileHash ); // Clean up delete file_; file_ = 0; + QFileInfo fileInfo; + QString ext; // Special checks for some types. switch( msnObject_.getType() ) { case MsnObject::DISPLAYPIC: + // Auto-assign the extension for the file + ext = QImageReader::imageFormat( pictureFileName ); + if( ext.isEmpty() || ! success ) + { + // If the type of image isn't support or the data is corrupted + // remove the file + QFile::remove ( pictureFileName ); + return; + } + + // Rename the file with the new extension if there is anyone + fileInfo.setFile( pictureFileName ); + if( fileInfo.suffix().isEmpty() ) + { + QFile::rename( pictureFileName, pictureFileName + "." + ext ); + } + break; + case MsnObject::BACKGROUND: case MsnObject::EMOTICON: // For pictures, see if it's broken. - if( QPixmap::imageFormat( pictureFileName ) == 0 || ! success ) + if( QImageReader::imageFormat( pictureFileName ).isEmpty() || ! success ) { - kdWarning() << "PictureTransferP2P::showTransferComplete() - Received image was broken (contact=" << getContactHandle() << ")." << endl; + kWarning() << "Received image was broken (contact=" << getContactHandle() << ")."; QFile::remove( pictureFileName ); return; } break; + case MsnObject::WINK: + { + QFile file; + + // Write the wink friendly to a file. + // The file will be used to retrieve the actual wink name, ie "Frog" + file.setFileName( pictureFileName + ".name" ); + if( file.open( QIODevice::WriteOnly | QIODevice::Text ) ) + { + QTextStream out( &file ); + out << msnObject_.getFriendly(); + out.flush(); + file.close(); + } + + // 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 don't write this value + // we can't send the wink to WLM, because it checks for the certificate + file.setFileName( 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; @@ -563,7 +587,7 @@ void PictureTransferP2P::showTransferComplete() // Send an event to the switchboard: - emit pictureReceived( getContactHandle(), msnObject_ ); + emit msnObjectReceived( getContactHandle(), msnObject_ ); // The application should close automatically now, // and it sends the BYE message automatically too. @@ -574,15 +598,15 @@ void PictureTransferP2P::showTransferComplete() /** * Hide transfer messages, by overwriting the default method implementation. */ -void PictureTransferP2P::showTransferMessage( const QString &message ) +void MsnObjectTransferP2P::showTransferMessage( const QString &message ) { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P::showTransferMessage() - suppressed message: " << message << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "suppressed message: " << message; #else Q_UNUSED( message ); // Avoid compiler warnings #endif - // WLM8 appears to initiate direct connections for picture transfers as well. + // WLM8 appears to initiate direct connections for msnobject transfers as well. // this method hides the connecting-messages by simply overwriting the base method and no nothing instead. } @@ -591,21 +615,22 @@ void PictureTransferP2P::showTransferMessage( const QString &message ) /** * Step one of a user-started chat: the user invites the contact */ -void PictureTransferP2P::userStarted1_UserInvitesContact() +void MsnObjectTransferP2P::userStarted1_UserInvitesContact() { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P - userStarted1_UserInvitesContact - requesting display picture" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "requesting display picture"; #endif // Set the filename - fileName_ = getPictureFileName(msnObject_); + fileName_ = KMessConfig::instance()->getMsnObjectFileName(msnObject_); // Encode the context - // The \0 char is added on purpose, this fixes the picture transfers with Bot2k3. + // The \0 char is added on purpose, this fixes the msnobject transfers with Bot2k3. // Sometimes the context string is padded with '=' characters, note this is a feature of BASE64 encoding! QString context; - QByteArray rawObject = msnObject_.objectString().utf8(); // conversion from QCString to QByteArray, adding \0 char. - context = QString::fromUtf8(KCodecs::base64Encode(rawObject)); + QByteArray rawObject = msnObject_.objectString().toUtf8(); + rawObject.append( '\0' ); // appears to be sent by the official client, likely unintentional. + context = rawObject.toBase64(); int appId; MsnObject::MsnObjectType objectType = msnObject_.getType(); @@ -634,7 +659,7 @@ void PictureTransferP2P::userStarted1_UserInvitesContact() } // Send the invitation - sendSlpSessionInvitation( generateID(), getAppId(), appId, context); + sendSlpSessionInvitation( KMessShared::generateID(), getAppId(), appId, context); } @@ -644,10 +669,10 @@ void PictureTransferP2P::userStarted1_UserInvitesContact() * * @param message Accept message of the other contact */ -void PictureTransferP2P::userStarted2_ContactAccepts(const MimeMessage & /*message*/) +void MsnObjectTransferP2P::userStarted2_ContactAccepts(const MimeMessage & /*message*/) { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P - userStarted2_ContactAccepts" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug(); #endif // We don't need to do anything else here. @@ -661,32 +686,35 @@ void PictureTransferP2P::userStarted2_ContactAccepts(const MimeMessage & /*messa /** * Step three of a user-started chat: the user prepares for the session. */ -void PictureTransferP2P::userStarted3_UserPrepares() +void MsnObjectTransferP2P::userStarted3_UserPrepares() { -#ifdef KMESSDEBUG_PICTURETRANSFER_P2P - kdDebug() << "PictureTransferP2P - userStarted3_UserPrepares" << endl; +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug(); #endif #ifdef KMESSTEST - ASSERT( file_ == 0 ); - ASSERT( ! fileName_.isEmpty() ); + KMESS_ASSERT( file_ == 0 ); + KMESS_ASSERT( ! fileName_.isEmpty() ); #endif if( file_ != 0 ) { // TODO: Quick fix for WML8, this method is called twice because WLM8 // initializes a Direct connection while it sent the data preparation +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kWarning() << "this method was already called before."; +#endif return; } file_ = new QFile(fileName_); - bool success = file_->open(IO_WriteOnly); + bool success = file_->open(QIODevice::WriteOnly); if( ! success ) { // Notify the user, even if debug mode is not enabled. - kdWarning() << "PictureTransferP2P: Unable to open file: " << fileName_ << "!" << endl; + kWarning() << "Unable to open file: " << fileName_ << "!"; // Close the file (also causes gotData() to fail) delete file_; @@ -700,4 +728,4 @@ void PictureTransferP2P::userStarted3_UserPrepares() } -#include "picturetransferp2p.moc" +#include "msnobjecttransferp2p.moc" diff --git a/kmess/network/applications/picturetransferp2p.h b/src/network/applications/msnobjecttransferp2p.h similarity index 80% rename from kmess/network/applications/picturetransferp2p.h rename to src/network/applications/msnobjecttransferp2p.h index b31fe73..4a52753 100644 --- a/kmess/network/applications/picturetransferp2p.h +++ b/src/network/applications/msnobjecttransferp2p.h @@ -1,5 +1,5 @@ /*************************************************************************** - picturetransferp2p.h - description + msnobjecttransferp2p.h - description ------------------- begin : Fri Nov 26 2004 copyright : (C) 2004 by Diederik van der Boor @@ -15,39 +15,39 @@ * * ***************************************************************************/ -#ifndef PICTURETRANSFERP2P_H -#define PICTURETRANSFERP2P_H +#ifndef MSNOBJECTTRANSFERP2P_H +#define MSNOBJECTTRANSFERP2P_H +#include "../../contact/msnobject.h" #include "p2papplication.h" -#include "../../msnobject.h" -#include -#include class MsnObject; class MimeMessage; class P2PMessage; + class QFile; + /** - * An application class responsable for picture transfers between clients. + * An application class responsable for MSN Object transfers between clients. * * @author Diederik van der Boor * @ingroup Applications */ -class PictureTransferP2P : public P2PApplication +class MsnObjectTransferP2P : public P2PApplication { Q_OBJECT public: // The constructor without msnobject (sufficient for incoming sessions) - PictureTransferP2P(ApplicationList *applicationList); + MsnObjectTransferP2P(ApplicationList *applicationList); // The constructor with msnobject to start a session - PictureTransferP2P(ApplicationList *applicationList, const MsnObject &msnObject); + MsnObjectTransferP2P(ApplicationList *applicationList, const MsnObject &msnObject); // The destructor - virtual ~PictureTransferP2P(); + virtual ~MsnObjectTransferP2P(); // Return the application's GUID static QString getAppId(); @@ -55,14 +55,13 @@ class PictureTransferP2P : public P2PApplication // Return the msn object of the picture we're transferring const MsnObject & getMsnObject() const; - // Static function to return a file name. - static QString getPictureFileName(const MsnObject& msnObject); - // Indicates a private chat is not required, overwritten from the base class. bool isPrivateChatRequired() const; // Hide standard informative application message (e.g. user invited, cancelled) virtual void showEventMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ); + // Show a message to notify about a system error. + virtual void showSystemMessage( const QString &message, const ChatMessage::ContentsClass contents, bool isIncoming ); // Closes the file, verifies the MsnObject and updates possible listeners. virtual void showTransferComplete(); // Hide transfer messages, by overwriting the default method implementation. @@ -76,6 +75,8 @@ class PictureTransferP2P : 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 @@ -102,7 +103,7 @@ class PictureTransferP2P : public P2PApplication MsnObject msnObject_; signals: - void pictureReceived(const QString& contact, const MsnObject &msnObject); + void msnObjectReceived(const QString& contact, const MsnObject &msnObject); }; #endif diff --git a/kmess/network/applications/msnremotedesktop.cpp b/src/network/applications/msnremotedesktop.cpp similarity index 83% rename from kmess/network/applications/msnremotedesktop.cpp rename to src/network/applications/msnremotedesktop.cpp index 033e42b..9cb8d7d 100644 --- a/kmess/network/applications/msnremotedesktop.cpp +++ b/src/network/applications/msnremotedesktop.cpp @@ -17,14 +17,15 @@ #include "msnremotedesktop.h" -#include - -#include -#include - #include "../../kmessdebug.h" #include "../mimemessage.h" +#include + +#include + + + // The constructor MsnRemoteDesktop::MsnRemoteDesktop(const QString &contactHandle) : MimeApplication(contactHandle) @@ -44,11 +45,11 @@ MsnRemoteDesktop::~MsnRemoteDesktop() void MsnRemoteDesktop::contactStarted1_ContactInvitesUser(const MimeMessage& /*message*/) { #ifdef KMESSDEBUG_REMOTEDESKTOP - kdDebug() << "MsnRemoteDesktop - contactStarted1_ContactInvitesUser" << endl; + kDebug(); #endif // Send the message to the chat window. - offerAcceptOrReject( i18n("You are invited to share this person's desktop.") ); + offerAcceptOrReject( i18n("You are invited to share this contact's desktop.") ); } @@ -57,7 +58,7 @@ void MsnRemoteDesktop::contactStarted1_ContactInvitesUser(const MimeMessage& /*m void MsnRemoteDesktop::contactStarted2_UserAccepts() { #ifdef KMESSDEBUG_REMOTEDESKTOP - kdDebug() << "MsnRemoteDesktop - contactStarted2_UserAccepts" << endl; + kDebug(); #endif // Create the accept message @@ -79,7 +80,7 @@ void MsnRemoteDesktop::contactStarted2_UserAccepts() void MsnRemoteDesktop::contactStarted3_ContactConfirmsAccept(const MimeMessage& message) { #ifdef KMESSDEBUG_REMOTEDESKTOP - kdDebug() << "MsnRemoteDesktop - contactStarted3_ContactConfirmsAccept" << endl; + kDebug(); #endif // Store the data from the message @@ -119,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" ); @@ -148,23 +149,28 @@ QString MsnRemoteDesktop::getAppId() void MsnRemoteDesktop::startRemoteClient(QString /*login*/, QString /*password*/) { #ifdef KMESSDEBUG_REMOTEDESKTOP - kdDebug() << "MsnRemoteDesktop - Start KDE's remote desktop client." << endl; + kDebug() << "Start KDE's remote desktop client."; #endif + // Remove the accept links + modifyOfferMessage(); + // Show the user that the app is starting - showEventMessage( i18n("Starting KRDC. Connecting to %1.").arg( remoteIp_ ), ChatMessage::CONTENT_APP_INFO, ! isUserStartedApp() ); + showEventMessage( i18n("Starting KRDC. Connecting to %1.", remoteIp_ ), ChatMessage::CONTENT_APP_INFO, ! isUserStartedApp() ); + +// arg = "rdp://" + login + ":" + password + "@" + remoteIp_; + QStringList args; + args.append( "rdp://" + remoteIp_ ); // Give a login screen, we can't figure out the password + +#ifdef KMESSDEBUG_REMOTEDESKTOP + kDebug() << "Argument is " << args[0] << "."; +#endif // Start the app - QProcess process; - process.addArgument("krdc"); - QString arg; -// arg = "rdp://" + login + ":" + password + "@" + remoteIp_; - arg = "rdp://" + remoteIp_; // Give a login screen, we can't figure out the password -#ifdef KMESSDEBUG_REMOTEDESKTOP - kdDebug() << "MsnRemoteDesktop - Argument is " << arg << "." << endl; -#endif - process.addArgument( arg ); - process.start(); + if( ! QProcess::startDetached( "krdc", args ) ) + { + kWarning() << "Unable to start 'krdc'!"; + } // Delete the application (which is now finished) endApplication(); diff --git a/kmess/network/applications/msnremotedesktop.h b/src/network/applications/msnremotedesktop.h similarity index 97% rename from kmess/network/applications/msnremotedesktop.h rename to src/network/applications/msnremotedesktop.h index 68778d5..a8f1de6 100644 --- a/kmess/network/applications/msnremotedesktop.h +++ b/src/network/applications/msnremotedesktop.h @@ -18,9 +18,10 @@ #ifndef MSNREMOTEDESKTOP_H #define MSNREMOTEDESKTOP_H -#include #include "mimeapplication.h" + + /** * Use KDE's KRDC to use MSN's remote desktop protocol. * @@ -35,7 +36,7 @@ class MsnRemoteDesktop : public MimeApplication // The constructor MsnRemoteDesktop(const QString &contactHandle); // The destructor - ~MsnRemoteDesktop(); + virtual ~MsnRemoteDesktop(); // Return the application's GUID static QString getAppId(); diff --git a/src/network/applications/p2papplication.cpp b/src/network/applications/p2papplication.cpp new file mode 100644 index 0000000..9a2fa6c --- /dev/null +++ b/src/network/applications/p2papplication.cpp @@ -0,0 +1,3707 @@ +/*************************************************************************** + p2papplication.cpp - description + ------------------- + begin : Mon Nov 22 2004 + copyright : (C) 2004 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 "p2papplication.h" + +#include "../../kmessdebug.h" +#include "../../currentaccount.h" +#include "../../contact/msnobject.h" +#include "../../utils/kmessshared.h" +#include "../extra/msndirectconnection.h" +#include "../mimemessage.h" +#include "../p2pmessage.h" +#include "applicationlist.h" + +#include + +#include + + +#ifdef KMESSDEBUG_P2PAPPLICATION +#define KMESSDEBUG_P2PAPPLICATION_GENERAL +#endif + +// Settings for debugging. +#define P2PAPPLICATION_AVOID_DC_CLIENT 0 +#define P2PAPPLICATION_AVOID_DC_SERVER 0 + +// Timeout settings, to prevent stale instances. +// Measured an ACK response time of 90 seconds once for an overloaded machine (Pentium 2 running Skype + WLM). +#define P2PAPPLICATION_TIMEOUT_ACCEPT 120000 +#define P2PAPPLICATION_TIMEOUT_ACK 120000 +#define P2PAPPLICATION_TIMEOUT_DATA 120000 +#define P2PAPPLICATION_TIMEOUT_MOREDATA 120000 +#define P2PAPPLICATION_TIMEOUT_SLP 120000 // 120 seconds +#define P2PAPPLICATION_TIMEOUT_DESTROY 10000 // 10 seconds + + + +/** + * @brief Constructor, initializes the P2PApplication instance fields. + * + * The ApplicationList object contains the direct connection, which is shared between all P2P applications of one same contact. + * This object is also used to deliver messages back to the contact. + * + * @param applicationList The application list object for the contact + */ +P2PApplication::P2PApplication(ApplicationList *applicationList) +: P2PApplicationBase( applicationList ), + applicationList_( applicationList ), // local copy for now, don't want to expose it as protected. + gotSlpMessage_(false), + invitationCSeq_(0), + invitationSessionID_(0), + sessionID_(0), + userShouldAcknowledge_(false) +{ + // For debugging + setObjectName( QLatin1String( metaObject()->className() ) + "[0/" + getContactHandle() + "]" ); +} + + + +/** + * @brief Class destructor. + * + * Cleans up buffers and timers. + */ +P2PApplication::~P2PApplication() +{ +#ifdef KMESSDEBUG_APPLICATION + kDebug() << " session=" << getSessionID(); +#endif + + applicationList_ = 0; +} + + + +/** + * @brief The contact aborted the session + * + * This method is overwritten from the base class, so + * endApplicationLater() is called instead of endApplication(). + * This leaves the P2P session open for a short while, to accept any remaining + * packets that could be sent (like TCP's TIME_WAIT state). + * + * @param message Optional message to display, defaults to getContactAbortMessage(). + */ +void P2PApplication::contactAborted(const QString &message) +{ +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "state=" << (int) getWaitingState(); +#endif + + // Make sure a second message is not displayed here. + // The contact could be sending multiple error messages. + if( isWaitingState( P2P_WAIT_END_APPLICATION ) ) + { +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "Abort the application again, " + "application was already awaiting termination."; +#endif + + // Make sure the timer is started again. + endApplicationLater(); + return; + } + else if( isClosing() ) + { + kWarning() << "Attempted to close application twice " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplicationlater)"; + + // Make sure the timer is started again. + endApplicationLater(); + return; + } + + + if( isTransferComplete() ) + { + // Make sure the user won't get a "transfer complete" message + // followed by a "contact aborted" message. + // + // This could happen if: + // - WLM sends data + // - KMess acks + // - WLM closes the SB + // - contactAborted() called for every app. + + // Also interesting: + // - signout / signin with WLM. + // - establish a SB connection again by starting a chat. + // - The P2P session is still active in WLM, + // and has a bridge now, so WLM sends the SLP BYE. + // - kmess will ack it with a temporary p2p session. + kWarning() << "not displaying message because data transfer is complete. " + "The switchboard was likely closed after receiving all data. " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplicationlater)"; + } + else + { + // Remove the accept links + modifyOfferMessage(); + + if( message.isEmpty() ) + { + showEventMessage( getContactAbortMessage(), ChatMessage::CONTENT_APP_CANCELED, true ); + } + else + { + showEventMessage( message, ChatMessage::CONTENT_APP_CANCELED, true ); + } + } + + endApplicationLater(); +} + + + +/** + * @brief Step 1 of a contact-started chat: the contact invites the user + * + * This default implementation automatically declines the invitation with a "feature not supported" notification. + * + * Override this method to handle the invitation instead. + * It can typically do one of the following things: + * - parse the 'Context' field of the invitation and store the information. + * - display the accept/cancel link with offerAcceptOrReject(). + * - automatically accept the invitation by calling contactStarted2_UserAccepts(). + * - decline the invitation by calling sendCancelMessage(). + * + * @param message The body (payload fields) of the SLP INVITE message, + * which typically has the fields 'Context' and 'AppID'. + * The 'SessionID' and 'EUF-GUID' fields are be processed automatically. + */ +void P2PApplication::contactStarted1_ContactInvitesUser(const MimeMessage &message) +{ +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "(rejects invitation)"; +#endif + + // We can assume the switchboard already displayed a better error message +#ifdef KMESTEST + kWarning() << "The Application subclass didn't implement contactStarted1_ContactInvitesUser!"; +#endif + + // Send some debug info to the console + MimeMessage slpMimeBody(message.getBody()); + kWarning() << "The contact sent an MSNSLP invitation type KMess can't handle yet " + "(euf-guid=" << slpMimeBody.getValue("EUF-GUID") << + " appid=" << slpMimeBody.getValue("AppID") << + " action=send500)."; + + // Display a warning to the user + showSystemMessage( i18n("The contact has invited you to an activity not yet supported by KMess."), ChatMessage::CONTENT_SYSTEM_NOTICE, true ); + + + // Cancel the invitation + sendCancelMessage( CANCEL_NOT_INSTALLED ); + + // Unlike Application::contactStarted1_ContactInvitesUser() + // we don't quit here!! We should wait for the BYE message from the other contact! +} + + + +/** + * @brief Step 4 of a contact-started chat: the contact confirms the data-preparation message. + * + * This method was added for P2P-style chats to support the last step of a P2P session. + * When the contact requests to send data, call sendData() here to start the transfer. + */ +void P2PApplication::contactStarted4_ContactConfirmsPreparation() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug(); +#endif +} + + + +/** + * @brief Return the identifier the SLP INVITE message. + * @return The Branch-ID value from the SLP INVITE message. + */ +QString P2PApplication::getBranch() const +{ + return branch_; +} + + + +/** + * @brief Return the identifier of the SLP session. + * @return The Call-ID value from the SLP INVITE message. + */ +QString P2PApplication::getCallID() const +{ + return callID_; +} + + + +/** + * @brief Return the Content-Type of the invitation message + * + * This method is useful for some contactStarted1_ContactInvitesUser() implementations. + * + * @return The Content-Type value, e.g. application/x-msnmsgr-sessionreqbody. + */ +const QString& P2PApplication::getInvitationContentType() const +{ + return invitationContentType_; +} + + + +/** + * @brief Return the identifier of the SLP INVITE message. + * + * This method is useful for some contactStarted2_UserAccepts() implementations. + * It's possible getSessionID() still returns zero, because the client should confirm the Session-ID first. + * + * @return The 'SessionID' field from the SLP payload of the invitation message. + */ +quint32 P2PApplication::getInvitationSessionID() const +{ + return invitationSessionID_; +} + + + +/** + * @brief Return the session ID, this identifies the P2P session. + * + * It's the first field of the binary P2P header. + * When a negotiation message is sent, it's session ID field will always be zero, + * regardless of the real session ID. + * + * @return The session ID field used in the binary P2P header. + */ +quint32 P2PApplication::getSessionID() const +{ + return sessionID_; +} + + + +/** + * @brief Parse the received ACK message. + * + * The messageType field is used to detect actions + * like "contact ACKed the OK message" or "contact received all data". + * + * It handles the following ACK message types: + * - ACK of a SLP INVITE message invokes gotAck_SlpSessionInvitation(). + * - ACK of a SLP session OK message invokes gotAck_slpSessionOk(). + * - ACK of a SLP tranfer INVITE message invokes gotAck_slpTransferInvitation(). + * - ACK of a SLP tranfer OK message invokes gotAck_slpTransferOk(). + * - ACK of a SLP transfer decline message invokes gotAck_slpTransferDecline(). + * - ACK of the data preparation message invokes gotAck_dataPreparation() + * - ACK of the sent file data invokes gotAck_dataReceived(). + * - ACK of the SLP BYE message, invokes gotAck_slpBye(). + * - ACK of a SLP error message invokes gotAck_slpError(). + * - all other ACKs are not treated specially. + * + * @param message The ACK message. + * @param ackedMessageType The type of the original message this ACK corresponds with. + */ +void P2PApplication::gotAck(const P2PMessage &message, const P2PMessageType ackedMessageType) +{ +#ifndef KMESSTEST + Q_UNUSED( message ); // Avoid compiler warning +#endif + +#ifdef KMESSTEST + if( message.isAck() ) // normal 0x02 ack + { + KMESS_ASSERT( message.getDataSize() == 0 ); + KMESS_ASSERT( message.getTotalSize() == 0 ); + KMESS_ASSERT( message.getAckSessionID() != 0 ); + KMESS_ASSERT( message.getAckUniqueID() != 0 ); + KMESS_ASSERT( message.getAckDataSize() != 0 ); + } +#endif + + switch( ackedMessageType ) + { + // Are we waiting for the contact to accept our invitation (e.g. send "200 OK")? + case P2P_MSG_SESSION_INVITATION: +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (INVITE ACK)."; +#endif + + gotAck_slpSessionInvitation(); + return; + + + // Are we waiting for the ACK to confirm our "200 OK" message? + case P2P_MSG_SESSION_OK: + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (200 OK ACK)."; +#endif + + gotAck_slpSessionOk(); + return; + + + // Are we waiting for the contact to accept our transfer invitation (e.g. send "200 OK")? + case P2P_MSG_TRANSFER_INVITATION: +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (INVITE transfer ACK)."; +#endif + + gotAck_slpTransferInvitation(); + return; + + + // Are we waiting for the ACK to confirm our "200 OK" message? + case P2P_MSG_TRANSFER_OK: + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (200 transfer OK ACK)."; +#endif + + gotAck_slpTransferOk(); + return; + + + // Are we waiting for the ACK to confirm our data preparation message? + case P2P_MSG_DATA_PREPARATION: + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (data-preparation ACK)."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( message.getAckDataSize() == 4 ); +#endif + + gotAck_dataPreparation(); + return; + + + // Are we waiting for the ACK to confirm that all data was received? + case P2P_MSG_DATA: +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (all-received ACK)."; +#endif + + gotAck_dataReceived(); + return; + + + // Are we waiting for the BYE ACK to quit the session/application? + case P2P_MSG_SESSION_BYE: +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (BYE ACK, terminating)."; +#endif + + gotAck_slpBye(); + return; + + + // Are we expecting a ACK for our decline of the transfer? + case P2P_MSG_TRANSFER_DECLINE: +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (transfer decline ACK)."; +#endif + + gotAck_slpTransferDecline(); + return; + + + // Are we waiting for the SLP Error message to be ACK-ed? + case P2P_MSG_SLP_ERROR: +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message (Confirmed SLP Error)."; +#endif + + gotAck_slpError(); + return; + + + // Standard ACK message or unhandled ACK message. + default: + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an ACK message. " + "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 ) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "No special action taken (waiting for a connection)."; +#endif + } + else if( ackedMessageType != P2P_MSG_UNKNOWN || ! isWaitingState( P2P_WAIT_DEFAULT ) ) + { + // Unexpected, this should be a normal ACK message. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kWarning() << "Unhandled state for ACK message:" + " waitingState=" << (int) getWaitingState() << " ackedMessageType=" << ackedMessageType << "!"; +#endif + // If we were waiting: the timer is stopped and + // we forgot an if-block in this method. + // So make sure the object will still be killed eventually. + setWaitingState( getWaitingState(), P2PAPPLICATION_TIMEOUT_DATA ); + return; + } + } +} + + + +/** + * @brief Called when the ACK for the data preparation was received. + * + * This invokes initiateTransfer(), unless the the application + * waits for an ACK to a SLP transfer OK message. + */ +void P2PApplication::gotAck_dataPreparation() +{ +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_PREPARE_ACK ) || isWaitingState( P2P_WAIT_FOR_CONNECTION ) ); +#endif + + // Temporary switch state, if the derived class + // sends a message this state will be changed. + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + + // This should happen after the data preparation message is sent. + + // If the user sent the invitation, + // we shouldn't receive the prepare-ack, but sent it. + if(isUserStartedApp()) + { + // We received a data preparation ACK but didn't expect it. + kWarning() << "P2P message can't be handled, " + "this ack is not expected for applications started by the user " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x08)."; + + // Send error back. + sendP2PAbort(); + + showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, false ); + endApplicationLater(); + return; + } + + + // Keep waiting if a direct connection setup is about to be complete. + if( hasUnAckedMessage( P2P_MSG_TRANSFER_OK ) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Application is waiting for a 200 transfer OK ACK, " + "not initiating transfer yet."; +#endif + + setWaitingState( P2P_WAIT_FOR_TRANSFER_ACK, P2PAPPLICATION_TIMEOUT_SLP ); + return; + } + + + // Dispatch to derived implementation + initiateTransfer(); +} + + + +/** + * @brief Called when the ACK for the sent file data was received. + * + * This method invokes showTransferComplete(), and sends the SLP BYE if needed. + */ +void P2PApplication::gotAck_dataReceived() +{ +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_DATA_ACK ) ); +#endif + + if(isUserStartedApp()) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "All data sent and confirmed, " + "sending BYE message..."; +#endif + + // We sent the INVITE, now we send the BYE. + sendSlpBye(); + + // All data was acked + // Telling derived class the transfer is complete. + showTransferComplete(); + + // Don't terminate yet, that message needs to be ACK-ed as well. + } + else + { +#ifdef gotAck_dataReceived + kDebug() << "All data sent and confirmed, " + "waiting for BYE message..."; +#endif + + // All data was acked, this is good enough. + // The remaining teardown happens behind the scenes. + showTransferComplete(); + + // The other contact sent the INVITE, so we also wait for the BYE message. + // This happens for msnobject transfers for example. + setWaitingState( P2P_WAIT_FOR_SLP_BYE, P2PAPPLICATION_TIMEOUT_SLP ); + } +} + + + +/** + * @brief Called when the ACK for the SLP BYE message was received. + * + * This schedules the application for termination. + */ +void P2PApplication::gotAck_slpBye() +{ + if( ! isWaitingState( P2P_WAIT_FOR_SLP_BYE_ACK ) ) + { + kWarning() << "Unexpected SLP BYE received!"; + } + + // Test whether the data transfer to the contact was aborted. + testDataSendingAborted(); + + // Session complete. + endApplicationLater(); +} + + + +/** + * @brief Called when the ACK for a SLP Error was received. + * + * if the contact started the application, this will wait for the SLP BYE message. + * Otherwise the application is terminated. + */ +void P2PApplication::gotAck_slpError() +{ +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_SLP_ERR_ACK ) ); +#endif + + if(! isUserStartedApp()) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "The contact started this application, waiting for BYE."; +#endif + + // We wait for the BYE + setWaitingState( P2P_WAIT_FOR_SLP_BYE, P2PAPPLICATION_TIMEOUT_SLP ); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "The user started this application, terminating."; +#endif + + // TODO: send BYE after the client confirmed our SLP error? + endApplicationLater(); + } +} + + + +/** + * @brief Called when the ACK for the first SLP INVITE message was received. + * + * This only changes the waiting state, to wait for the SLP OK message. + */ +void P2PApplication::gotAck_slpSessionInvitation() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for 200 OK message..."; +#endif + + // Continue to wait for the contact to send the accept message (SLP OK). + setWaitingState( P2P_WAIT_CONTACT_ACCEPT, P2PAPPLICATION_TIMEOUT_ACCEPT ); + stopWaitingTimer(); +} + + + +/** + * @brief Called when the ACK of the SLP OK message was received. + * + * This method invokes contactStarted3_ContactConfirmsAccept() + */ +void P2PApplication::gotAck_slpSessionOk() +{ + // This should happen after the "200 OK" message is sent. + + // If the user started the inviation, + // we send the SLP OK ack, not receive it + if( isUserStartedApp() ) + { + // We received an 200 OK ACK but didn't expect it. + // This is very unlikely, but still prevent worse situations when contactStarted3_.. is invoked(). + kWarning() << "P2P message can't be handled, " + "this ack is not expected for applications started by the user " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x08)."; + + // Show message + showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, false ); + + // Abort + sendCancelMessage( CANCEL_ABORT ); + return; + } + + // Reset, will be changed by initiateTransfer->contactStarted3..->sendDataPreparationAck. + // TODO: rewrite the sending of the data-preparation message using the incoming/outgoing queue. + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + + // SLP OK message ACKed + // For P2P apps, we can't prove any mime fields here, so an empty constructor is what's left.. + // This is where the data preparation ACK could be sent. + contactStarted3_ContactConfirmsAccept( MimeMessage() ); + +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_DEFAULT ) || isWaitingState( P2P_WAIT_FOR_PREPARE_ACK ) ); +#endif + + // If the contactStarted3() didn't sent anything, we'll wait for incoming file data. + if( isWaitingState( P2P_WAIT_DEFAULT ) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting state not changed, " + "waiting for file data..."; +#endif + + // For Pictures, the contact must send the data preparation ACK at this point (P2P_WAIT_FOR_PREPARE_ACK) + // For Files, the contact must initiate the data transfer now. (P2P_WAIT_DEFAULT) + setWaitingState( P2P_WAIT_FOR_FILE_DATA, P2PAPPLICATION_TIMEOUT_DATA ); + } +} + + + +/** + * @brief Called when the ACK for the SLP transfer decline message was received. + * + * This only changes the waiting state, + * the contact should start to send the data now. + */ +void P2PApplication::gotAck_slpTransferDecline() +{ +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_SLP_ERR_ACK ) || isWaitingState( P2P_WAIT_FOR_FILE_DATA ) ); +#endif + + if( isTransferActive() || isWaitingState( P2P_WAIT_FOR_FILE_DATA ) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got ack while data transfer is already active."; +#endif + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for file data..."; +#endif + + // Continue to wait for the contact to send the file data + setWaitingState( P2P_WAIT_FOR_FILE_DATA, P2PAPPLICATION_TIMEOUT_DATA ); + } +} + + + +/** + * @brief Called when the ACK for the SLP transfer INVITE message was received. + * + * This only changes the waiting state, to wait for the SLP OK message. + */ +void P2PApplication::gotAck_slpTransferInvitation() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for 200 OK message..."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_INVITE_TR_ACK ) ); +#endif + + // Continue to wait for the contact to send the accept message (SLP OK). + setWaitingState( P2P_WAIT_FOR_TRANSFER_ACCEPT, P2PAPPLICATION_TIMEOUT_ACCEPT ); + + // note KMess uses a fixed time user to accept/decline here. + // WLM8 has no timeout here for file transfer. +} + + + +/** + * @brief Called when the ACK for the SLP transfer OK mesages was received. + * + * This invokes initiateTransfer() or waits + * for an other direct connection to complete. + */ +void P2PApplication::gotAck_slpTransferOk() +{ + // For some reason, our "MSNSLP/1.0 200 OK" message can be ACKed when we just ACKed all data is received. + // Detect this, otherwise the chat window is filled with "File transfer complete.. Contact aborted" messages. + if( isTransferComplete() || isWaitingState( P2P_WAIT_FOR_SLP_BYE ) ) + { + kWarning() << "Received ACK for 'transrespbody' message " + "while closing the session " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=return)."; + + // Make sure the timer starts again. + setWaitingState( getWaitingState(), P2PAPPLICATION_TIMEOUT_SLP ); + return; + } + + // Temporary switch the waiting state. + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + + // This should happen after the "200 OK" message is sent. + + // SLP ransfer OK message ACKed + if( ! applicationList_->hasDirectConnection() + && ! applicationList_->hasPendingConnections() ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "No connection attempts were made, " + "so starting transfer immediately."; +#endif + // TODO: the contact may actually send an INVITE back to become the server. + initiateTransfer(); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "200 transfer OK ACK received, " + "but waiting for connection attempts to succeed or fail..."; +#endif + } + + // If the contactStarted3() didn't sent anything, we'll wait for incoming file data. + if( isWaitingState( P2P_WAIT_DEFAULT ) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting state not changed, " + "waiting for file data..."; +#endif + + // At some slow systems, it seams WLM can already start + // the data transfer before waiting for a connection. + if( isTransferActive() ) + { + kWarning() << "already received " << getTransferredBytes() << " bytes before receiving the 200 transfer OK ACK " + "(state=" << (int) getWaitingState() << + " dc=" << applicationList_->hasDirectConnection() << + " dcauth=" << applicationList_->hasAuthorizedDirectConnection() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue)."; + } + + // For Files, the contact must initiate the data transfer now. (P2P_WAIT_DEFAULT) + setWaitingState( P2P_WAIT_FOR_FILE_DATA, P2PAPPLICATION_TIMEOUT_DATA ); + } +} + + + +/** + * @brief Called when data is received. + * + * This method should be overwritten in the derived class + * to store the data in a file, buffer, etc.. + * + * The order of the data fragments is not guaranteed by WLM, especially when it's switching to a direct connection. + * The writeP2PDataToFile() function can be used to cope with this behavour. + * Also don't rely on P2PMessage::isLastFragment() to determine when the transfer is complete. + * Overwrite showTransferComplete() instead. + * + * @param message The P2P message containing the data. + */ +void P2PApplication::gotData(const P2PMessage &/*message*/) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kWarning() << "Data not handeled by derived class."; +#endif +} + + + +/** + * @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::gotDataComplete( const P2PMessage &lastMessage ) +{ + Q_UNUSED( lastMessage ); + + // Determine what to send next + if(isUserStartedApp()) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Application was started by the user, also send SLP BYE."; +#endif + + // Current state could be P2P_WAIT_FOR_FILE_DATA, but reset it here. + // Make the debugging clean. + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + + // We sent the INVITE, now we send the BYE. + sendSlpBye(); + // Don't terminate yet, that message needs to be ACK-ed as well. + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Application was started by the contact, waiting for SLP BYE..."; +#endif + + // Otherwise we wait for the BYE + setWaitingState( P2P_WAIT_FOR_SLP_BYE, P2PAPPLICATION_TIMEOUT_SLP ); + } +} + + + +/** + * @brief Got an direct connection handshake ack. + * + * This method verifies the Nonce field and marks the connection as authenticated. + * If the Nonce field is invalid, the connection will be closed without any notice. + * + * @param message The handshake message received from the direct connection. + */ +void P2PApplication::gotDirectConnectionHandshake(const P2PMessage &message) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got a direct connection handshake message."; +#endif + + // If the contact was sending a handshake when we dropped the connection, + // it's possible this packet will be delivered over the switchboard. + if( ! applicationList_->hasDirectConnection() ) + { + // Ignore the packet + kWarning() << "Received direct connection handshake at the switchboard " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=return)."; + return; + } + + MsnDirectConnection *directConnection = applicationList_->getDirectConnection(); + + // Get connection info + QString nonce ( message.getNonce() ); + bool isServer = directConnection->isServer(); + + // Verify the nonce + // Nonce is already used in ApplicationList to find this application, + // but this is kept here for consistency, and if ApplicationList would change one time. + if( nonce != nonce_ ) + { + // Invalid nonce! Drop connection + kWarning() << "Contact sent invalid nonce " + "(received=" << nonce << + " expected=" << nonce_ << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=closeconnection)."; + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Closing connection, moving transfer to switchboard."; +#endif + + // Like the official client, close the connection without any notice. + // The transfer continues over the switchboard instead. + directConnection->closeConnection(); // DirectConnectionPool deletes it. + } + else if( isServer ) + { + // If we're the server, we still need to send a handshake back +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Contact sent correct nonce, " + "sending direct connection handshake ACK."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_HANDSHAKE ) || isTransferActive() ); +#endif + + // KMess is the server, it should authenticate the handshake message. + sendDirectConnectionHandshake( nonce_ ); + } + else + { + // KMess is the client, it should verify the handshake response only. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Contact sent correct nonce, " + "marking connection as authorized."; +#endif + +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_HANDSHAKE_OK ) || isTransferActive() ); +#endif + + // Detect when the contact sent a second INVITE, runs the direct connection server, but sends the nonce first. + // This happened once with WLM8 after the data transfer because KMess didn't send the handshake. + if( isWaitingState( P2P_WAIT_FOR_HANDSHAKE ) ) + { + kWarning() << "received nonce from contact first, " + "but it's running the server" + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x100)!"; + + sendDirectConnectionHandshake( nonce_ ); + } + } + + + // See if the transfer was already started. + if( isTransferComplete() ) + { + kWarning() << "connection is authorized " + "but data transfer is already complete" + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x100)!"; + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "marking connection as authorized, transfer should start."; +#endif + + // Note this could be a reverse invitation. + + setWaitingState( P2P_WAIT_FOR_FILE_DATA, 0 ); // no timeout, happens by DirectConnectionPool. + } + + // Mark connection as authorized + // This also starts signals which call slotConnectionAuthorized() + directConnection->setAuthorized(true); +} + + + +/** + * @brief Called when the data preparation message is received. + * + * It calls initiateTransfer() to inform the derived class. + * When sendDataPreparationAck() is not called by the derived class, + * the session will abort automatically. + * + * @param message The P2P data preparation message. + */ +void P2PApplication::gotDataPreparation(const P2PMessage &/*message*/) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got the data preparation message"; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( ! isP2PAckSent() ); + // WLM invites for a DC first before sending the data preparation. + // Since KMess declines this with a 603, P2P_WAIT_FOR_SLP_ERR_ACK is also a valid state here. + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_PREPARE ) || isWaitingState( P2P_WAIT_FOR_SLP_ERR_ACK ) ); +#endif + + + // Tell the derived class it can send the data. + // You typically want to call sendDataPreparation() or sendCancelMessage() here. + // sendDataPreparationAck() only sets a boolean, so we're able to send the + // correct ack or error message here. The methods changes one the following variable: + userShouldAcknowledge_ = true; + + // Let the derived class call the methods. + initiateTransfer(); + + // if sendDataPreparation() was not called, determine now what to send: + if( userShouldAcknowledge_ ) + { + kDebug() << "Handling of data preparation failed " + "(contact=" << getContactHandle() << " action=send0x08)"; + + // Derived class still didn't acknowledge or cancel at all + // (both disable userShouldAcknowledge_). This shouldn't occur! + + // Reject the data-preparation message + showEventMessage( i18n("The transfer failed. Data preparation failed."), ChatMessage::CONTENT_APP_FAILED, false ); + + // Initiate abort. + sendP2PAbort(); + return; + } + + + // If the user did acknowledge something, we no longer have to send an ack any more + // it must have been sendCancelMessage(CANCEL_ABORT) calling sendP2PAbort(). + if( isP2PAckSent() ) + { + // No error message here, assume your derived class already displayed something. + // If sendP2PAck() was called, the app won't terminate, so end it now. + endApplicationLater(); + return; + } + + + // TODO: for WLM8, we need to delay the P2P ack message until the DC is established. + + // User did acknowledge, we can send the *actual* preparation ACK now. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Data preparation successful, sending ACK"; +#endif + + sendP2PAck(); + + + // Now wait for the data to arrive +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for file data to arrive..."; +#endif + + setWaitingState( P2P_WAIT_FOR_FILE_DATA, P2PAPPLICATION_TIMEOUT_DATA ); +} + + + +/** + * @brief Called when an complete SLP message is received. + * + * These messages are used to negotiate session parameters. + * The SLP message itself also has a MIME header and MIME body. + * + * This method validates the 'To' field, + * and dispatches the to the correct handler: + * - messages starting with INVITE MSNMSGR are delivered to gotSlpInvite(). + * - messages starting with MSNSLP/ are delivered to gotSlpStatus(). + * - messages starting with BYE MSNMSGR are delivered to gotSlpBye(). + * - other messages are rejected with an P2P error. + * + * The P2P message is not ACKed yet, each handler does this + * when it's able to parse the SLP body. + * + * A preamble could look like one of the following: + * @code +INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +@endcode +@code +MSNSLP/1.0 200 OK +@endcode +@code +BYE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +@endcode + * + * The message itself looks like: + * @code +To: +From: +Via: MSNSLP/1.0/TLP ;branch={068676F2-9B0C-4945-8ABA-4E6F585F710F} +CSeq: 0 +Call-ID: {E9BCFBDB-2768-4BD3-9E4C-A97DC70261E8} +Max-Forwards: 0 +Content-Type: application/x-msnmsgr-sessionreqbody +Content-Length: 348 + +{the message contents} +@endcode + * + * @param slpMessage The payload extracted from the P2P message fragments (the MIME fields and body). + * @param preamble The first status line sent before the MIME fields, which describes the message type. + */ +void P2PApplication::gotNegotiationMessage(const MimeMessage &slpMessage, const QString &preamble) +{ + // Parse the "negotiation message" (P2PMessage with sessionID 0) + // Verify it is indeed directed to us.. + QString msgTo( slpMessage.getValue("To") ); + + if(! msgTo.isEmpty()) + { + // Only test if the field is available. If it's not, either something + // is wrong in this application, or the client sent a bad message and + // we should respond with an 500 error instead. + // For some reason this can be received in upper case too if the user entered it that way (likely happens with 3rd party clients). + if( msgTo.toLower() != "getHandle().toLower() + ">" ) + { + // In the future, the string might be replaced with + // something to support MSN to AOL chats, etc.. + kWarning() << "P2P message can't be handled, " + "addressed to someone else " + "(to=" << msgTo << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send404)."; + + showEventMessage( i18n("The invitation was cancelled. Message was not directed to us."), ChatMessage::CONTENT_APP_CANCELED, true ); + + // Send error message back + sendSlpError("404 Not Found"); // Waits for ACK and terminates + return; + } + } + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an SLP message, preamble=" << preamble << "."; +#endif + + + + // Find out what kind of message this is: + if( preamble.startsWith("INVITE MSNMSGR") ) + { + // Got an invitation! + gotSlpInvite( slpMessage ); + } + else if( preamble.startsWith("MSNSLP/") ) + { + // Error message, or "MSNSLP/1.0 200 OK" message + gotSlpStatus( slpMessage, preamble ); + } + else if( preamble.startsWith("ACK MSNMSGR") ) + { + // Got a SLP ACK message (Windows Live Messenger feature) + gotSlpAck( slpMessage ); + } + else if( preamble.startsWith("BYE MSNMSGR") ) + { + // Got a BYE message + gotSlpBye( slpMessage ); + } + else + { + // Unknown SLP message + kWarning() << "P2P message can't be handled, " + "unsuppored SLP negotiation message " + "(preamble=" << preamble << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x08)."; + + // Got an unknown SLP preamble + sendP2PAbort(); + + // Abort the application + showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, true ); + return; + } +} + + + +/** + * @brief Called when an SLP ACK message was received. + * + * This message should not be confused with a P2P ACK. + * + * Windows Live Messenger uses this message to acknowlegde + * IP/port information for a direct connection. + * + * This method is currently a STUB to keep Windows Live Messenger happy. + * + * One of the observed messages is: + * @code +ACK MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +To: +From: +Via: MSNSLP/1.0/TLP ;branch={67683AAA-A6F2-4B11-895F-EF46B483F3A9} +CSeq: 0 +Call-ID: {00000000-0000-0000-0000-000000000000} +Max-Forwards: 0 +Content-Type: application/x-msnmsgr-transudpswitch +Content-Length: 157 + +IPv4ExternalAddrsAndPorts: 111.222.333.444:3495 +IPv4InternalAddrsAndPorts: 192.168.1.12:3495 +SessionID: 15076776 +SChannelState: 0 +Capabilities-Flags: 1 +@endcode + * + * @code +ACK MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +To: +From: +Via: MSNSLP/1.0/TLP ;branch={BBE6AAC0-10F4-4419-B01C-1F7C2838BC3D} +CSeq: 0 +Call-ID: {00000000-0000-0000-0000-000000000000} +Max-Forwards: 0 +Content-Type: application/x-msnmsgr-transdestaddrupdate +Content-Length: 197\r\n +\r\n +IPv4ExternalAddrsAndPorts: 11.222.3.44:62570\r\n +IPv4InternalAddrsAndPorts: 192.168.1.69:1343\r\n +IPv4External-Connecting-Port-End-Range: 62576\r\n +SessionID: 15751111\r\n +SChannelState: 0 +Capabilities-Flags: 1 +@endcode + * + * @param slpMessage The parsed SLP message. + */ +void P2PApplication::gotSlpAck(const MimeMessage &slpMessage ) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got SLP ACK message, usage is unknown. Message dump follows.\n" + << slpMessage.getFields() << "\n" + << slpMessage.getBody(); +#else + Q_UNUSED( slpMessage ); +#endif + + bool emptySession = ( ! isFirstMessageSent() || getMode() == APP_MODE_ERROR_HANDLER ); + + // This is some internal message of WLM8. + // Accept it for now. + sendP2PAck(); + + // Also terminate this instance if it was just created for this SLP ACK messasge. + if( emptySession ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Directly terminating temporary P2PApplication instance for SLP ACK message."; +#endif + endApplication(); + } +} + + + +/** + * @brief Called when an SLP BYE message was received. + * + * It sends the ACK back, and calls endApplication() to terminate the session. + * A contact may sent a BYE message to abort the transfer. + * In this case, contactAborted() will be called instead. + * + * The SLP BYE message looks like: + * @code +BYE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +To: +From: +Via: MSNSLP/1.0/TLP ;branch={A1DBCADF-6DA2-43FE-BE27-0AEE26816D91} +CSeq: 0 +Call-ID: {E9BCFBDB-2768-4BD3-9E4C-A97DC70261E8} +Max-Forwards: 0 +Content-Type: application/x-msnmsgr-sessionclosebody +Content-Length: 40 + +SessionID: 114164 +SChannelState: 0 +@endcode + * + * @param slpMessage The parsed SLP message. + */ +void P2PApplication::gotSlpBye( const MimeMessage &slpMessage ) +{ + Q_UNUSED( slpMessage ); // Avoid compiler warning + + // If the BYE was received early, it means the session was aborted prematurely. + // + // There appears to be a small bug in MSN 7.0. It doesn't sent the final "all data received" ACK, + // but sends the BYE directly. After we ACK it, we get a "BYE sent" message back. + // This issue appears to be fixed in MSN 7.5. + // + // Microsoft Messenger for the Mac (6.0.3) takes this even further with msnobject transfers. + // It sends the BYE first and the "all data received" ACK afterwards. + // This happens when KMess is already in the P2P_WAIT_END_APPLICATION state (see "action=unsetclosing"). + + // Also terminate without errors if we're waiting for a BYE ACK and instead receive another BYE. This + // 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. + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got SLP BYE message, closing application " + "(state=" << (int) getWaitingState() << ")."; +#endif + + // Make sure the data is not sent anymore + abortDataSending(); + + + if( ! isWaitingState( P2P_WAIT_FOR_SLP_BYE ) + && ! isWaitingState( P2P_WAIT_FOR_SLP_BYE_ACK ) + && ! isWaitingState( P2P_WAIT_FOR_DATA_ACK ) ) // HACK: added for Messenger for the Mac 6.0.3 and MSN 7.0 + { + // Make a final check if our states have been messed up. Had the following situation once: + // - WLM invites to send a file + // - KMess hosted the server socket. + // - WLM started to send data. + // - transfer was complete, acked, waiting for BYE + // - WLM establishes the connection with the socket. + // - connection is authenticated. + // - sockets are disconnected + // - WLM sends BYE + if( isComplete ) + { + kWarning() << "Transfer seems complete but state suggests otherwise " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue)"; + endApplicationLater(); + } + else if( isWaitingState( P2P_WAIT_END_APPLICATION ) ) + { + // When WLM aborts at a very late stage, it actually processes our final data messages, + // ack's those, handle our BYE, and send it's "aborting BYE" afterwards. + kWarning() << "Received BYE to abort when all data is already transferred " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplicationlater)"; + + // Resume timer + endApplicationLater(); + } + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "BYE message was unexpected; contact aborted " + << "(state=" << (int) getWaitingState() << " contact=" << getContactHandle() << ")"; +#endif + + // End with failure, bye sent at a different moment. + contactAborted(); // closes the application + + // TODO: after this, the contact should send a 0x40 or 0x80 ack of the data stream. + // the message flag indicates whether the contact aborted it's own stream, or aborted ours. + } + else + { + // Normal end + endApplicationLater(); + } +} + + + +/** + * @brief Called when a SLP INVITE message was received. + * + * It extracts the header fields, updates the instance fields, and parses the MIME body. + * The invitation message is delivered to one of the following methods: + * - The application/x-msnmsgr-sessionreqbody message is delivered to gotSlpSessionInvitation(). + * - The application/x-msnmsgr-transreqbody message is delivered to gotSlpTransferInvitation(). + * - The application/x-msnmsgr-transrespbody message is delivered to gotSlpTransferResponse(), + * with the secondInvite parameter set to true. + * - Other messages are rejected as "unrecognized content-type". + * + * @param slpMessage The parsed SLP message. + */ +void P2PApplication::gotSlpInvite(const MimeMessage &slpMessage) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got SLP INVITE message"; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_DEFAULT ) // First invitation + || isWaitingState( P2P_WAIT_FOR_FILE_DATA ) // Second invitation for file transfers. + || isWaitingState( P2P_WAIT_FOR_PREPARE ) // WLM8: reverse invitation for msnobject transfer, holds back it's data-preparation message. + || isWaitingState( P2P_WAIT_FOR_PREPARE_ACK ) // WLM8: second invitation for msnobject transfer, we already sent data-preparation ack. + ); +#endif + + // Reset the waiting state if this is the second INVITE for a file transfer + // TODO: test what to do for the new WLM8 feature (sending transfer invites before data preparation). + if( isWaitingState( P2P_WAIT_FOR_FILE_DATA ) ) + { + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + } + + // Indicate this is an SLP message (sendCancelMessage() uses this) + // This value is reset once a message is sent. + gotSlpMessage_ = true; + + + // Session invitation + // Extract the fields of the message. This is required for userRejected() + MimeMessage slpMimeBody( slpMessage.getBody() ); + + // Set global fields from INVITE message. + QString slpVia ( slpMessage.getValue("Via") ); + callID_ = slpMessage.getValue("Call-ID"); + invitationCSeq_ = slpMessage.getValue("CSeq").toInt(); + invitationContentType_ = slpMessage.getValue("Content-Type"); + + // Extract branch from the "Via" parameter + QRegExp callRE(";branch=(.+)"); // don't use a guid-pattern here, msn6 seams to accept random strings. + callRE.indexIn( slpVia ); + branch_ = callRE.cap(1); + + + // Don't forget the initialize the base class + // The cookie is empty if this is a contact-started session. + if( getCookie().isEmpty() ) + { + startByInvite(generateCookie()); + } + + + // Handle invitation based on the Content-Type field + if( invitationContentType_ == "application/x-msnmsgr-sessionreqbody" ) + { + // Send the ACK message + setCurrentMessageType( P2P_MSG_SESSION_INVITATION ); + sendP2PAck(); + + // Client invites us for a session + // Will set the waitingState to P2P_WAIT_USER_ACCEPT later. + gotSlpSessionInvitation( slpMimeBody ); + } + else if( invitationContentType_ == "application/x-msnmsgr-transreqbody" ) + { + // Send the ACK message + setCurrentMessageType( P2P_MSG_TRANSFER_INVITATION ); + sendP2PAck(); + + // Client requested to transfer the session + // Handle the invitation internally + gotSlpTransferInvitation( slpMimeBody ); + } + 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. + gotSlpTransferResponse( slpMimeBody, true ); + } + else + { + // Send the ACK message + sendP2PAck(); + + // Client sent an unknown invitation type + kWarning() << "Received unexpected Content-Type " + "(type=" << invitationContentType_ << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send500)."; + + // Indicate we don't like that content-type: + sendCancelMessage(CANCEL_INVALID_SLP_CONTENT_TYPE); + // Don't QUIT, the error will be ACK-ed. + } + + // Reset state again. + // So if the base class calls sendCancelMessage() outside + // this method, it won't respond with a SLP message. + gotSlpMessage_ = false; +} + + + +/** + * @brief Called when a SLP 200 OK message was received. + * + * This method is invoked from gotSlpStatus(). + * It extracts the Content-Type status code, depending on the value it proceeds with a different action: + * - The payload of the application/x-msnmsgr-sessionreqbody message + * is delivered to userStarted2_ContactAccepts(). + * - The payload of the application/x-msnmsgr-transrespbody message + * is delivered to gotSlpTransferResponse(). + * - Any other message is rejected with a SLP error. + * + * A session confirmation looks like: + * @code +MSNSLP/1.0 200 OK +To: +From: +... +Content-Type: application/x-msnmsgr-sessionreqbody +Content-Length: 22 + +SessionID: 114164 +@endcode + * + * For an example of a transfer confirmation, see gotSlpTransferResponse(). + * + * @param slpMessage The parsed SLP message. + */ +void P2PApplication::gotSlpOk(const MimeMessage &slpMessage) +{ + // With a 200 code, we reset the waiting state for every situation, + // to make the next check work. + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + + // Parse the data of the message + QString contentType( slpMessage.getValue("Content-Type") ); + MimeMessage slpMimeBody( slpMessage.getBody() ); // body consists of more mime fields + + + // The content-type tells us which fields are present + if( contentType == "application/x-msnmsgr-sessionreqbody" ) + { + // Message confirms the SessionID +#ifdef KMESSTEST + 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); + } + else if( (contentType == "application/x-msnmsgr-transrespbody") || + // 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 << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send500)!"; + + showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, true ); + + // Send error message back + sendCancelMessage( CANCEL_INVALID_SLP_CONTENT_TYPE ); + return; + } + + + // Determine whether we should be waiting for the data-preparation message. + // If we didn't send anything that changed the state and no transfer has started, + // we're likely waiting for some kind of prepare message + if( isWaitingState( P2P_WAIT_DEFAULT ) && ! isTransferActive() ) + { + // Waiting for prepare message +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to send some prepare message..."; +#endif + + setWaitingState( P2P_WAIT_FOR_PREPARE, P2PAPPLICATION_TIMEOUT_ACK ); + } +} + + + +/** + * @brief Called when a SLP session invitation was received. + * + * This method stores the session ID and + * invokes contactStarted1_ContactInvitesUser(). + * That method should parse the 'Context' field to handle the invitation. + * + * An SLP INVITE message for a msnobject transfer looks like: + * @code +INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +To: +From: +... +Content-Type: application/x-msnmsgr-sessionreqbody +Content-Length: 348 + +EUF-GUID: {A4268EEC-FEC5-49E5-95C3-F126696BDBF6} +SessionID: 114164 +AppID: 12 +Context: PG1zbm9ia.. +@endcode + * + * @param slpMimeBody The SLP message with the fields 'EUF-GUID', 'SessionID', 'AppID' and 'Context'. + */ +void P2PApplication::gotSlpSessionInvitation( const MimeMessage &slpMimeBody ) +{ + // Read requested session id from the message + invitationSessionID_ = slpMimeBody.getValue("SessionID").toUInt(); + + // Don't accept invites if we sent one. + if( ! isFirstMessageSent() && isUserStartedApp() ) + { + kWarning() << "Got an INVITE response for " + "user-started application, rejecting " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send500)."; + + sendCancelMessage( CANCEL_INVALID_SLP_CONTENT_TYPE ); + return; + } + + // For debugging + setObjectName( QLatin1String( metaObject()->className() ) + + "[" + QString::number( invitationSessionID_ ) + "/" + getContactHandle() + "]" ); + + // Mark waiting state for user. + // Don't set a timeout just as WLM. + setWaitingState( P2P_WAIT_USER_ACCEPT, 0 ); // state is used later to abort with 500 instead of BYE. + + // Tell the derived class we've got an invitation + contactStarted1_ContactInvitesUser( slpMimeBody ); +} + + + +/** + * @brief Called when a SLP status message was received. + * + * This method extracts the status code, depending on the status code it proceeds with a different action: + * - The 200 OK message invokes gotSlpOk(). + * - The 404 Not Found message invokes contactAborted(). + * - THe 481 No Such Call message invotes contactAborted(). + * - The 500 Internal Error message invokes contactAborted(). + * - The 603 Decline message invokes contactRejected(). + * - Any other message is rejected with a P2P error. + * + * @param slpMessage The parsed SLP message. + * @param preamble The status line sent before the MIME fields, + * which contains the error code (much like HTTP status codes). + */ +void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString &preamble) +{ + // An Error message, or "MSNSLP/1.0 200 OK" message +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got SLP status message (" << preamble << ")"; +#endif + + // See if this object was initialized to handle a Bad packet. + if(getMode() == APP_MODE_ERROR_HANDLER) + { + // This object was initialized to send an error response for an unknown packet (at SLP level). + showSystemMessage( i18n("The transfer failed. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_SYSTEM_NOTICE, true ); + sendSlpError("500 Internal Error"); // Waits for ACK and terminates + return; + } + + // Should only be received if we started it. + if(! isUserStartedApp()) + { + kWarning() << "P2P message can't be handled, " + "unexpected SLP response containing status code " + "(preamble=" << preamble << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x08)."; + + sendP2PAbort(); + + // Abort the application + showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, true ); + return; + } + + + // 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) ); + + + // Reset the waiting state if we were waiting. + if( isWaitingState( P2P_WAIT_CONTACT_ACCEPT ) ) + { + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + } + + // Handle the status codes + switch( code ) + { + // If the invitation was accepted + case 200: + // We don't need to do much here: + // The message will be ACK-ed with the correct session ID automatically + // because that ID was given in the sendSlpInvitation() method. + // 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 ); + break; + + + // We sent a bad address in the to: header + case 404: + setCurrentMessageType( P2P_MSG_SLP_ERROR ); + sendP2PAck(); + + // Inform the user KMess has an error + kWarning() << "KMess sent a bad address in the 'to:' header " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=contactaborted)."; + contactAborted( i18n("The contact rejected the invitation. An internal error occurred.") ); + break; + + + // 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" + + // Inform the user KMess has an error + kWarning() << "KMess sent an invalid Call-ID " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=contactaborted)."; + contactAborted( i18n("The contact rejected the invitation. An internal error occurred.") ); + break; + + + // Something was not supported + case 500: + setCurrentMessageType( P2P_MSG_SLP_ERROR ); + sendP2PAck(); + + // Content-Type of this message is application/x-msnmsgr-session-failure-respbody + + if( slpMessage.getValue("Content-Type") == "null" ) + { + // The Content-Type was not supported + kWarning() << "Content-Type of our invitation was not understood " + "(type=" << invitationContentType_ << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=contactaborted)!"; + } + else + { + // Bad header sent in SLP fields, or invitation type was not supported + kWarning() << "Our invitation was not supported " + "or the contact client had an internal error " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=contactaborted)"; + } + + contactAborted( i18n("The contact rejected the invitation. An internal error occurred.") ); + break; + + + // 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 + contactRejected(); + break; + + // Last option: tell the contact it sent an unknown message + default: + kWarning() << "P2P message can't be handled, " + "unsupported SLP response " + "(preamble=" << preamble << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x08)."; + + // Got an unknown SLP status code + sendP2PAbort(); + + // Scheduelle the application to terminate + showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, true ); + } +} + + + +/** + * @brief Called when a SLP transfer invitation was received. + * + * This is typically received when the contact initiated the file transfer session. + * The Content-Type of the message application/x-msnmsgr-transreqbody. + * The message contains meta-information about the contact's network configuration. + * + * A typical incoming message looks like: + * @code +INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +To: +From: +... +Content-Type: application/x-msnmsgr-transreqbody +Content-Length: 193 + +Bridges: TRUDPv1 TCPv1 +NetID: -789490475 +Conn-Type: IP-Restrict-NAT +UPnPNat: true +ICF: false +Hashed-Nonce: {754C0129-F286-4882-5793-70BA45D62B6A} +SessionID: 114164 +SChannelState: 0 +@endcode + * + * As of Windows Live Messenger 8.1, the message body looks like: +@code +Bridges: TRUDPv1 TCPv1 SBBridge TURNv1 +NetID: 140808277 +Conn-Type: Port-Restrict-NAT +TCP-Conn-Type: Port-Restrict-NAT +UPnPNat: false +ICF: false +Hashed-Nonce: {78F2E9F6-06B7-9080-1D83-A222F143F681} +SessionID: 2674976 +SChannelState: 0 +Capabilities-Flags: 1 +@endcode + * + * Currently the Hashed-Nonce is ignored, a normal Nonce is sent back. + * + * This method attempts to create a server socket and send the possible connection options back to the contact. + * The response message also contains a Listening field + * and supported transport layers (Bridge field). + * It optionally contains one of the following: + * - a generated nonce, the internal/external IP addresses (IPv4Internal-Addrs and IPv4external-Addrs values), or + * - a null nonce to indicate the file data must be sent over the switchboard connection. + * + * See gotSlpTransferResponse() for an example message. + * + * The other contact can decide to start a server socket instead (sending a second invitation message), + * or transfer the file data over the switchboard. + * + * @param slpMimeBody The SLP message with the fields "Bridges", "NetID", "Conn-Type", "UPnPNat", "ICF". + */ +void P2PApplication::gotSlpTransferInvitation(const MimeMessage &slpMimeBody) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Invite message is a request to transfer the session."; +#endif + + // For some reason it's also possible to receive SLP transfer invitations from WLM8 + // with an entirely different callid while trying to setup a direct connection. + // Perhaps some packet is stalled in the outgoing message channel? + if( sessionID_ == 0 || getMode() == APP_MODE_ERROR_HANDLER ) + { + kWarning() << "Received an invitation for a direct connection," + " but no session is set up " + "(maybe an old session, " + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send603)."; + + sendSlpError("603 Decline", invitationSessionID_, invitationContentType_, P2P_MSG_TRANSFER_DECLINE); + return; + } + + + // See if there is already a connection attempt pending. + // This really happened with WLM8.1, somehow it sent multiple connection invites + // the the contact, even for the same session ID. + if( applicationList_->hasPendingConnections() ) + { + kWarning() << "Received an invitation for a direct connection," + " while a connection attempt is already in progress " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send603)."; + + sendSlpError("603 Decline", invitationSessionID_, invitationContentType_, P2P_MSG_TRANSFER_DECLINE); + return; + } + + + // See if the connection already exists + if( applicationList_->hasDirectConnection() ) + { + kWarning() << "Received an invitation " + "to start a direct connection, but a direct connection is already available " + "(authorized=" << applicationList_->hasAuthorizedDirectConnection() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=closeconnection)."; + + // Drop the previous connection. HACK: added for amsn 0.97. + // aMsn 0.97 does some interesting things: + // - DC's it hosted are directly closed after sending all file data. + // - DC's it connected to are left open forever. P2P messages are still received at it, + // but somehow all responses are sent over the SB back as if amsn doesn't know it has a DC. + applicationList_->getDirectConnection()->closeConnection(); + } + + + // Abort if the file data was just received. + // For some reason WLM8 sometimes sends the invitation directly after the file was sent. + // First cause some invites to fail (don't accept/cancel). + // Then accept one but send an "transfer accept" with invalid IP/port. + // Not sure it can always be reproduced this way though. + if( isWaitingState( P2P_WAIT_FOR_SLP_BYE ) ) + { + kWarning() << "Received an invitation for " + "a direct connection, but expecting BYE instead " + "(file transfer just completed, " + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=slpcancel)."; + sendCancelMessage( CANCEL_ABORT ); + return; + } + + + // New in WLM8 reverse direct connection invites for msnobject transfer + bool isReverseInvite = isUserStartedApp(); + if( isReverseInvite ) + { + // Receiving invitations for your own session only happens for msnobject transfer at the moment. + // It means KMess needs: + // - some way to delay the data preparation acks + // - the ability to detect if a SLP error was sent for the transfer INVITE only. + // - fixes for new issues with the state tracking. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Received a reverse invitation to for a direct connection, we started the session."; +#endif + } + + + // Create the accept message + MimeMessage acceptMessage; + bool startListening = false; + + // Get network details + 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 + + + // Based on the contact's network configuration, + // we choose how we want to send the file. + // + // The client can include a Hashed-Nonce field, + // and we can respond with another Hashed-Nonce field. + // This algorithm is not known, but including a normal Nonce field + // in the accept message seams to work (the client has some fallback). + + // Listen at the internal port + // The connection can be used for both the internal and external port + // because it only accepts one incoming packet, the second one will be rejected. +#if P2PAPPLICATION_AVOID_DC_SERVER + int listeningPort = 0; // for debugging. +#else + int listeningPort = applicationList_->addServerConnection(); +#endif + + if( listeningPort != 0 ) + { + // Get parameters for message + nonce_ = KMessShared::generateGUID(); // used for authentication + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Generating Nonce value " + << nonce_ << " for incoming connections."; +#endif + + acceptMessage.addField( "Bridge", "TCPv1" ); + acceptMessage.addField( "Listening", "true" ); + acceptMessage.addField( "Nonce", nonce_ ); + + if(localIp != externalIp) + { + acceptMessage.addField("IPv4Internal-Addrs", localIp ); + acceptMessage.addField("IPv4Internal-Port", QString::number(listeningPort) ); + } + + acceptMessage.addField("IPv4External-Addrs", externalIp ); // TODO: include other aliases + acceptMessage.addField("IPv4External-Port", QString::number(listeningPort) ); + + // Inform the user about the file transfer progress. + showTransferMessage( i18n("Awaiting connection at %1, port %2", externalIp, QString::number( listeningPort ) ) ); + + // Prepare to send the nonce too when connection to other contact is established + connect( applicationList_, SIGNAL( connectionEstablished() ), // when connected, send nonce + this, SLOT ( slotConnectionEstablished() )); + connect( applicationList_, SIGNAL( connectionAuthorized() ), // when authorized, send data + this, SLOT ( slotConnectionAuthorized() )); + connect( applicationList_, SIGNAL( connectionFailed() ), // when failed, revert to switchboard + this, SLOT ( slotConnectionFailed() )); + + startListening = true; // avoids double-checking certain conditions. + } + else if( isReverseInvite ) + { + // Could not listen at a local port, send reject instead. + kWarning() << "Could not listen at local port, " + "redirecting transfer to the switchboard " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send603)."; + + // Note this doesn't kill the session. + setWaitingState( P2P_WAIT_DEFAULT, 0 ); // avoid assertion. + sendSlpError("603 Decline", invitationSessionID_, invitationContentType_, P2P_MSG_TRANSFER_DECLINE); + return; + } + else + { + // Could not listen at a local port, use switchboard instead. + kWarning() << "Could not listen at local port, " + "redirecting transfer to the switchboard " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue)."; + + // This configuration sends each file over the switchboard: + acceptMessage.addField( "Bridge", "TCPv1" ); + acceptMessage.addField( "Listening", "false" ); + acceptMessage.addField( "Nonce", "{00000000-0000-0000-0000-000000000000}"); + + // Inform the user about the file transfer progress. + showTransferMessage( i18n("Reverting to indirect file transfer (this could be slow).") ); + // TODO: at this point, it's assumend the other client will initiate the transfer. + // perhaps set the waitingState to detect when the contact does not return a request? + // Windows Live Messenger is also capable of sending a new INVITE message so it becomes the server instead. + } + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sending 200 transfer OK message, " + "listening=" << (listeningPort != 0) << "."; +#endif + + // Confirm the session + sendSlpOkMessage( acceptMessage ); + + // Wait for the contact to ACK the message.. + if( startListening ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for a connection to succeed or fail..."; +#endif + + setWaitingState( P2P_WAIT_FOR_CONNECTION, P2PAPPLICATION_TIMEOUT_DATA ); + } + else + { + // Expecting file data now we've rejected the invite. + // TODO: it's also possible another invite is sent, hoping for a second chance. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to send file data..."; +#endif + + setWaitingState( P2P_WAIT_FOR_FILE_DATA, P2PAPPLICATION_TIMEOUT_DATA ); + } +} + + + +/** + * @brief Called when a response to a SLP transfer message was received. + * + * The message body contains the IP address to connect to. + * It can be received the following situations: + * - We sent the transfer invitation with a sendSlpTransferInvitation() call. + * The contact sends the "200 OK" message with the ipaddress/port information. + * - We sent a transfer response back with "Listening: false" field. + * The contact sends a second SLP INVITE to become the server instead. + * + * When the contact starts a server, it sends the following message: + * @code +MSNSLP/1.0 200 OK +To: +From: +... +Content-Type: application/x-msnmsgr-transrespbody +Content-Length: 144 + +Bridge: TCPv1 +Listening: true +Nonce: {9BA191DB-3B68-93DA-91A2-BB9031D5B92F} +IPv4External-Addrs: 111.222.333.444 +IPv4External-Port: 6891 +IPv4Internal-Addrs: 192.168.0.111 +IPv4Internal-Port: 6891 +@endcode + * As of Windows Live Messenger 8.0, a SChannelState: 0 field is added. + * Version 8.1 also adds a Capabilities-Flags: 1, Conn-Type and TCP-Conn-Type field. + * + * When the contact is not able to open a port, it sends the following message: + * @code +MSNSLP/1.0 200 OK +To: +From: +... +Content-Type: application/x-msnmsgr-transrespbody +Content-Length: 83 + +Bridge: TCPv1 +Listening: false +Nonce: {00000000-0000-0000-0000-000000000000} +@endcode + * + * When the contact likes to become the server instead it sends the following message: + * @code +INVITE MSNMSGR:user@kmessdemo.org MSNSLP/1.0 +To: +From: +... +Content-Type: application/x-msnmsgr-transrespbody +Content-Length: 146 + +Bridge: TCPv1 +Listening: true +Hashed-Nonce: {B00B2A8A-B3B6-95EB-322F-379747842156} +IPv4Internal-Addrs: 10.0.0.152 +IPv4Internal-Port: 1182 +@endcode + * + * @param slpMimeBody The SLP message with the fields "Listening", "Nonce", + * and optionally ipaddress and port information. + * @param secondInvite Used to indicate the contact sent a second invitation. + */ +void P2PApplication::gotSlpTransferResponse(const MimeMessage &slpMimeBody, bool secondInvite) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + if( ! secondInvite ) + { + kDebug() << "Parsing 200 OK message."; + } + else + { + kDebug() << "Parsing 2nd transfer INVITE message, " + << "contact offers to become the direct connection server."; + } +#endif + + + // Test for an existing (possibly even authorized) direct connection. + // This could happen with local-lan file transfer, the roundtrip of the switchboard + // response message could take longer then the time to authenticate the connection. + if( applicationList_->hasDirectConnection() ) + { + if( applicationList_->hasAuthorizedDirectConnection() ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Connection already authorized " + << "before invitation response was received, starting transfer."; +#endif + initiateTransfer(); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Connection already established " + << "before invitation response was received, waiting for connection to authorize..."; +#endif + // Slots already connected at this point. + } + + return; + } + + + // Handle some special situations when the contact sent an INVITE message back instead. + // This happens when: + // - gotSlpTransferInvitation() was called become the contact wanted to initialize a direct connection. + // - we sent a "200 OK" message back with "Listening: false" to indicate we can't be the server. + // - this method gets called because the contact sends an INVITE to become the server instead. + if( secondInvite ) + { + // TODO: send SLP 200/OK message back when contact sent a second INVITE message? + + // The 'connectionAuthenticated()' and 'connectionFailed()' slots are connected in gotSlpTransferInvitation() + // The 'connectionEstablished()' signal was not connected because we were supposed to become the server. + connect( applicationList_, SIGNAL( connectionEstablished() ), // when connected, send nonce + this, SLOT ( slotConnectionEstablished() )); + } + + + // The Conn-type field of the message is the least important here, + // the "Listening", "ICF" and "UPnPNat" tell us more about the situation of the contact, + // and the probability to create a successful direct connection in either way. + + // Get fields from message + bool listening = slpMimeBody.getValue("Listening") == "true"; + bool listenInternal = slpMimeBody.hasField("IPv4Internal-Addrs"); + bool listenExternal = slpMimeBody.hasField("IPv4External-Addrs"); + nonce_ = slpMimeBody.getValue("Nonce"); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "P2PApplication:gotSlpTransferResponse() - Storing contact nonce value " + << nonce_ << " to authenticate later."; +#endif + +#if P2PAPPLICATION_AVOID_DC_CLIENT + listening = false; // for debugging. +#endif + + + // If the contact is not listening, we can do the following things: + // - invite the contact to connect to connect to this host instead (not implemented yet, TODO) + // - send the data over the switchboard instead. (always works, but it's slow). + + // If the contact is listening, try to create a direct connection to the contact. + if( listening && (listenExternal || listenInternal) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Contact is listening, " + << "attempting to connect to the given IP-address."; +#endif + + // Get the IP addresses. + QStringList externalIpAddresses; + QStringList internalIpAddresses; + quint16 externalPort = 0; + quint16 internalPort = 0; + + if( listenInternal ) + { + internalIpAddresses = slpMimeBody.getValue("IPv4Internal-Addrs").split(" "); + internalPort = (quint16)slpMimeBody.getValue("IPv4Internal-Port").toUInt(); + } + + if( listenExternal ) + { + externalIpAddresses = slpMimeBody.getValue("IPv4External-Addrs").split(" "); + externalPort = (quint16)slpMimeBody.getValue("IPv4External-Port").toUInt(); + } + + // See if the clients are likely at the same lan. + bool sameLan = ( listenInternal && externalIpAddresses.contains( CurrentAccount::instance()->getExternalIp() ) ); + + // Avoid sending slotAllConnectionsFailed() if one connection attempt fails immediately. + applicationList_->setAddingConnections( true ); + + // Connect to the internal IP address + if( listenInternal ) + { + // Add connection attempt for each local IP address + for ( QStringList::Iterator it = internalIpAddresses.begin(); it != internalIpAddresses.end(); ++it ) + { + // Ignore when connection was made + if( applicationList_->hasDirectConnection() ) + { + break; + } + + // Show "connecting to " message when connecting + if( applicationList_->addConnection( *it, internalPort ) ) + { + showTransferMessage( i18n("Connecting to %1, port %2", *it, QString::number( internalPort ) ) ); + } + } + } + + // Connect to the external IP address + if( listenExternal ) + { + // Add connection attempt for each external IP address + for ( QStringList::Iterator it = externalIpAddresses.begin(); it != externalIpAddresses.end(); ++it ) + { + // Ignore when connection was made + if( applicationList_->hasDirectConnection() ) + { + break; + } + + // Show "connecting to " message message unless the hosts are _likely_ at the same lan. + // In that case, a previous "Connecting to ..." message should stay visible. + if( applicationList_->addConnection( *it, externalPort ) && ! sameLan ) + { + showTransferMessage( i18n("Connecting to %1, port %2", *it, QString::number( externalPort ) ) ); + } + } + } + + // Reset again. + applicationList_->setAddingConnections( false ); + } + + + // After passing the connections to addConnection() it's possible + // some slots are already fired and the connection was established. + if( applicationList_->hasDirectConnection() ) + { + return; + } + + + // See if there aren't connections established already. + if( applicationList_->hasPendingConnections() ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for connection attempt to succeed..."; +#endif + + // Wait for connection to establish + setWaitingState( P2P_WAIT_FOR_CONNECTION2, P2PAPPLICATION_TIMEOUT_DATA ); + } + else + { + // Nothing is pending, nothing is connected. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "No connection possible, " + << "informing ApplicationList."; +#endif + + // If no direct connection attempt will be made. + // Reset the pending invitation connection flag, ApplicationList sends the connectionFailed signal. + // This also signals other applications the connection attempt failed. + applicationList_->setPendingConnectionInvitation(false); + } +} + + + +/** + * @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. + * + * It either calls userStarted3_UserPrepares() or contactStarted4_ContactConfirmsPreparation(), + * depending who started the application. The timeout timer will also be stopped. + */ +void P2PApplication::initiateTransfer() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Signalling implementation class " + << "to start the file transfer."; +#endif + + // No longer waiting, we're sending. + if( isWaitingState( P2P_WAIT_FOR_CONNECTION ) + || isWaitingState( P2P_WAIT_FOR_CONNECTION2 ) ) + { + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + } + + // When we start sending information, it could take a while before + // the contact returns messages which disable the waiting timer. + // Avoid this by disabling it now, before we kill our own transfer. + if( stopWaitingTimer() ) + { + kWarning() << "timeout detection timer was still running, stopped " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue)."; + } + + + // Call the connect implementation based on who invoked this application. + // The implementations of these methods can call sendData(), and + // the actual transfer will be handled transparently here. + if( isUserStartedApp() ) + { + userStarted3_UserPrepares(); + } + else + { + contactStarted4_ContactConfirmsPreparation(); + } +} + + + +/** + * @brief Send a cancel message. + * + * The application will be terminated later, either directly or after the contact ACKed the error. + * + * The following cancelReason values are supported: + * - CANCEL_INVITATION + * The user declined the invitation. This sends an SLP 603 Decline message. + * + * - CANCEL_ABORT / CANCEL_FAILED + * The user aborted the session. + * If called from contactStarted1_ContactInvitesUser() with CANCEL_FAILED, + * this sends an SLP 500 Internal Error message. + * Otherwise it sends a SLP BYE or P2P error message. + * + * - CANCEL_NOT_INSTALLED + * The requested service/application is not installed. + * This sends an SLP 500 Internal Error message. + * + * - CANCEL_TIMEOUT + * There was a timeout waiting for the contact to accept or send certain P2P data. + * This sends an P2P message with the "waiting flag" set (type 4) and terminates the application direclty. + * This reason is used internally by certain timeout functions. + * + * - CANCEL_INVALID_SLP_CONTENT_TYPE + * Sends an "MSNSLP 500 Internal Error" message back, but with a null Content-Type value set. + * + * The error messages which send an SLP message can only be used from + * contactStarted1_ContactInvitesUser() and userStarted2_ContactAccepts(). + * Once the MSNSLP error message is sent, P2PApplication waits for the + * contact to ACK, and terminates the application afterwards. + * Hence, you don't have to call endApplication() at all. + * + * When an MSNSLP error is sent at a different moment, this will likely result in + * undefined responses from the other client (or the error message could be ignored). + * If KMess is compiled in debug mode, an assertion in sendSlpError() detects this. + * + * The CANCEL_ABORT reason is the only valid response to reject + * a data-preparation message in the userStarted3_UserPrepares() method. + * If KMess is compiled in debug mode, an assertion will be triggered otherwise. + * + * @param cancelReason The reason why the application is cancelled. + */ +void P2PApplication::sendCancelMessage(const ApplicationCancelReason cancelReason) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "request to abort " + << "(reason=" << cancelReason << ", state=" << (int) getWaitingState() << ")."; +#endif + + // I don't care what the reason is if you had + // to send the data-preparation ACK + if( userShouldAcknowledge_ ) + { +#ifdef KMESSTEST + KMESS_ASSERT( cancelReason == CANCEL_ABORT); +#endif + + // Cancelled the data preparation message + sendP2PAbort(); + userShouldAcknowledge_ = false; + + // TODO: send bye here to? wait for bye? just terminate? + kWarning() << "data-preparation stage failed " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplicationlater)."; + endApplicationLater(); + return; + } + + + switch(cancelReason) + { + // Declined the invitation + case CANCEL_INVITATION: +#ifdef KMESSTEST + KMESS_ASSERT( ! invitationContentType_.isEmpty() ); + KMESS_ASSERT( invitationSessionID_ != 0 ); +#endif + + // Use the cancel-reason to send the correct message: + sendSlpError("603 Decline", invitationSessionID_, invitationContentType_); + return; + + + // Timeout waiting for some P2P data + // ...or timeout waiting for contact to accept. + case CANCEL_TIMEOUT: + // Timeout handling occurs via slotCleanup(), not here. + kWarning() << "CANCEL_TIMEOUT is not supported here " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x04,endapplicationlater)"; + + // Send the low-level error message that the session is waiting for something! + sendP2PWaitingError(); + endApplicationLater(); + return; + + + // The application type is not installed + case CANCEL_NOT_INSTALLED: + if( gotSlpMessage_) + { + // Usually this particular error is invoked from Application::contactStarted1_ContactInvitesUser(). + sendSlpError("500 Internal Error", invitationSessionID_, "null"); + } + else + { + kWarning() << "CANCEL_NOT_INSTALLED is not supported here " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=return)"; + } + return; + + + // User or application wants to abort + case CANCEL_ABORT: + case CANCEL_FAILED: + // Make sure sending is aborted. + abortDataSending(); + + // Determine which error message to send back. + if( gotSlpMessage_ ) + { + // A: Special case for SLP messages. + if( isWaitingState( P2P_WAIT_USER_ACCEPT ) && cancelReason == CANCEL_ABORT ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Cancelling after receiving an SLP INVITE, " + << "sending BYE back."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( isUserStartedApp() ); +#endif + // Send bye early, contact should detect this. + sendSlpBye(); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Aborting after receiving an SLP message, " + << "sending 500 Internal Error back."; +#endif + // Cancelled while in SLP negotiate mode. + // Include the original content-type to tell the other + // client that part of the message was not in error. + sendSlpError("500 Internal Error", invitationSessionID_, invitationContentType_); + } + } + else if( isUserStartedApp() ) + { + // B: User started application +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "P2PApplication::sendCancelMessage() Cancelling an application " + << "we've started ourselves, sending BYE early."; +#endif + // Mark the logs if there is something weird going on. + // It's possible the contact doesn't receive the INVITE anymore + // while KMess can't detect yet it's closed. + // This happens sometimes when KMess sent a file before which was aborted by WLM. + if( hasUnAckedMessage( P2P_MSG_SESSION_INVITATION ) ) + { + kWarning() << "aborting while INVITE ack was not received " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue,sendslpbye)."; + } + + // Send bye early, contact should detect this. + sendSlpBye(); + } + else + { + // C: Contact started application +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "P2PApplication::sendCancelMessage() Cancelling an application " + << "started by the other contact, sending BYE early."; +#endif + // Send bye early, contact should detect this. + sendSlpBye(); + + // TODO: after the message is ACKed, the contact sends a 0x40 "I've sent the bye early" message. + // KMess does not do this here. + } + + return; + + + // Invalid content type received + case CANCEL_INVALID_SLP_CONTENT_TYPE: +#ifdef KMESSTEST + KMESS_ASSERT( gotSlpMessage_ ); +#endif + // Send an 500 error message without content-type set + sendSlpError("500 Internal Error"); + return; + + + // Last option, unknown cancel message + default: + kWarning() << "unknown cancelReason used " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x08)."; + + // Initiate primitive abort. + sendP2PAbort(); + } +} + + + +/** + * @brief Send the data preparation ACK. + * + * You need to call this method from userStarted3_UserPrepares() + * to accept the data-preparation message. + * + * This method will actually set a flag only, + * which is inspected by gotDataPreparation() when userStarted3_UserPrepares() returns. + */ +void P2PApplication::sendDataPreparationAck() +{ + if(userShouldAcknowledge_) + { + // This value is checked again after the + // userStarted3_UserPrepares() method returns. + userShouldAcknowledge_ = false; + } + else + { + kWarning() << "Call not expected here! " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue)"; + } +} + + + +/** + * @brief Send a SLP BYE message to close the session. + * + * This should only be called if we sent the SLP INVITE too, + * otherwise the contact should sent it. + * + * Once the BYE message is sent, it waits for the last ACK to arrive. + * The session is terminated afterwards. If the last ACK doesn't arrive + * before a timeout occurs, the application is terminated as well to avoid. + * + * See gotSlpBye() for an example of a SLP BYE message. + */ +void P2PApplication::sendSlpBye() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sending SLP BYE message."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( sessionID_ != 0 ); + KMESS_ASSERT( ! callID_.isEmpty() ); + KMESS_ASSERT( ! branch_.isEmpty() ); +#endif + + // Handle + 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" ); + uint contentLength = content.length(); + + // Create the message + QString slpMessage; + slpMessage = "BYE MSNMSGR:" + getContactHandle() + " MSNSLP/1.0\r\n" + "To: \r\n" + "From: \r\n" + "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" // from our INVITE + "CSeq: 0\r\n" + "Call-ID: " + callID_ + "\r\n" // from our INVITE + "Max-Forwards: 0\r\n" + "Content-Type: " + contentType + "\r\n" + "Content-Length: " + QString::number(contentLength) + "\r\n" + + (contentLength > 0 ? "\r\n" : "") + + content; + + // Send the message + sendSlpMessage(slpMessage, P2P_MSG_SESSION_BYE); + setClosing(true); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for BYE ACK..."; +#endif + + // Don't run endApplication() yet, there is one ACK we wait for... + setWaitingState( P2P_WAIT_FOR_SLP_BYE_ACK, P2PAPPLICATION_TIMEOUT_ACK ); +} + + + +/** + * @brief Send an SLP error response. + * + * This can be done to decline a file tranfer or tell the other client it sent bad SLP data. + * + * The session ID can be 0 to indicate there was an error in the Content-Type. Setting the + * session ID and Content-Type to the values used in the INVITE message indicates + * the invitation is cancelled. + * + * @param statusLine The status line, for example 200 OK, or 603 Decline. + * @param sessionID The identifier of the current session (can be zero). + * @param messageContentType Contact type of the message which is in error (can be empty) + * @param messageType The message type. This is used later when an ACK is received. + */ +void P2PApplication::sendSlpError( const QString &statusLine, + const ulong sessionID, const QString &messageContentType, P2PMessageType messageType ) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sending SLP error response: " << statusLine; +#endif + +#ifdef KMESSTEST + // Test, as other invocations likely result in undefined client behavour + KMESS_ASSERT( gotSlpMessage_ ); + 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() ); + + // Determine Content-Type and Content-Length fields + QString content; + QString contentType; + uint contentLength; + + if( callID_.isEmpty() || branch_.isEmpty() ) + { + kWarning() << "attempting to send SLP error back, " + "but Call-ID or Branch is unknown! " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=send0x08)"; + + sendP2PAbort(); + return; + } + + // It's safe now to send the normal ACK. + // Send it if this was not done by the caller yet. + // The if(..) is not needed but avoids a NOTICE in the debug log. + if( ! isP2PAckSent() ) + { + sendP2PAck(); + } + + if(sessionID == 0) + { + // Used to indicate a general error + content = QString::null; + contentType = "null"; + contentLength = 0; + } + else + { +#ifdef KMESSTEST + KMESS_ASSERT(messageContentType != 0 && ! messageContentType.isEmpty()); +#endif + // Used to indicate an error in the Invite, or decline a session + content = "SessionID: " + QString::number(sessionID) + "\r\n\r\n\0"; + contentLength = content.length(); + contentType = messageContentType; + + // TODO see when this should be application/x-msnmsgr-session-failure-respbody instead. + } + + // Create the message + QString slpMessage; + slpMessage = "MSNSLP/1.0 " + statusLine + "\r\n" + "To: \r\n" + "From: \r\n" + "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" // Indicates which INVITE was in error. + "CSeq: 0\r\n" + "Call-ID: " + callID_ + "\r\n" + "Max-Forwards: 0\r\n" + "Content-Type: " + contentType + "\r\n" + "Content-Length: " + QString::number(contentLength) + "\r\n" + + (contentLength > 0 ? "\r\n" : "") + + content; + + // Send the message + sendSlpMessage(slpMessage, messageType); + setClosing(true); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for SLP ACK..."; +#endif + + // Wait for the message to be ACK-ed. + setWaitingState( P2P_WAIT_FOR_SLP_ERR_ACK, P2PAPPLICATION_TIMEOUT_ACK ); +} + + + +/** + * @brief Utility function to send an SLP INVITE message. + * + * Derived classes use sendSlpSessionInvitation() and sendSlpTransferInvitation() instead. + * Both functions use this method internally to send the invitation. + * + * This method is constructs the SLP headers for the INVITE message, and sends it using sendSlpMessage(). + * The Branch-ID is generated by this method, and the Call-ID is generated with the first request. + * After sending the invitation, it's waiting for the contact to accept or decline the message. + * + * @param message The SLP body fields, typically 'SessionID', 'EUF-GUID', 'AppId', and 'Context'. + * @param contentType Content-Type of the message body. + * @param messageType The message type. This is used later when an ACK is received. + */ +void P2PApplication::sendSlpInvitation(const MimeMessage &message, const QString &contentType, P2PMessageType messageType) +{ +#ifdef KMESSTEST + KMESS_ASSERT(! contentType.isEmpty() ); + KMESS_ASSERT( isWaitingState( P2P_WAIT_DEFAULT ) ); +#endif + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sending INVITE message"; +#endif + + // Mime message conversion + QString mimeBody( message.getFields() ); + + // Content handles + QString myHandle( CurrentAccount::instance()->getHandle() ); + + // Generate identifiers + if( callID_.isNull() ) + { + // The callID remains the same between multiple invites + // It identifies the session. + callID_ = KMessShared::generateGUID(); + } + + // BranchID identifies this INVITE request + branch_ = KMessShared::generateGUID(); + + // Create the message (space after CSeq is added to emulate msn exactly) + QString slpMessage; + slpMessage = "INVITE MSNMSGR:" + getContactHandle() + " MSNSLP/1.0\r\n" + "To: \r\n" + "From: \r\n" + "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" + "CSeq: 0 \r\n" + "Call-ID: " + callID_ + "\r\n" + "Max-Forwards: 0\r\n" + "Content-Type: " + contentType + "\r\n" // Starts MSNSLP Session. + "Content-Length: " + QString::number(mimeBody.length() + 5) + "\r\n" + "\r\n" + + mimeBody + + "\r\n"; + + sendSlpMessage(slpMessage, messageType); + + // Keep the used content type in the state variables. + // For contact-started invitations, this is used to store their type. + // In this case, it can be used to store ours. + invitationContentType_ = contentType; + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to send INVITE ACK, and accept later..."; +#endif + + // Wait for the contact to accept + // MSN 6 had a timeout of 30 sec to accept, WLM seams to have no timeout. + setWaitingState( P2P_WAIT_FOR_INVITE_ACK, P2PAPPLICATION_TIMEOUT_ACCEPT ); +} + + + +/** + * @brief Send the 200 OK message to accept the invitation. + * + * The message should contain the 'SessionID' field. It's value can + * be retreived with getInvitationSessionID(). + * + * Once the confirmation message has been sent, this class will automatically + * use the correct Session ID for following messages (since it was already read from the SLP INVITE message). + * + * See gotSlpOk() for a message example. + * Note that the 'message' parameter only needs to supply the SLP body fields. + * The SLP header will be added by this method. + * + * @param message The SLP message body. + */ +void P2PApplication::sendSlpOkMessage(const MimeMessage &message) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sending MSNSLP/1.0 200 OK message."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT(! branch_.isEmpty() ); + KMESS_ASSERT(! invitationContentType_.isEmpty() ); + // Waiting state is P2P_WAIT_USER_ACCEPT if contactStarted2_.. is called directly from contactStarted1_.. + // TODO: handle WLM8 invitations sent before data preparation + // SLP_WAIT_FOR_PREPARE happens when a confirmation needs to be sent when the session is still in prepare state + KMESS_ASSERT( isWaitingState( P2P_WAIT_DEFAULT ) || isWaitingState( P2P_WAIT_USER_ACCEPT ) + || isWaitingState( P2P_WAIT_FOR_CONNECTION ) || isWaitingState( P2P_WAIT_FOR_PREPARE ) ); +#endif + + // 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 myHandle( CurrentAccount::instance()->getHandle() ); + + // Send the SLP OK message to tell the other client you'd like to start the transfer. + QString slpMessage; + slpMessage = "MSNSLP/1.0 200 OK\r\n" + "To: \r\n" + "From: \r\n" + "Via: MSNSLP/1.0/TLP ;branch=" + branch_ + "\r\n" + "CSeq: " + QString::number(invitationCSeq_ + 1) + "\r\n" + "Call-ID: " + callID_ + "\r\n" + "Max-Forwards: 0\r\n" + "Content-Type: " + contentType + "\r\n" + "Content-Length: " + QString::number(content.length() + 3) + "\r\n" + "\r\n" + + content + "\r\n"; + + sendSlpMessage(slpMessage, ( gotTransferInvitation ? P2P_MSG_TRANSFER_OK : P2P_MSG_SESSION_OK ) ); + + + // Initialize the session ID for the first OK message. + // Note this method can be called again later to handle the transfer OK message. + if( sessionID_ == 0 ) + { + // Now that we've confirmed the session, + // the sessionID will be used the next messages. + sessionID_ = invitationSessionID_; + } + + + + if(gotTransferInvitation) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to ACK the 200 transfer OK message..."; +#endif + + // Wait until our transfer OK message is ACK-ed + setWaitingState( P2P_WAIT_FOR_TRANSFER_ACK, P2PAPPLICATION_TIMEOUT_ACK ); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to ACK the 200 OK message..."; +#endif + + // Wait until our normal OK message is ACK-ed + setWaitingState( P2P_WAIT_FOR_SLP_OK_ACK, P2PAPPLICATION_TIMEOUT_ACK ); + } +} + + + +/** + * @brief Send the invitation for a normal session. + * + * It sends a normal application/x-msnmsgr-sessionreqbody message using sendSlpInvitation(). + * The session ID is stored to handle incoming messages. It can be requested with getSessionID(). + * + * Internally the remaining message fields are appended using: + * - sendSlpInvitation() + * - sendSlpMessage() + * - sendP2PMessage() + * + * See gotSlpSessionInvitation() for an example message. + * + * @param sessionID The generated session ID, can be generated with generateID(). + * @param eufGuid The EUF-GUID value identifying the application type, from getAppId(). + * @param appId The numeric app-Id value, which also identifies the application type. + * @param context The context field. + */ +void P2PApplication::sendSlpSessionInvitation( quint32 sessionID, const QString &eufGuid, const int appId, const QString &context ) +{ + // Create the message + MimeMessage invitation; + invitation.addField( "EUF-GUID", eufGuid ); + invitation.addField( "SessionID", QString::number(sessionID) ); + invitation.addField( "AppID", QString::number(appId) ); + invitation.addField( "Context", context ); + + // Send the invitation + sendSlpInvitation( invitation, "application/x-msnmsgr-sessionreqbody", P2P_MSG_SESSION_INVITATION); + + // If the client accepts our invitation, we + // use the session ID in the next ACK message. + sessionID_ = sessionID; + + setObjectName( QLatin1String( metaObject()->className() ) + + "[" + QString::number( sessionID_ ) + "/" + getContactHandle() + "]" ); +} + + + +/** + * @brief Send the invitation for a direct connection. + * + * This sends a application/x-msnmsgr-transreqbody message using sendSlpInvitation(). + * The contact responds with the ipaddresses/ports we can connect to. + * + * When the direct connection attempt completed, initiateTransfer() will be called. + * It's possible the direct connection attempt failed, the clients will + * exchange file data over the switchboard instead. + * + * See gotSlpTransferInvitation() for message examples. + */ +void P2PApplication::sendSlpTransferInvitation() +{ + // Check if there is already an connection + if( applicationList_->hasAuthorizedDirectConnection() ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Connection is already setup, " + << "re-using the current connection."; +#endif + initiateTransfer(); + return; + } + + // Prepare to transfer when a connection is made by this application, or another application. + connect( applicationList_, SIGNAL( connectionAuthorized() ), // when authorized, send data + this, SLOT ( slotConnectionAuthorized() )); + connect( applicationList_, SIGNAL( connectionFailed() ), // when failed, revert to switchboard + this, SLOT ( slotConnectionFailed() )); + + // Check if there are pending connections + if( applicationList_->hasPendingConnections() || applicationList_->hasPendingConnectionInvitation() ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Another application is already inviting " + << "for a direct connection, waiting for that attempt to succeed or fail..."; +#endif + + setWaitingState( P2P_WAIT_FOR_CONNECTION2, 0 ); + showTransferMessage( i18n("Waiting for connection") ); + return; + } + + // Only connect last slot if we're really going to make the connection ourselves. + connect( applicationList_, SIGNAL( connectionEstablished() ), // when connected, send nonce + this, SLOT ( slotConnectionEstablished() )); + + // Invite the contact to create a connection. + // This message tells the other client it can't connect to this end-host. + // Either the data needs to be sent over the switchboard, + // or the other client should initiate a direct connection server. + MimeMessage invitation; + invitation.addField("Bridges", "TCPv1"); + invitation.addField("NetID", QString::number( KMessShared::generateID() )); + invitation.addField("Conn-Type", "IP-Restrict-NAT"); + invitation.addField("UPnPNat", "false"); + invitation.addField("ICF", "false"); + + // Send the invitation + sendSlpInvitation( invitation, "application/x-msnmsgr-transreqbody", P2P_MSG_TRANSFER_INVITATION ); + + // Wait for the ack, the application list should + // timeout if the connections can't be made. + setWaitingState( P2P_WAIT_FOR_INVITE_TR_ACK, 0 ); + + // Mark invitation as pending. + // This will fire an event when it's manually reset to false. + applicationList_->setPendingConnectionInvitation( true ); + + + // When we include a Hashed-Nonce field, the contact also + // adds a Hashed-Nonce to it's 'transrespbody' response message. + // This may resemble http-digest authentication, but is still not researched. + + // Supported Conn-Type values: + // - Firewall + // - Direct-Connect (Same IP, same port) + // - Port-Restrict-NAT (Same IP, different port) + // - IP-Restrict-NAT (Different IP, same port) + // - Symmetric-NAT (Different IP, different port) + // - Unknown-Connect (Different IP, different port) + // The connection type can be discovered with STUN. + + // NetID is zero for Firewall/Direct-Connect, + // otherwise it's a random number. + + // Inform the user about the file transfer progress. + showTransferMessage( i18n("Negotiating options to connect") ); +} + + + +/** + * Assign a fixed session ID (used for p2p ink transfers) + */ +void P2PApplication::setDataCastSessionID( quint32 sessionID ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( sessionID_ == 0 ); + KMESS_ASSERT( sessionID < 600 ); + KMESS_ASSERT( getMode() == APP_MODE_DATACAST ); +#endif + + sessionID_ = sessionID; +} + + + +/** + * @brief Called when the direct connection is authorized by one of the P2P applications. + * + * This initiates the transfer by calling initiateTransfer(). + */ +void P2PApplication::slotConnectionAuthorized() +{ + // Avoid posibility that this method is invoked again if + // the direct connection is closed and re-connected later by another application. + disconnect( applicationList_, 0, this, SLOT(slotConnectionAuthorized())); + + // The user who sent the INVITE, but the other side asked us to be the server. + bool wasReverseInvite = ( isUserStartedApp() && applicationList_->getDirectConnection()->isServer() ); + + if( wasReverseInvite ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Direct connection authorized, " + "reverse invitation complete (state=" << (int) getWaitingState() << ")."; +#endif + + // Since we don't actively start reverse invitations, + // assume for now that the contact should send something again. + // TODO: when we send reverse invites too, we need to track who's turn it is. + if( ! isTransferActive() ) + { + // Waiting for prepare message +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to send some prepare message..."; +#endif + + setWaitingState( P2P_WAIT_FOR_PREPARE, P2PAPPLICATION_TIMEOUT_ACK ); + } + + // Do not call 'initiateTransfer()' here. For MsnObject transfers, + // this will fire userStarted3 to confirm the data preparation. + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Direct connection authorized, " + "starting transfer (state=" << (int) getWaitingState() << ")."; +#endif + + // Protect against situations which could break our internal state. + if( isTransferActive() ) + { + kWarning() << "Direct connection authorized, " + "but data transfer was already started before. Won't notify derived classes " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " reverse=" << wasReverseInvite << + " class=" << metaObject()->className() << + " action=return)."; + return; + } + + // No longer wait for packets, got connection, so go for it. + stopWaitingTimer(); + initiateTransfer(); + } +} + + + +/** + * @brief Called when the direct connection is established. + * + * This sends the direct connection handshake with sendDirectConnectionHandshake(), + * or waits for the contact to send one. + */ +void P2PApplication::slotConnectionEstablished() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Direct connection established."; +#endif + + // Disconnect irrelevant signals. + // Connection can still fail if the nonce is invalid. + disconnect( applicationList_, 0, this, SLOT( slotConnectionEstablished() )); + + // Send the handshake if this is a new connection + bool isClient = ( ! applicationList_->getDirectConnection()->isServer() ); + if( isClient ) + { +#ifdef KMESSTEST + KMESS_ASSERT( isWaitingState( P2P_WAIT_FOR_CONNECTION2 ) ); +#endif + + // Send the handshake + sendDirectConnectionHandshake( nonce_ ); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for direct connection handshake response..."; +#endif + + // Start the timeout timer again. + setWaitingState( P2P_WAIT_FOR_HANDSHAKE_OK, P2PAPPLICATION_TIMEOUT_ACK ); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to send connection handshake..."; +#endif + + // Wait for the handshake + setWaitingState( P2P_WAIT_FOR_HANDSHAKE, P2PAPPLICATION_TIMEOUT_ACK ); + } +} + + + +/** + * @brief Called when a direct connection could not be made. + * + * It initiates the transfer with initiateTransfer(). + */ +void P2PApplication::slotConnectionFailed() +{ + // Make this a warning, so users can figure out stuff when running kmess from the console. + kWarning() << "A direct connection could not be made, " + "switching file transfer to slow indirect transfer " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue)."; + +#ifdef KMESSTEST + KMESS_ASSERT( ! applicationList_->hasDirectConnection() ); + KMESS_ASSERT( ! applicationList_->hasPendingConnections() ); +#endif + + // Disconnect all signals as they are not relevant anymore + disconnect( applicationList_, 0, this, SLOT( slotConnectionAuthorized() )); + disconnect( applicationList_, 0, this, SLOT( slotConnectionEstablished() )); + disconnect( applicationList_, 0, this, SLOT( slotConnectionFailed() )); + + // Inform the user about the transfer progress + showTransferMessage( i18n("Reverting to indirect file transfer (this could be slow).") ); + + // start the transfer over the switchboard + stopWaitingTimer(); + initiateTransfer(); +} + + + +/** + * @brief Show a timeout message because an expected message was not received. + * + * The contact is already notified at this point about this problem. + * All this method needs to do, is displaying a reasonable message at the console or user interface. + */ +void P2PApplication::showTimeoutMessage( P2PWaitingState waitingState ) +{ + // Important note: + // 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 ) + { + case P2P_WAIT_FOR_INVITE_ACK: + { + kWarning() << "Timeout waiting SLP INVITE ack message " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_CONTACT_ACCEPT: + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Contact didn't accept the invitation, terminating manually."; +#endif + + // NOTE: WLM8 has no timeout abort P2P (file transfer) invitations. + // It keeps the invitation open even if the switchboard closes. + showEventMessage( i18n("The invitation was cancelled. A timeout occurred waiting for the contact to accept."), ChatMessage::CONTENT_APP_CANCELED, false ); + sendCancelMessage( CANCEL_ABORT ); // Should call sendSlpBye(). + // Can't send 0x04 timeout message because there is no session yet, and previous message is already ACKed. + // NOTE: it seams Windows Live Messenger 8.0 doesn't send a BYE ACK for this message. + return; + } + + case P2P_WAIT_FOR_CONNECTION: + { + showEventMessage( i18n("The invitation was cancelled. A timeout occurred waiting for a connection to succeed or fail."), ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); + endApplication(); + break; + } + + case P2P_WAIT_FOR_CONNECTION2: + { + // Still keep waiting, DirectConnectionBase should trigger a timeout. + kWarning() << "Time-out waiting to connect to the remote system " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=return)."; + return; + } + + case P2P_WAIT_FOR_SLP_OK_ACK: + { + kWarning() << "Timeout waiting for SLP OK ACK " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_FOR_PREPARE: + { + kWarning() << "Timeout waiting for data-preparation message " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_FOR_PREPARE_ACK: + { + kWarning() << "Timeout waiting for data-preparation ACK " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_FOR_TRANSFER_ACK: + { + kWarning() << "Timeout waiting for SLP transfer OK ACK " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_FOR_FILE_DATA: + { + kWarning() << "Timeout waiting for file data " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + + // The 0x80 mesage should be sent now. + + // Set "incoming" parameter to display messages like "the file you're sending.." in the future. + showEventMessage( i18n("The invitation was cancelled. A timeout occurred waiting for data."), ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); + sendCancelMessage( CANCEL_FAILED ); // Should call sendSlpBye(). + return; + } + + case P2P_WAIT_FOR_DATA_ACK: + { + kWarning() << "Timeout waiting for file data received ack " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_FOR_HANDSHAKE: + { + // NOTE: we could start an initiateTransfer() here, but this is clearly a client bug. + kWarning() << "Timeout waiting for DC handshake " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_FOR_HANDSHAKE_OK: + { + // NOTE: we could start an initiateTransfer() here, but this is clearly a client bug. + kWarning() << "Timeout waiting for DC handshake response " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + break; + } + + case P2P_WAIT_FOR_SLP_BYE: + { + kWarning() << "Timeout waiting for BYE message " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + // No message required, already got what we wanted + endApplication(); + return; + } + + case P2P_WAIT_FOR_SLP_BYE_ACK: + { + kWarning() << "Timeout waiting for BYE-ACK " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + // No message required, already got what we wanted + endApplication(); + return; + } + + case P2P_WAIT_FOR_SLP_ERR_ACK: + { + kWarning() << "Timeout waiting for SLP Error-ACK " + "(contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplication)."; + // No message required, already got what we wanted + endApplication(); + return; + } + + default: + { + kWarning() << "Timeout waiting " + "(state=" << (int) getWaitingState() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " contact=" << getContactHandle() << ")"; + } + } + + // Default implementation quits + showEventMessage( i18n("The invitation was cancelled. A timeout occurred waiting for data."), ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); + endApplication(); +} + + +/** + * @brief Called when the user aborted the application. + * + * Displays a message using getUserAbortMessage() and notifies the contact. + * Unlike the base class, it won't terminate the application since the contact should return an ACK message first. + * + * This method may be overwritten to add additional event handling. + */ +void P2PApplication::userAborted() +{ +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "user requests to abort the session. state=" << (int) getWaitingState(); +#endif + + // Make sure a second message is not displayed here. + if( isClosing() ) + { + kWarning() << "Attempted to close application twice " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplicationlater)"; + + // Make sure the timer is started again. + endApplicationLater(); + return; + } + else if( isWaitingState( P2P_WAIT_FOR_SLP_BYE ) ) + { + // This is a problem when a client does not send a SLP BYE (as seen with amsn 0.97). +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "Ignoring request while waiting for SLP BYE."; +#endif + + return; + } + + if( isTransferComplete() ) + { + // Make sure the user won't get a "transfer complete" message + // followed by a "contact aborted" message. + // + // Currently happens when a contact restarts a switchboard (aMsn 0.97 does). + // The old switchboard is removed, and all applications abort. + // TODO: The switchboard closeConnection() call assumes it's always user initiated. + + kWarning() << "not displaying message because data transfer is complete. " + "The switchboard was likely closed after receiving all data. " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=continue)"; + } + else + { + // 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. + setUserAborted( true ); + setClosing( true ); + + // Don't end the application, instead wait for contact's client to respond too +} + + + +/** + * @brief Called when the user rejected (declined) the application. + * + * Displays a message using getUserRejectMessage() and notifies the contact. + * Unlike the base class, it won't terminate the application since the contact should return an ACK message first. + */ +void P2PApplication::userRejected() +{ + if( isClosing() ) + { +#ifdef KMESSDEBUG_APPLICATION + kWarning() << "Attempted to close application twice " + "(state=" << (int) getWaitingState() << + " contact=" << getContactHandle() << + " session=" << sessionID_ << + " class=" << metaObject()->className() << + " action=endapplicationlater)"; +#endif + + // Make sure the timer is started again. + endApplicationLater(); + return; + } + else + { +#ifdef KMESSDEBUG_APPLICATION + 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. + setUserAborted( true ); + setClosing( true ); + + // Don't end the application, instead wait for contact's client to respond too + } +} + + + +#include "p2papplication.moc" diff --git a/src/network/applications/p2papplication.h b/src/network/applications/p2papplication.h new file mode 100644 index 0000000..61d156c --- /dev/null +++ b/src/network/applications/p2papplication.h @@ -0,0 +1,257 @@ +/*************************************************************************** + p2papplication.h - description + ------------------- + begin : Mon Nov 22 2004 + copyright : (C) 2004 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 P2PAPPLICATION_H +#define P2PAPPLICATION_H + +#include "p2papplicationbase.h" + +#include "../extra/p2pfragmenttracker.h" +#include "../p2pmessage.h" + +class MimeMessage; + + + +/** + * @brief An Application subclass implementing MSNSLP on top of MSN6 P2P-style conversations. + * + * This base class aims to hide all complex details of the P2P and MSNSLP communication. + * To implement a P2P service, create a derived class which + * implements the userStarted*, contactStarted* and getAppId() methods. + * + * User-started invitations are handled this way: + * + * - The start() method is called externally to start the application. + * This method calls initializes the application and calls + * userStarted1_UserInvitesContact() + * + * - The userStarted1_UserInvitesContact() allows you to create the + * invitation message and use sendSlpInvitation() to send it. + * + * - The userStarted2_ContactAccepts() method is called when the + * contact accepts the invitation (sending a 200/OK message). + * It's possible to call sendSlpTransferInvitation() here. + * + * - The userStarted3_UserPrepares() method is called when the session is ready to transfer data. + * The data-preparation message was received, a direct connection is ready, + * or data can be sent over the switchboard. + * From this method you can call start an external application, + * call sendDataPreparationAck() or sendData(). + * + * - The gotData() method is called for every received data packet (e.g. file or picture data). + * You can store the data in a file, buffer it, etc.. + * The session will terminate automatically when all data is received. + * + * + * Contacted-started invitations are handled this way: + * + * - The gotMessage() method of the base class is called externally + * (by the ApplicationList of a Contact) to handle an incoming P2P message. + * The base class will relay this message to gotNegotiationMessage(). + * + * - The contactStarted1_ContactInvitesUser() method is called when the invitation message is fully received. + * This allows you to extract the details from the invitation message. + * When needed, call offerAcceptOrReject() to show an accept/cancel link in the chat window. + * Otherwise, call contactStarted2_UserAccepts() directly to "automatically accept" the invitation. + * + * - The contactStarted2_UserAccepts() method is called when the user hits the 'accept' link + * in the chat window. The accept message should be prepared and sent with sendSlpOkMessage(). + * + * - The contactStarted3_ContactConfirmsAccept() method is called when the contact ACKs the "SLP OK" message. + * From here, you can call sendDataPreparation() to send the data preparation message, + * or simply wait for the data transfer to start (contactStarted4_..). + * + * - The contactStarted4_ContactConfirmsPreparation() is called called when the session is ready to tranfer data. + * Either the data-preparation message was ACKed, or the direct connection is available. + * You can call sendData() from here to start the data transfer. + * The session will terminate automatically if all data has been sent. + * + * To cancel a running session, call userAborted() or use sendCancelMessage(). + * In most cases the application will terminate automatically after the contact ACK-ed the cancel message. + * Otherwise, endApplication() needs to be called manually. + * + * When a data transfer is active, the methods showTransferMessage(), showTransferProgress(), showTransferComplete() + * are called to inform the derived class of the status. It can update the GUI from these methods. + * + * + * --- internals ---- + * + * This class extends the P2PApplicationBase class, to implement the MSNSLP communication. + * This is a session protocol which is transferred over the P2P payloads. + * New messages are delivered by the base class though the gotNegotiationMessage() method. + * + * The exact contents of the P2P message is described in the P2PApplicationBase API documentation. + * This class calls typically calls the sendSlpMessage() and the other send..() methods + * to dispatch the messages. + * + * Some third party clients (including KMess 1.4.x) seam to send incorrect message fields. + * This class is able to handle those not-entirely valid messages as well. + * The situations where this happens are marked as "HACK" in the code. + * + * @author Diederik van der Boor + * @ingroup Applications + */ +class P2PApplication : public P2PApplicationBase +{ + Q_OBJECT + + public: // public methods + + // The constructor + P2PApplication(ApplicationList *applicationList); + + // The destructor + virtual ~P2PApplication(); + + // The contact cancelled the session + virtual void contactAborted(const QString &message = QString::null); + // Returns the branch. + QString getBranch() const; + // Returns the call ID (identifies the invitation). + QString getCallID() const; + // Returns the nonce that's being expected. + const QString & getNonce() const; + // Returns the session ID. + quint32 getSessionID() const; + // The user cancelled the session + virtual void userAborted(); + + + protected: // protected mehods + + // Step one of a contact-started chat: the contact invites the user + virtual void contactStarted1_ContactInvitesUser(const MimeMessage& message); + // Step four of a contact-started chat: the contact confirms the data-preparation message. + virtual void contactStarted4_ContactConfirmsPreparation(); + // Return the content type read from the invitation message + const QString& getInvitationContentType() const; + // Return the session id read from the invitation message + 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( 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( quint32 sessionID ); + // The user rejected the invitation + virtual void userRejected(); + + + private: // private methods + + // Parse a ACK messsage (in certain situations we need to active some methods) + void gotAck(const P2PMessage &message, const P2PMessageType messageType); + // Called when the ACK for the data preparation was received. + void gotAck_dataPreparation(); + // Called when the ACK for the sent file data was received. + void gotAck_dataReceived(); + // Called when the ACK for the SLP BYE message was received. + void gotAck_slpBye(); + // Called when the ACK for a SLP Error was received. + void gotAck_slpError(); + // Called when the ACK for the first SLP INVITE message was received. + void gotAck_slpSessionInvitation(); + // Called when the ACK of the SLP OK message was received. + void gotAck_slpSessionOk(); + // Called when the ACK for the SLP transfer decline message was received. + void gotAck_slpTransferDecline(); + // Called when the ACK for the SLP transfer INVITE message was received. + void gotAck_slpTransferInvitation(); + // Called when the ACK for the SLP transfer OK mesages was received. + void gotAck_slpTransferOk(); + // Called when the data preparation message is received + void gotDataPreparation(const P2PMessage &message); + // Got an direct connection handshake. + void gotDirectConnectionHandshake(const P2PMessage &message); + // Got a message with SessionID 0 + void gotNegotiationMessage(const MimeMessage &slpMessage, const QString &preamble); + // Got an MSNSLP ACK message + void gotSlpAck(const MimeMessage &slpMessage); + // Got an MSNSLP BYE message + void gotSlpBye(const MimeMessage &slpMessage); + // Got an MSNSLP INVITE message + void gotSlpInvite(const MimeMessage &slpMessage); + // Got an MSNSLP 200 OK header + void gotSlpOk(const MimeMessage &slpMessage); + // Got an MSNSLP session invitation + void gotSlpSessionInvitation(const MimeMessage &slpMimeBody); + // Got an MSNSLP status header + void gotSlpStatus(const MimeMessage &slpMessage, const QString &preamble); + // Got an MSNSLP transfer invitation + void gotSlpTransferInvitation(const MimeMessage &slpMimeBody); + // Got an MSNSLP transfer invitation response + void gotSlpTransferResponse(const MimeMessage &slpMimeBody, bool secondInvite = false); + // Signal the derived class it can initiate the file transfer + void initiateTransfer(); + // Send an SLP BYE message to close the session + void sendSlpBye(); + // Send an SLP invitation message + void sendSlpInvitation(const MimeMessage &message, const QString &contentType, P2PMessageType messageType); + // Send an SLP error message (to decline an invitation for example) + void sendSlpError( const QString &statusLine, const ulong sessionID = 0, + const QString &messageContentType = 0, + P2PMessageType messageType = P2P_MSG_SLP_ERROR ); + // Show a timeout message because an expected message was not received. + void showTimeoutMessage( P2PWaitingState waitingState ); + + + private slots: + // The direct connection is authorized. + void slotConnectionAuthorized(); + // The direct connection is established. + void slotConnectionEstablished(); + // The direct connection could not be made. + void slotConnectionFailed(); + + + private: // private fields + // The application list, parent of all application objects. + ApplicationList *applicationList_; + // Branch ID, identifies the INVITE-message + QString branch_; + // Call ID, identifies the session at MSNSLP level. + QString callID_; + // True if we got an SLP message (requires a different error handling) + bool gotSlpMessage_; + // Content type from the invitation message + QString invitationContentType_; + // CSeq field from the invitation message + int invitationCSeq_; + // SessionID field from the invitaiton message + quint32 invitationSessionID_; + // The nonce for direct connections + QString nonce_; + // Session ID, identifies the session at MSNP2P level. + quint32 sessionID_; + // True if the user needs to acknowledge the data preparation message. (doesn't send an ACK automatically) + bool userShouldAcknowledge_; +}; + +#endif diff --git a/src/network/applications/p2papplicationbase.cpp b/src/network/applications/p2papplicationbase.cpp new file mode 100644 index 0000000..48208cc --- /dev/null +++ b/src/network/applications/p2papplicationbase.cpp @@ -0,0 +1,2426 @@ +/*************************************************************************** + p2papplicationbase.cpp - description + ------------------- + begin : Mon Nov 22 2004 + copyright : (C) 2004 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 "p2papplication.h" + +#include "../../kmessdebug.h" +#include "../../currentaccount.h" +#include "../../contact/msnobject.h" +#include "../../utils/kmessshared.h" +#include "../extra/msndirectconnection.h" +#include "../mimemessage.h" +#include "../p2pmessage.h" +#include "applicationlist.h" + +#include +#include +#include +#include + +#include + + +#ifdef KMESSDEBUG_P2PAPPLICATION +#define KMESSDEBUG_P2PAPPLICATION_GENERAL +#endif + +// Settings for debugging. +#define P2PAPPLICATION_AVOID_DC_CLIENT 0 +#define P2PAPPLICATION_AVOID_DC_SERVER 0 + +// Timeout settings, to prevent stale instances. +// Measured an ACK response time of 90 seconds once for an overloaded machine (Pentium 2 running Skype + WLM). +#define P2PAPPLICATION_TIMEOUT_ACCEPT 120000 +#define P2PAPPLICATION_TIMEOUT_ACK 120000 +#define P2PAPPLICATION_TIMEOUT_DATA 120000 +#define P2PAPPLICATION_TIMEOUT_MOREDATA 120000 +#define P2PAPPLICATION_TIMEOUT_SLP 120000 // 120 seconds +#define P2PAPPLICATION_TIMEOUT_DESTROY 10000 // 10 seconds + + + +/** + * @brief Constructor, initializes the P2PApplicationBase instance fields. + * + * The ApplicationList object contains the direct connection, which is shared between all P2P applications of one same contact. + * This object is also used to deliver messages back to the contact. + * + * @param applicationList The application list object for the contact + */ +P2PApplicationBase::P2PApplicationBase(ApplicationList *applicationList) +: Application( applicationList->getContactHandle() ), + applicationList_(applicationList), + buffer_(0), + dataSource_(0), + dataType_(P2P_TYPE_NEGOTIATION), + fragmentMessageID_(0), + fragmentOffset_(0), + fragmentTotalSize_(0), + nextMessageID_(0), + shouldSendAck_(false), + userAborted_(false), + waitingState_(P2P_WAIT_DEFAULT) +{ + // For debugging + setObjectName( QLatin1String( metaObject()->className() ) + "[0/" + getContactHandle() + "]" ); + + // Reset other internal fields + lastIncomingMessage_.dataSize = 0; + lastIncomingMessage_.messageID = 0; + lastIncomingMessage_.messageType = P2P_MSG_UNKNOWN; + lastIncomingMessage_.sentTime = 0; + lastIncomingMessage_.sessionID = 0; + lastIncomingMessage_.totalSize = 0; + lastIncomingMessage_.ackSessionID = 0; + lastIncomingMessage_.footerCode = 0; + + // Initiaize the timer + waitingTimer_ = new QTimer(this); + waitingTimer_->setSingleShot( true ); + connect( waitingTimer_, SIGNAL(timeout()), this, SLOT(slotCleanup()) ); + + // Crash prevention. + connect( applicationList_, SIGNAL(destroyed()), this, SLOT(slotApplicationListDeleted()) ); +} + + + +/** + * @brief Class destructor. + * + * Cleans up buffers and timers. + */ +P2PApplicationBase::~P2PApplicationBase() +{ +#ifdef KMESSDEBUG_APPLICATION + // Can't include getSessionID() here, is virtual method of destructed derived class. + kDebug() << " closing=" << isClosing() << + " timer=" << waitingTimer_->isActive() << + " state=" << waitingState_ << + " unackedCount=" << outgoingMessages_.count() << "."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( outgoingMessages_.isEmpty() ); +#endif + + // Stop the timer + waitingTimer_->stop(); + applicationList_ = 0; + dataSource_ = 0; + + // Delete pointers + qDeleteAll( outgoingMessages_ ); + delete waitingTimer_; + delete buffer_; +} + + + +/** + * @brief Make sure no more data will be sent. + * + * Note this method does nothing special, + * except for closing down the data source. + * Typically you want to call a high-level method + * instead which calls this method internally. + */ +void P2PApplicationBase::abortDataSending() +{ + // Abort sending. + if( dataSource_ != 0 ) + { +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "application was still sending data, resetting."; +#endif + + dataSource_ = 0; + dataType_ = P2P_TYPE_NEGOTIATION; + applicationList_->unregisterDataSendingApplication( this ); + } +} + + + +/** + * @brief Scheduelle termination, but wait for last incoming packets + */ +void P2PApplicationBase::endApplicationLater() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "setting timeout to destroy object, allow contact to send a final message."; +#endif + + // If a transfer was active, make sure it ends. + abortDataSending(); + + if( waitingState_ != P2P_WAIT_END_APPLICATION ) + { + // Test if there are still unacked messages (make sure it's only tested once). + // This is done explicitly before the data transfer ends. + testUnAckedMessages( false ); + } + + // Set timeout to destroy + setWaitingState( P2P_WAIT_END_APPLICATION, P2PAPPLICATION_TIMEOUT_DESTROY ); + + // Set flag to avoid second attempts. + setClosing( true ); +} + + + +/** + * @brief Return the message ID used in the previous message from the contact. + * + * This value is used to match fragmented messages. + * It's the second field of the binary P2P header. + * + * @return The message ID field used in the binary P2P header. + */ +unsigned long P2PApplicationBase::getLastContactMessageID() const +{ + return lastIncomingMessage_.messageID; +} + + + +/** + * @brief Returns the nonce that's being expected. + * + * This value is used to authenticate the direct connection. + * + * @return The Nonce value; a randonly generated GUID. + */ +const QString & P2PApplication::getNonce() const +{ + return nonce_; +} + + + +/** + * @brief Return the number of transferred bytes. + */ +unsigned long P2PApplicationBase::getTransferredBytes() const +{ + return dataType_ != P2P_TYPE_NEGOTIATION + ? fragmentOffset_ // outgoing + : fragmentTracker_.getTransferredBytes(); // incoming +} + + + +/** + * @brief Find the unacked message which corresponds with the received P2P ACK message. + * + * This method compares the binary P2P fields to find the original message which was sent. + * The returned 'messageType' field is used later in gotAck() to handle ACKs for some specific messages. + * + * @param ackMessage The ACK message to test for. + * @return The meta information about the original message ACKed by the contact. + */ +P2PApplicationBase::UnAckedMessage * P2PApplicationBase::getUnAckedMessage(const P2PMessage &ackMessage) const +{ +#ifdef KMESSTEST + KMESS_ASSERT( ackMessage.getFlags() != 0 && ackMessage.getDataSize() == 0 ); +#endif + + unsigned long ackSessionID = ackMessage.getAckSessionID(); // ackSid + unsigned long ackUniqueID = ackMessage.getAckUniqueID(); // ackUid + unsigned long ackFlag = ackMessage.getFlags(); + + foreach( UnAckedMessage *unAcked, outgoingMessages_ ) + { + // This works for normal ACKs (0x02) to P2P messages. + // Ack message | original message + // ----------------------------------------- + // ackSid = messageID + // ackUid = ackSid + // ackSize = size + if( ackUniqueID == unAcked->ackSessionID ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "message is matched, option 1: " + "ackUniqueID = original uniqueID " << ackUniqueID << "."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( ackFlag == P2PMessage::MSN_FLAG_ACK ); +#endif + // Found it, save reference + return unAcked; + } + + + // This works for control messages (like 0x08): + // uniqueID is reffers to uniqueID of original message. + // Ack message | original message + // ----------------------------------------- + // total = total + // ackSid = ackSid + // ackUid = 0 + // ackSize = 0 + if( ackSessionID == unAcked->ackSessionID && ackUniqueID == 0 ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "message is matched, option 2: " + "ackSessionID = original uniqueID " << ackSessionID << "."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( ackFlag == P2PMessage::MSN_FLAG_ERROR ); +#endif + // Found it, save reference + return unAcked; + } + + // Also attempt to match on the messageID alone if: + // - 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: + // Ack message | original message + // ----------------------------------------- + // ackSid = messageID + // ackUid = 0 + // ackSize = bytepos + // + // This happens with 0x80 messages: + // Ack message | original message + // ----------------------------------------- + // ackSid = messageID + // ackUid = new + // ackSize = size + if( ackSessionID == unAcked->messageID + && ( ackFlag == P2PMessage::MSN_FLAG_ABORTED_RECEIVING || ackUniqueID == 0 ) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "message is matched, option 3: " + "ackMessageID = original messageID " << ackSessionID << "."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( ackFlag == P2PMessage::MSN_FLAG_ABORTED_RECEIVING + || ackFlag == P2PMessage::MSN_FLAG_NEGATIVE_ACK ); +#endif + + // Found it, save reference + return unAcked; + } + } + + return 0; +} + + + +/** + * @brief Find the unacked message which corresponds with given message type. + * + * @param messageType The P2P message type. + * @return The message unacked message details. + */ +P2PApplicationBase::UnAckedMessage * P2PApplicationBase::getUnAckedMessage(const P2PMessageType messageType) const +{ + foreach( UnAckedMessage *unAcked, outgoingMessages_ ) + { + if( unAcked->messageType == messageType ) + { + return unAcked; + } + } + + return 0; +} + + + +/** + * @brief Return the current waiting state. + * + * This function is intended to be used for debugging. + * Use isWaitingState() to test for the current state. + * + * @return The current waiting state + */ +P2PApplicationBase::P2PWaitingState P2PApplicationBase::getWaitingState() const +{ + return waitingState_; +} + + + +/** + * @brief Called internally when data is received, this eventually calls gotData() + * + * It validates the current state, calls showTransferProgress() and gotData(). + * After receiving the last message, it calls showTransferComplete() and sends the SLP BYE message if needed. + * + * @param message The received data message. + */ +void P2PApplicationBase::gotDataFragment(const P2PMessage &message) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Received file data, calling gotData()."; +#endif +#ifdef KMESSDEBUG + KMESS_ASSERT( waitingState_ == P2P_WAIT_FOR_FILE_DATA ); +#endif + + unsigned long dataOffset = message.getDataOffset(); + + // See if the class is trying to abort. + // Avoid bothering the derived class with these issues. + if( waitingState_ == P2P_WAIT_FOR_SLP_BYE_ACK ) + { + kWarning() << "Still receiving data while BYE is sent " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send0x08)."; + sendP2PAbort(); + return; + } + else if( waitingState_ == P2P_WAIT_FOR_SLP_BYE ) + { + // This actually happened when there were some delayed packets in the buffer with WLM. + // When switching bridges (SB/DC) it actually cannot guarantee the messages will be sent in order. + // This is visible at slow computers. + kWarning() << "Still receiving data while last fragment was received " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send0x08)."; + sendP2PAbort(); + return; + } + else if( waitingState_ == P2P_WAIT_END_APPLICATION ) + { + // This happend when the data preparation was rejected, + // and the contact kept sending data. + kWarning() << "Still receiving data while the application wants to close " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send0x08)."; + sendP2PAbort(); + return; + } + + + // See if data is already sent before establishing a connection. + // Happens with WLM, likely at slow computers. + if( dataOffset == 0 && ! applicationList_->hasDirectConnection() + && ( applicationList_->hasPendingConnections() || applicationList_->hasPendingConnectionInvitation() ) ) + { + kWarning() << "Contact is already sending data " + "while attempting to establish a direct connection " + "(state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=continue)."; + } + + + // Initialize at the first message + if( dataOffset == 0 ) + { + fragmentTracker_.initialize( message.getMessageID(), message.getTotalSize() ); + } + else + { + // Check if the new data fragment belongs to the current one. + if( ! fragmentTracker_.isInitialized( message.getMessageID() ) ) + { + // Send negative ack message, like WLM does (0x01) + // TODO: provide last failed position, allow contact to resume + kWarning() << "Received unexpected offset for message " + "(offset=" << dataOffset << + " messageID=" << message.getMessageID() << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send0x01)."; + sendP2PAckImpl( P2PMessage::MSN_FLAG_NEGATIVE_ACK ); + sendCancelMessage( CANCEL_FAILED ); // sends slp bye + return; + } + } + + + // Update the tracker + fragmentTracker_.registerFragment( message.getDataOffset(), message.getDataSize() ); + + // Dispatch the message to the derived class + showTransferProgress( fragmentTracker_.getTransferredBytes() ); + gotData(message); + + + // See if the transfer should be complete now. + if( ! fragmentTracker_.isComplete() ) + { + // Wait for more data to arrive. + waitingTimer_->start( P2PAPPLICATION_TIMEOUT_MOREDATA ); + + if( message.isLastFragment() ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got the last fragment, " + "but some messages are not received yet."; + kDebug() << "Current message is " << fragmentTracker_.getDebugMap(); +#endif + shouldSendAck_ = false; // could be true if received out of order. + } + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got the last fragment. Sending ack, calling gotDataComplete() and showTransferComplete()."; +#endif + + // After all data is received, ACK it and send the BYE + // TODO: if the messages were received out of order, should we ACK the final message instead? + 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 ) + { +#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; + } + + // 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. + } +} + + + +/** + * @brief Called when a P2P message was received with the error-flag set. + * + * This method aborts the application by calling contactAborted(). + * + * @param message The received error message. + */ +void P2PApplicationBase::gotErrorAck(const P2PMessage &message) +{ +#ifdef KMESSTEST + KMESS_ASSERT( message.getDataSize() == 0 ); + + if( message.isNegativeAck() ) + { + KMESS_ASSERT( message.getTotalSize() == 0 ); + } + else if( message.isError() ) + { + KMESS_ASSERT( message.getTotalSize() != 0 ); + } + + KMESS_ASSERT( message.getAckSessionID() != 0 ); + KMESS_ASSERT( message.getAckUniqueID() == 0 ); + KMESS_ASSERT( message.getAckDataSize() == 0 ); +#endif + + // When the contact aborted, it could send some 0x08 messages back for the + // next fragments which were already sent (e.g. already in the DC at that time). + // Ignore these error messages. + if( isClosing() ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an P2P error-response while closing " + "(flag=0x" << QString::number( message.getFlags(), 16 ) << + ", ignoring message)."; +#endif + + // Make sure the timer resumes. + endApplicationLater(); + return; + } + + if( message.isNegativeAck() ) + { + // Received when the transfer failed, e.g. write errors at the direct connection. + kWarning() << "Got an unexpected P2P error-response " + "(flag=nak" << + " byte=" << message.getDataSize() << + " state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=continue)."; + + // TODO: resume transfer at the indicated byte position. + abortDataSending(); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for contact to send a BYE message."; +#endif + + // Wait for BYE at the moment. + setWaitingState( P2P_WAIT_FOR_SLP_BYE, P2PAPPLICATION_TIMEOUT_SLP ); + } + else + { + // Error in our headers? + kWarning() << "Got an unexpected P2P error-response " + "(flag=0x" << QString::number( message.getFlags(), 16 ) << + " state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=contactaborted)."; + + + if( dataType_ == P2P_TYPE_NEGOTIATION && ! P2P_WAIT_FOR_DATA_ACK ) + { + // We likely made an error in the invitation/bye reponse + contactAborted( i18n("The contact rejected the invitation. An internal error occured.") ); + } + else + { + // TODO: make this error custom. + // We were sending or receiving a file/picture + // Can also happen if the contact can't handle our data for a different reason. + contactAborted( i18n("The transfer failed.") ); + } + } +} + + + +/** + * @brief Main entry function for incoming incoming messages. + * + * This method receives the incoming P2P messages, analyses it's + * flags and delivers it to various handling methods: + * - ACK messages are delivered to gotAck(), gotDirectConnectionHandshake(), gotErrorAck() or gotTimeoutAck(). + * - SLP negotiation messages are delivered to gotNegotiationFragment(). + * - P2P data preparation messages are delivered to gotDataPreparation(). + * - P2P data messages are delivered to gotDataFragment(). + * + * Other P2P messages are rejected with an error message. + * + * @param p2pMessage A reference to a P2PMessage object. + */ +void P2PApplicationBase::gotMessage(const P2PMessage &p2pMessage) +{ + // Reset session variables. + waitingTimer_->stop(); // stop timer + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + if( getMode() == APP_MODE_DATACAST ) + { + // Special case, abuse of P2P system + kDebug() << "P2P message from " << getContactHandle() << " is handled by a datacast session."; + } + else if( nextMessageID_ == 0 ) + { + // No messages sent, new application + kDebug() << "P2P message from " << getContactHandle() << " is handled by a newly created session."; + } + else + { + // s/found/received/ since ApplicationList::gotMessage() finds it, but this makes it easier to filter the logs. + kDebug() << "New P2P message from " << getContactHandle() << " is handled by session " << getSessionID() << "."; + } +#endif + + // Cancel termination if a new message is received + // while the application was already scheduelled to be closed. + // Ignore typical messages which are sent while a transfer is aborting. + if( waitingState_ == P2P_WAIT_END_APPLICATION + && ! p2pMessage.isError() + && ! p2pMessage.isAbortedReceivingAck() + && ! p2pMessage.isAbortedSendingAck() ) + { + kWarning() << "received another message while awaiting termination " + "(flags=0x" << QString::number( p2pMessage.getFlags(), 16 ) << + " size=" << p2pMessage.getDataSize() << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=unsetclosing)."; + + // Don't reset the waiting state. should happen by next method which responds to the message. + // It could be a SLP BYE for example or "481 No Such Call". + userAborted_ = false; + setClosing( false ); + } + + + // If this object was initialized to handle a Bad packet. + if( getMode() == APP_MODE_ERROR_HANDLER ) + { + // Make an exception for SLP packets + 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. + // Inform the user + showEventMessage( i18n("The invitation was cancelled. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, ! isUserStartedApp() ); + + // Abort + sendP2PAbort(); + endApplication(); + return; + } + } + + + // Handle ACKs before everything else. + if( p2pMessage.getDataSize() == 0 ) // HACK: for Bot2K3 4.1: no testing for flags + { + UnAckedMessage *unAcked = getUnAckedMessage(p2pMessage); + P2PMessageType ackedMessageType = P2P_MSG_UNKNOWN; + if( unAcked == 0 ) + { + if( p2pMessage.isAck() ) // other messages can't relate have the control flags set. + { + kWarning() << "Unable to handle ACK message, " + "original message not found " + "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << + " size=0 state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=return)."; + return; + } + } + else + { + // Remove ack record + // Also avoids that hasUnAckedMessage() returns the message we just received. + ackedMessageType = unAcked->messageType; + outgoingMessages_.removeAll( unAcked ); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Removed ack slot for message " + << "(sid=" << unAcked->sessionID + << " mid=" << unAcked->messageID + << " ackSid=" << unAcked->ackSessionID + << " size=" << unAcked->dataSize + << " type=" << unAcked->messageType + << ")"; +#endif + + delete unAcked; + } + + + if( p2pMessage.isAck() ) // 0x02 + { + gotAck( p2pMessage, ackedMessageType ); + } + else if( p2pMessage.isConnectionHandshake() ) // 0x100 + { + gotDirectConnectionHandshake( p2pMessage ); + } + else if( p2pMessage.isNegativeAck() ) // 0x01 + { + gotErrorAck( p2pMessage ); + } + else if( p2pMessage.isWaitingForReply() ) // 0x04 + { + gotTimeoutAck( p2pMessage ); + } + else if( p2pMessage.isWaitingForAck() ) // 0x06 + { + gotTimeoutAck( p2pMessage ); + } + else if( p2pMessage.isError() ) // 0x08 + { + gotErrorAck( p2pMessage ); + } + else if( p2pMessage.isAbortedSendingAck() ) // 0x40 + { + gotTransferAbortedAck( p2pMessage ); + } + else if( p2pMessage.isAbortedReceivingAck() ) // 0x80 + { + gotTransferAbortedAck( p2pMessage ); + } + else + { + kWarning() << "Unable to handle ACK message, " + "unknown flag value encountered " + "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << + " size=0 state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=assumerror)."; + + // Make sure the application does abort somehow. + gotErrorAck( p2pMessage ); + } + + return; + } + + + // Send the ack if needed (also applies to INVITE messages) + shouldSendAck_ = p2pMessage.isLastFragment(); + + // Store some message parameters for Acknowledgement later, or to send an error message. + // This should not be inserted in a if(shouldSendAck_) line, this info is used to resolve fragmented messages. + lastIncomingMessage_.dataSize = p2pMessage.getDataSize(); + lastIncomingMessage_.messageID = p2pMessage.getMessageID(); + lastIncomingMessage_.messageType = P2P_MSG_UNKNOWN; + lastIncomingMessage_.sentTime = 0; + lastIncomingMessage_.sessionID = p2pMessage.getSessionID(); + lastIncomingMessage_.totalSize = p2pMessage.getTotalSize(); + lastIncomingMessage_.ackSessionID = p2pMessage.getAckSessionID(); + lastIncomingMessage_.footerCode = 0; + + + // Special cases (abuse of the P2P system) + if( getMode() == APP_MODE_DATACAST ) + { + // Ink data, etc.. + gotDataFragment(p2pMessage); + return; + } + + + // Session ID is 0? -> the clients negotiate for session. + if(p2pMessage.getSessionID() == 0) + { + if( p2pMessage.isSlpData() ) + { + // Parse the fragment + gotNegotiationFragment(p2pMessage); + } + else + { + kWarning() << "P2PApplicationBase:gotMessage() - P2P message can't be handled, " + "unknown negotiation message type " + "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << + " size=" << p2pMessage.getDataSize() << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send0x08)."; + + // Don't know what to do with a negotiation message with flags set. + sendP2PAbort(); + + // Abort the application + showEventMessage( i18n("The transfer failed. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, true ); + endApplicationLater(); + return; + } + } + // Session ID not zero? -> clients exchange data in the session + else + { + // Check for data preparation messages + if( p2pMessage.isDataPreparation() ) + { + shouldSendAck_ = true; + lastIncomingMessage_.messageType = P2P_MSG_DATA_PREPARATION; + gotDataPreparation(p2pMessage); + } + else if( waitingState_ != P2P_WAIT_FOR_FILE_DATA + && p2pMessage.isData() + && p2pMessage.getDataSize() == 4 + && p2pMessage.getTotalSize() == 4 ) + { + // HACK: added for Encarta Instant Answers (has data flag set with preparation message). + kWarning() << "Expecting data-preparation message, " + "got message of 4 bytes with incorrect flags " + "(assuming data preparation," + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << ")!"; + shouldSendAck_ = true; + lastIncomingMessage_.messageType = P2P_MSG_DATA_PREPARATION; + gotDataPreparation(p2pMessage); + } + // 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()) + { + // HACK: added for Kopete 0.9.2 code (has no flag set with data messages). + kWarning() << "Expecting data message, " + "got fragmented message with no flags set " + "(assuming file data," + " 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 + kWarning() << "P2P message can't be handled, " + "unknown data message type " + "(flags=0x" << QString::number(p2pMessage.getFlags(), 16) << + " size=" << p2pMessage.getDataSize() << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send0x08)."; + + // Got an P2P binary message we can't handle. (some new kind of flag..?) + sendP2PAbort(); + + // Abort the application + showEventMessage( i18n("The transfer failed. The contact sent bad data, or KMess does not support it."), ChatMessage::CONTENT_APP_CANCELED, true ); + endApplicationLater(); + return; + } + } + +#ifdef KMESSTEST + // At the end of this method, we should have sent the ACK..! + KMESS_ASSERT( isP2PAckSent() ); +#endif +} + + + +/** + * @brief Called when a SLP message fragment was received. + * + * The fragments is buffered until all parts are received. + * The gotNegotiationMessage() will be called afterwards. + * + * @param p2pMessage The received P2P message with SLP payload. + */ +void P2PApplicationBase::gotNegotiationFragment(const P2PMessage &p2pMessage) +{ + if(! p2pMessage.isLastFragment()) + { + // Not everything received yet, buffer it. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got an SLP fragment, buffering it."; +#endif + + if(buffer_ == 0) + { + buffer_ = new QBuffer(); + buffer_->open(QIODevice::ReadWrite); + } + + buffer_->write( p2pMessage.getData(), p2pMessage.getDataSize() ); + } + else + { + // Read the message or buffer + QString slpData; + QByteArray bufferData; + + if(buffer_ != 0) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Got the last SLP fragment."; +#endif + + // Append the last MSNSLP fraqment and call the method. + buffer_->write( p2pMessage.getData(), p2pMessage.getDataSize() ); + buffer_->reset(); + + // Read the buffer + bufferData = buffer_->readAll(); + slpData = QString::fromUtf8( bufferData.data(), bufferData.size() ); + + delete buffer_; + buffer_ = 0; + } + else + { + // Read the data directly from the message + slpData = QString::fromUtf8( p2pMessage.getData(), (int)p2pMessage.getDataSize() ); + } + + // 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 ) ); + MimeMessage slpMessage( slpMimePart ); + + // Parse the negotiation message + gotNegotiationMessage( slpMessage, preamble ); + } +} + + + +/** + * @brief Called when a P2P message with timeout-flag was received. + * + * This method aborts the application with contactAborted(). + * + * @param message The received P2P message. + */ +void P2PApplicationBase::gotTimeoutAck(const P2PMessage &message) +{ + // Error in our headers? + if(isWaitingForUser()) + { + // Contact aborted this session because we didn't press "accept/cancel" within 120 secs. + contactAborted( i18n("The transfer failed. Timeout while waiting for user to accept.") ); + } + else + { + // Apparently the contact was waiting for something, likely some packet we had to send. + kWarning() << "Got an unexpected P2P timeout-error response " + "(flag=" << QString::number( message.getFlags(), 16 ) << + " state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=contactaborted)."; + + if( dataType_ == P2P_TYPE_NEGOTIATION ) + { + contactAborted( i18n("The contact rejected the invitation. An internal error occured.") ); + } + else + { + contactAborted( i18n("The transfer failed. An internal error occured.") ); + } + } +} + + + +/** + * @brief Got a transfer aborted ack. + * + * This message acknowledges the data transfer was aborted. + * The flag type indicates whether the sender aborted, or the receiver aborted the transfer. + * + * @param message The received error message. + */ +void P2PApplicationBase::gotTransferAbortedAck(const P2PMessage &message) +{ + // Got some kind of confirmation when we indicated to abort. + // Accept it by closing directly + // Error in our headers? + + if( ! isClosing() ) + { + kWarning() << "Got an unexpected P2P transfer aborted-response " + "(flag=" << QString::number( message.getFlags(), 16 ) << + " state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=endapplication)."; + + // Make sure the app still quits. + abortDataSending(); + endApplicationLater(); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Message confirms abort, requesting terination."; +#endif + + // Make sure the app will exist, but leave it half-open to receive the final 0x08 messages + // for all messages which were already being sent whle the BYE was underway. + abortDataSending(); + endApplicationLater(); + } +} + + + +/** + * @brief Returns whether the application can handle the given ACK message. + * + * It checks whether an unacked message exists for the given ACK message. + * + * @return Whether the application can handle the ACK message. + */ +bool P2PApplicationBase::hasUnAckedMessage(const P2PMessage &p2pMessage) +{ + // Simply test using the internal function, don't expose the UnAckedMessage pointer to external classes. + return (getUnAckedMessage(p2pMessage) != 0); +} + + + +/** + * @brief Return whether a given message type is still unacked. + * + * @return Whether the given message is still unacked. + */ +bool P2PApplicationBase::hasUnAckedMessage(const P2PMessageType messageType) +{ + return (getUnAckedMessage(messageType) != 0); +} + + +/** + * @brief Test whether the first message has been sent. + */ +bool P2PApplicationBase::isFirstMessageSent() const +{ + return nextMessageID_ != 0; +} + + +/** + * @brief Test whether a P2P ack was sent for the current message. + * @return Whether a P2P ack was sent or the current message. + */ +bool P2PApplicationBase::isP2PAckSent() const +{ + return ! shouldSendAck_; +} + + +/** + * @brief Test whether the transfer is active. + * @return Whether the transfer is active. + */ +bool P2PApplicationBase::isTransferActive() const +{ + return dataType_ != P2P_TYPE_NEGOTIATION // sending data + || ! fragmentTracker_.isEmpty(); // receiving data +} + + + +/** + * @brief Verify whether the transfer was initiated and was completed. + * @return Whether the transfer is complete. + * @todo This only works for receiving data at the moment. + */ +bool P2PApplicationBase::isTransferComplete() const +{ + return fragmentTracker_.isComplete(); // TODO: sending data. +} + + + +/** + * @brief Test whether a given waiting state is set. + * @param waitingState The state to test for. + * @return Whether the waiting state is currently set. + */ +bool P2PApplicationBase::isWaitingState( P2PWaitingState waitingState ) const +{ + // TODO: later perhaps make it a flag instead (to wait for both the DC response and data preparation). + return waitingState_ == waitingState; +} + + + +/** + * @brief Send file data in P2P packets. + * + * A timer starts that transmits all data packets automatically. + * It uses the dataSource object to determine the total size of the data to send. + * + * @param dataSource Source of the data to send + * @param dataType Type of the data, used to set the correct flag in the P2P footer code. + */ +void P2PApplicationBase::sendData(QIODevice *dataSource, P2PDataType dataType) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Begin of data transfer"; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( getSessionID() != 0 ); + KMESS_ASSERT( dataSource != 0 ); + KMESS_ASSERT( nextMessageID_ != 0 ); +#endif + + // Make sure we don't activate a slot without a data source. + if(dataSource == 0) + { + kWarning() << "Couldn't send data, data source is null " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send500)."; + + showEventMessage( i18n("The transfer failed. Could not open data source."), ChatMessage::CONTENT_APP_FAILED, false ); + + // TODO: Official client sends BYE when data preparation failed. + sendCancelMessage(CANCEL_FAILED); // MSNSLP messages terminate the application eventually. + return; + } + + // Set the global data fields + dataSource_ = dataSource; + dataType_ = dataType; + + // Reserve the next message ID. + nextMessageID_++; + + // 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_ = (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. + applicationList_->registerDataSendingApplication( this ); +} + + + +/** + * @brief Send the data preparation message. + * + * This is a consists of a P2P message with 0x00000000 as message body. + * The contact should return with a data-preparation ACK, which initiates the file transfer. + * Note that Windows Live Messenger (v8) will start a direct connection setup first + * before it sends the data preparation ACK. + */ +void P2PApplicationBase::sendDataPreparation() +{ +#ifdef KMESSTEST + KMESS_ASSERT( getSessionID() != 0 ); + KMESS_ASSERT( waitingState_ == P2P_WAIT_DEFAULT || waitingState_ == P2P_WAIT_FOR_FILE_DATA ); +#endif + + // TODO: Check the various footer codes send for certain transfers. + QByteArray p2pMessage( 4, 0x00 ); + 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 + // - it sends the transreq message, + // - when the invitation finished (or the DC is up..??) it sends the data preparation ACK. + // - after that it sends the ACK of the last "SLP 200 OK" message. + // - at this point, the data preparation ACK triggers KMess to send the picture data. + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for data preparation ACK..."; +#endif + + // Wait until our preparation message is ACK-ed + setWaitingState( P2P_WAIT_FOR_PREPARE_ACK, P2PAPPLICATION_TIMEOUT_ACK ); +} + + + +/** + * @brief Send the direct connection handshake + * + * This message contains the Nonce field, + * used by the other contact to authenticate the direct connection. + * The confirmation message is identical to the handshake message. + */ +void P2PApplicationBase::sendDirectConnectionHandshake( const QString &nonce ) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sending direct connection handshake " + << "(nonce=" << nonce << ")."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( applicationList_->hasDirectConnection() ); +#endif +#ifdef KMESSTEST + // NOTE: the handshake could happen while the file transfer was in progress, or even completed already. + KMESS_ASSERT( waitingState_ == P2P_WAIT_FOR_CONNECTION2 // we just established connection, send the first handshake + || waitingState_ == P2P_WAIT_FOR_HANDSHAKE // contact established connection, waiting to receive first handshake + || waitingState_ == P2P_WAIT_FOR_HANDSHAKE_OK // we sent the first handshake, waiting for contact to return second. + ); +#endif + + // Message flag is 0x100 + const int handshakeFlag = P2PMessage::MSN_FLAG_DC_HANDSHAKE; + + // Prepare the header + QByteArray header( 48, 0x00 ); + nextMessageID_++; + + // Insert the bytes + P2PMessage::insertBytes(header, 0, 0); // 1: SessionID + P2PMessage::insertBytes(header, nextMessageID_, 4); // 2: MessageID + // offset and total size are 0 + P2PMessage::insertBytes(header, handshakeFlag, 28); // 6: Message type (flags) + + // Insert the nonce at fields 7-9 + P2PMessage::insertNonce(header, nonce); + + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + // Display binary data as hexadecimal string + const int nonceOffset = 32; + const char hexMap[] = "0123456789ABCDEF"; + QString hex; + for(int i = 0; i < 16; i++) + { + if( i == 4 || i == 6 || i == 8 || i == 10 ) + { + hex += "-"; + } + int upper = (header[nonceOffset + i] & 0xf0) >> 4; + int lower = (header[nonceOffset + i] & 0x0f); + hex += hexMap[upper]; + hex += hexMap[lower]; + } + kDebug() << "copied nonce '" << nonce << "' to p2p message header as '" << hex << "'."; +#endif + + // Forcefully Send the message over the direct connection + applicationList_->getDirectConnection()->sendMessage( header ); + + // Not updating the waiting state here. + // The handshake process could happen while the data transfer is already in progress +} + + + +/** + * @brief Called when the connection is ready to send more file data. + * @param preferredFragments The preferred number of fragments to send at once. + * + * The sendData() method calls ApplicationList::registerDataSendingApplication() + * to start this notification process. Each time the direct connection is + * ready to send more data, ApplicationList::slotConnectionReadyWrite() is called which + * calls this method. + * + * @return Returns false if something failed, and this method should not be called again. + */ +bool P2PApplicationBase::sendNextDataParts( int preferredFragments ) +{ + // Abort if the data sending was reset. + // Also fixes race conditions with signals. + if( dataType_ == P2P_TYPE_NEGOTIATION || isClosing() || KMESS_NULL(dataSource_) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "called while aborting " + "(datatype=" << dataType_ << + " isclosing=" << isClosing() << + " userAborted=" << userAborted_ << // sort-of reserved for aborts from ApplicationList. + " datasource=" << dataSource_ << + " waitingState=" << waitingState_ << + " contact=" << getContactHandle() << ")."; +#endif + + // Request caller not to call us again. + return false; + } + + + // Allow the caller to specify the number of loops, + // e.g. more for a direct connection, less for parallel transfers. + int loops = qMax( preferredFragments, 1 ); + while( --loops >= 0 && fragmentOffset_ < fragmentTotalSize_ && ! dataSource_->atEnd() ) + { + // Read the data from the file. + char buffer[1202]; // 1202 is the max P2P data size. + qint64 bytesRead = dataSource_->read( buffer, 1202 ); + if( bytesRead < 0 ) + { + kWarning() << "Couldn't send more data, " + "read error at " << fragmentOffset_ << " of " << fragmentTotalSize_ << " bytes " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=slpcancel)."; + sendCancelMessage( CANCEL_FAILED ); + return ( dataSource_ == 0 ); // return true if already aborted by sendCancelMessage(). + } + else if( bytesRead == 0 ) + { + break; + } + + // Wrap in buffer, without copying. + QByteArray data = QByteArray::fromRawData( buffer, (int)bytesRead ); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sending data:" + << " offset=" << fragmentOffset_ + << " buffer=" << bytesRead; +#endif + + // 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. + uint flag = 0; + switch( dataType_ ) + { + 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 ) + { + kWarning() << "Unknown data transfer mode " + "(mode=" << dataType_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=tryflag)."; + } + } + + // 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. + if( ! writeSuccess ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "message could not be written entirely, leaving loop early."; +#endif + break; + } + + // Dispatch the progress to the derived class + showTransferProgress( nextProgressValue ); + } + + + // Rounds completed, make final assertions. + // Be verbose if something internally goes wrong. + if( dataSource_->atEnd() && fragmentOffset_ < fragmentTotalSize_ ) + { + kWarning() << "data source is at the end, " + "but offset byte count is not " + "(fragmentoffset=" << fragmentOffset_ << + " fragmenttotalsize=" << fragmentTotalSize_ << + " sourceopen=" << dataSource_->isOpen() << + " sourcesize=" << dataSource_->size() << + " datatype=" << dataType_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=resetstate)!"; + + // Reset for next p2p message. + fragmentTotalSize_ = 0; + fragmentOffset_ = 0; + } + + // See if transfer completed, + // if so tell the application list to stop calling this method. + if( fragmentOffset_ == 0 || fragmentOffset_ >= fragmentTotalSize_ ) + { + dataSource_ = 0; + dataType_ = P2P_TYPE_NEGOTIATION; + applicationList_->unregisterDataSendingApplication( this ); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Waiting for all data received ACK..."; +#endif + + // Now wait for the contact to ACK that it received all data. + setWaitingState( P2P_WAIT_FOR_DATA_ACK, P2PAPPLICATION_TIMEOUT_ACK ); + + // no return false, will unregister the app twice. + } + + return true; +} + + + +/** + * @brief Send a low-level control message to terminate the session. + * + * The session will automatically be scheduelled termination using a call to endApplicationLater(). + */ +void P2PApplicationBase::sendP2PAbort() +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + if( ! shouldSendAck_ ) + { + kDebug() << "NOTICE: sending 0x08 control packet while the contact is not expecting an ack response."; + } +#endif + + // Inform the client we want to kill the session right away. + sendP2PAckImpl( P2PMessage::MSN_FLAG_ERROR ); + +#ifdef KMESSTEST + KMESS_ASSERT( isP2PAckSent() ); +#endif + + // Scheduelle termination of the session. + endApplicationLater(); +} + + + +/** + * @brief Send an ACK message if this is needed. + * + * This method called each time a P2P payload is fully received (such as an SLP message). + * The ACK system turns the P2P communication into a stop-and-wait protocol. + * The other client waits until it receives an ACK or error before it continues with the next step. + * + * This function is mostly used by the derived P2PApplication class. + * It calls sendP2PAck() when a SLP message is properly received. + * + * @return Whether an ack had to be sent. + */ +bool P2PApplicationBase::sendP2PAck() +{ + // Only send an ACK is this is really needed. + if( ! shouldSendAck_ ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "NOTICE: not sending 0x02 ack packet, something is already sent (or nothing needs to be sent)."; +#endif + + return false; + } + + // Send the ack + sendP2PAckImpl(); // type = P2PMessage::MSN_FLAG_ACK. + return true; +} + + + +/** + * @brief Internal function to send a P2P ACK message. + * + * This method is the internal implementation for sendP2PAck() and others. + * + * @param ackType The ACK type (flag field) to use, defaults to MSN_FLAG_ACK. + * @param originalMessageData The meta data of the original message, used to fill some parts of the ACK message. + * Defaults to the last received message. + */ +void P2PApplicationBase::sendP2PAckImpl(int ackType, UnAckedMessage *originalMessageData) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + if(ackType == P2PMessage::MSN_FLAG_ACK) + { + if( nextMessageID_ == 0 && getMode() == APP_MODE_NORMAL ) + { + kDebug() << "Sending P2P ACK (INVITE-ACK)"; + } + else + { + kDebug() << "Sending P2P ACK"; + } + } + else if(ackType == P2PMessage::MSN_FLAG_ERROR) + { + kDebug() << "Sending P2P ACK (Error-response)"; + } + else if(ackType == P2PMessage::MSN_FLAG_WAITING) + { + kDebug() << "Sending P2P ACK (Timeout-response)"; + } + else if(ackType == P2PMessage::MSN_FLAG_WAITING_FOR_ACK) + { + kDebug() << "Sending P2P ACK (ACK-timeout-response)"; + } + else if(ackType == P2PMessage::MSN_FLAG_ABORTED_SENDING) + { + kDebug() << "Sending P2P ACK (Aborted-myself-ACK)"; + } + else if(ackType == P2PMessage::MSN_FLAG_ABORTED_RECEIVING) + { + kDebug() << "Sending P2P ACK (Aborted-you-ACK)"; + } + else + { + kDebug() << "Sending P2P ACK (Unknown-type)"; + } +#endif +#ifdef KMESSTEST + KMESS_ASSERT( shouldSendAck_ ); // TODO: test for control messages, which do not have to obey this rule. +#endif + + // Default to previous message if no argument is given + if( originalMessageData == 0 ) + { + originalMessageData = &lastIncomingMessage_; + } + + + // Fill the header: + // + // 0 4 8 16 24 28 32 36 40 48 + // |....|....|....|....|....|....|....|....|....|....|....|....| + // |sid |mid |offset |totalsize|size|flag|asid|auid|a-datasz | + // + + QByteArray header( 48, 0x00 ); + + // Determine the message ID + quint32 messageID; + if( nextMessageID_ == 0 ) + { + // We don't have a message ID set yet, we're acknowledging + // the first INVITE message. Generate an ID + + nextMessageID_ = KMessShared::generateID(); + messageID = nextMessageID_; + + // Somehow, the next message we send (200 OK) should contain a messageID - 3: + // We decrement the messageID with 4 because it will be incremented in the next call. + nextMessageID_ -= 4; + } + else + { + nextMessageID_++; + messageID = nextMessageID_; + } + + // Determine the ack settings. + 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 ) + { + // This ack tells the contact it should reset the session (TCP RST). + ackTotalSize = originalMessageData->totalSize; + ackSessionID = originalMessageData->ackSessionID; + } + else if( ackType == P2PMessage::MSN_FLAG_NEGATIVE_ACK ) + { +#ifdef KMESSTEST + KMESS_ASSERT( ! fragmentTracker_.isEmpty() ); + KMESS_ASSERT( fragmentTracker_.isInitialized( originalMessageData->messageID ) ); +#endif + // This ack tells the contact we haven't received the data properly (e.g. invalid offsets) + // TODO: guess the ackDataSize is the the last offset which was received. + ackSessionID = originalMessageData->messageID; + ackDataSize = fragmentTracker_.isInitialized( originalMessageData->messageID ) + ? fragmentTracker_.getTransferredBytes() : 0; + } + else if( ackType == P2PMessage::MSN_FLAG_ABORTED_RECEIVING ) + { + // This ack tells the contact we won't ack the data anymore, since it's aborted. + ackSessionID = originalMessageData->messageID; + ackUniqueID = KMessShared::generateID(); + ackDataSize = originalMessageData->totalSize; + } + else if( ackType == P2PMessage::MSN_FLAG_ABORTED_SENDING ) + { +#ifdef KMESSTEST + KMESS_ASSERT( fragmentMessageID_ != 0 ); + KMESS_ASSERT( originalMessageData->messageType == P2P_MSG_DATA ); + KMESS_ASSERT( hasUnAckedMessage( P2P_MSG_DATA) ); +#endif + // this ack tells the contact to terminate it's ack session. + ackSessionID = originalMessageData->messageID; // must reffer to our OWN message. + } + else if( ackType == P2PMessage::MSN_FLAG_WAITING ) + { + // The ackSid seams to be random if it was waiting for an ack. + ackSessionID = originalMessageData->ackSessionID; // we give it a more precise value. + } + else + { +#ifdef KMESSTEST + KMESS_ASSERT( ackType == P2PMessage::MSN_FLAG_ACK ); +#endif + // This is a normal ack which confirms the arrival. + ackSessionID = originalMessageData->messageID; + ackUniqueID = originalMessageData->ackSessionID; + ackDataSize = originalMessageData->totalSize; + } + + // Insert the bytes + P2PMessage::insertBytes(header, originalMessageData->sessionID, 0); // SessionID + P2PMessage::insertBytes(header, messageID, 4); // BaseIdentifier + // offset of 8 bytes is always 0 (position 8) + P2PMessage::insertBytes(header, ackTotalSize, 16); // Confirm total size set in previous message + // size of 4 bytes is always 0 (position 24) + P2PMessage::insertBytes(header, ackType, 28); // Set the ACK flag. + P2PMessage::insertBytes(header, ackSessionID, 32); // ID referring to a previous message. + 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, QByteArray(), footerCode); + shouldSendAck_ = false; + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "ACK Transmitted " + << "(flags=0x" << QString::number(ackType, 16) << ")."; +#endif +} + + + +/** + * @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(). + * + * The following instance fields are updated automatically: + * - nextMessageID_ is generated for every new P2P message. + * - fragmentOffset_ is updated when a splitted message is sent. + * - fragmentTotalSize_ and messageOffse_ are reset when the last message fragment is sent. + * - 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 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. + * 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::sendP2PMessageImpl(const QByteArray &messageData, int flagField, P2PDataType footerCode, P2PMessageType messageType, quint32 messageID) +{ +#ifdef KMESSTEST + KMESS_ASSERT( messageData.size() <= 1202 ); +#endif + + // Initialize the header + QByteArray header( 48, 0x00 ); + + // Determine the message ID, if none is given. + if( messageID == 0 ) + { + if( nextMessageID_ == 0) + { + // This is the first P2P message we send, initialize message ID + nextMessageID_ = KMessShared::generateID(); + } + else if(fragmentOffset_ == 0) + { + // Only increments the ID for the first message. + // Don't increment it for the next fragments (if it's a splitted message). + // Better approach: pass the desired messageID to this function. + nextMessageID_++; + } + + messageID = nextMessageID_; + } + + + // Verify we're not configured to send a splitted message. + if( fragmentTotalSize_ > 0 + && flagField != 0 + && flagField != P2PMessage::MSN_FLAG_OBJECT_DATA + && flagField != P2PMessage::MSN_FLAG_FILE_DATA ) + { + kWarning() << "Attempting to send splitted ACK message " + "(flags=0x" << QString::number( flagField, 16 ) << + " state=" << waitingState_ << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=continue)!"; + } + + + // Determine the message size: + // 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 ) + { + // Normal message + totalSize = messageData.size(); + offsetField = 0; + } + else + { + // Splited message: total size is set. + totalSize = fragmentTotalSize_; + offsetField = fragmentOffset_; + } + + + // Generate ack session identifier for this message + quint32 ackSessionID = KMessShared::generateID(); + + // Set session ID to zero when SLP messages are sent. + quint32 sessionID = getSessionID(); + if( flagField == 0 + && footerCode == 0 // fixes all data transfers, like msnobjects and webcam. + && messageType != P2P_MSG_DATA_PREPARATION ) + { + sessionID = 0; + } + + // Update the header + P2PMessage::insertBytes(header, sessionID, 0); // 1: Session ID (zero for SLP messages). + P2PMessage::insertBytes(header, messageID, 4); // 2: BaseIdentifier (starts random [4, 4294967295]) + P2PMessage::insertBytes(header, offsetField, 8); // 3: Offset (if more then 1202 bytes to send) + P2PMessage::insertBytes(header, totalSize, 16); // 4: Total size of the message + P2PMessage::insertBytes(header, messageSize, 24); // 5: This message size, size of previous if no data + P2PMessage::insertBytes(header, flagField, 28); // 6: Message type (flags) + P2PMessage::insertBytes(header, ackSessionID, 32); // 7: Used to link ack messages (ACK session ID) +//P2PMessage::insertBytes(header, 0, 36); // 8: Field7 of previous for ACK-messages (unique ID) +//P2PMessage::insertBytes(header, 0, 40); // 9: Field4 of previous for ACK-messages (size) + + + // Deliver the message over the correct link (switchboard or direct connection) + bool writeSuccess = applicationList_->sendMessage( this, header, messageData, (uint) footerCode ); + if( ! writeSuccess ) + { + // This only happens when a direct connection transfer is congested. + // The same message will be re-sent later. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Message sending was blocked, should try again later."; +#endif + return false; + } + + + // Update unacked message queue to handle incoming ACKs + if( flagField == 0 || messageType != 0 ) + { + if( offsetField == 0 ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Storing message fields to track the ACK response."; +#endif + // First message, or single message, store new record for ACKs. + QDateTime currentTime; + UnAckedMessage *ackData = new UnAckedMessage; + ackData->sessionID = getSessionID(); + ackData->messageID = messageID; + ackData->dataSize = messageSize; + ackData->totalSize = totalSize; + ackData->ackSessionID = ackSessionID; + ackData->messageType = messageType; // used later to handle certain ACKs. + ackData->sentTime = currentTime.toTime_t(); + outgoingMessages_.append(ackData); + } + else + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Updating message fields to track the ACK response."; +#endif + // Follow-up part of a splitted/fragmented message. + // Update the uniqueID aka ackSID field to handle new acks. + // TODO: it appears MSN7 uses the same ackSID for some messages, not sure + // whether that is a feature (to capture acks in a short time) or a problem in their random function. + foreach( UnAckedMessage *unAcked, outgoingMessages_ ) + { + if( unAcked->messageID == messageID ) + { + unAcked->ackSessionID = ackSessionID; + break; + } + } + } + } + + // Update the offset fields for splitted messages + if(fragmentTotalSize_ != 0) + { + // Update offset + fragmentOffset_ += messageSize; + + // If we transmitted all parts, reset the fields for the next normal message + if(fragmentOffset_ >= fragmentTotalSize_) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "All message parts sent, resetting fragmentOffset_ and fragmentTotalSize_."; +#endif + + fragmentOffset_ = 0; + fragmentTotalSize_ = 0; + } + } + + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Message transmitted " + << "(sid=" << getSessionID() + << " mid=" << messageID + << " ackSid=" << ackSessionID + << " flags=0x" << QString::number(flagField, 16) + << " size=" << messageSize + << " type=" << messageType + << ")"; +#endif + + return true; +} + + + +/** + * @brief Send a low-level error message that the application is waiting for a certain message. + */ +void P2PApplicationBase::sendP2PWaitingError() +{ + sendP2PMessageImpl( 0, P2PMessage::MSN_FLAG_WAITING ); + shouldSendAck_ = false; +} + + + +/** + * @brief Send a complete SLP message in multiple P2P packets. + * + * 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. This value is returned with gotAck(). + */ +void P2PApplicationBase::sendSlpMessage(const QString &slpMessage, P2PMessageType messageType) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "SLP message=" << slpMessage; +#endif + + // Get the raw utf8 encoded bytearray + QByteArray utf8Message = slpMessage.toUtf8(); + QByteArray messagePart; + + // Make sure the extra padded '\0' character is there. MSN 6-WLM rely on this. + utf8Message.append('\0'); + + sendP2PMessage( utf8Message, 0, P2P_TYPE_NEGOTIATION, messageType ); // will split the message. +} + + + +/** + * @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_ ) + { + kWarning() << "NOTICE: ack is likely sent already, setting setCurrentMessageType() has no use anymore."; + } + + lastIncomingMessage_.messageType = messageType; +} + + + +/** + * @brief Notify this base class the user is aborting the session. + * + * This method sets a flag to avoid sending certain error messages while the user is aborting + * (e.g. closing the chat window). It prevents crashes or spawning new chat sessions. + * + * @param userAborted Whether the user is aborting. + */ +void P2PApplicationBase::setUserAborted( bool userAborted ) +{ + userAborted_ = userAborted; +} + + + +/** + * @brief Indicate which packet is expected next. + * @param waitingState The new waiting state. + * @param timeout Number of milliseconds before a timer fires and showTimeoutMessage() is called. + * The contact's client will be informed automatically that it forgot to send some data. + * If this value is 0, it means the class temporary changes the state for debugging. + */ +void P2PApplicationBase::setWaitingState( P2PWaitingState waitingState, int timeout ) +{ +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + unsigned long sessionID = getSessionID(); + + if( timeout == 0 ) + { +#ifdef KMESSTEST + KMESS_ASSERT( ! waitingTimer_->isActive() ); +#endif + + if( waitingState_ != waitingState ) + { + kDebug() << "temporary switching waitingState of session" << sessionID << "from" << waitingState_ << "to" << waitingState; + } + } + else + { + if( waitingState_ != waitingState ) + { + kDebug() << "switching waitingState of session" << sessionID << "from" << waitingState_ << "to" << waitingState; + } + else + { + kDebug() << "resuming waitingState of session" << sessionID << "for" << waitingState_; + } + } +#endif + + // Update the state + waitingState_ = waitingState; + + // Restart the timer + if( timeout != 0 ) + { + waitingTimer_->start( timeout ); + } +} + + + +/** + * @brief Crash prevention method. + * + * While it should never happen that the ApplicationList is deleted before the P2PApplication class, + * this did happen in the past (see http://trac.kmess.org/ticket/263). This method is an extra + * safety guard to prevent crashes after many things do wrong. + */ +void P2PApplicationBase::slotApplicationListDeleted() +{ + kWarning() << "ApplicationList is deleted before the P2PApplication class! This should not happen!" + "(maybe an old session, " + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=endapplication)."; + + applicationList_ = 0; // ignores the derived P2PApplication class for now. + + // No one can or needs to receive the deleteMe() signal anymore. + // Forcefuly delete ourselves and hope for the best. + deleteLater(); +} + + + +/** + * @brief Cleanup function, is used to handle timeout events. + * + * When a timeout occurs before the contact sent something we expect, + * this function terminates the application automatically. + * + * Depending on the internal "waiting state", an error message will be outputted with kWarning(). + */ +void P2PApplicationBase::slotCleanup() +{ + // See if the waiting time for new packets is over (like TCP's TIME_WAIT state). + if( waitingState_ == P2P_WAIT_END_APPLICATION ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "timer of endApplicationLater() fired, finally destroying object."; +#endif + + // Directly destroy ...finally. + testUnAckedMessages( true ); + endApplication(); + return; + } + + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "timeout fired, cleaning up " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " waitingState=" << waitingState_ << ")."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( waitingState_ != P2P_WAIT_DEFAULT ); +#endif + + + // Not waiting for ourselves to connect. + // Not waiting for contact to accept. + // Not waiting for contact to send BYE ack. + if( waitingState_ == P2P_WAIT_FOR_CONNECTION2 + || waitingState_ == P2P_WAIT_CONTACT_ACCEPT + || waitingState_ == P2P_WAIT_FOR_SLP_BYE_ACK ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Not sending timeout message for current waiting state."; +#endif + } + else + { + if( userAborted_ ) + { + // Don't send messages when aborting. This could potentially crash KMess, or cause new windows to appear. + // - suppose this is the last aborting application which requests removal. + // - ApplicationList informs the MsnSwitchboardConnection it can remove itself. + // - ChatMaster processes the putMsg() call, and attempts to deliver the message. +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Not sending error message because application is aborting."; +#endif + + testUnAckedMessages( false ); + } + else + { + +/* + // Tell the other client we were waiting for a message to receive! + // TODO: this is still not as it should be, but a start. + uint waitFlag = P2PMessage::MSN_FLAG_WAITING; + switch(waitingState_) + { + case P2P_WAIT_FOR_FILE_DATA: + // Waiting for file data. Application is shutting down sender right now. + waitFlag = P2PMessage::MSN_FLAG_ABORTED_RECEIVING; // 0x80 + break; + + if waiting for ack, wlm also sends 0x04. + + case P2P_WAIT_FOR_SLP_OK_ACK: + case P2P_WAIT_FOR_PREPARE_ACK: + case P2P_WAIT_FOR_TRANSFER_ACK: + case P2P_WAIT_FOR_DATA_ACK: + //not P2P_WAIT_FOR_SLP_BYE_ACK: + case P2P_WAIT_FOR_SLP_ERR_ACK: + // we guess 0x06 is used as waiting-for-ack error. + waitFlag = P2PMessage::MSN_FLAG_WAITING_FOR_ACK; + break; + + default: break; + } + + // Send the message + sendP2PMessageImpl(0, waitFlag, 0); // TODO: pass the original message which is unacked!! +*/ + testUnAckedMessages( true ); // TODO: argument is not used, and replaces sendP2PWaitingError(). + + sendP2PWaitingError(); + } + } + + + // Pass to delivered class + showTimeoutMessage( waitingState_ ); +} + + + +/** + * @brief Test if the contact aborted the sending of data. + * + * This method is intended to be used by the P2PApplication class. + * When a transfer to the contact is aborted, this method sends a 0x40 message. + * That control packet terminates the "ack slot" in the remote client. + */ +void P2PApplicationBase::testDataSendingAborted() +{ +#ifdef KMESSTEST + KMESS_ASSERT( waitingState_ == P2P_WAIT_FOR_SLP_BYE_ACK ); +#endif + + // See if the data was not acked. + UnAckedMessage *unAckedDataMessage = getUnAckedMessage( P2P_MSG_DATA ); + if( unAckedDataMessage != 0 ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Sent data was not acked, sending 0x40 to abort ack request."; +#endif + + // It's possible WLM also closed it's data stream at this point, + // so ignores the 0x40 and sends a 0x80 at the same time back. + sendP2PAckImpl( P2PMessage::MSN_FLAG_ABORTED_SENDING, unAckedDataMessage ); + + // Remove from collection + outgoingMessages_.removeAll( unAckedDataMessage ); + delete unAckedDataMessage; + } +} + + + +/** + * @brief Test if there are still unacked messages. + * @param sendError Whether to send an error to the client back as well. + */ +void P2PApplicationBase::testUnAckedMessages( bool /*sendError*/ ) +{ + // Check if there are still unacked messages. + if( ! outgoingMessages_.isEmpty() ) + { + uint unackedCount = outgoingMessages_.count(); + + if( unackedCount == 1 ) + { + UnAckedMessage *unAcked = outgoingMessages_.at(0); + + // More simple debug statement for most used case. + kWarning() << "there is still " << unackedCount << " unacked message " + "(type=" << unAcked->messageType << + " ackSid=" << unAcked->ackSessionID << + " totalsize=" << unAcked->totalSize << + " state=" << waitingState_ << + " contact=" << getContactHandle() << + " class=" << metaObject()->className() << + " session=" << getSessionID() << ")"; + } + else + { + kWarning() << "there are still " << unackedCount << " unacked messages " + "(state=" << waitingState_ << + " contact=" << getContactHandle() << + " class=" << metaObject()->className() << + " session=" << getSessionID() << ")"; + + foreach( UnAckedMessage *unAcked, outgoingMessages_ ) + { + kWarning() << "Message " << unAcked->messageID << " is unacked " + "(type=" << unAcked->messageType << + " ackSid=" << unAcked->ackSessionID << + " totalsize=" << unAcked->totalSize << ")."; + + } + } + } +} + + + +/** + * @brief Stop the waiting timer + * @return Whether the timer was still running, or not. + */ +bool P2PApplicationBase::stopWaitingTimer() +{ + bool wasActive = waitingTimer_->isActive(); + waitingTimer_->stop(); + return wasActive; +} + + + +/** + * @brief Utility function to write P2P data to a file, also deals with message offsets. + * + * When an error occurs, the required error message + * will be sent back to the other client. + * + * While Windows Live Messenger does not allow messages to be out of order, + * this method explicitly allows it because WLM itself seams to send messages out of order + * in some cases when it's switching to the direct connection (likely error prone at slow systems). + * + * @param message The P2P message with a file part. + * @param file The file to output the data to. + * @return True if the data could be written to the file, false on error. + */ +bool P2PApplicationBase::writeP2PDataToFile( const P2PMessage &message, QIODevice *file ) +{ + unsigned long offset = message.getDataOffset(); + + // See if the offset should be changed, + // and if so, update it. + if( offset != (ulong)file->pos() && ! file->seek( offset ) ) + { +#ifdef KMESSDEBUG_APPLICATION + kDebug() << "data is received out of order, updating file offset."; +#endif + + // File position was different and could not be changed.. + 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 + { + // TODO: allow contacts to resume at the correct byte position. + kWarning() << "data offset is too far ahead of current end of file " + "(filepos=" << file->pos() << + " eofpos=" << file->size() << + " offset=" << offset << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=send0x01)"; + sendP2PAckImpl( P2PMessage::MSN_FLAG_NEGATIVE_ACK ); + sendCancelMessage( CANCEL_FAILED ); // sends slp bye + return false; + } + else if( offset <= fileSize ) + { + // seek( offset ) should only fail if the offset is beyond the end of the file. + // If this is not the case, moving within the file failed so abort. + kWarning() << "file pointer could not be set to message offset " + "(filepos=" << file->pos() << + " eofpos=" << file->size() << + " offset=" << offset << + " contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=sendcancel)"; + sendCancelMessage( CANCEL_FAILED ); + return false; + } + + // Create padding to write at the end + unsigned long remainingSize = offset - fileSize; + QByteArray padding( 4096, 0x00 ); + + // Add padding at the end of the file. + file->seek( fileSize ); + while( remainingSize > 0 ) + { + if( file->write( padding, qMin( (unsigned long) 4096, remainingSize ) ) <= 0 ) + { + break; + } + remainingSize -= 4096; + } + + // Make sure the file position is correct now. + if( offset != (ulong)file->pos() ) + { + sendCancelMessage( CANCEL_FAILED ); + return false; + } + } + + + // Offsets are correct. + // Write the data to the file, + qint64 status = file->write( message.getData(), message.getDataSize() ); + if( status == -1 ) + { + kWarning() << "Failed to write the data to the file " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + " action=sendcancel)"; + + sendCancelMessage(CANCEL_FAILED); + return false; + } + + // Indicate success! + return true; +} + + + +#include "p2papplicationbase.moc" diff --git a/kmess/network/applications/p2papplication.h b/src/network/applications/p2papplicationbase.h similarity index 58% rename from kmess/network/applications/p2papplication.h rename to src/network/applications/p2papplicationbase.h index 02347df..38a2bda 100644 --- a/kmess/network/applications/p2papplication.h +++ b/src/network/applications/p2papplicationbase.h @@ -1,5 +1,5 @@ /*************************************************************************** - p2papplication.h - description + p2papplicationbase.h - description ------------------- begin : Mon Nov 22 2004 copyright : (C) 2004 by Diederik van der Boor @@ -15,16 +15,16 @@ * * ***************************************************************************/ -#ifndef P2PAPPLICATION_H -#define P2PAPPLICATION_H +#ifndef P2PAPPLICATIONBASE_H +#define P2PAPPLICATIONBASE_H #include "application.h" -#include -#include +#include "../extra/p2pfragmenttracker.h" #include "../p2pmessage.h" -#include "../extra/p2pfragmenttracker.h" +#include + class QIODevice; class MimeMessage; @@ -33,11 +33,13 @@ class QBuffer; class ApplicationList; + /** * @brief An Application subclass implementing MSN6 P2P-style conversations. * * This base class aims to hide all complex details of the P2P communication. - * To implement a P2P service, create a derived class which + * The derived P2PApplication class adds handling of the MSNSLP protocol to this featureset. + * To implement a P2P service, create a derived class of P2PApplication which * implements the userStarted*, contactStarted* and getAppId() methods. * * P2P messages can be received from switchboard or direct connections. @@ -48,55 +50,11 @@ class ApplicationList; * - an instance of P2PApplication processes it. * The incoming message is received at the gotMessage() method. * + * The data flow starts with the gotMessage() method, + * which is called by the ApplicationList class with the incoming P2P message. * - * User-started invitations are handled this way: - * - * - The start() method is called externally to start the application. - * This method calls initializes the application and calls - * userStarted1_UserInvitesContact() - * - * - The userStarted1_UserInvitesContact() allows you to create the - * invitation message and use sendSlpInvitation() to send it. - * - * - The userStarted2_ContactAccepts() method is called when the - * contact accepts the invitation (sending a 200/OK message). - * It's possible to call sendSlpTransferInvitation() here. - * - * - The userStarted3_UserPrepares() method is called when the session is ready to transfer data. - * The data-preparation message was received, a direct connection is ready, - * or data can be sent over the switchboard. - * From this method you can call start an external application, - * call sendDataPreparationAck() or sendData(). - * - * - The gotData() method is called for every received data packet (e.g. file or picture data). - * You can store the data in a file, buffer it, etc.. - * The session will terminate automatically when all data is received. - * - * - * Contacted-started invitations are handled this way: - * - * - The gotMessage() method is called externally to handle an incoming P2P message. - * - * - The contactStarted1_ContactInvitesUser() method is called when the invitation message is fully received. - * This allows you to extract the details from the invitation message. - * When needed, call offerAcceptOrReject() to show an accept/cancel link in the chat window. - * Otherwise, call contactStarted2_UserAccepts() directly to "automatically accept" the invitation. - * - * - The contactStarted2_UserAccepts() method is called when the user hits the 'accept' link - * in the chat window. The accept message should be prepared and sent with sendSlpOkMessage(). - * - * - The contactStarted3_ContactConfirmsAccept() method is called when the contact ACKs the "SLP OK" message. - * From here, you can call sendDataPreparation() to send the data preparation message, - * or simply wait for the data transfer to start (contactStarted4_..). - * - * - The contactStarted4_ContactConfirmsPreparation() is called called when the session is ready to tranfer data. - * Either the data-preparation message was ACKed, or the direct connection is available. - * You can call sendData() from here to start the data transfer. - * The session will terminate automatically if all data has been sent. - * - * To cancel a running session, call userAborted() or use sendCancelMessage(). - * In most cases the application will terminate automatically after the contact ACK-ed the cancel message. - * Otherwise, endApplication() needs to be called manually. + * A user-started application is initiated with start(), + * which calls userStarted1_UserInvitesContact() to send the first message. * * When a data transfer is active, the methods showTransferMessage(), showTransferProgress(), showTransferComplete() * are called to inform the derived class of the status. It can update the GUI from these methods. @@ -107,7 +65,8 @@ class ApplicationList; * Internally, this code ensures valid P2P messages are sent. * * A P2P message consists of a a 48 byte binary header followed by an optional pyload. - * The payload which can be binary data or plain text MIME data (the MSNSLP messages). + * The payload which can be binary data or plain text MIME data (the MSNSLP messages, + * which are handled by the derived P2PApplication class). * * The messages can be sent over the switchboard, or direct connection. * When the P2P messages are sent over the switchboard, they will be wrapped @@ -226,91 +185,32 @@ SessionID: 114164 * @author Diederik van der Boor * @ingroup Applications */ -class P2PApplication : public Application +class P2PApplicationBase : public Application { Q_OBJECT public: // public methods // The constructor - P2PApplication(ApplicationList *applicationList); + P2PApplicationBase(ApplicationList *applicationList); // The destructor - virtual ~P2PApplication(); + virtual ~P2PApplicationBase(); - // The contact cancelled the session - virtual void contactAborted(const QString &message = 0); - // Returns the branch. - QString getBranch() const; - // Returns the call ID (identifies the invitation). - QString getCallID() const; // Return the message ID used in the previous message received from the contact. unsigned long getLastContactMessageID() const; - // Returns the nonce that's being expected. - const QString & getNonce() const; // Returns the session ID. - unsigned long getSessionID() const; + 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. bool hasUnAckedMessage(const P2PMessage &p2pMessage); // Called when the connection is ready to send more file data. bool sendNextDataParts( int preferredFragments ); - // The user cancelled the session - virtual void userAborted(); protected: // protected mehods - /** - * @brief The data type being sent. - * - * This value is used to set the footer code of P2P messages which are sent over the switchboard. - */ - enum P2PDataType - { - P2P_TYPE_NEGOTIATION = 0, ///< Default value, the session is negotiating. - 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. - }; - - // Scheduelle termination, but wait for last incoming packets - void endApplicationLater(); - // Step one of a contact-started chat: the contact invites the user - virtual void contactStarted1_ContactInvitesUser(const MimeMessage& message); - // Step four of a contact-started chat: the contact confirms the data-preparation message. - virtual void contactStarted4_ContactConfirmsPreparation(); - // Generate the random numbers for the session-id and message-id. - static unsigned long generateID(); - // 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; - // Called when data is received - virtual void gotData(const P2PMessage &message); - // Send a cancel message - void sendCancelMessage(const ApplicationCancelReason cancelReason); - // Send the data - void sendData(QIODevice *dataSource, const P2PDataType dataType); - // Sends the data preparation message. - void sendDataPreparation(); - // Method to be called from userStarted3_UserPrepares(); - void sendDataPreparationAck(); - // Send the invitation for a normal session - void sendSlpSessionInvitation(uint 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); - // The user rejected the invitation - virtual void userRejected(); - // Utility function to write P2P data to a file, also deals with message offsets. - bool writeP2PDataToFile( const P2PMessage &message, QIODevice *file ); - - - private: // private methods - /** * @brief The meta type of a P2P message. * @@ -319,130 +219,36 @@ class P2PApplication : 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. }; /** - * @brief Meta data on an unacked message. + * @brief The data type being sent. + * + * This value is used to set the footer code of P2P messages which are sent over the switchboard. */ - struct UnAckedMessage + enum P2PDataType { - // 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. - uint sentTime; ///< The time the message was sent. - P2PMessageType messageType; ///< The meta type of the message. + P2P_TYPE_NEGOTIATION = 0 ///< Default value, the session is negotiating. + , 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. }; - // Make sure no more data will be sent - void abortDataSending(); - // Generate the strings for the BranchID and call-ID. - static QString generateGUID(); - // Find the unacked message record associated with the received P2P message. - UnAckedMessage * getUnAckedMessage(const P2PMessage &ackMessage) const; - // Find the unacked message which corresponds with given message type. - UnAckedMessage * getUnAckedMessage(const P2PMessageType messageType) const; - // Parse a ACK messsage (in certain situations we need to active some methods) - void gotAck(const P2PMessage &message, const P2PMessageType messageType); - // Called when the ACK for the data preparation was received. - void gotAck_dataPreparation(); - // Called when the ACK for the sent file data was received. - void gotAck_dataReceived(); - // Called when the ACK for the SLP BYE message was received. - void gotAck_slpBye(); - // Called when the ACK for a SLP Error was received. - void gotAck_slpError(); - // Called when the ACK for the first SLP INVITE message was received. - void gotAck_slpSessionInvitation(); - // Called when the ACK of the SLP OK message was received. - void gotAck_slpSessionOk(); - // Called when the ACK for the SLP transfer decline message was received. - void gotAck_slpTransferDecline(); - // Called when the ACK for the SLP transfer INVITE message was received. - void gotAck_slpTransferInvitation(); - // Called when the ACK for the SLP transfer OK mesages was received. - void gotAck_slpTransferOk(); - // Got an direct connection handshake. - void gotDirectConnectionHandshake(const P2PMessage &message); - // Called internally when data is received, this eventually calls gotData() - void gotDataFragment(const P2PMessage &message); - // Called when the data preparation message is received - void gotDataPreparation(const P2PMessage &message); - // Received a P2P message with the error-flag set. This method aborts the application. - void gotErrorAck(const P2PMessage &message); - // Got a message fragment with SessionID 0 - void gotNegotiationFragment(const P2PMessage &message); - // Got a message with SessionID 0 - void gotNegotiationMessage(const MimeMessage &slpMessage, const QString &preamble); - // Got an MSNSLP ACK message - void gotSlpAck(const MimeMessage &slpMessage); - // Got an MSNSLP BYE message - void gotSlpBye(const MimeMessage &slpMessage); - // Got an MSNSLP INVITE message - void gotSlpInvite(const MimeMessage &slpMessage); - // Got an MSNSLP 200 OK header - void gotSlpOk(const MimeMessage &slpMessage); - // Got an MSNSLP session invitation - void gotSlpSessionInvitation(const MimeMessage &slpMimeBody); - // Got an MSNSLP status header - void gotSlpStatus(const MimeMessage &slpMessage, const QString &preamble); - // Got an MSNSLP transfer invitation - void gotSlpTransferInvitation(const MimeMessage &slpMimeBody); - // Got an MSNSLP transfer invitation response - void gotSlpTransferResponse(const MimeMessage &slpMimeBody, bool secondInvite = false); - // Received a message with the timeout-flag set. This method aborts the application. - void gotTimeoutAck(const P2PMessage &message); - // Received a P2P message with the aborted-flag set. This method aborts the application. - void gotTransferAbortedAck(const P2PMessage &message); - // Verify whether a given message is still unacked. - bool hasUnAckedMessage(const P2PMessageType messageType); - // Signal the derived class it can initiate the file transfer - void initiateTransfer(); - // Send the direct connection handshake - void sendDirectConnectionHandshake(); - // Send a P2P ACK message - void sendP2PAck(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); - // Send an SLP BYE message to close the session - void sendSlpBye(); - // Send an SLP invitation message - void sendSlpInvitation(const MimeMessage &message, const QString &contentType, P2PMessageType messageType); - // Send an SLP error message (to decline an invitation for example) - void sendSlpError(const QString &statusLine, const uint sessionID = 0, - const QString &messageContentType = 0, - P2PMessageType messageType = P2P_MSG_SLP_ERROR); - // Send a given string using sendP2PMessage() - void sendSlpMessage(const QString &slpMessage, P2PMessageType messageType); - // Test if there are still unacked messages. - void testUnAckedMessages(bool sendError); - - - private slots: - // Cleanup function, called if the last ACK isn't received at all - void slotCleanup(); - // The direct connection is authorized. - void slotConnectionAuthorized(); - // The direct connection is established. - void slotConnectionEstablished(); - // The direct connection could not be made. - void slotConnectionFailed(); - - - private: // private fields - /** * @brief An indication which message is expected from the contact. * @@ -454,11 +260,12 @@ class P2PApplication : public Application */ enum P2PWaitingState { - // It's recommended to keep these values, as they're also printed by kdWarning() statements! + // It's recommended to keep these values, as they're also printed by kWarning() statements! 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. @@ -483,51 +290,150 @@ class P2PApplication : public Application P2P_WAIT_END_APPLICATION = 17 ///< Waiting for a short while before destroying this object (like TCP TIME_WAIT state) }; + // Make sure no more data will be sent + void abortDataSending(); + // Scheduelle termination, but wait for last incoming packets + void endApplicationLater(); +// // Step one of a contact-started chat: the contact invites the user +// virtual void contactStarted1_ContactInvitesUser(const MimeMessage& message); +// // Step four of a contact-started chat: the contact confirms the data-preparation message. +// virtual void contactStarted4_ContactConfirmsPreparation(); + // Return the number of transferred bytes. + unsigned long getTransferredBytes() const; + // Return the current waiting state. + P2PWaitingState getWaitingState() const; + // Parse a ACK messsage (in certain situations we need to active some methods) + virtual void gotAck(const P2PMessage &message, const P2PMessageType messageType) = 0; + // Called when data is received + virtual void gotData(const P2PMessage &message) = 0; + // Called when all data is received. + 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. + virtual void gotDirectConnectionHandshake(const P2PMessage &message) = 0; + // Got a message with SessionID 0 + virtual void gotNegotiationMessage(const MimeMessage &slpMessage, const QString &preamble) = 0; + // Verify whether a given message is still unacked. + bool hasUnAckedMessage(const P2PMessageType messageType); + // Test whether the first message has been sent. + bool isFirstMessageSent() const; + // Test whether a P2P ack was sent for the current message. + bool isP2PAckSent() const; + // Test whether the transfer is active. + bool isTransferActive() const; + // Verify whether the transfer was initiated and was completed. + bool isTransferComplete() const; + // Test whether a given waiting state is set. + bool isWaitingState( P2PWaitingState waitingState ) const; + // Send the data + void sendData(QIODevice *dataSource, const P2PDataType dataType); + // Sends the data preparation message. + void sendDataPreparation(); + // Method to be called from userStarted3_UserPrepares(); + void sendDataPreparationAck(); + // Send the direct connection handshake + void sendDirectConnectionHandshake( const QString &nonce ); + // Send a low-level control message to terminate the session. + 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. + void setWaitingState( P2PWaitingState waitingState, int timeout ); + // Show a timeout message because an expected message was not received. + virtual void showTimeoutMessage( P2PWaitingState waitingState ) = 0; + // Stop the waiting timer + bool stopWaitingTimer(); + // Test if the contact aborted the sending of data. + void testDataSendingAborted(); + // Utility function to write P2P data to a file, also deals with message offsets. + bool writeP2PDataToFile( const P2PMessage &message, QIODevice *file ); - // The application is aborting - bool aborting_; + + private: // private methods + + /** + * @brief Meta data on an unacked message. + */ + struct UnAckedMessage + { + // Data for ACK message: + 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. + UnAckedMessage * getUnAckedMessage(const P2PMessage &ackMessage) const; + // Find the unacked message which corresponds with given message type. + UnAckedMessage * getUnAckedMessage(const P2PMessageType messageType) const; + // Called internally when data is received, this eventually calls gotData() + void gotDataFragment(const P2PMessage &message); + // Received a P2P message with the error-flag set. This method aborts the application. + void gotErrorAck(const P2PMessage &message); + // Got a message fragment with SessionID 0 + void gotNegotiationFragment(const P2PMessage &message); + // Received a message with the timeout-flag set. This method aborts the application. + void gotTimeoutAck(const P2PMessage &message); + // Received a P2P message with the aborted-flag set. This method aborts the application. + void gotTransferAbortedAck(const P2PMessage &message); + // Send a P2P ACK message + void sendP2PAckImpl(int ackType = P2PMessage::MSN_FLAG_ACK, UnAckedMessage *originalMessageData = 0); + // Send a P2P message + 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); + + + private slots: + // Crash prevention method + void slotApplicationListDeleted(); + // Cleanup function, called if the last ACK isn't received at all + void slotCleanup(); + + + private: // private fields // The application list, parent of all application objects. ApplicationList *applicationList_; // Message buffer, required to deal with splitted MSNSLP messages QBuffer *buffer_; - // Branch ID, identifies the INVITE-message - QString branch_; - // Call ID, identifies the session at MSNSLP level. - QString callID_; // The data source QIODevice *dataSource_; // 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_; - // True if we got an SLP message (requires a different error handling) - bool gotSlpMessage_; // The last incoming message. UnAckedMessage lastIncomingMessage_; - // Content type from the invitation message - QString invitationContentType_; - // CSeq field from the invitation message - int invitationCSeq_; - // SessionID field from the invitaiton message - unsigned long invitationSessionID_; - // Session ID, identifies the session at MSNP2P level. - unsigned long sessionID_; // Message ID, updated each time a message has been sent - unsigned long nextMessageID_; - // The nonce for direct connections - QString nonce_; + quint32 nextMessageID_; // The list of outgoing messages to be acked - QPtrList outgoingMessages_; + QList outgoingMessages_; // True if an ACK was not sent yet. bool shouldSendAck_; - // True if the user needs to acknowledge the message. (doesn't send an ACK automatically) - bool userShouldAcknowledge_; + // The user asked the application to start aborting + bool userAborted_; // The current waiting state P2PWaitingState waitingState_; // The waiting timer (for timeout events) diff --git a/kmess/network/applications/sipconnection.cpp b/src/network/applications/sipconnection.cpp similarity index 93% rename from kmess/network/applications/sipconnection.cpp rename to src/network/applications/sipconnection.cpp index 73b6058..ac344ab 100644 --- a/kmess/network/applications/sipconnection.cpp +++ b/src/network/applications/sipconnection.cpp @@ -16,28 +16,29 @@ ***************************************************************************/ #include "sipconnection.h" -#include -#include - -#include -#include -#include - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif +#include "config-kmess.h" #ifdef HAS_KPHONE - #include - #include #include "dissipate2/sipmessage.h" #include "dissipate2/sipclient.h" #include "dissipate2/sipuser.h" #include "dissipate2/sipcall.h" #include "kphone/callaudio.h" + + #include + #include #endif +#include +#include +#include + +#include +#include + + + UserAgent::UserAgent(QString localIP, unsigned sipListenPort, unsigned rtpListenPort) : client(NULL), user(NULL), call(NULL), member(NULL), audio(NULL) { @@ -50,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; @@ -86,9 +87,9 @@ 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.latin1(), O_WRONLY | O_NONBLOCK ); + audio_fd = ::open(audioDevice.toLatin1(), O_WRONLY | O_NONBLOCK ); if(audio_fd) { ::close(audio_fd); @@ -104,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()); @@ -124,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); @@ -136,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 } @@ -181,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"); @@ -238,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/kmess/network/applications/sipconnection.h b/src/network/applications/sipconnection.h similarity index 97% rename from kmess/network/applications/sipconnection.h rename to src/network/applications/sipconnection.h index 1d41116..f053de7 100644 --- a/kmess/network/applications/sipconnection.h +++ b/src/network/applications/sipconnection.h @@ -17,7 +17,8 @@ #ifndef SIPCONNECTION_H #define SIPCONNECTION_H -#include +#include + class SipClient; class SipUser; @@ -25,13 +26,15 @@ class SipCall; class SipCallMember; class CallAudio; + + class UserAgent : public QObject { Q_OBJECT public: UserAgent(QString localIP, unsigned sipListenPort, unsigned rtpListenPort); - ~UserAgent(); + virtual ~UserAgent(); void outgoingCall(QString strRemoteUri); void incomingCall(); diff --git a/kmess/network/applications/voiceconversation.cpp b/src/network/applications/voiceconversation.cpp similarity index 84% rename from kmess/network/applications/voiceconversation.cpp rename to src/network/applications/voiceconversation.cpp index 2768f19..559b431 100644 --- a/kmess/network/applications/voiceconversation.cpp +++ b/src/network/applications/voiceconversation.cpp @@ -15,26 +15,20 @@ * * ***************************************************************************/ #include "voiceconversation.h" + +#include "../../currentaccount.h" +#include "../../kmessdebug.h" +#include "../mimemessage.h" #include "sipconnection.h" -//#include -#include -#include -#include -/* -#include -#include -#include -#include -#include -*/ -#include "../../kmessdebug.h" -#include "../../currentaccount.h" -#include "../mimemessage.h" +#include + unsigned SIP_LISTEN_PORT = 5060; unsigned RTP_LISTEN_PORT = 10000; + + VoiceConversation::VoiceConversation(const QString &contactHandle) : MimeApplication(contactHandle), userAgent_(0) @@ -48,7 +42,7 @@ VoiceConversation::VoiceConversation(const QString &contactHandle) VoiceConversation::~VoiceConversation() { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "DESTROYED VoiceConversation" << endl; + kDebug() << "DESTROYED."; #endif if(userAgent_ != 0) @@ -64,7 +58,7 @@ VoiceConversation::~VoiceConversation() void VoiceConversation::contactStarted1_ContactInvitesUser(const MimeMessage& message) { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversation - contactStarted1_ContactInvitesUser" << endl; + kDebug(); #endif remotePublicIp_ = message.getValue("Public-IP"); @@ -93,7 +87,7 @@ void VoiceConversation::contactStarted1_ContactInvitesUser(const MimeMessage& me void VoiceConversation::contactStarted2_UserAccepts() { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversation - contactStarted2_UserAccepts" << endl; + kDebug(); #endif MimeMessage message; @@ -126,7 +120,7 @@ void VoiceConversation::contactStarted2_UserAccepts() message.addField( "UPnP", remoteUPnP_ ); message.addField( "Launch-Application", "TRUE" ); message.addField( "Request-Data", "IP-Address:" ); - message.addField( "IP-Address", getExternalIp().latin1() ); + message.addField( "IP-Address", getExternalIp().toLatin1() ); sendMessage(message); } @@ -137,18 +131,18 @@ void VoiceConversation::contactStarted2_UserAccepts() void VoiceConversation::contactStarted3_ContactConfirmsAccept(const MimeMessage& message) { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversation - contactStarted3_ContactConfirmsAccept" << endl; + kDebug(); #endif // Get the contact's information from the message // QString ipPort = message.getValue("IP-Address"); // remoteUPnP_ = message.getValue("UPnP"); - QString base64IP = message.getValue("IP-Address-Enc64"); // SIP contact IP address - QString ipPort = KCodecs::base64Decode( base64IP.data() ); + QString base64IP( message.getValue( "IP-Address-Enc64" ) ); // SIP contact IP address + QString ipPort ( QByteArray::fromBase64( base64IP.toLatin1() ) ); int pos; - if((pos = ipPort.find(":")) != -1) + if((pos = ipPort.indexOf(":")) != -1) { remotePort_ = ipPort.right(ipPort.length() - (pos + 1)); remoteIp_ = ipPort.left(pos); @@ -180,10 +174,10 @@ QString VoiceConversation::getUserAbortMessage() const void VoiceConversation::startConversation( bool connectToRemote ) { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversation - Start the voice conversation." << endl; + kDebug(); #endif - QString localIP = getLocalIp(); + QString localIP ( getLocalIp() ); bool isDirectConnect = (getExternalIp() == remotePublicIp_); if(foundUPnPDevice_ && ! isDirectConnect) @@ -208,24 +202,26 @@ void VoiceConversation::startConversation( bool connectToRemote ) // Abort if the audio device can't be opened. if(! userAgent_->audioCheck()) { - showEventMessage( i18n("The invitation was cancelled. The audio device couldn't be opened."), ChatMessage::CONTENT_APP_CANCELED, ! isUserStartedApp() ); + showEventMessage( i18n("The invitation was cancelled. The audio device could not be opened."), ChatMessage::CONTENT_APP_CANCELED, ! isUserStartedApp() ); sendCancelMessage(CANCEL_FAILED); return; } + // Remove the accept links + modifyOfferMessage(); if(connectToRemote) { // Make outgoing call // Doesn't have username@hostname format, will it work ? userAgent_->outgoingCall( "sip:" + remoteIp_ + ":" + remotePort_ ); - showEventMessage( i18n("Start voice conversation. Connecting to %1.").arg(remoteIp_), ChatMessage::CONTENT_APP_INFO, false ); + showEventMessage( i18n("Start voice conversation. Connecting to %1.", remoteIp_), ChatMessage::CONTENT_APP_INFO, false ); } else { // Wait for an incoming call userAgent_->incomingCall(); - showEventMessage( i18n("Start voice conversation. Listening on %1.").arg(localIP), ChatMessage::CONTENT_APP_INFO, true ); + showEventMessage( i18n("Start voice conversation. Listening on %1.", localIP), ChatMessage::CONTENT_APP_INFO, true ); } } @@ -235,7 +231,7 @@ void VoiceConversation::startConversation( bool connectToRemote ) void VoiceConversation::userAborted() { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversation - userAborted" << endl; + kDebug(); #endif // Stop the KPhone application now. (not in destructor) @@ -255,13 +251,13 @@ void VoiceConversation::userAborted() void VoiceConversation::userStarted1_UserInvitesContact() { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversion - userStarted1_UserInvitesContact" << endl; + kDebug(); #endif 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_) @@ -299,7 +295,7 @@ void VoiceConversation::userStarted1_UserInvitesContact() void VoiceConversation::userStarted2_ContactAccepts(const MimeMessage& message) { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversation - userStarted2_ContactAccepts" << endl; + kDebug(); #endif // Store the data from the message @@ -313,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_); @@ -321,14 +317,14 @@ void VoiceConversation::userStarted2_ContactAccepts(const MimeMessage& message) if(foundUPnPDevice_ && ! isDirectConnect) { // UPnP NAT Traversal support - sipContactAddress.sprintf("%s:%d", getExternalIp().latin1(), SIP_LISTEN_PORT); + sipContactAddress = getExternalIp() + ":" + QString::number( SIP_LISTEN_PORT ); } else { - sipContactAddress.sprintf("%s:%d", getLocalIp().latin1(), SIP_LISTEN_PORT); + sipContactAddress = getLocalIp() + ":" + QString::number( SIP_LISTEN_PORT ); } - QString sipContactEncoded = QString::fromUtf8(KCodecs::base64Encode( sipContactAddress.utf8() )); + QString sipContactEncoded( sipContactAddress.toLatin1().toBase64() ); response.addField( "Invitation-Command", "ACCEPT" ); response.addField( "Context-Data", "Requested:SIP_A,;" ); @@ -354,7 +350,7 @@ void VoiceConversation::userStarted2_ContactAccepts(const MimeMessage& message) void VoiceConversation::userStarted3_UserPrepares() { #ifdef KMESSDEBUG_VOICECONVERSATION - kdDebug() << "VoiceConversation - userStarted3_UserPrepares" << endl; + kDebug(); #endif // Start the application diff --git a/kmess/network/applications/voiceconversation.h b/src/network/applications/voiceconversation.h similarity index 97% rename from kmess/network/applications/voiceconversation.h rename to src/network/applications/voiceconversation.h index b19e506..565f88d 100644 --- a/kmess/network/applications/voiceconversation.h +++ b/src/network/applications/voiceconversation.h @@ -19,14 +19,15 @@ #ifndef VOICECONVERSATION_H #define VOICECONVERSATION_H -#include -//#include #include "mimeapplication.h" + // Forward declarations class MimeMessage; class UserAgent; + + class VoiceConversation : public MimeApplication { Q_OBJECT @@ -35,7 +36,7 @@ class VoiceConversation : public MimeApplication // The constructor VoiceConversation(const QString &contactHandle); // The destructor - ~VoiceConversation(); + virtual ~VoiceConversation(); // Return the application's GUID static QString getAppId(); // User stop voice conversation diff --git a/kmess/network/applications/webapplicationp2p.cpp b/src/network/applications/webapplicationp2p.cpp similarity index 75% rename from kmess/network/applications/webapplicationp2p.cpp rename to src/network/applications/webapplicationp2p.cpp index b93a47e..ba33e87 100644 --- a/kmess/network/applications/webapplicationp2p.cpp +++ b/src/network/applications/webapplicationp2p.cpp @@ -17,13 +17,12 @@ #include "webapplicationp2p.h" +#include "../../kmessdebug.h" #include "../mimemessage.h" -#include "../../kmessdebug.h" +#include + -#include -#include -#include /** * Constructor @@ -67,15 +66,15 @@ WebApplicationP2P::~WebApplicationP2P() void WebApplicationP2P::contactStarted1_ContactInvitesUser(const MimeMessage &message) { #ifdef KMESSDEBUG_WEBAPPLICATION_P2P - kdDebug() << "WebApplicationP2P - contactStarted1_ContactInvitesUser" << endl; + kDebug() << "contactStarted1_ContactInvitesUser"; #endif - QString appID = message.getValue("AppID"); - QString context = message.getValue("Context"); + QString appID ( message.getValue("AppID") ); + QString context( message.getValue("Context") ); #ifdef KMESSTEST - ASSERT( appID.length() == 8 ); + KMESS_ASSERT( appID.length() == 8 ); #endif // Split the appID @@ -83,27 +82,24 @@ 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::fromUcs2(). - QByteArray decodedContext; - KCodecs::base64Decode(context.utf8(), decodedContext); - // Contents is something like '10331021;1;Tic Tac Toe' - QString contextString = QString::fromUcs2( reinterpret_cast(decodedContext.data()) ); + 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 - ASSERT( contextString.section(';', 0, 0) == appID ); + KMESS_ASSERT( contextString.section(';', 0, 0) == appID ); #endif // KMess does not support the webapplication invitations yet, // this class only parses the context so we can produce a proper error message // Warn the user we received an unknown invitation - showSystemMessage( i18n("The contact is inviting you for '%1', but this is not implemented yet.") - .arg( appName ), + showSystemMessage( i18n( "The contact is inviting you for '%1', but this is not implemented yet.", + appName ), ChatMessage::CONTENT_SYSTEM_NOTICE, true ); // Tell the contact we don't support this. @@ -122,3 +118,5 @@ QString WebApplicationP2P::getAppId() { return "{6A13AF9C-5308-4F35-923A-67E8DDA40C2F}"; } + +#include "webapplicationp2p.moc" diff --git a/kmess/network/applications/webapplicationp2p.h b/src/network/applications/webapplicationp2p.h similarity index 99% rename from kmess/network/applications/webapplicationp2p.h rename to src/network/applications/webapplicationp2p.h index b5ef886..01b318e 100644 --- a/kmess/network/applications/webapplicationp2p.h +++ b/src/network/applications/webapplicationp2p.h @@ -21,6 +21,7 @@ #include "p2papplication.h" + /** * This class handles the invitations for msn games and online activities. * Those invitations are found in the "Games" and "Activities" buttons of the official client. diff --git a/src/network/applications/webcamtransferp2p.cpp b/src/network/applications/webcamtransferp2p.cpp new file mode 100644 index 0000000..55ec994 --- /dev/null +++ b/src/network/applications/webcamtransferp2p.cpp @@ -0,0 +1,754 @@ +/*************************************************************************** + webcamtransferp2p.cpp - description + ------------------- + begin : Sun Aug 7 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 "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. +// + + + + +/** + * Constructor + * + * @param applicationList The shared sources for the contact. + */ +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() )); +} + + + +/** + * Destructor + */ +WebcamTransferP2P::~WebcamTransferP2P() +{ + delete webcamConnectionPool_; + webcamConnection_ = 0; // will be deleted by the direct connection pool. +} + + + +/** + * Step one of a contact-started chat: the contact invites the user + * + * @param message The invitation message + */ +void WebcamTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage & message) +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug(); +#endif + +#if ENABLE_WEBCAM + + // Read the values from the message + uint appID = message.getValue("AppID").toUInt(); + QString eufGuid( message.getValue("EUF-GUID") ); + QString context( message.getValue("Context") ); + + 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 contact'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.", + i18n("webcam") ), + ChatMessage::CONTENT_SYSTEM_NOTICE, true ); + + // Tell the contact we don't support this. + sendCancelMessage(CANCEL_NOT_INSTALLED); +#endif +} + + + +/** + * 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() ?? +} + + + +/** + * Return the application's GUID for "user push" invitations. + */ +QString WebcamTransferP2P::getPushAppId() +{ + return "{4BD96FC0-AB17-4425-A14A-439185962DC8}"; +} + + + +/** + * Return the application's GUID for "contact pull" invitations. + */ +QString WebcamTransferP2P::getPullAppId() +{ + return "{1C9AA97E-9C05-4583-A3BD-908A196F1E92}"; +} + + + +/** + * 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 new file mode 100644 index 0000000..34c00cb --- /dev/null +++ b/src/network/applications/webcamtransferp2p.h @@ -0,0 +1,110 @@ +/*************************************************************************** + webcamtransferp2p.h - description + ------------------- + begin : Wed Dec 27 2006 + copyright : (C) 2006 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 WEBCAMTRANSFERP2P_H +#define WEBCAMTRANSFERP2P_H + +#include "p2papplication.h" + +#include + +class MsnWebcamConnection; +class DirectConnectionPool; + + + +/** + * This class handles the invitations for webcam video transfer. + * + * This is currently a STUB class. It rejects the invitation, + * but displays a better error message instead of "some MSN6 invitation is not supported". + * + * @author Diederik van der Boor + * @ingroup Applications + */ +class WebcamTransferP2P : public P2PApplication +{ + Q_OBJECT + + public: + // The constructor without application parameters (sufficient for incoming sessions) + WebcamTransferP2P(ApplicationList *applicationList); + // The constructor with application parameters to start a session +// WebcamTransferP2P(const QString &contactHandle, ...); + + // 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(); + + // Return the application's GUID (for the "contact pull" invitation) + 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/kmess/network/chatinformation.cpp b/src/network/chatinformation.cpp similarity index 93% rename from kmess/network/chatinformation.cpp rename to src/network/chatinformation.cpp index 5e4d18e..22b02ab 100644 --- a/kmess/network/chatinformation.cpp +++ b/src/network/chatinformation.cpp @@ -17,7 +17,7 @@ #include "chatinformation.h" -#include +#include @@ -38,7 +38,7 @@ ChatInformation::ChatInformation( MsnNotificationConnection *parent, const QStri // The constructor for a contact-started chat ChatInformation::ChatInformation( MsnNotificationConnection *parent, const QString& handle, - const QString &ip, int port, const QString &authorization, const QString &chatId, + const QString &ip, quint16 port, const QString &authorization, const QString &chatId, ConnectionType type ) : authorization_(authorization) , chatId_(chatId) @@ -103,7 +103,7 @@ MsnNotificationConnection * ChatInformation::getNotificationConnection() const // Return the switchboard server port -const int& ChatInformation::getPort() const +quint16 ChatInformation::getPort() const { return port_; } @@ -143,7 +143,7 @@ bool ChatInformation::getUserStartedChat() const // Set server information -void ChatInformation::setServerInformation( const QString& ip, const int& port, const QString& authorization ) +void ChatInformation::setServerInformation( const QString& ip, const quint16& port, const QString& authorization ) { ip_ = ip; port_ = port; diff --git a/kmess/network/chatinformation.h b/src/network/chatinformation.h similarity index 95% rename from kmess/network/chatinformation.h rename to src/network/chatinformation.h index 7077517..da4c547 100644 --- a/kmess/network/chatinformation.h +++ b/src/network/chatinformation.h @@ -18,12 +18,15 @@ #ifndef CHATINFORMATION_H #define CHATINFORMATION_H -#include +#include + // Forward declarations class ContactList; class MsnNotificationConnection; + + /** * The container for switchboard connections information. * @@ -53,7 +56,7 @@ class ChatInformation int transactionId, ConnectionType type ); // The constructor for a contact-started chat ChatInformation( MsnNotificationConnection *parent, const QString& handle, - const QString &ip, int port, const QString &authorization, + const QString &ip, quint16 port, const QString &authorization, const QString &chatId, ConnectionType type ); // The destructor ~ChatInformation(); @@ -68,7 +71,7 @@ class ChatInformation // Return the notification connection that spawned this object MsnNotificationConnection *getNotificationConnection() const; // Return the switchboard server port - const int& getPort() const; + quint16 getPort() const; // Return the time of when the SB transfer request has been sent int getTime() const; // Return the transaction ID used in the "XFR" command. @@ -78,7 +81,7 @@ class ChatInformation // Return whether the user started the chat bool getUserStartedChat() const; // Set server information - void setServerInformation( const QString& ip, const int& port, const QString& authorization ); + void setServerInformation( const QString& ip, const quint16& port, const QString& authorization ); private: // Private attributes @@ -95,7 +98,7 @@ class ChatInformation // The notification connection that spawned this object MsnNotificationConnection *notificationConnection_; // The switchboard server's port - int port_; + quint16 port_; // The time when the SB transfer request was issued to the notification server uint requestTime_; // The transaction ID used in the "XFR" command. diff --git a/kmess/chat/chatmessage.cpp b/src/network/chatmessage.cpp similarity index 96% rename from kmess/chat/chatmessage.cpp rename to src/network/chatmessage.cpp index cb5b467..cdf3282 100644 --- a/kmess/chat/chatmessage.cpp +++ b/src/network/chatmessage.cpp @@ -17,8 +17,6 @@ #include "chatmessage.h" -#include - // The constructor @@ -142,6 +140,14 @@ ChatMessage::MessageType ChatMessage::getType() const +// Return whether the body is already in HTML format. +bool ChatMessage::hasHtmlBody() const +{ + return ( contentsClass_ == CONTENT_MESSAGE_INK ); +} + + + // Return whether the message is incoming or outgoing bool ChatMessage::isIncoming() const { diff --git a/kmess/chat/chatmessage.h b/src/network/chatmessage.h similarity index 90% rename from kmess/chat/chatmessage.h rename to src/network/chatmessage.h index 3deb346..192811e 100644 --- a/kmess/chat/chatmessage.h +++ b/src/network/chatmessage.h @@ -18,16 +18,20 @@ #ifndef CHATMESSAGE_H #define CHATMESSAGE_H -#include -#include -#include +#include +#include +#include + class ContactBase; + /** * A class describing a chat message. + * * @author Diederik van der Boor + * @ingroup NetworkCore */ class ChatMessage { @@ -41,7 +45,8 @@ class ChatMessage TYPE_APPLICATION_FILE, // File transfer message TYPE_APPLICATION_WEBCAM, // Cam session message TYPE_APPLICATION_AUDIO, // Audio conversation session message - TYPE_NOTIFICATION, // Message events notification: winks, nudges, contact join/leave events, ... + TYPE_NOTIFICATION, // Message events notification: winks, nudges, ... + TYPE_PRESENCE, // Presence events: contact join and leave events, ... TYPE_SYSTEM, // Protocol messages: user is offline, message sending failed, ... TYPE_OFFLINE_INCOMING // Incoming offline IM Message }; @@ -50,10 +55,13 @@ class ChatMessage enum ContentsClass { CONTENT_MESSAGE, + CONTENT_MESSAGE_INK, // Ink / handwriting 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_PRESENCE_JOIN, // A contact has joined the chat + CONTENT_PRESENCE_LEAVE, // A contact has left the chat + CONTENT_PRESENCE_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" @@ -104,6 +112,8 @@ class ChatMessage const QTime getTime() const; // Return the message type MessageType getType() const; + // Return whether the body is already in HTML format. + bool hasHtmlBody() const; // Return whether the message is incoming or outgoing bool isIncoming() const; // Return whether it's a normal chat message diff --git a/kmess/network/extra/directconnectionbase.cpp b/src/network/extra/directconnectionbase.cpp similarity index 57% rename from kmess/network/extra/directconnectionbase.cpp rename to src/network/extra/directconnectionbase.cpp index a9d585f..147b4c4 100644 --- a/kmess/network/extra/directconnectionbase.cpp +++ b/src/network/extra/directconnectionbase.cpp @@ -17,36 +17,50 @@ #include "directconnectionbase.h" +#include "../../utils/kmessconfig.h" #include "../../kmessdebug.h" -#include +#include +#include +#include +#include + +#include -#include -#include -#include #ifdef KMESSDEBUG_DIRECTCONNECTION #define KMESSDEBUG_DIRECTCONNECTION_GENERAL #endif -int DirectConnectionBase::nextServerPort_(6891); +quint16 DirectConnectionBase::nextServerPort_( 0 ); + // The constructor -DirectConnectionBase::DirectConnectionBase( QObject *parent, const char *name) - : QObject(parent, name) +DirectConnectionBase::DirectConnectionBase( QObject *parent ) + : QObject(parent) , authorized_(false) , isServer_(false) , lastWriteFailed_(false) , server_(0) - , serverPort_(-1) + , serverPort_(0) , socket_(0) , timeout_(false) , writeHandlerCount_(0) { connect( &connectionTimer_, SIGNAL( timeout() ), this, SLOT ( slotConnectionTimeout() )); + + // 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( "highestTransferPort", 6900 ); +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "Using port interval" << lowestServerPortLimit_ << "-" << highestServerPortLimit_; +#endif + + connectionTimer_.setSingleShot( true ); } @@ -61,7 +75,7 @@ DirectConnectionBase::~DirectConnectionBase() } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DESTROYED DirectConnectionBase [connectTo=" << connectingTo_ << "]" << endl; + kDebug() << "DESTROYED. [connectTo=" << connectingTo_ << " wasConnected=" << isConnected() << " wasServer=" << isServer_ << " wasAuthorized=" << authorized_ << "]"; #endif } @@ -71,11 +85,11 @@ DirectConnectionBase::~DirectConnectionBase() void DirectConnectionBase::closeConnection() { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase: closing sockets" << endl; + kDebug() << "closing sockets"; #endif // Reset globals - // Also see slotSocketClosed() + // Also see slotSocketDisconnected() isServer_ = false; authorized_ = false; connectionTimer_.stop(); @@ -83,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) { @@ -95,7 +105,9 @@ void DirectConnectionBase::closeConnection() } + // Close and delete the client socket +// if the socket_ is already deleted, this method does nothing bool DirectConnectionBase::closeClientSocket() { connectionTimer_.stop(); @@ -107,37 +119,66 @@ bool DirectConnectionBase::closeClientSocket() } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::closeClientSocket() - destroying client socket." << endl; + kDebug() << "destroying client socket."; #endif - // Close and delete the socket - socket_->flush(); - socket_->closeNow(); // also calls cancelAsyncConnect() - delete socket_; +#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 KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "destroyed client socket."; +#endif + return true; } + // Close and delete the server socket bool DirectConnectionBase::closeServerSocket() { +#ifdef KMESSTEST + 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 - kdDebug() << "DirectConnectionBase::closeServerSocket() - destroying server socket." << endl; + if( socket_ == 0 ) + { + kDebug() << "destroying server socket."; + } + else + { + kDebug() << "closing server socket. Object will not be destroyed yet because a socket is connected."; + } #endif - server_->closeNow(); - delete server_; - server_ = 0; + // Close the server + server_->close(); + + // 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; } @@ -149,7 +190,7 @@ void DirectConnectionBase::connectWriteHandler(QObject *receiver, const char *sl if( KMESS_NULL(socket_) ) return; // Enable the readyWrite signal. - // This is invoked each time the write-buffer is empty, + // This is invoked each time data is written off the write-buffer. // meaning the derived class can send data fast in a autonomous way. // When you don't need to write commands very often, @@ -163,11 +204,15 @@ void DirectConnectionBase::connectWriteHandler(QObject *receiver, const char *sl if( writeHandlerCount_++ <= 0 ) { - socket_->enableWrite( true ); - connect( socket_, SIGNAL(readyWrite()), this, SLOT(slotSocketReadyWrite()) ); + connect( socket_, SIGNAL(bytesWritten(qint64)), this, SLOT(slotSocketReadyWrite(qint64)) ); } connect( this, SIGNAL(writeHandlerReady()), receiver, slot ); + + // Starting with Qt 4, there is no real "readyWrite()" signal anymore, + // only a bytesWritten(). We use that signal to fake the existance of a readyWrite(). + // Start the first round now. + emit writeHandlerReady(); } @@ -180,8 +225,7 @@ void DirectConnectionBase::disconnectWriteHandler(QObject *receiver, const char // If all listeners are unset, disable the signal again. if( --writeHandlerCount_ <= 0 ) { - socket_->enableWrite( false ); - disconnect( socket_, SIGNAL(readyWrite()), this, SLOT(slotSocketReadyWrite()) ); + disconnect( socket_, SIGNAL(bytesWritten(qint64)), this, SLOT(slotSocketReadyWrite(qint64)) ); } disconnect( this, SIGNAL(writeHandlerReady()), receiver, slot ); @@ -190,7 +234,7 @@ void DirectConnectionBase::disconnectWriteHandler(QObject *receiver, const char // Return the number of bytes which are already received in the local buffer -int DirectConnectionBase::getAvailableBytes() const +qint64 DirectConnectionBase::getAvailableBytes() const { if(KMESS_NULL(socket_)) return -2; // same as KExtendedSocket API, means "invalid state" return socket_->bytesAvailable(); @@ -199,10 +243,10 @@ int DirectConnectionBase::getAvailableBytes() const // Get the server port that will be used -int DirectConnectionBase::getLocalServerPort() +quint16 DirectConnectionBase::getLocalServerPort() { // Port not chosen yet - if( serverPort_ < 0 ) + if( serverPort_ == 0 ) { // It's possible to use a random port nowadays, // old clients with the "only port 6891" are no longer in use. @@ -212,16 +256,16 @@ int DirectConnectionBase::getLocalServerPort() // // TODO: verify whether we can use the port by calling openServerPort() earlier. - if(nextServerPort_ > 6900) + if( nextServerPort_ == 0 || nextServerPort_ > highestServerPortLimit_ ) { - nextServerPort_ = 6891; + nextServerPort_ = lowestServerPortLimit_; } serverPort_ = nextServerPort_; nextServerPort_++; #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::getLocalServerPort: Reserved port " << serverPort_ << " for server socket." << endl; + kDebug() << "Reserved port " << serverPort_ << " for server socket."; #endif } @@ -237,32 +281,23 @@ QString DirectConnectionBase::getRemoteIp() const { return QString::null; } - else if( socket_->peerAddress() == 0 ) - { - return QString::null; - } - else - { - return socket_->peerAddress()->nodeName(); - } + + QHostAddress address = socket_->peerAddress(); + return address.toString(); } // Get the remote port the socket is connected with. -QString DirectConnectionBase::getRemotePort() const +quint16 DirectConnectionBase::getRemotePort() const { if(socket_ == 0) { - return QString::null; - } - else if( socket_->peerAddress() == 0 ) - { - return QString::null; + return 0; } else { - return socket_->peerAddress()->serviceName(); + return socket_->peerPort(); } } @@ -281,10 +316,7 @@ QString DirectConnectionBase::getSocketError() const } else { - // The return value of systemError() is the "errno" value from errno.h at the - // time the socket system-call failed. This function hides the low-level stuff - // like "errno" (see man:errno(3)) and perror() (see man:perror(3)) - return KExtendedSocket::strError( socket_->status(), socket_->systemError() ); + return socket_->errorString(); } } @@ -335,7 +367,7 @@ bool DirectConnectionBase::isAuthorized() const // Return true if a connection is active bool DirectConnectionBase::isConnected() const { - return (socket_ != 0 && socket_->socketStatus() == KExtendedSocket::connected); + return ( socket_ != 0 && socket_->isValid() && socket_->state() == QAbstractSocket::ConnectedState ); } @@ -357,13 +389,13 @@ bool DirectConnectionBase::isWriteHandlerConnected() const // Connect to a host -bool DirectConnectionBase::openConnection(const QString &ipAddress, const int port, bool async) +bool DirectConnectionBase::openConnection( const QString &ipAddress, const quint16 port ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::openConnection: Connecting to " << ipAddress << " port " << port << "." << endl; + kDebug() << "Connecting to " << ipAddress << " port " << port << "."; #endif #ifdef KMESSTEST - ASSERT( socket_ == 0 ); + KMESS_ASSERT( socket_ == 0 ); #endif connectingTo_ = ipAddress + ":" + QString::number(port); @@ -371,46 +403,29 @@ bool DirectConnectionBase::openConnection(const QString &ipAddress, const int po // Note that a buffered socket only emits the readyRead() signal when data is really received. // The socket is made non-blocking, so the connectionSuccess() signal tells us when the connection is made. // Otherwise KMess would freeze until a connection is made or fails. - socket_ = new KExtendedSocket(ipAddress, port, KExtendedSocket::bufferedSocket ); - socket_->enableRead(true); - socket_->enableWrite(false); - socket_->setBlockingMode(false); // avoid blocking until connect() returns - socket_->setTimeout(10); - connect( socket_, SIGNAL( readyRead() ), this, SLOT( slotDataReceived() )); - connect( socket_, SIGNAL( connectionFailed(int) ), this, SLOT( slotSocketFailed() )); - connect( socket_, SIGNAL( connectionSuccess() ), this, SLOT( slotSocketConnected() )); - connect( socket_, SIGNAL( closed(int) ), this, SLOT( slotSocketClosed(int) )); + socket_ = new QTcpSocket( this ); + //KExtendedSocket(ipAddress, port, KExtendedSocket::bufferedSocket ); + connect( socket_, SIGNAL( connected() ), + this, SLOT ( slotSocketConnected() )); + connect( socket_, SIGNAL( disconnected() ), + this, SLOT ( slotSocketDisconnected() )); + connect( socket_, SIGNAL( readyRead() ), + this, SLOT ( slotSocketDataReceived() )); + connect( socket_, SIGNAL( error(QAbstractSocket::SocketError) ), + this, SLOT ( slotSocketError(QAbstractSocket::SocketError) )); // Indicate we'll become a direct-connection client. isServer_ = false; timeout_ = false; // Start timer, as the asyncConnect doesn't seam to honor the timeout value. - // Needs to be started before startAsyncConnect() because it could call slotSocketFailed() directly. - connectionTimer_.start(10000, true); + // Needs to be started before connectToHost() to avoid a potential race condition if the call failed immediately. + connectionTimer_.start( 10000 ); // Connect the socket - int connectResult = 0; - if( async ) - { - connectResult = socket_->startAsyncConnect(); - } - else - { - connectResult = socket_->connect(); - } + socket_->connectToHost( ipAddress, port ); - // Connect the socket - if(connectResult != 0) - { - kdWarning() << "DirectConnectionBase::openConnection: Couldn't connect new socket" << endl; - delete socket_; - socket_ = 0; - writeHandlerCount_ = 0; - return false; - } - - // The code continues with slotSocketConnected() or slotSocketFailed() + // The code continues with slotSocketConnected() or slotSocketError() return true; } @@ -420,53 +435,39 @@ bool DirectConnectionBase::openConnection(const QString &ipAddress, const int po bool DirectConnectionBase::openServerPort() { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::openServerPort - Creating server socket." << endl; + kDebug() << "Creating server socket."; #endif #ifdef KMESSTEST - ASSERT( server_ == 0 ); + KMESS_ASSERT( server_ == 0 ); #endif - int port; - bool portSuccess; - int listenResult; - - // Create the server socket to the given port. - server_ = new KExtendedSocket(); - server_->setSocketFlags( KExtendedSocket::noResolve | KExtendedSocket::passiveSocket ); - - // Set the port - port = getLocalServerPort(); - portSuccess = server_->setPort(port); - if(! portSuccess ) - { - kdWarning() << "DirectConnectionBase: Could not use port " << port << "." << endl; - serverPort_ = -1; // reset, so getLocalServerPort() picks the next port with another openServerPort() call. - delete server_; - server_ = 0; - return false; - } + quint16 port; + // Get the port + port = getLocalServerPort(); connectingTo_ = "0.0.0.0:" + QString::number(port); - // Connect the server to signal when it is ready to accept a connection - connect( server_, SIGNAL( readyAccept() ), this, SLOT( slotAcceptConnection() )); + // Create the server socket to the given port. + server_ = new QTcpServer( this ); + server_->setMaxPendingConnections( 1 ); + connect( server_, SIGNAL( newConnection() ), this, SLOT( slotAcceptConnection() )); // Start timer, but allow a longer timeout. // Start before listen() so event's will stop the timer agian. - connectionTimer_.start(30000, true); + connectionTimer_.start( 30000 ); // Indicate we'll become a direct-connection server. isServer_ = true; timeout_ = false; // Put the socket in listen mode. - listenResult = server_->listen(1); // Refuse parallel connections - if(listenResult != 0) + bool listenSuccess = server_->listen( QHostAddress::Any, port ); + if( ! listenSuccess ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase: Could not listen at port " << port << ", freeing for next one." << endl; + kDebug() << "Could not listen at port " << port << ", freeing for next one."; #endif - serverPort_ = -1; // reset, so getLocalServerPort() picks the next port with another openServerPort() call. + serverPort_ = 0; // reset, so getLocalServerPort() picks the next port with another openServerPort() call. delete server_; server_ = 0; return false; @@ -479,55 +480,46 @@ bool DirectConnectionBase::openServerPort() // Verify how many bytes the read buffer has. Note this actually reads the data to test it. -int DirectConnectionBase::peekBlock( const uint size ) +qint64 DirectConnectionBase::peekBlock( const qint64 size ) { // Avoid crashes if(KMESS_NULL(socket_)) return -1; // Read the data and see how much got read. // This is the only reliable method, but expensive in terms of performance. - QByteArray buffer( size ); + QByteArray buffer; + buffer.resize( (int)size ); #ifdef KMESSTEST - ASSERT( size > 0 ); - ASSERT( buffer.size() == size ); + KMESS_ASSERT( size > 0 ); + KMESS_ASSERT( buffer.size() == size ); #endif - return socket_->peekBlock( buffer.data(), size ); + return socket_->peek( buffer.data(), size ); } // Read data from the socket -int DirectConnectionBase::readBlock( char *buffer, uint size ) +qint64 DirectConnectionBase::readBlock( char *buffer, qint64 size ) { // Avoid crashes if(KMESS_NULL(socket_)) return -1; if(KMESS_NULL(buffer)) return -1; // Fill the buffer - Q_LONG noBytesRead = socket_->readBlock( buffer, size ); + qint64 noBytesRead = socket_->read( buffer, size ); if( noBytesRead < 0 ) { - if( socket_->systemError() == EWOULDBLOCK ) - { -#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::readBlock() - got system error EWOULDBLOCK, buffer is empty." << endl; -#endif - return 0; - } - else - { - kdWarning() << "DirectConnectionBase::readBlock() - Error while reading " << size << " bytes from socket, return code: " << noBytesRead << ", system error: " << getSocketError() << " remote address: " << getRemoteIp() << ":" << getRemotePort() << "!" << endl; - return -1; - } + kWarning() << "Error while reading " << size << " bytes from socket, return code: " << noBytesRead << ", system error: " << getSocketError() << " remote address: " << getRemoteIp() << ":" << getRemotePort() << "!"; + return -1; } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - if( (uint) noBytesRead < size ) + if( noBytesRead < size ) { // TODO: Even if the code detects it's not connected anymore, we don't signal this yet. // It opens a new can of worms to handle various event flows which are covered now. - kdDebug() << "DirectConnectionBase::readBlock() - only " << noBytesRead - << " of " << size << " bytes could be read (still connected=" << isConnected() << ")." << endl; + kDebug() << "only " << noBytesRead + << " of " << size << " bytes could be read (still connected=" << isConnected() << ")."; } #endif @@ -538,7 +530,7 @@ int DirectConnectionBase::readBlock( char *buffer, uint size ) // Read data from the socket (uses the QByteArray size() as block size) -int DirectConnectionBase::readBlock( QByteArray &buffer, const uint maxSize, const uint bufferOffset ) +qint64 DirectConnectionBase::readBlock( QByteArray &buffer, const qint64 maxSize, const qint64 bufferOffset ) { // Avoid crashes if(KMESS_NULL(socket_)) return -1; @@ -546,45 +538,62 @@ int DirectConnectionBase::readBlock( QByteArray &buffer, const uint maxSize, con // Make final connected check if( ! isConnected() ) { - kdWarning() << "DirectConnectionBase::readBlock() - Attempting to read data from a disconnected socket." << endl; + kWarning() << "Attempting to read data from a disconnected socket."; return false; } // Determine the maximum number of bytes we can write to the buffer - int bufferSpace = buffer.size() - bufferOffset; + qint64 bufferSpace = buffer.size() - bufferOffset; // API usage check. // Warn if certain sizes get a unusual value if(buffer.size() == 0) { - kdWarning() << "DirectConnectionBase::readBlock() - Buffer is not initialized!" << endl; + kWarning() << "Buffer is not initialized!"; return -1; } else if(bufferSpace < 0) { - kdWarning() << "DirectConnectionBase::readBlock() - Offset of " << bufferOffset << " bytes" - << " exceeds the buffer size of " << buffer.size() << " bytes!" << endl; + kWarning() << "Offset of " << bufferOffset << " bytes" + << " exceeds the buffer size of " << buffer.size() << " bytes!"; } - else if( (uint) bufferSpace < maxSize) + else if( bufferSpace < maxSize) { - kdWarning() << "DirectConnectionBase::readBlock() - Maximum allowed read size" - << " exceeds the buffer size of " << buffer.size() << " bytes!" << endl; + kWarning() << "Maximum allowed read size" + << " exceeds the buffer size of " << buffer.size() << " bytes!"; } // Fill the buffer from the give offset, // size argument is limited to what the buffer can/may sustain. char *bufferStart = buffer.data() + bufferOffset; - uint size = QMIN( (uint) bufferSpace, maxSize ); + qint64 size = qMin( bufferSpace, maxSize ); return readBlock( bufferStart, size ); } +// 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) { #ifdef KMESSTEST - ASSERT( isConnected() ); + KMESS_ASSERT( isConnected() ); #endif // notify when it wasn't authorized before, but will be authorized now. @@ -598,7 +607,7 @@ void DirectConnectionBase::setAuthorized(bool authorized) } else { - kdWarning() << "DirectConnectionBase::setAuthorized() - connection is already authorized, not notifying applications again." << endl; + kWarning() << "connection is already authorized, not notifying applications again."; } } @@ -608,30 +617,29 @@ void DirectConnectionBase::setAuthorized(bool authorized) void DirectConnectionBase::slotAcceptConnection() { #ifdef KMESSTEST - ASSERT( socket_ == 0 ); + KMESS_ASSERT( socket_ == 0 ); + KMESS_ASSERT( server_ != 0 ); #endif #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase: Accept a socket" << endl; + kDebug() << "Accept a socket"; #endif if(socket_ != 0) { // Already accepted a connection, close server #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase: Already got a connection, rejecting this request" << endl; + kDebug() << "Already got a connection, rejecting this request"; #endif - closeServerSocket(); return; } // Wait until a connection was established - server_->setBlockingMode(true); - - if(server_->accept(socket_) != 0) + socket_ = server_->nextPendingConnection(); + if( socket_ == 0 ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdWarning() << "DirectConnectionBase: Failed to accept incoming connection." << endl; + kWarning() << "Failed to accept incoming connection."; #endif // TODO: signal failure? return; @@ -639,22 +647,21 @@ void DirectConnectionBase::slotAcceptConnection() // Accept success #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase: Accept success" << endl; + kDebug() << "Accept success"; #endif - // Close the server, we don't need to anymore (no connectionClosed events()). - server_->closeNow(); - delete server_; - server_ = 0; + // Close the server, we don't need it anymore (no connectionClosed events()). + // Can't delete the object here, because socket_ becomes a qobject child of server_. + server_->close(); connectionTimer_.stop(); - // Configure the socket for asynchronous operation - socket_->enableRead(true); - socket_->enableWrite(false); - socket_->setBlockingMode(false); - socket_->setTimeout(10); - connect( socket_, SIGNAL( readyRead() ), this, SLOT( slotDataReceived() )); - connect( socket_, SIGNAL( connectionFailed(int) ), this, SLOT( slotConnectionFailed() )); + // Connect the socket signals + connect( socket_, SIGNAL( disconnected() ), + this, SLOT ( slotSocketDisconnected() )); + connect( socket_, SIGNAL( readyRead() ), + this, SLOT ( slotSocketDataReceived() )); + connect( socket_, SIGNAL( error(QAbstractSocket::SocketError) ), + this, SLOT ( slotSocketError(QAbstractSocket::SocketError) )); // Inform there is a connection emit connectionEstablished(); @@ -682,18 +689,18 @@ 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() ) { - kdWarning() << "DirectConnectionBase: Failed to connect with " << connectingTo_ << ", system error: " << sysError << "." << endl; + kWarning() << "Failed to connect with " << connectingTo_ << ", system error: " << sysError << "."; } else { - kdWarning() << "DirectConnectionBase: Failed to connect with " << connectingTo_ << "!" << endl; + kWarning() << "Failed to connect with " << connectingTo_ << "!"; } - // No events here, this method is called from slotSocketFailed() + // No events here, this method is called from slotSocketError() } @@ -710,16 +717,16 @@ void DirectConnectionBase::slotConnectionTimeout() // This bug is fixed, but keep the check nevertheless. #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotConnectionTimeout: Timer fired but connection " - "with " << connectingTo_ << " is already established, ignore." << endl; + kDebug() << "Timer fired but connection " + "with " << connectingTo_ << " is already established, ignore."; #endif return; } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotConnectionTimeout: Timer fired before connection " + kDebug() << "Timer fired before connection " "with " << connectingTo_ << " was established, " - "closing sockets and reporting failure." << endl; + "closing sockets and reporting failure."; #endif // Delete sockets, no connectionClosed events. @@ -730,12 +737,6 @@ void DirectConnectionBase::slotConnectionTimeout() timeout_ = true; connectionTimer_.stop(); - // Make sure the sockets are removed. - // When the class is reused, create new sockets. - // Avoids calls to isConnected() at a socket in bad state. - closeClientSocket(); - closeServerSocket(); - // Inform derived class and other listeners // This pretends we're connected to our signals but without generating the overhead. slotConnectionFailed(); @@ -744,48 +745,15 @@ void DirectConnectionBase::slotConnectionTimeout() -// Signal that the connection was closed -void DirectConnectionBase::slotSocketClosed( int state ) -{ -#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotSocketClosed() - Socket got closed, state=" << state << "." << endl; -#endif - - // Reset the globals. - isServer_ = false; - authorized_ = false; - connectionTimer_.stop(); - - if( ! ( state & KBufferedIO::closedNow ) ) - { - // Make sure the objects are cleaned up too. - closeClientSocket(); - closeServerSocket(); - } - -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_CLOSE(this); -#endif - - // Only notify if the remote connection closed the socket. - // Otherwise it was done by this class. - if( state & KBufferedIO::involuntary ) - { - emit connectionClosed(); - } -} - - - // Signal that the connection was established void DirectConnectionBase::slotSocketConnected() { // This is called when the socket in openConnection() was connected. #ifdef KMESSTEST - ASSERT( ! isServer_ ); + KMESS_ASSERT( ! isServer_ ); #endif #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotSocketConnected() - Connected with host " << connectingTo_ << "." << endl; + kDebug() << "Connected with host " << connectingTo_ << "."; #endif connectionTimer_.stop(); @@ -798,50 +766,92 @@ void DirectConnectionBase::slotSocketConnected() -// Signal that the connection could not be made. -void DirectConnectionBase::slotSocketFailed() +// Signal that the connection was closed +void DirectConnectionBase::slotSocketDisconnected() { - // This is called when the socket in openConnection() failed. #ifdef KMESSTEST - ASSERT( ! isServer_ ); + KMESS_ASSERT( socket_ != 0 ); #endif #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotSocketFailed: Failed to connect to host " << connectingTo_ << "." << endl; + kDebug() << "Socket got closed, state=" << socket_->state() << "."; +#endif + + // Reset the globals. + isServer_ = false; + authorized_ = false; + connectionTimer_.stop(); + + // Make sure the objects are cleaned up too. + closeClientSocket(); + closeServerSocket(); +} + + + +// Signal that the connection could not be made. +void DirectConnectionBase::slotSocketError( QAbstractSocket::SocketError error ) +{ + // This is called when the socket in openConnection() failed, + // or when the socket closed. +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "Got error with host " << connectingTo_ << " " + "(code=" << error << + " state=" << socket_->state() << + " reason=" << socket_->errorString() << ")."; #endif connectionTimer_.stop(); // Make sure the sockets are removed. // When the class is reused, create new sockets. - // Avoids calls to isConnected() at a socket in bad state. closeClientSocket(); closeServerSocket(); - // Inform derived class and other listeners - // This pretends we're connected to our signals but without generating the overhead. - slotConnectionFailed(); - emit connectionFailed(); + // Filter errors that happen when you've connected already. + switch( error ) + { + case QAbstractSocket::RemoteHostClosedError: + emit connectionClosed(); + return; + + case QAbstractSocket::DatagramTooLargeError: + case QAbstractSocket::NetworkError: + case QAbstractSocket::UnknownSocketError: +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "No signals emitted for this error code."; +#endif + break; + + default: + // Inform derived class and other listeners + // This pretends we're connected to our signals but without generating the overhead. + slotConnectionFailed(); + emit connectionFailed(); + } } // Slot called when the socket is ready to write data. -void DirectConnectionBase::slotSocketReadyWrite() +void DirectConnectionBase::slotSocketReadyWrite( qint64 bytesWritten ) { // First see if the additional write buffer can be cleared. if( ! additionalWriteBuffer_.isEmpty() ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotSocketReadyWrite() - flushing buffer with unsent data first. " - "There are " << additionalWriteBuffer_.size() << " bytes to send." << endl; + kDebug() << "flushing buffer with unsent data first. " + "(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). // Simply re-use the function. // Not the most efficient method, but the most reliable. - QByteArray newBuffer; - newBuffer.duplicate( additionalWriteBuffer_ ); // TODO: for Qt4 porting, verify QByteArray sharing changes. + QByteArray newBuffer = additionalWriteBuffer_; additionalWriteBuffer_.truncate(0); // See what get's sent, and what's added to additionalWriteBuffer_ again. @@ -850,15 +860,15 @@ void DirectConnectionBase::slotSocketReadyWrite() { if( additionalWriteBuffer_.isEmpty() ) { - kdWarning() << "DirectConnectionBase::slotSocketReadyWrite() - the remaining " << newBuffer.size() << - " unsent bytes could still not be sent!" << endl; + kWarning() << "the remaining " << newBuffer.size() << + " unsent bytes could still not be sent!"; } else { // else ok, remaining is in additional buffer again. #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotSocketReadyWrite() - buffer not completely flushed yet, " - "still " << additionalWriteBuffer_.size() << " bytes to send." << endl; + kDebug() << "buffer not completely flushed yet, " + "still " << additionalWriteBuffer_.size() << " bytes to send."; #endif } @@ -867,13 +877,29 @@ void DirectConnectionBase::slotSocketReadyWrite() } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionBase::slotSocketReadyWrite() - buffer flushed, notifying real listeners." << endl; + kDebug() << "buffer flushed, see if the write handler can be called for more data."; #endif } - // Finally notify the real sender - emit writeHandlerReady(); + // Then make sure we ask for more data. + if( socket_->bytesToWrite() > 2000 ) + { +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "still got " << socket_->bytesToWrite() << " bytes to write, delaying next write handler signal."; +#endif + } + else + { +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "firing next write handler signal. " + "(bytesWritten=" << bytesWritten << + " bytesToWrite=" << socket_->bytesToWrite() << ")."; +#endif + + // Notify the real senders + emit writeHandlerReady(); + } } @@ -889,7 +915,7 @@ void DirectConnectionBase::slotSocketReadyWrite() * @param size Size of the block to read. * @returns Whether the has been a write error. */ -bool DirectConnectionBase::writeBlock( const char *block, const uint size ) +bool DirectConnectionBase::writeBlock( const char *block, const qint64 size ) { lastWriteFailed_ = true; if(KMESS_NULL(socket_)) return false; @@ -897,7 +923,7 @@ bool DirectConnectionBase::writeBlock( const char *block, const uint size ) // Make final connected check if( ! isConnected() ) { - kdWarning() << "DirectConnectionBase::writeBlock() - Attempting to write data to a disconnected socket." << endl; + kWarning() << "Attempting to write data to a disconnected socket."; return false; } @@ -906,33 +932,33 @@ bool DirectConnectionBase::writeBlock( const char *block, const uint size ) if( ! additionalWriteBuffer_.isEmpty() ) { #ifdef KMESSTEST - ASSERT( isWriteHandlerConnected() ); + KMESS_ASSERT( isWriteHandlerConnected() ); #endif // Warn! if( additionalWriteBuffer_.size() > 1000 ) { // only warn with release for larger additions. avoid false-positives for size preamble field. - kdWarning() << "DirectConnectionBase::writeBlock() - received another mesage of " << size << " bytes " - "while the write buffer is full!" << endl; + kWarning() << "received another mesage of " << size << " bytes " + "while the write buffer is full!"; } else { // else only warn in debug mode. #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdWarning() << "DirectConnectionBase::writeBlock() - received another mesage of " << size << " bytes " - "while the write buffer is full!" << endl; + kWarning() << "received another mesage of " << size << " bytes " + "while the write buffer is full!"; #endif } - additionalWriteBuffer_.add( block, size ); + additionalWriteBuffer_.append( QByteArray::fromRawData( block, (int)size ) ); // Protect against consuming all system memory // 50 kB is more then enough if you're writing messages of 1300 bytes! if( additionalWriteBuffer_.size() > 50000 ) { - kdWarning() << "DirectConnectionBase::writeBlock() - write buffers are flooding, " - "dropping connection immediately!" << endl; + kWarning() << "write buffers are flooding, " + "dropping connection immediately!"; additionalWriteBuffer_.truncate(0); closeConnection(); return false; @@ -940,39 +966,28 @@ bool DirectConnectionBase::writeBlock( const char *block, const uint size ) } // Write the data - Q_LONG noBytesWritten = socket_->writeBlock( block, size ); + qint64 noBytesWritten = socket_->write( block, size ); if( noBytesWritten < 0 ) { - if( socket_->systemError() == EWOULDBLOCK ) - { - kdWarning() << "DirectConnectionBase::writeBlock() - got system error EWOULDBLOCK, buffer is full." << endl; - additionalWriteBuffer_.add( block, size ); - return false; - } - else - { - kdWarning() << "DirectConnectionBase::writeBlock() - Error while writing " << size << " bytes to socket, return code: " << noBytesWritten << ", system error: " << getSocketError() << " remote address: " << getRemoteIp() << ":" << getRemotePort() << "!" << endl; - return false; - } + kWarning() << "Error while writing " << size << " bytes to socket, return code: " << noBytesWritten << ", system error: " << getSocketError() << " remote address: " << getRemoteIp() << ":" << getRemotePort() << "!"; + return false; } // Log in network window. // Use actual size of written block. #ifdef KMESS_NETWORK_WINDOW - QByteArray wrapper; - wrapper.setRawData( block, noBytesWritten ); + QByteArray wrapper = QByteArray::fromRawData( block, (int)noBytesWritten ); KMESS_NET_SENT(this, wrapper); - wrapper.resetRawData( block, noBytesWritten ); #endif // Warn if number of written bytes is off, - // this corrupts file transfers. - if( (uint) noBytesWritten < size ) + // this corrupts file transfers if the data is not sent later on. + if( noBytesWritten < size ) { - kdWarning() << "DirectConnectionBase::writeBlock() - only " << noBytesWritten - << " of " << size << " bytes could be written!" << endl; + kWarning() << "only " << noBytesWritten + << " of " << size << " bytes could be written!"; - additionalWriteBuffer_.add( block + noBytesWritten, ( size - noBytesWritten ) ); + additionalWriteBuffer_.append( QByteArray::fromRawData( block + noBytesWritten, (int)(size - noBytesWritten) ) ); } else { @@ -981,7 +996,7 @@ bool DirectConnectionBase::writeBlock( const char *block, const uint size ) } // Return true if the data was indeed written. - return ( (uint) noBytesWritten == size ); + return ( noBytesWritten == size ); } diff --git a/kmess/network/extra/directconnectionbase.h b/src/network/extra/directconnectionbase.h similarity index 80% rename from kmess/network/extra/directconnectionbase.h rename to src/network/extra/directconnectionbase.h index 13144bb..a501572 100644 --- a/kmess/network/extra/directconnectionbase.h +++ b/src/network/extra/directconnectionbase.h @@ -18,13 +18,16 @@ #ifndef DIRECTCONNECTIONBASE_H #define DIRECTCONNECTIONBASE_H -#include -#include -#include +#include +#include +#include + + +class QTcpSocket; +class QTcpServer; +class QBuffer; -#include "../kmessbuffer.h" -class KExtendedSocket; /** * The class for receiving and sending files. @@ -38,7 +41,7 @@ class DirectConnectionBase : public QObject public: // The constructor - DirectConnectionBase(QObject *parent = 0, const char *name = 0); + DirectConnectionBase(QObject *parent = 0); // The destructor virtual ~DirectConnectionBase(); @@ -65,15 +68,15 @@ class DirectConnectionBase : public QObject // Return true when a write handler is connnected. bool isWriteHandlerConnected() const; // Get the server port that will be used - int getLocalServerPort(); + quint16 getLocalServerPort(); // Get the remote ip the socket is connected with. QString getRemoteIp() const; // Get the remote port the socket is connected with. - QString getRemotePort() const; + quint16 getRemotePort() const; // Return the error description QString getSocketError() const; // Connect to a host - bool openConnection(const QString &ipAddress, int port, bool async = false); + bool openConnection( const QString &ipAddress, const quint16 port ); // Wait for an incoming connection bool openServerPort(); @@ -83,39 +86,41 @@ class DirectConnectionBase : public QObject // This is called when the connection could not be made. virtual void slotConnectionFailed(); // This is called when data is received from the socket. - virtual void slotDataReceived() = 0; + virtual void slotSocketDataReceived() = 0; private slots: // Accept incoming connections on the socket. void slotAcceptConnection(); // A timeout occured to connect a socket void slotConnectionTimeout(); - // Signal that the connection was closed - void slotSocketClosed( int state ); // Signal that the connection was established void slotSocketConnected(); + // Signal that the connection was closed + void slotSocketDisconnected(); // Signal that the connection could not be made. - virtual void slotSocketFailed(); + virtual void slotSocketError( QAbstractSocket::SocketError error ); // Slot called when the socket is ready to write data. - void slotSocketReadyWrite(); + void slotSocketReadyWrite( qint64 bytesWritten ); protected: // Protected methods // Close and delete the server socket bool closeServerSocket(); // Return the number of bytes which are already received in the local buffer - int getAvailableBytes() const; + qint64 getAvailableBytes() const; // Return the name of the locally opened port. QString getListeningServiceName() const; // Verify how many bytes the read buffer has. Note this actually reads the data to test it. - int peekBlock( const uint size ); + qint64 peekBlock( const qint64 size ); // Read data from the socket - int readBlock( char *buffer, const uint size ); + qint64 readBlock( char *buffer, const qint64 size ); // Read data from the socket (uses the QByteArray size() as block size) - int readBlock( QByteArray &buffer, const uint maxSize = 0, const uint offset = 0 ); + 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 - bool writeBlock( const char *block, const uint size ); + bool writeBlock( const char *block, const qint64 size ); // Write data to the socket bool writeBlock( const QByteArray &block ); @@ -128,26 +133,30 @@ class DirectConnectionBase : public QObject QTime lastActivity_; private: // Private attributes - // Additional write buffer when KExtendedSocket reports it can't write all data. - KMessBuffer additionalWriteBuffer_; + // Additional write buffer when the socket reports it can't write all data. + QByteArray additionalWriteBuffer_; // Whether the connection handshake was successful bool authorized_; // The location openConnection() is connecting to, for debugging QString connectingTo_; // The timeout handling for openConnection() QTimer connectionTimer_; + // The higher limit to the interval of server ports this class will use + quint16 highestServerPortLimit_; // Whether the class acts as server or client bool isServer_; // Whether the last write action failed. bool lastWriteFailed_; + // The lower limit to the interval of server ports this class will use + quint16 lowestServerPortLimit_; // The server socket which listens for incoming connections. - KExtendedSocket *server_; + QTcpServer *server_; // The server port this class will use - int serverPort_; + quint16 serverPort_; // The next server port used with a openServerPort() call. - static int nextServerPort_; + static quint16 nextServerPort_; // The socket over which data is sent or received. - KExtendedSocket *socket_; + QTcpSocket *socket_; // Whether an timeout occured bool timeout_; // True if the user cancelled the session diff --git a/kmess/network/extra/directconnectionpool.cpp b/src/network/extra/directconnectionpool.cpp similarity index 67% rename from kmess/network/extra/directconnectionpool.cpp rename to src/network/extra/directconnectionpool.cpp index d7830d4..84f6542 100644 --- a/kmess/network/extra/directconnectionpool.cpp +++ b/src/network/extra/directconnectionpool.cpp @@ -20,17 +20,19 @@ #include "../../kmessdebug.h" + #ifdef KMESSDEBUG_DIRECTCONNECTION #define KMESSDEBUG_DIRECTCONNECTION_GENERAL #endif + // The constructor -DirectConnectionPool::DirectConnectionPool() - : QObject(0, "DirectConnectionPool") +DirectConnectionPool::DirectConnectionPool( bool waitForAuthorized ) + : QObject() , activeConnection_(0) + , waitForAuthorized_( waitForAuthorized ) { - } @@ -39,7 +41,7 @@ DirectConnectionPool::DirectConnectionPool() DirectConnectionPool::~DirectConnectionPool() { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool: Destructor: Deleting pending sockets and active connection." << endl; + kDebug() << "Deleting pending sockets and active connection."; #endif clearPending(); @@ -47,14 +49,13 @@ DirectConnectionPool::~DirectConnectionPool() // Remove the active connection if it was still active. if( activeConnection_ != 0 ) { - disconnect(activeConnection_, SIGNAL(connectionClosed()), this, SLOT(slotConnectionClosed())); - disconnect(activeConnection_, SIGNAL(connectionFailed()), this, SLOT(slotConnectionFailed())); + activeConnection_->blockSignals( true ); activeConnection_->deleteLater(); activeConnection_ = 0; } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DESTROYED DirectConnectionPool" << endl; + kDebug() << "DESTROYED."; #endif } @@ -64,17 +65,17 @@ DirectConnectionPool::~DirectConnectionPool() * Add a connection to the list, tells the object to connect to the given ipaddress/port. * Returns true when the connection could be added to the pending list (e.g. it's openConnection() method didn't fail). */ -bool DirectConnectionPool::addConnection(DirectConnectionBase *connection, const QString &ipAddress, const int port) +bool DirectConnectionPool::addConnection(DirectConnectionBase *connection, const QString &ipAddress, const quint16 port) { // Refuse if there is already an active connection if( activeConnection_ != 0 ) { - kdWarning() << "DirectConnectionPool::addConnection() - Refusing connection attempt, a connection has already been made." << endl; + kWarning() << "Refusing connection attempt, a connection has already been made."; return 0; } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::addConnection() - Adding new client connection to peer " + kDebug() << "Adding new client connection to peer " << ipAddress << ":" << port << endl; #endif @@ -91,14 +92,14 @@ bool DirectConnectionPool::addConnection(DirectConnectionBase *connection, const this, SLOT( slotConnectionAuthorized() ) ); // Connect the the host - bool opened = connection->openConnection( ipAddress, port, true ); + bool opened = connection->openConnection( ipAddress, port ); if( ! opened ) { - pendingConnections_.remove( connection ); + pendingConnections_.removeAll( connection ); connection->deleteLater(); #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::addConnection() - Could not connect to " << ipAddress << ":" << port << endl; + kDebug() << "Could not connect to " << ipAddress << ":" << port; #endif return false; } @@ -116,12 +117,12 @@ int DirectConnectionPool::addServerConnection(DirectConnectionBase *connection) // Refuse if there is already an active connection if( activeConnection_ != 0 ) { - kdWarning() << "DirectConnectionPool::addServerConnection() - Refusing server connection attempt, a connection has already been made." << endl; + kWarning() << "Refusing server connection attempt, a connection has already been made."; return 0; } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::addServerConnection() - Adding new server connection to listen at port" << connection->getLocalServerPort() << endl; + kDebug() << "Adding new server connection to listen at port" << connection->getLocalServerPort(); #endif pendingConnections_.append( connection ); // append to pending list before signals are fired. @@ -139,6 +140,7 @@ int DirectConnectionPool::addServerConnection(DirectConnectionBase *connection) bool listening = false; // Attempt to listen at one of the 10 ports we use. + // FIXME: loop from start range to end. for(int i = 0; i < 10; i++) { // The openServerPort() automatically picks another port @@ -153,12 +155,10 @@ int DirectConnectionPool::addServerConnection(DirectConnectionBase *connection) if( ! listening ) { - pendingConnections_.remove( connection ); + pendingConnections_.removeAll( connection ); connection->deleteLater(); -#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::addServerConnection() - Could not find a port to listen at." << endl; -#endif + kWarning() << "No available free port could be found"; return 0; } @@ -173,27 +173,41 @@ int DirectConnectionPool::addServerConnection(DirectConnectionBase *connection) */ void DirectConnectionPool::clearPending() { + // Avoid unwanted debug messages.. + if( pendingConnections_.isEmpty() && unauthorizedConnections_.isEmpty() ) + { + return; + } + #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::clearPending() - Removing pending sockets." << endl; + kDebug() << "Removing pending sockets."; #endif // Tell all other pending connections to abort - QPtrListIterator it(pendingConnections_); - while( it.current() != 0 ) + foreach( DirectConnectionBase *pendingConnection, pendingConnections_ ) { - DirectConnectionBase *pendingConnection = it.current(); - #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::clearPending() - Deleting pending connection to peer " - << pendingConnection->getRemoteIp() << ":" << pendingConnection->getRemotePort() << endl; + kDebug() << "Deleting pending connection to peer " + << pendingConnection->getRemoteIp() << ":" << pendingConnection->getRemotePort() << endl; #endif pendingConnection->deleteLater(); // delete should not be called from a slot. - ++it; + } + + // 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(); } @@ -223,7 +237,8 @@ bool DirectConnectionPool::hasActiveConnection() const */ bool DirectConnectionPool::hasPendingConnections() const { - return (pendingConnections_.count() > 0); + return ( ! pendingConnections_.isEmpty() + || ! unauthorizedConnections_.isEmpty() ); } @@ -234,20 +249,37 @@ bool DirectConnectionPool::hasPendingConnections() const void DirectConnectionPool::slotConnectionAuthorized() { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionAuthorized() - A direct connection was authorized." << endl; + kDebug() << "A direct connection was authorized."; #endif // Find out which object sent the signal const QObject *eventSender = sender(); if(KMESS_NULL(eventSender)) return; #ifdef KMESSTEST - ASSERT( eventSender->inherits("DirectConnectionBase") ); + KMESS_ASSERT( eventSender->inherits("DirectConnectionBase") ); #endif // 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 - ASSERT( connection == activeConnection_ ); + 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 Q_UNUSED( connection ); // Avoid compiler warning #endif @@ -265,23 +297,19 @@ void DirectConnectionPool::slotConnectionClosed() const QObject *eventSender = sender(); if(KMESS_NULL(eventSender)) return; #ifdef KMESSTEST - ASSERT( eventSender->inherits("DirectConnectionBase") ); + KMESS_ASSERT( eventSender->inherits("DirectConnectionBase") ); #endif // Remove the connection DirectConnectionBase *connection = static_cast(const_cast(eventSender)); - pendingConnections_.remove(connection); - -#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionClosed() - Direct connection was closed to peer " - << connection->getRemoteIp() << ":" << connection->getRemotePort() << endl; -#endif + pendingConnections_.removeAll( connection ); + unauthorizedConnections_.removeAll( connection ); // Signal when the active connection closed if(connection == activeConnection_) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionClosed() - Closed connection was the active connection!" << endl; + kDebug() << "Closed connection was the active connection!"; #endif emit activeConnectionClosed(); @@ -290,14 +318,14 @@ void DirectConnectionPool::slotConnectionClosed() else { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionClosed() - Closed connection was another pending socket from the pool." << endl; + kDebug() << "Closed connection was another pending socket from the pool."; #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 - kdDebug() << "DirectConnectionPool::slotConnectionClosed() - No remaining direct connections left." << endl; + kDebug() << "No remaining direct connections left."; #endif // Emit signal for fallback (e.g. sending files over the switchboard) @@ -306,6 +334,7 @@ void DirectConnectionPool::slotConnectionClosed() } // delete the connection + connection->blockSignals( true ); connection->deleteLater(); } @@ -317,28 +346,31 @@ void DirectConnectionPool::slotConnectionClosed() void DirectConnectionPool::slotConnectionEstablished() { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionEstablished() - Direct connection established." << endl; + kDebug() << "Direct connection established."; #endif // Test whether two connection attempts were established quickly after each other. if( activeConnection_ != 0 ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionEstablished() - Already got an active connection, removing other connections." << endl; + kDebug() << "Already got an active connection, removing other connections."; #endif clearPending(); return; } // No connection yet, find the first successful connection. - QPtrListIterator it(pendingConnections_); - while( it.current() != 0 ) + foreach( DirectConnectionBase *pendingConnection, pendingConnections_ ) { - DirectConnectionBase *pendingConnection = it.current(); if( pendingConnection->isConnected() ) { +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "Connected to peer " + << pendingConnection->getRemoteIp() << ":" << pendingConnection->getRemotePort() << endl; +#endif + // Established connection found, remove from list. - pendingConnections_.remove( pendingConnection ); + pendingConnections_.removeAll( pendingConnection ); // Try to initialize the connection. bool success = pendingConnection->initialize(); @@ -347,8 +379,8 @@ void DirectConnectionPool::slotConnectionEstablished() // Not initialized (e.g. preamble cound not be sent in case of a MsnDirectConnection), // try the next item in the list instead. #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionEstablished() - could not initialize connection, " - << "trying next available connection." << endl; + kDebug() << "could not initialize connection, " + "trying next available connection." << endl; #endif pendingConnection->deleteLater(); pendingConnection = 0; @@ -356,27 +388,28 @@ 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; } } - - ++it; } // If there is an initialized connection, remove all other pending connections. if( activeConnection_ != 0 ) { -#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionEstablished() - 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(); @@ -391,28 +424,28 @@ void DirectConnectionPool::slotConnectionEstablished() void DirectConnectionPool::slotConnectionFailed() { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionFailed() - A direct connection failed." << endl; + kDebug() << "A direct connection failed."; #endif // Find out which object sent the signal const QObject *eventSender = sender(); if(KMESS_NULL(eventSender)) return; #ifdef KMESSTEST - ASSERT( eventSender->inherits("DirectConnectionBase") ); + KMESS_ASSERT( eventSender->inherits("DirectConnectionBase") ); #endif // Remove the connection DirectConnectionBase *connection = static_cast(const_cast(eventSender)); - pendingConnections_.remove(connection); + pendingConnections_.removeAll( connection ); // If there is still no connection made if( activeConnection_ == 0 ) { // If there are no remaining pending connections - if( pendingConnections_.count() == 0 ) + if( ! hasPendingConnections() ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionFailed() - No remaining direct connections left." << endl; + kDebug() << "No remaining direct connections left."; #endif // Emit signal for fallback (e.g. sending files over the switchboard) @@ -421,7 +454,7 @@ void DirectConnectionPool::slotConnectionFailed() else { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionFailed() - There are " << pendingConnections_.count() << " remaining direct connections, waiting for one to succeed." << endl; + kDebug() << "There are " << ( pendingConnections_.count() + unauthorizedConnections_.count() ) << " remaining direct connections, waiting for one to succeed."; #endif } } @@ -430,7 +463,7 @@ void DirectConnectionPool::slotConnectionFailed() if( connection == activeConnection_ ) { // This really shouldn't happen - kdWarning() << "DirectConnectionPool::slotConnectionFailed() - The active connection failed!" << endl; + kWarning() << "The active connection failed!"; // Reset current object activeConnection_ = 0; @@ -440,7 +473,7 @@ void DirectConnectionPool::slotConnectionFailed() } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::slotConnectionFailed() - Deleting failed connection." << endl; + kDebug() << "Deleting failed connection."; #endif // Delete the failed connection object. @@ -460,14 +493,11 @@ bool DirectConnectionPool::verifyActiveConnection() && ( ! activeConnection_->isConnected() || activeConnection_->hasTimedOut() ) ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DirectConnectionPool::verifyActiveConnection() - Active connection is no longer connected, deleting connection." << endl; + kDebug() << "Active connection is no longer connected, deleting connection."; #endif - // Avoid calling slots. - disconnect(activeConnection_, SIGNAL(connectionClosed()), this, SLOT(slotConnectionClosed())); - disconnect(activeConnection_, SIGNAL(connectionFailed()), this, SLOT(slotConnectionFailed())); - - // Delete connection, might fire connectionClosed() signal. + // Delete connection + activeConnection_->blockSignals( true ); activeConnection_->deleteLater(); activeConnection_ = 0; diff --git a/kmess/network/extra/directconnectionpool.h b/src/network/extra/directconnectionpool.h similarity index 87% rename from kmess/network/extra/directconnectionpool.h rename to src/network/extra/directconnectionpool.h index af50dcd..1e9f732 100644 --- a/kmess/network/extra/directconnectionpool.h +++ b/src/network/extra/directconnectionpool.h @@ -18,11 +18,14 @@ #ifndef DIRECTCONNECTIONPOOL_H #define DIRECTCONNECTIONPOOL_H -#include -#include +#include +#include + class DirectConnectionBase; + + /** * A pool for direct connection attempts. * @@ -40,12 +43,12 @@ class DirectConnectionPool : public QObject public: // The constructor - DirectConnectionPool(); + DirectConnectionPool( bool waitForAuthorized = false ); // The destructor virtual ~DirectConnectionPool(); // Add a connection to the list, tells the object to connect to the given ipaddress/port. - bool addConnection(DirectConnectionBase *connection, const QString &ipAddress, const int port); + bool addConnection(DirectConnectionBase *connection, const QString &ipAddress, const quint16 port); // Add a connection to the list, starts listening for incoming connections (returns zero if couldn't start listening). int addServerConnection(DirectConnectionBase *connection); // Remove all connections from the pending list @@ -59,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(); @@ -72,9 +74,13 @@ class DirectConnectionPool : public QObject private: // private properties // The currently active connection - DirectConnectionBase *activeConnection_; + DirectConnectionBase *activeConnection_; // The list of pending connections - QPtrList pendingConnections_; + 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/kmess/network/extra/msndirectconnection.cpp b/src/network/extra/msndirectconnection.cpp similarity index 76% rename from kmess/network/extra/msndirectconnection.cpp rename to src/network/extra/msndirectconnection.cpp index 0cb0bbf..409c7e0 100644 --- a/kmess/network/extra/msndirectconnection.cpp +++ b/src/network/extra/msndirectconnection.cpp @@ -20,7 +20,6 @@ #include "../../kmessdebug.h" #include "../p2pmessage.h" -#include #ifdef KMESSDEBUG_DIRECTCONNECTION #define KMESSDEBUG_DIRECTCONNECTION_GENERAL @@ -31,13 +30,15 @@ MsnDirectConnection::MsnDirectConnection(const QString &contactHandle) - : DirectConnectionBase(0, "MsnDirectConnection") + : DirectConnectionBase(0) , bufferOffset_(0) , contactHandle_(contactHandle) , firstMessage_(true) , preambleOffset_(0) , remainingBlockBytes_(0) { + setObjectName( "MsnDirectConnection[" + contactHandle + "]" ); + preambleBuffer_.resize(4); } @@ -45,7 +46,7 @@ MsnDirectConnection::MsnDirectConnection(const QString &contactHandle) MsnDirectConnection::~MsnDirectConnection() { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "DESTROYED MsnDirectConnection [handle=" << contactHandle_ << "]" << endl; + kDebug() << "DESTROYED. [handle=" << contactHandle_ << "]"; #endif } @@ -69,7 +70,7 @@ bool MsnDirectConnection::initialize() } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection: sending preamble message (0x666f6f00)." << endl; + kDebug() << "sending preamble message (0x666f6f00)."; #endif #ifdef KMESS_NETWORK_WINDOW KMESS_NET_INIT(this, "DC " + getRemoteIp()); @@ -82,7 +83,7 @@ bool MsnDirectConnection::initialize() // Send the preamble packet // This consists of 8 bytes: // the length field followed by "foo\0" - QByteArray preambleMessage(8); + QByteArray preambleMessage( 8, 0x00 ); P2PMessage::insertBytes( preambleMessage, 4, 0 ); preambleMessage[4] = 0x66; // f preambleMessage[5] = 0x6f; // 0 @@ -97,11 +98,11 @@ bool MsnDirectConnection::initialize() bool MsnDirectConnection::sendMessage(const QByteArray &message) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection: sending message block (size=" << message.size() << ", handle=" << contactHandle_ << ")" << endl; + kDebug() << "sending message block (size=" << message.size() << ", handle=" << contactHandle_ << ")"; #endif #ifdef KMESSTEST - ASSERT( message.size() <= 1352 ); // max message size for official client - ASSERT( ! hasTemporaryWriteError() ); + 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. @@ -110,11 +111,11 @@ bool MsnDirectConnection::sendMessage(const QByteArray &message) lastActivity_.start(); // Send the message size in advance - QByteArray lengthField( 4 ); + QByteArray lengthField( 4, 0x00 ); P2PMessage::insertBytes( lengthField, message.size(), 0 ); if( ! writeBlock( lengthField ) && ! hasTemporaryWriteError() ) { - kdWarning() << "MsnDirectConnection: Unable to send the preamble block " + kWarning() << "Unable to send the preamble block " "(contact=" << contactHandle_ << ")." << endl; return false; } @@ -126,12 +127,12 @@ bool MsnDirectConnection::sendMessage(const QByteArray &message) // This is called when data is received from the socket. -void MsnDirectConnection::slotDataReceived() +void MsnDirectConnection::slotSocketDataReceived() { // HACK: Completely avoid using DirectConnectionBase::getAvailableBytes() in this method: it makes this method // to freeze. It seems that the call to the socket ( KExtendedSocket::bytesAvailable() ) always returns zero. // This wouldn't be SO bad as an issue by itself. But the loop ( doing getAvailableBytes() > 0 ) evals to TRUE - // sticking itself in an infinite loop. I've tried putting a "kdWarning() << getAvailableBytes()" statement + // sticking itself in an infinite loop. I've tried putting a "kWarning() << getAvailableBytes()" statement // immediately before the while() statement as last instruction of the loop: in the log it says "kmess: WARNING: // 0", but the loop goes on anyways. @@ -144,7 +145,7 @@ void MsnDirectConnection::slotDataReceived() // start with a new data block if( remainingBlockBytes_ <= 0 ) { - int noBytesPeeked = peekBlock(4); + qint64 noBytesPeeked = peekBlock(4); if( preambleOffset_ == 0 ) { // First see if there are enough bytes. @@ -152,7 +153,7 @@ void MsnDirectConnection::slotDataReceived() if( 0 < noBytesPeeked && noBytesPeeked < 4 ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection::slotDataReceived() - Socket buffer only has " << noBytesPeeked << " of 4 bytes for the size preamble field, will wait for new data." << endl; + kDebug() << "Socket buffer only has " << noBytesPeeked << " of 4 bytes for the size preamble field, will wait for new data."; #endif return; } @@ -162,17 +163,17 @@ void MsnDirectConnection::slotDataReceived() } // First 4 bytes indicate the message/block length. - int noBytesRead = readBlock( preambleBuffer_, 4 - preambleOffset_, preambleOffset_ ); + qint64 noBytesRead = readBlock( preambleBuffer_, 4 - preambleOffset_, preambleOffset_ ); if( noBytesRead == 0 ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection::slotDataReceived() - Socket buffer is empty, will wait for new data (read=" << noBytesRead << " peek=" << noBytesPeeked << ")." << endl; + kDebug() << "Socket buffer is empty, will wait for new data (read=" << noBytesRead << " peek=" << noBytesPeeked << ")."; #endif return; } else if( noBytesRead < 0 ) { - kdWarning() << "MsnDirectConnection::slotDataReceived() - read error on socket " + kWarning() << "read error on socket " "(read=" << noBytesRead << " peek=" << noBytesPeeked << " offset=" << preambleOffset_ << " contact=" << contactHandle_ << ")." << endl; @@ -182,7 +183,7 @@ void MsnDirectConnection::slotDataReceived() else if( noBytesRead < 4 ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection::slotDataReceived() - read partial size preamble message " + kDebug() << "read partial size preamble message " "(read=" << noBytesRead << " offset=" << preambleOffset_ << " peek=" << noBytesPeeked << ")." << endl; #endif @@ -194,13 +195,13 @@ void MsnDirectConnection::slotDataReceived() preambleOffset_ = 0; #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection::slotDataReceived() - got final part of size preamble message." << endl; + kDebug() << "got final part of size preamble message."; #endif } else { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection::slotDataReceived() - will wait for " + kDebug() << "will wait for " "the remaining " << ( 4 - noBytesRead ) << " bytes of the size preamble message..." << endl; #endif @@ -218,7 +219,7 @@ void MsnDirectConnection::slotDataReceived() KMESS_NET_RECEIVED( this, preambleBuffer_ ); #endif #ifdef KMESSTEST - ASSERT( preambleOffset_ == 0 ); + KMESS_ASSERT( preambleOffset_ == 0 ); #endif firstMessage_ = false; @@ -229,7 +230,7 @@ void MsnDirectConnection::slotDataReceived() // Official client only allows up to 1352 bytes. if( remainingBlockBytes_ > 4000 ) { - kdWarning() << "MsnDirectConnection::slotDataReceived() - received unexpected large block length, " + kWarning() << "received unexpected large block length, " "aborting transfer " "(length=" << remainingBlockBytes_ << " contact=" << contactHandle_ << ")!" << endl; @@ -238,12 +239,12 @@ void MsnDirectConnection::slotDataReceived() } // Allocate the buffer. - buffer_.resize(remainingBlockBytes_); + buffer_.resize( (int)remainingBlockBytes_ ); buffer_.fill('\0'); bufferOffset_ = 0; #ifdef KMESSDEBUG_DIRECTCONNECTION_RECEIVING - kdDebug() << "MsnDirectConnection::slotDataReceived() - 4 bytes read, " + kDebug() << "4 bytes read, " << "next block size is " << remainingBlockBytes_ << " bytes." << endl; #endif @@ -257,10 +258,10 @@ void MsnDirectConnection::slotDataReceived() // Fill the next part of the buffer with the bytes received. // Read as many bytes as possible, test for errors. - int noBytesRead = readBlock( buffer_, remainingBlockBytes_, bufferOffset_ ); + qint64 noBytesRead = readBlock( buffer_, remainingBlockBytes_, bufferOffset_ ); if( noBytesRead < 0 ) { - kdWarning() << "MsnDirectConnection::slotDataReceived() - read error " + kWarning() << "read error " "(returned " << noBytesRead << " block size=" << buffer_.size() << " buffer offset=" << bufferOffset_ << @@ -272,7 +273,7 @@ void MsnDirectConnection::slotDataReceived() { // Buffer is currently empty: wait the next data arrival to handle it #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection::slotDataReceived() - Socket buffer is empty, will wait for new data." << endl; + kDebug() << "Socket buffer is empty, will wait for new data."; #endif return; } @@ -286,11 +287,11 @@ void MsnDirectConnection::slotDataReceived() remainingBlockBytes_ -= noBytesRead; #ifdef KMESSDEBUG_DIRECTCONNECTION_RECEIVING - kdDebug() << "MsnDirectConnection::slotDataReceived() - read " + kDebug() << "read " << noBytesRead << " bytes, " << remainingBlockBytes_ << " remaining." << endl; #endif #ifdef KMESSTEST - ASSERT( (bufferOffset_ + remainingBlockBytes_) == buffer_.size() ); + KMESS_ASSERT( (int) (bufferOffset_ + remainingBlockBytes_) == buffer_.size() ); #endif // Signal when we've received the whole block @@ -300,22 +301,22 @@ void MsnDirectConnection::slotDataReceived() if( buffer_.size() == 4 ) { // This should be a preamble packet from the other client. - if( QCString(buffer_.data(), 4) == "foo" ) + if( QByteArray(buffer_.data(), 3) == "foo" ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kdDebug() << "MsnDirectConnection::slotDataReceived() - received preamble packet, ignoring." << endl; + kDebug() << "received preamble packet, ignoring."; #endif } else { - kdWarning() << "MsnDirectConnection::slotDataReceived() - received unexpected preamble packet, ignoring" + kWarning() << "received unexpected preamble packet, ignoring" << " (data=" << buffer_.data() << " contact=" << contactHandle_ << ")." << endl; } } else { #ifdef KMESSDEBUG_DIRECTCONNECTION_RECEIVING - kdDebug() << "MsnDirectConnection::slotDataReceived() - Emitting message received signal." << endl; + kDebug() << "Emitting message received signal."; #endif // A normal message was received emit messageReceived( buffer_ ); diff --git a/kmess/network/extra/msndirectconnection.h b/src/network/extra/msndirectconnection.h similarity index 93% rename from kmess/network/extra/msndirectconnection.h rename to src/network/extra/msndirectconnection.h index 97a71b5..d880725 100644 --- a/kmess/network/extra/msndirectconnection.h +++ b/src/network/extra/msndirectconnection.h @@ -20,10 +20,13 @@ #include "directconnectionbase.h" -#include +#include + class MimeMessage; + + /** * A connection used to transfer MSNP2P data (e.g. files) directly between two end-hosts. * This connection can be established during a P2PApplication invitation. @@ -52,13 +55,13 @@ class MsnDirectConnection : public DirectConnectionBase private slots: // Protected slots // This is called when data is received from the socket. - void slotDataReceived(); + void slotSocketDataReceived(); private: // private properties // The buffer for the incoming p2p messages. QByteArray buffer_; // The offset of the currently received block - uint bufferOffset_; + quint64 bufferOffset_; // The other contact we're connected with QString contactHandle_; // Whether the first message is received @@ -66,9 +69,9 @@ class MsnDirectConnection : public DirectConnectionBase // The buffer for the next preamble message. QByteArray preambleBuffer_; // The offset in the preamble buffer - int preambleOffset_; + qint64 preambleOffset_; // Set when only partial data was received - uint remainingBlockBytes_; + quint64 remainingBlockBytes_; signals: // Signal that a full message block was received. diff --git a/kmess/network/extra/msnftpconnection.cpp b/src/network/extra/msnftpconnection.cpp similarity index 74% rename from kmess/network/extra/msnftpconnection.cpp rename to src/network/extra/msnftpconnection.cpp index 4069e3a..90614e9 100644 --- a/kmess/network/extra/msnftpconnection.cpp +++ b/src/network/extra/msnftpconnection.cpp @@ -22,15 +22,9 @@ #include "../../kmessdebug.h" #include "../../currentaccount.h" -#include -#include -#include -#include +#include +#include -#include -#include -#include -#include #ifdef KMESSDEBUG_MSNFTP #define KMESSDEBUG_MSNFTP_GENERAL @@ -39,9 +33,12 @@ #endif + // The constructor -MsnFtpConnection::MsnFtpConnection() - : DirectConnectionBase(0, "MsnFtpConnection") +MsnFtpConnection::MsnFtpConnection( const QString authHandle, const QString authCookie ) + : DirectConnectionBase() + , authCookie_( authCookie ) + , authHandle_( authHandle ) , fileBytesRemaining_(0) , fileSize_(0) , inputStream_(0) @@ -50,6 +47,7 @@ MsnFtpConnection::MsnFtpConnection() , remainingBlockBytes_(0) , userCancelled_(false) { + setObjectName("MsnFtpConnection[" + authHandle + "]"); } @@ -67,10 +65,10 @@ MsnFtpConnection::~MsnFtpConnection() void MsnFtpConnection::cancelTransfer(bool userCancelled) { #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection::cancelTransfer - Cancelling." << endl; + kDebug() << "Cancelling."; #endif #ifdef KMESSTEST - ASSERT( isConnected() ); + KMESS_ASSERT( isConnected() ); #endif userCancelled_ = userCancelled; @@ -96,7 +94,7 @@ void MsnFtpConnection::cancelTransfer(bool userCancelled) void MsnFtpConnection::closeConnection() { #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection - closing sockets" << endl; + kDebug() << "MsnFtpConnection - closing sockets"; #endif // Reset the current mode @@ -113,26 +111,25 @@ void MsnFtpConnection::emitCancelStatusMessage(bool contactCancelled) { #ifdef KMESSTEST // Assume that this is only used from slotWriteMessage() - ASSERT( contactCancelled || mode_ == SEND_CANCEL || mode_ == SEND_CCL ); + KMESS_ASSERT( contactCancelled || mode_ == SEND_CANCEL || mode_ == SEND_CCL ); #endif 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 ); } } @@ -165,7 +162,7 @@ void MsnFtpConnection::parseCommand(const QStringList &command) // Mark connection as authorized, this command is received in response to our USR. setAuthorized(true); #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection: There are " << fileBytesRemaining_ << " bytes to be received." << endl; + kDebug() << "There are " << fileBytesRemaining_ << " bytes to be received."; #endif } else if(command[0] == "USR") @@ -185,9 +182,9 @@ void MsnFtpConnection::parseCommand(const QStringList &command) } else { - kdDebug() << "MsnFtpConnection - WARNING - user authorisation was incorrect." << endl; + kWarning() << "user authorisation was incorrect."; #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection: expected " << authHandle_ << "/" << authCookie_ + kDebug() << "expected " << authHandle_ << "/" << authCookie_ << " got " << command[1] << "/" << command[2] << "." << endl; #endif cancelTransfer(false); @@ -204,12 +201,12 @@ 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 { // Never passed authorisation test - kdWarning() << "MsnFtpConnection: user authorisation was skipped by contact." << endl; + kWarning() << "user authorisation was skipped by contact."; cancelTransfer(false); // TODO: test it } @@ -217,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") { @@ -229,7 +226,7 @@ void MsnFtpConnection::parseCommand(const QStringList &command) } else { - kdDebug() << "File transfer got unhandled command: " << command[0] << "." << endl; + kDebug() << "File transfer got unhandled command: " << command[0] << "."; // Cancel, session is of no use now. cancelTransfer(false); } @@ -241,7 +238,7 @@ void MsnFtpConnection::parseCommand(const QStringList &command) void MsnFtpConnection::parseReceivedFileData() { #ifdef KMESSTEST - ASSERT( outputStream_ != 0); + KMESS_ASSERT( outputStream_ != 0); #endif // After we give the TFR signal, the contact (server) sends all file data @@ -251,8 +248,8 @@ void MsnFtpConnection::parseReceivedFileData() unsigned char code; unsigned char byte1; unsigned char byte2; - int blockSize; - int noBytesRead; + qint64 blockSize; + qint64 noBytesRead; // Make sure we read all available bytes from the socket before returning @@ -262,7 +259,7 @@ void MsnFtpConnection::parseReceivedFileData() if(remainingBlockBytes_ <= 0) { // Start with a new data block - QByteArray controlBlock(3); + QByteArray controlBlock( 3, 0x00 ); readBlock( controlBlock, 3); #ifdef KMESS_NETWORK_WINDOW @@ -282,8 +279,8 @@ void MsnFtpConnection::parseReceivedFileData() remainingBlockBytes_ = (byte1 | byte2 << 8); #ifdef KMESSDEBUG_MSNFTP_RECEIVING - kdDebug() << "MsnFtpConnection::slotDataReceived - Receiving new block, size = " << remainingBlockBytes_ << "." - << " socket bytes available: " << getAvailableBytes() << "." << endl; + kDebug() << "Receiving new block, size = " << remainingBlockBytes_ << ". " + << "socket bytes available: " << getAvailableBytes() << "." << endl; #endif } else if(code == 1) @@ -319,21 +316,19 @@ void MsnFtpConnection::parseReceivedFileData() noBytesRead = readBlock( rawBlock, blockSize ); #ifdef KMESS_NETWORK_WINDOW - QByteArray wrapper; - wrapper.setRawData( rawBlock, noBytesRead ); + QByteArray wrapper = QByteArray::fromRawData( rawBlock, (int)noBytesRead ); KMESS_NET_RECEIVED( this, wrapper ); - wrapper.resetRawData( rawBlock, noBytesRead ); #endif if(noBytesRead <= 0) { #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdWarning() << "MsnFtpConnection: read error (returned " << noBytesRead << " block size=" << blockSize << ")" << endl; + kWarning() << "read error (returned " << noBytesRead << " block size=" << blockSize << ")"; #endif // Socket error, exit - closeConnection(); emit transferFailed(); // cancelTransfer(false); + closeConnection(); return; } else @@ -341,14 +336,14 @@ 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_->writeBlock( rawBlock, noBytesRead ); + outputStream_->write( rawBlock, noBytesRead ); #ifdef KMESSDEBUG_MSNFTP_RECEIVING - kdDebug() << "MsnFtpConnection::slotDataReceived - " << noBytesRead << " bytes read. " - << fileBytesRemaining_ << " bytes remaining." << endl; + kDebug() << noBytesRead << " bytes read. " + << fileBytesRemaining_ << " bytes remaining." << endl; #endif } @@ -357,7 +352,7 @@ void MsnFtpConnection::parseReceivedFileData() if(fileBytesRemaining_ <= 0) { #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection::slotDataReceived - Done receiving file data." << endl; + kDebug() << "Done receiving file data."; #endif mode_ = SEND_BYE; return; @@ -369,23 +364,14 @@ 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) { #ifdef KMESSTEST - ASSERT( authHandle_.length() > 0 ); - ASSERT( authCookie_.length() > 0 ); - ASSERT( inputFile != 0); - ASSERT( inputFile->isOpen() && inputFile->isReadable() ); + KMESS_ASSERT( authHandle_.length() > 0 ); + KMESS_ASSERT( authCookie_.length() > 0 ); + KMESS_ASSERT( inputFile != 0); + KMESS_ASSERT( inputFile->isOpen() && inputFile->isReadable() ); #endif // Prepare @@ -399,16 +385,18 @@ bool MsnFtpConnection::sendFile(QFile *inputFile) if(listening) { // Success! - QString externIp = CurrentAccount::instance()->getExternalIp(); - emit statusMessage( i18n("Awaiting connection at %1, port %2") - .arg(externIp) // display the external ip submitted to the contact, not our local lan ip. - .arg(getLocalServerPort()), STATUS_DIALOG ); + 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() ) ), + STATUS_DIALOG + ); } else { // Failed! - emit statusMessage( i18n("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 statusMessage( ki18n("The transfer of %1 failed. Could not open a local port."), STATUS_CHAT_FAILED); + emit statusMessage( i18n("Could not open a local port."), STATUS_DIALOG_FAILED); emit transferFailed(); } @@ -420,13 +408,13 @@ bool MsnFtpConnection::sendFile(QFile *inputFile) // Retrieve a file -bool MsnFtpConnection::retrieveFile(QFile *outputFile, const QString &ipAddress, const int port) +bool MsnFtpConnection::retrieveFile(QFile *outputFile, const QString &ipAddress, const quint16 port) { #ifdef KMESSTEST - ASSERT( authHandle_.length() > 0 ); - ASSERT( authCookie_.length() > 0 ); - ASSERT( outputFile != 0 ); - ASSERT( outputFile->isOpen() && outputFile->isWritable() ); + KMESS_ASSERT( authHandle_.length() > 0 ); + KMESS_ASSERT( authCookie_.length() > 0 ); + KMESS_ASSERT( outputFile != 0 ); + KMESS_ASSERT( outputFile->isOpen() && outputFile->isWritable() ); #endif // Open the file @@ -474,11 +462,11 @@ void MsnFtpConnection::slotConnectionEstablished() void MsnFtpConnection::slotConnectionFailed() { #ifdef KMESSTEST - ASSERT( ! isServer() ); // slot only applies to connections initialized with openConnection() + KMESS_ASSERT( ! isServer() ); // slot only applies to connections initialized with openConnection() #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(); } @@ -486,14 +474,14 @@ void MsnFtpConnection::slotConnectionFailed() // This is called when data is received from the socket. -void MsnFtpConnection::slotDataReceived() +void MsnFtpConnection::slotSocketDataReceived() { // This function either delegates the control // to parseCommand() or parseReceivedFileData() char rawBlock[255]; - int blockSize; - int noBytesRead; + qint64 blockSize; + qint64 noBytesRead; QString commandLine; QStringList command; @@ -525,24 +513,24 @@ void MsnFtpConnection::slotDataReceived() } // Convert data block to UTF8 string - commandLine = QString::fromUtf8( rawBlock, noBytesRead ); + commandLine = QString::fromUtf8( rawBlock, (int)noBytesRead ); #ifdef KMESS_NETWORK_WINDOW - KMESS_NET_RECEIVED( this, commandLine.utf8() ); + KMESS_NET_RECEIVED( this, commandLine.toUtf8() ); #endif // Strip the newline character if(commandLine.contains("\r\n")) { - commandLine = commandLine.left(commandLine.find("\r\n")); + commandLine = commandLine.left(commandLine.indexOf("\r\n")); } // Split command into separate fields - command = QStringList::split(" ", commandLine); + command = commandLine.split( " " ); #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection <<< " << commandLine << endl; + kDebug() << "<<< " << commandLine; #endif // Parse the command @@ -559,7 +547,7 @@ void MsnFtpConnection::slotWriteData() { case WAIT : { - // Do nothing. Wait for slotDataReceived() + // Do nothing. Wait for slotSocketDataReceived() break; } case SEND_VER : @@ -583,13 +571,13 @@ 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; } case RECEIVE_DATA : { - // Client: Receiving data with slotDataReceived() + // Client: Receiving data with slotSocketDataReceived() break; } case SEND_BYE : @@ -675,7 +663,7 @@ void MsnFtpConnection::slotWriteData() void MsnFtpConnection::writeCancelData() { #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection - Cancelling transfer" << endl; + kDebug() << "Cancelling transfer"; #endif // Send a new data block @@ -693,14 +681,14 @@ void MsnFtpConnection::writeCancelData() void MsnFtpConnection::writeFileData() { #ifdef KMESSTEST - ASSERT( inputStream_ != 0 ); + KMESS_ASSERT( inputStream_ != 0 ); #endif - int noBytesRead; - char rawBlock[2048]; + qint64 noBytesRead; + char rawBlock[2048]; // Read a block from the file. - noBytesRead = inputStream_->readBlock( rawBlock + 3, sizeof(rawBlock) - 3 ); + noBytesRead = inputStream_->read( rawBlock + 3, sizeof(rawBlock) - 3 ); if(noBytesRead < 0) { @@ -717,19 +705,19 @@ void MsnFtpConnection::writeFileData() } #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection::writeFileData - " << noBytesRead << " bytes written. " - << fileBytesRemaining_ << " bytes remaining." - << " connected=" << isConnected() << endl; + kDebug() << noBytesRead << " bytes written. " + << fileBytesRemaining_ << " bytes remaining." + << " connected=" << isConnected() << endl; #endif // Set the header rawBlock[0] = 0; - rawBlock[1] = (noBytesRead & 0x00ff); - rawBlock[2] = (noBytesRead & 0xff00) >> 8; + rawBlock[1] = (char) ( noBytesRead & 0x00ff ); + rawBlock[2] = (char)( ( noBytesRead & 0xff00 ) >> 8 ); // Update the progress fileBytesRemaining_ -= noBytesRead; - emit transferProgess(fileSize_ - fileBytesRemaining_); + emit transferProgess( (qint32)( fileSize_ - fileBytesRemaining_ ) ); // Write the data to the socket_ writeBlock( rawBlock, noBytesRead + 3 ); @@ -737,7 +725,7 @@ void MsnFtpConnection::writeFileData() // See if we're done if(fileBytesRemaining_ <= 0 ) { - kdDebug() << "MsnFtpConnection::writeFileData - done transferring file." << endl; + kDebug() << "done transferring file."; mode_ = WAIT; // Wait for BYE } } @@ -747,11 +735,12 @@ void MsnFtpConnection::writeFileData() // Write a message to the socket. void MsnFtpConnection::writeMessage(QString message) { - writeBlock( message.utf8().data(), message.utf8().length() ); + QByteArray messageUtf8 = message.toUtf8(); + writeBlock( messageUtf8 ); #ifdef KMESSDEBUG_MSNFTP_GENERAL - kdDebug() << "MsnFtpConnection: mode is " << mode_ << endl; - kdDebug() << "MsnFtpConnection >>> " << message; + kDebug() << "mode is " << mode_; + kDebug() << "MsnFtpConnection >>> " << message; #endif } diff --git a/kmess/network/extra/msnftpconnection.h b/src/network/extra/msnftpconnection.h similarity index 92% rename from kmess/network/extra/msnftpconnection.h rename to src/network/extra/msnftpconnection.h index ea8dab7..ef5f96e 100644 --- a/kmess/network/extra/msnftpconnection.h +++ b/src/network/extra/msnftpconnection.h @@ -21,12 +21,17 @@ #define MSNFTPCONNECTION_H #include "directconnectionbase.h" -#include -class KExtendedSocket; +#include + +#include + + class QIODevice; class QFile; + + /** * The class for receiving and sending files. * The MSNFTP protocol is used by old clients to transfer files. @@ -43,7 +48,7 @@ class MsnFtpConnection : public DirectConnectionBase public: // The constructor - MsnFtpConnection(); + MsnFtpConnection( const QString authHandle, const QString authCookie ); // The destructor virtual ~MsnFtpConnection(); @@ -51,12 +56,10 @@ 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 - bool retrieveFile(QFile *outputFile, const QString &ipAddress, const int port); + bool retrieveFile(QFile *outputFile, const QString &ipAddress, const quint16 port); private slots: // This is called when a connection is established. @@ -64,7 +67,7 @@ class MsnFtpConnection : public DirectConnectionBase // This is called when the connection could not be made. void slotConnectionFailed(); // This is called when data is received from the socket. - void slotDataReceived(); + void slotSocketDataReceived(); // The socket is ready for writing. Write any outstanding commands. void slotWriteData(); @@ -121,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. @@ -131,13 +134,15 @@ class MsnFtpConnection : public DirectConnectionBase // The stream to write received data to QIODevice *outputStream_; // True when only partial file data was received - int remainingBlockBytes_; + qint64 remainingBlockBytes_; // True if the user cancelled the session bool userCancelled_; 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/kmess/network/extra/p2pfragmenttracker.cpp b/src/network/extra/p2pfragmenttracker.cpp similarity index 84% rename from kmess/network/extra/p2pfragmenttracker.cpp rename to src/network/extra/p2pfragmenttracker.cpp index d872387..e5f152c 100644 --- a/kmess/network/extra/p2pfragmenttracker.cpp +++ b/src/network/extra/p2pfragmenttracker.cpp @@ -16,11 +16,13 @@ ***************************************************************************/ #include "p2pfragmenttracker.h" + #include "../../kmessdebug.h" #define ADDDIFF(orig, new) ( (new) > (orig) ? (new) - (orig) : 0 ) + /** * Constructor */ @@ -48,30 +50,26 @@ 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:"; } // Add range details - QPtrListIterator it( ranges_ ); unsigned long realCount = 0; - while( it.current() != 0 ) + foreach( Range *range, ranges_ ) { - Range *range = it.current(); - // Update string and counter result += " " + QString::number( range->start ) + ".." + QString::number( range->end ); realCount += ( range->end - range->start ); - ++it; } // Test if counters are correct #ifdef KMESSTEST - ASSERT( realCount == transferredBytes_ ); + KMESS_ASSERT( realCount == transferredBytes_ ); #endif if( realCount != transferredBytes_ ) { @@ -86,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_; } @@ -97,23 +95,20 @@ 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 - QPtrListIterator it( ranges_ ); - unsigned long realCount = 0; - while( it.current() != 0 ) + quint32 realCount = 0; + foreach( Range *range, ranges_ ) { - Range *range = it.current(); realCount += ( range->end - range->start ); - ++it; } if( transferredBytes_ != realCount ) { - kdWarning() << "P2PFragmentTracker: Invalid byte count for " << getDebugMap() << endl; + kWarning() << "P2PFragmentTracker: Invalid byte count for " << getDebugMap(); return realCount; } @@ -129,11 +124,15 @@ 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; transferredBytes_ = 0; totalSize_ = totalSize; + + // Clear collection + qDeleteAll( ranges_ ); ranges_.clear(); } @@ -143,7 +142,7 @@ void P2PFragmentTracker::initialize( unsigned long messageID, unsigned long tota * @brief Return whether the fragment tracker is complete. * @return Returns true if all fragments are transferred. */ -bool P2PFragmentTracker::isComplete() +bool P2PFragmentTracker::isComplete() const { // Check the preconditions, otherwise don't even check the ranges. if( totalSize_== 0 || ranges_.count() != 1 || getTransferredBytes() < totalSize_ ) @@ -152,7 +151,7 @@ bool P2PFragmentTracker::isComplete() } // Check the last remaining range. - Range *range = ranges_.at( 0 ); // is not const. + const Range *range = ranges_.first(); return range->start == 0 && range->end >= totalSize_; } @@ -174,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 ); } @@ -186,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_; @@ -276,7 +275,7 @@ void P2PFragmentTracker::registerFragment( unsigned long offset, unsigned long s transferredBytes_ += ADDDIFF( offset, range->start ); transferredBytes_ += ADDDIFF( range->end, newEnd ); range->start = offset; - range->end = QMAX( nextRange->end, newEnd ); + range->end = qMax( nextRange->end, newEnd ); // Fix next item, for next test i++; @@ -290,7 +289,7 @@ void P2PFragmentTracker::registerFragment( unsigned long offset, unsigned long s // New range appends current item. // Option 4 transferredBytes_ += ADDDIFF( range->end, newEnd ); - range->end = QMAX( range->end, newEnd ); + range->end = qMax( range->end, newEnd ); // See if the item can be merged. // Option 4b and 5 @@ -317,16 +316,16 @@ 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 { transferredBytes_ += ( nextRange->end - range->end ); } - range->end = QMAX( range->end, nextRange->end ); + range->end = qMax( range->end, nextRange->end ); - ranges_.remove( i + 1 ); + delete ranges_.takeAt( i + 1 ); last--; nextRange = ( i < last ) ? ranges_.at( i + 1 ) : 0; } diff --git a/kmess/network/extra/p2pfragmenttracker.h b/src/network/extra/p2pfragmenttracker.h similarity index 75% rename from kmess/network/extra/p2pfragmenttracker.h rename to src/network/extra/p2pfragmenttracker.h index b7639cb..600cd45 100644 --- a/kmess/network/extra/p2pfragmenttracker.h +++ b/src/network/extra/p2pfragmenttracker.h @@ -19,13 +19,14 @@ #ifndef P2PFRAGMENTTRACKER_H #define P2PFRAGMENTTRACKER_H -#include -#include +#include + /** * @brief Utility class to track completed ranges of a transferred file. * @author Diederik van der Boor + * @ingroup NetworkExtra */ class P2PFragmentTracker { @@ -38,19 +39,19 @@ class P2PFragmentTracker // Output for debugging QString getDebugMap() const; // Return the message ID - unsigned long getMessageID() const; - // Return the number of received bytwws - unsigned long getTransferredBytes() const; + quint32 getMessageID() const; + // Return the number of received bytes + 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(); + 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: /** @@ -58,18 +59,18 @@ 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. - QPtrList ranges_; + QList ranges_; }; diff --git a/kmess/network/mimemessage.cpp b/src/network/mimemessage.cpp similarity index 66% rename from kmess/network/mimemessage.cpp rename to src/network/mimemessage.cpp index d4f9ac8..6e269cf 100644 --- a/kmess/network/mimemessage.cpp +++ b/src/network/mimemessage.cpp @@ -15,26 +15,25 @@ * * ***************************************************************************/ +#include "mimemessage.h" + +#include "../kmessdebug.h" + +#include +#include +#include + +#include +#include +#include + + + /* The decode...() functions and getCodecByName() come from KMail and are therefore (C) KMail developers. */ -#include "mimemessage.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "../kmessdebug.h" - // The constructor MimeMessage::MimeMessage() @@ -47,7 +46,7 @@ MimeMessage::MimeMessage() MimeMessage::MimeMessage(const QString &message) { #ifdef KMESSDEBUG_MIMEMESSAGE - kdDebug() << "MimeMessage - Parsing the message." << endl; + kDebug() << "Parsing the sub message"; #endif parseMessage( message ); } @@ -58,56 +57,54 @@ MimeMessage::MimeMessage(const QString &message) MimeMessage::MimeMessage(const QByteArray &message) { // we get the header without the binary data that comes after - int nullPos = message.find('\0'); - QString messageHeader = QString::fromUtf8(message.data(), (nullPos == -1) ? message.size() : nullPos ); + int nullPos = message.indexOf('\0'); + int endMime = message.indexOf("\r\n\r\n"); + QString messageHeader( QString::fromUtf8(message.data(), (nullPos == -1) ? endMime : nullPos ) ); - QRegExp rx("Content-Type: ([A-Za-z0-9$!*/\\-]*)"); - rx.search( messageHeader ); - QString type = rx.cap(1); - - // Attempt to find out if this is a multi-packet message. - QString messageId; + // Regexps to parse the header + QRegExp rx1("Content-Type: ([A-Za-z0-9$!*/\\-]*)"); QRegExp rx2("Message-ID: ([^\r\n]+)"); - if( rx2.search( messageHeader ) != -1 ) + + // Get the Content-Type header + QString contentType; + if( rx1.indexIn( messageHeader ) != -1 ) { - messageId = rx2.cap(1); + contentType = rx1.cap(1); } - // Based on the Content-Type, the message has different fields. - // For p2p messages however, the body may contain binary characters we need to take care of. - if( type == "application/x-msnmsgrp2p" || ! messageId.isNull() ) + // Some messages should be preserved as binary, so take care of that. + // - p2p messages have a 48 byte header. + // - multi-packet messages can be split between a double byte utf-8 char. + bool isP2P = ( contentType == "application/x-msnmsgrp2p" ); + bool isMultiPacket = ( rx2.indexIn( messageHeader ) != -1 ); + if( isP2P || isMultiPacket ) { #ifdef KMESSDEBUG_MIMEMESSAGE - if( messageId.isNull() ) + if( isP2P ) { - kdDebug() << "MimeMessage - Parsing the message, extracting binary body." << endl; + kDebug() << "Parsing the message, extracting binary p2p body."; } - else + else if( isMultiPacket ) { - kdDebug() << "MimeMessage - Parsing the message, preserving multi-packet body as binary." << endl; + kDebug() << "Parsing the message, preserving multi-packet body as binary."; } #endif - QString msg(message); - uint endMime = msg.find("\r\n\r\n"); - uint startBin = endMime + 4; // 2 newlines - uint binLength = message.size() - startBin; + int bodyStart = endMime + 4; // 2 newlines + int bodySize = message.size() - bodyStart; // Extract the Mime fields from the message - QString mimeData = QString::fromUtf8( message.data(), startBin ); + QString mimeData( QString::fromUtf8( message.data(), bodyStart ) ); parseMessage( mimeData ); - // Extract the binary data from the message - binaryBody_.duplicate(message.data() + startBin, binLength); - -#ifdef KMESSTEST - ASSERT(binaryBody_.size() == binLength); -#endif + // Extract the binary data from the message. + // Copy to our own managed copy. + binaryBody_ = QByteArray( message.data() + bodyStart, bodySize ); } else { #ifdef KMESSDEBUG_MIMEMESSAGE - kdDebug() << "MimeMessage - Parsing the message." << endl; + kDebug() << "Parsing the message."; #endif // This is a normal plain-text message. @@ -122,7 +119,7 @@ MimeMessage::MimeMessage(const QByteArray &message) MimeMessage::MimeMessage(const MimeMessage& other) { #ifdef KMESSDEBUG_MIMEMESSAGE - kdDebug() << "MimeMessage: copy constructor" << endl; + kDebug() << "copy constructor"; #endif // Get the body of the other message @@ -139,8 +136,8 @@ MimeMessage::MimeMessage(const MimeMessage& other) #ifdef KMESSTEST // Make sure the ascii-zero characters are copied correctly: - ASSERT( binaryBody_.size() == other.binaryBody_.size() ); - ASSERT( fields_.size() == other.fields_.size() ); + KMESS_ASSERT( binaryBody_.size() == other.binaryBody_.size() ); + KMESS_ASSERT( fields_.size() == other.fields_.size() ); #endif } @@ -164,38 +161,49 @@ void MimeMessage::addField(const QString& field, const QString& value) // Change a field, or add it void MimeMessage::setField(const QString& field, const QString& value) { - int index= fields_.findIndex(field); + int index = fields_.indexOf( field ); if(-1 == index) { - addField(field, value); + addField( field, value ); } else { - values_[index]= value; + values_[ index ] = value; } } +// Clear all fields in MimeMessage for re-use the object +void MimeMessage::clearFields() +{ + body_ = ""; + fields_.clear(); + values_.clear(); + binaryBody_ = ""; +} + + + // decodes MIME strings like =?iso...=...?= ... -QString MimeMessage::decodeRFC2047String(const QCString& aStr) const +QString MimeMessage::decodeRFC2047String(const QByteArray &aStr) const { QString result; - QCString charset; + QByteArray charset; char *pos, *beg, *end, *mid=0; - QCString str, cstr, LWSP_buffer; + QByteArray str, cstr, LWSP_buffer; char encoding='Q', ch; bool valid, lastWasEncodedWord=FALSE; const int maxLen=200; int i; - if (aStr.find("=?") < 0) + if( ! aStr.contains("=?") ) { - //QString str = messageCodec->toUnicode(aStr); - QString str = QString::fromUtf8( aStr ); - if (str.find('\n') == -1) return str; + //QString str( messageCodec->toUnicode(aStr) ); + QString str( QString::fromUtf8( aStr ) ); + if (str.indexOf('\n') == -1) return str; QString str2((QChar*)0, str.length()); - uint i = 0; + int i = 0; while (i < str.length()) { if (str[i] == '\n') @@ -210,7 +218,7 @@ QString MimeMessage::decodeRFC2047String(const QCString& aStr) const return str2; } - for (pos=aStr.data(); *pos; pos++) + for (pos = const_cast( aStr ).data(); *pos; pos++) { // line unfolding if ( pos[0] == '\r' && pos[1] == '\n' ) { @@ -240,7 +248,7 @@ QString MimeMessage::decodeRFC2047String(const QCString& aStr) const valid = TRUE; // parse charset name charset = ""; - for (i=2,pos+=2; i=maxLen || !*pos) valid = FALSE; @@ -272,7 +280,7 @@ QString MimeMessage::decodeRFC2047String(const QCString& aStr) const // valid encoding: decode and throw away separating LWSP ch = *pos; *pos = '\0'; - str = QCString(mid).left((int)(mid - pos - 1)); + str = QByteArray( mid ).left((int)(mid - pos - 1)); if (encoding == 'Q') { // decode quoted printable text @@ -283,7 +291,7 @@ QString MimeMessage::decodeRFC2047String(const QCString& aStr) const else { // decode base64 text - cstr = KCodecs::base64Decode(str); + cstr = QByteArray::fromBase64( str ); } QTextCodec *codec = getCodecByName(charset); if (!codec) @@ -335,20 +343,20 @@ const QByteArray& MimeMessage::getBinaryBody() const // Finds a QTextCodec by name -QTextCodec* MimeMessage::getCodecByName(const QCString& codecName ) +QTextCodec* MimeMessage::getCodecByName(const QByteArray& codecName ) { if ( codecName.isEmpty() ) { return 0; } - return KGlobal::charsets()->codecForName( codecName.lower() ); + return KGlobal::charsets()->codecForName( codecName.toLower() ); } // Return the field and value at the given index -void MimeMessage::getFieldAndValue(QString& field, QString& value, const uint& index) const +void MimeMessage::getFieldAndValue(QString& field, QString& value, const int index) const { if ( index < fields_.count() ) { @@ -367,10 +375,10 @@ void MimeMessage::getFieldAndValue(QString& field, QString& value, const uint& i // Return the message fields as a big string QString MimeMessage::getFields() const { - QString message = ""; + QString message( "" ); // Get the fields and values - for ( uint i = 0; i < fields_.count(); i++ ) + for( int i = 0; i < fields_.count(); i++ ) { message += fields_[i] + ": " + values_[i] + "\r\n"; } @@ -383,37 +391,19 @@ QString MimeMessage::getFields() const // Return the entire message as a big string QByteArray MimeMessage::getMessage() const { - // Combine the message parts, convert to UTF8 string - QCString textPart = QString(getFields() + "\r\n" + body_).utf8(); + // So much easier with Qt4! + QString message = QString( getFields() + "\r\n" + body_); - if(binaryBody_.isEmpty()) + // for messages with an empty body must use two \r\n + // sequences. This fixes typing notifications not showing in WLM 2009. + if( body_.isEmpty() && binaryBody_.isEmpty() ) { - // Downgrade to QByteArray. - // If this is not done manually, otherwise a '\0' will be padded. - QByteArray textPartBin; - textPartBin.duplicate(textPart.data(), textPart.length()); - return textPartBin; + message += "\r\n"; } - else - { - // Concatenate the message and binary data - QByteArray p2pMessage; - uint totalLength = textPart.length() + binaryBody_.size(); - char *rawData = new char[ totalLength ]; - uint offset = 0; - // Copy the parts to the array - memcpy(rawData + offset, textPart.data(), textPart.length()); offset += textPart.length(); - memcpy(rawData + offset, binaryBody_.data(), binaryBody_.size()); offset += binaryBody_.size(); + QByteArray textPart = message.toUtf8(); -#ifdef KMESSTEST - ASSERT( offset == totalLength ); -#endif - - // Load the rawData in the QByteArray, and return it - p2pMessage.assign( rawData, totalLength ); // does the deletion automatically - return p2pMessage; - } + return textPart + binaryBody_; } @@ -444,7 +434,7 @@ QString MimeMessage::getSubValue(const QString& field, const QString& subField) else { // The left of the parameter is "subField=", the right is the next semicolon or the end of the line - left = value.find( subField + "=" ); + left = value.indexOf( subField + "=" ); if ( left >= 0 ) { left += subField.length() + 1; @@ -452,7 +442,7 @@ QString MimeMessage::getSubValue(const QString& field, const QString& subField) } if ( left >= 0 ) { - right = value.find( ";", left ); + right = value.indexOf( ";", left ); if ( right < 0 ) { right = value.length(); @@ -468,18 +458,18 @@ QString MimeMessage::getSubValue(const QString& field, const QString& subField) // Get a value given a field -const QString& MimeMessage::getValue(const QString& field ) const +QString MimeMessage::getValue(const QString& field ) const { // Search the fields for a match - for ( uint i = 0; i < fields_.count(); i++ ) + for( int i = 0; i < fields_.count(); i++ ) { if ( fields_[i] == field ) { return values_[i]; } } - kdDebug() << "MimeMessage - WARNING - This message contained no field \"" << field << "\"." << endl; - return QString::null; + kWarning() << "This message contained no field \"" << field << "\"."; + return QString(); } @@ -488,7 +478,7 @@ const QString& MimeMessage::getValue(const QString& field ) const bool MimeMessage::hasField(const QString& field) const { // Search the fields for a match - for ( uint i = 0; i < fields_.count(); i++ ) + for( int i = 0; i < fields_.count(); i++ ) { if ( fields_[i] == field ) { @@ -512,14 +502,14 @@ void MimeMessage::parseMessage(const QString& message) splitHead( lines, head ); // Split all the lines into field and value - for ( uint i = 0; i < lines.count(); i++ ) + for( int i = 0; i < lines.count(); i++ ) { if( lines[i].startsWith("\t") ) { #ifdef KMESSTEST - ASSERT( fields_.last() == "Received" ); + 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); } @@ -535,22 +525,30 @@ void MimeMessage::parseMessage(const QString& message) } #ifdef KMESSTEST - ASSERT( fields_.count() == values_.count() ); + KMESS_ASSERT( fields_.count() == values_.count() ); #endif } -// Print the contents of the message to kdDebug (for debugging purposes) +// Print the contents of the message to kDebug (for debugging purposes) void MimeMessage::print() const { - kdDebug() << "MimeMessage - Printing MIME message, " << fields_.count() << " fields." << endl; + kDebug() << "Printing MIME message, " << fields_.count() << " fields."; // Get the fields and values - for ( uint i = 0; i < fields_.count(); i++ ) + for( int i = 0; i < fields_.count(); i++ ) { - kdDebug() << "MimeMessage - Print - Field: \"" << fields_[i] << "\" value: \"" << values_[i] << "\"" << endl; + kDebug() << "Field: \"" << fields_[i] << "\" value: \"" << values_[i] << "\""; + } + + if( binaryBody_.isEmpty() ) + { + kDebug() << "Body:" << endl << body_; + } + else + { + kDebug() << "Body: (" << binaryBody_.size() << " bytes of binary data)"; } - kdDebug() << "MimeMessage - Print - Body:" << endl << body_ << endl; } @@ -566,27 +564,23 @@ void MimeMessage::setBody(const QString& body) // Set the P2P data of the message void MimeMessage::setBinaryBody(const QByteArray &header, const QByteArray &body, const char footer[4]) { - // Concatenate the message. - QByteArray newBinaryData; - uint rawSize = header.size() + body.size() + (footer != 0 ? 4 : 0); - char *rawData = new char[rawSize]; + int headerSize = header.size(); + int bodySize = body.size(); + int footerPos = headerSize + bodySize; - // Copy the parts to the array - memcpy(rawData, header.data(), header.size()); + // Footer needs to be wrapped in a QByteArray + // or replace( start, end, char* ) will reduce the size of the footer (Qt 4.3.3) + QByteArray footerWrapper( footer, 4 ); - if(body.size() > 0) - { - memcpy(rawData + header.size(), body.data(), body.size()); - } + // So much easier with Qt4! + binaryBody_.resize( footerPos + 4 ); + binaryBody_.replace( 0, headerSize, header ); + binaryBody_.replace( headerSize, bodySize, body ); + binaryBody_.replace( footerPos, 4, footerWrapper ); - if(footer != 0) - { - // Footer is not set for direct connections - memcpy(rawData + rawSize - 4, footer, 4); - } - - // Does auto-deletion automatically - binaryBody_.assign(rawData, rawSize); +#ifdef KMESSTEST + KMESS_ASSERT( binaryBody_.size() >= 52 ); // 48 bytes header, 4 bytes footer. +#endif } @@ -594,7 +588,7 @@ void MimeMessage::setBinaryBody(const QByteArray &header, const QByteArray &body // Set the P2P data of the message void MimeMessage::setBinaryBody(const QByteArray &data) { - binaryBody_.duplicate(data); + binaryBody_ = data; } @@ -603,7 +597,7 @@ void MimeMessage::setBinaryBody(const QByteArray &data) void MimeMessage::splitLine(QString& field, QString& value, const QString& line) const { int index; - index = line.find(":"); + index = line.indexOf(":"); if ( index >= 0 ) { field = line.left( index ); @@ -618,7 +612,7 @@ void MimeMessage::splitLine(QString& field, QString& value, const QString& line) } else { - kdDebug() << "MimeMessage: WARNING - Couldn't split line '" << line << "'" << endl; + kWarning() << "Couldn't split line '" << line << "'"; } } @@ -631,7 +625,7 @@ void MimeMessage::splitHead(QStringList& stringList, const QString& head) const QString line; stringList.clear(); - right = head.find( "\r\n" ); + right = head.indexOf( "\r\n" ); while ( right >= 0 ) { // Get the message between "left" and "right". @@ -640,7 +634,7 @@ void MimeMessage::splitHead(QStringList& stringList, const QString& head) const // Find the next occurence of "\r\n" after left. left = right + 2; - right = head.find( "\r\n", left ); + right = head.indexOf( "\r\n", left ); if(right == -1 && ! head.endsWith("\r\n")) { @@ -660,7 +654,7 @@ void MimeMessage::splitMessage(QString& head, QString& body, const QString& mess int index; // The message is split into head and body at "\r\n\r\n" - index = message.find( "\r\n\r\n" ); + index = message.indexOf( "\r\n\r\n" ); if ( index < 0 ) { head = message; diff --git a/kmess/network/mimemessage.h b/src/network/mimemessage.h similarity index 91% rename from kmess/network/mimemessage.h rename to src/network/mimemessage.h index bbf2c93..ba60000 100644 --- a/kmess/network/mimemessage.h +++ b/src/network/mimemessage.h @@ -20,8 +20,12 @@ #include -#include -#include +#include + + +class QByteArray; + + /** * A MIME-type message class. @@ -46,14 +50,16 @@ class MimeMessage 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); + // Clear all fields + void clearFields(); // decodes MIME strings like =?iso...=...?= ... - QString decodeRFC2047String(const QCString& aStr) const; + QString decodeRFC2047String(const QByteArray &aStr) const; // Return the body of the message const QString& getBody() const; // Return the P2P data of the message const QByteArray& getBinaryBody() const; // Return the field and value at the given index - void getFieldAndValue(QString& field, QString& value, const uint& index) const; + void getFieldAndValue(QString& field, QString& value, const int index) const; // Return the message fields as a big string QString getFields() const; // Return the entire message as a big data array @@ -63,10 +69,10 @@ class MimeMessage // Get a sub-value of a value that has multiple parameters QString getSubValue(const QString& field, const QString& subField = QString::null) const; // Get a value given a field - const QString& getValue(const QString& field) const; + QString getValue(const QString& field) const; // Test whether a given field exists in the message header bool hasField(const QString& field) const; - // Print the contents of the message to kdDebug (for debugging purposes) + // Print the contents of the message to kDebug (for debugging purposes) void print() const; // Set the message body void setBody(const QString& body); @@ -77,7 +83,7 @@ class MimeMessage private: // Private methods // returns the appropriate QTextCodec for the characterset name - static QTextCodec* getCodecByName(const QCString& codecName); + static QTextCodec* getCodecByName(const QByteArray& codecName); // Parse the message into type, body, and fields and values void parseMessage(const QString& message); // Split the message and store it in the string list diff --git a/src/network/msnchallengehandler.cpp b/src/network/msnchallengehandler.cpp new file mode 100644 index 0000000..6c1d06d --- /dev/null +++ b/src/network/msnchallengehandler.cpp @@ -0,0 +1,196 @@ +/* + * This source file is used from Kopete, due the fact they've got + * it working earlier, it takes advantage of the the KDE/Qt API, + * and should work for both big and little endian systems. + * The debug lines have been replaced with KMess-style messages. + */ + + +/* + msnchallengehandler.h - Computes a msn challenge response hash key. + + Copyright (c) 2005 by Gregg Edghill + Kopete (c) 2003-2005 by The Kopete developers + + Portions taken from + http://msnpiki.msnfanatic.com/index.php/MSNP11:Challenges + + ************************************************************************* + * * + * 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 "msnchallengehandler.h" + +#include "../kmessdebug.h" + +#include +#include +#include + + +#define PRODUCT_KEY "ILTXC!4IXB5FB*PX" +#define PRODUCT_ID "PROD0119GSJUC$18" + + + +MSNChallengeHandler::MSNChallengeHandler() +{ + productKey_ = PRODUCT_KEY; + productId_ = PRODUCT_ID; +} + + + +MSNChallengeHandler::~MSNChallengeHandler() +{ + +} + + + +const QString MSNChallengeHandler::computeHash( const QString& challengeString ) +{ + // Step One: THe MD5 Hash. + + // 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; +#endif + + 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]; +#endif + } + + // Step Two: Create the challenge string key + + QString challengeKey( challengeString + productId_ ); + // Pad to multiple of 8. + 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++ ) + { + 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); + } + + // swap because of the byte ordering issue. + sNumHex = hexSwap( sNumHex ); + // Assign the converted number. + challengeIntegers[i] = sNumHex.toInt(0, 16); + +#ifdef KMESSDEBUG_CHALLENGEHANDLER + 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 ); + + // 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 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 ); +} + + + +qint64 MSNChallengeHandler::createHashKey(const QVector& md5Integers, + 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; + + low += high + temp; + } + + high = ( high + md5Integers[1] ) % 0x7FFFFFFF; + low = ( low + md5Integers[3] ) % 0x7FFFFFFF; + + QByteArray tempArray( 8, '0' ); + + QDataStream buffer(&tempArray,QIODevice::ReadWrite); + + buffer.setByteOrder(QDataStream::LittleEndian); + buffer << (qint32) high; + buffer << (qint32) low; + + buffer.device()->reset(); + buffer.setByteOrder( QDataStream::BigEndian ); + qint64 key; + buffer >> key; + + return key; +} + + + +const QString MSNChallengeHandler::hexSwap( const QString& in ) +{ + QString swapped; + QString sHex( in ); + + while(sHex.length() > 0) + { + swapped = swapped + sHex.mid( sHex.length() - 2, 2 ); + sHex = sHex.remove( sHex.length() - 2, 2 ); + } + return swapped; +} + + + +const QString& MSNChallengeHandler::getProductId() const +{ + return productId_; +} + diff --git a/kmess/network/msnchallengehandler.h b/src/network/msnchallengehandler.h similarity index 57% rename from kmess/network/msnchallengehandler.h rename to src/network/msnchallengehandler.h index a3eb74b..cf8d6ef 100644 --- a/kmess/network/msnchallengehandler.h +++ b/src/network/msnchallengehandler.h @@ -20,43 +20,50 @@ #ifndef MSNCHALLENGEHANDLER_H #define MSNCHALLENGEHANDLER_H -#include +#include +#include + + /** * Provides a simple way to compute a msn challenge response hash key. * * @author Gregg Edghill + * @ingroup NetworkCore */ 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. - */ - Q_INT64 createHashKey(const QValueVector& md5Integers, const QValueVector& 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 new file mode 100644 index 0000000..9c7db19 --- /dev/null +++ b/src/network/msnconnection.cpp @@ -0,0 +1,1071 @@ +/*************************************************************************** + msnconnection.cpp - description + ------------------- + begin : Thu Jan 23 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 "msnconnection.h" + +#include "mimemessage.h" +#include "msnsocketbase.h" +#include "msnsockettcp.h" +#include "msnsockethttp.h" +#include "multipacketmessage.h" +#include "soap/httpsoapconnection.h" + +#include +#include + +#ifdef KMESSDEBUG_CONNECTION // Area-specific debug statements + #define KMESSDEBUG_CONNECTION_GENERAL + #define KMESSDEBUG_CONNECTION_SOCKET +#endif + + +// Static members initialization +bool MsnConnection::useHttpSocket_( false ); + + +/** + * @brief The constructor + * + * Initializes the sockets, buffers and ping timer. + * + * @param serverType The type of server connection: TCP or HTTP. + */ +MsnConnection::MsnConnection( MsnSocketBase::ServerType serverType ) +: QObject(0) +, ack_(0) +, initialized_(false) +{ + // Create the socket needed for this connection: default to the TCP one + if( useHttpSocket_ ) + { + socket_ = new MsnSocketHttp( serverType ); + } + else + { + socket_ = new MsnSocketTcp( serverType ); + } + +#ifdef KMESSTEST + KMESS_ASSERT( socket_ != 0 ); +#endif +} + + + +/** + * @brief The destructor + * + * Closes the connection, and deletes the sockets. + */ +MsnConnection::~MsnConnection() +{ + // Disconnect from the server on exit + if(isConnected()) + { + disconnectFromServer(); + } + + // Clean up collections + qDeleteAll( multiPacketBuffer_ ); + multiPacketBuffer_.clear(); + + // Off course, delete the SOAP clients now here too. + deleteSoapClients(); + + // Delete the socket + delete socket_; + +#ifdef KMESSDEBUG_CONNECTION + kDebug() << objectName() << "- DESTROYED"; +#endif +} + + + +/** + * @brief Internal function to track SOAP clients. + * + * This method connects the HttpSoapConnection::soapError() signal, + * and appends the client to the internal list. + * + * @param client The SOAP client class. + */ +void MsnConnection::addSoapClient( HttpSoapConnection *client ) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Adding SOAP client to list."; +#endif + + // Connect signals + 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 ); +} + + + +/** + * @brief Connect a socket's signals to our slots + * + * Connects the signals of a new socket to this class' slots. + * This is needed to have one place only for socket connection; + * since socket connections are made in initialize() and in + * switchToHttpSocket(). + */ +void MsnConnection::attachToSocketSignals() +{ +#ifdef KMESSDEBUG_CONNECTION + kDebug() << objectName() << "- Connecting socket signals."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( socket_ != 0 ); +#endif + + // Connect our integrative methods to the raw socket's events signals + connect( socket_, SIGNAL( connected() ), + this, SLOT ( slotConnected() ) ); + connect( socket_, SIGNAL( disconnected() ), + this, SLOT ( slotDisconnected() ) ); + connect( socket_, SIGNAL( dataReceived(const QStringList&,const QByteArray&) ), + this, SLOT ( slotDataReceived(const QStringList&,const QByteArray&) ) ); + connect( socket_, SIGNAL( error(QString,MsnSocketBase::ErrorType) ), + this, SLOT ( slotError(QString,MsnSocketBase::ErrorType) ) ); + // Forward the socket's notification signals + connect( socket_, SIGNAL( statusMessage(QString,bool) ), + this, SIGNAL( statusMessage(QString,bool) ) ); + connect( socket_, SIGNAL( pingSent() ), + this, SIGNAL( pingSent() ) ); +} + + + +/** + * @brief Connect to the given server via the socket + * + * The connection attempt is asynchronous. + * When the connection is made, connectionSuccess() is called, + * on error connectionFailed() is called. + * Connection timeouts are not detected here yet. + * + * @param server The server hostname or IP address. + * @param port The port to connect to. + */ +void MsnConnection::connectToServer( const QString& server, const quint16 port ) +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET + if( server.isEmpty() && port == 0 ) + { + kDebug() << objectName() << "- Connecting to the default server."; + } + else + { + kDebug() << objectName() << "- Connecting to server at" << server << ":" << port << "."; + } +#endif + + // Start connecting now + socket_->connectToServer( server, port ); +} + + + +/** + * @brief Disconnect and delete a SOAP clients. + * + * @param client The client to delete. + * @see deleteSoapClients() + */ +void MsnConnection::deleteSoapClient( HttpSoapConnection *client ) +{ + soapClients_.removeAll( client ); + QTimer::singleShot( 10, client, SLOT(deleteLater()) ); // timeout needed for deleting passport login service. +} + + + +/** + * @brief Disconnect and delete all SOAP clients. + * + * This method is called by the derived class when all SOAP clients need to be deleted. + * This is not done automatically in disconnectFromServer() so the derived class + * is both responsable for creating and deleting the SOAP client objects. + */ +void MsnConnection::deleteSoapClients() +{ + // Disconnect other possibly active SOAP sessions. + // Use deleteLater() since this method may be called from loginIncorrect() + if( ! soapClients_.isEmpty() ) + { +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Closing SOAP sessions."; +#endif + + foreach( HttpSoapConnection *soapClient, soapClients_ ) + { + soapClient->abort(); + soapClient->deleteLater(); + } + + soapClients_.clear(); + } +} + + + +/** + * @brief Disconnect from the server + * + * This function is called after closeConnection() + * It empties all buffers, and resets the sockets. + * + * @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 MsnConnection::disconnectFromServer( bool isTransfer ) +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET + kDebug() << objectName() << "- Closing the connection."; +#endif + + // Gracefully disconnect + if( isConnected() ) + { + sendCommand( "OUT" ); + } + + // Stop pinging + setSendPings( false ); + + // Clean up collections + qDeleteAll( multiPacketBuffer_ ); + multiPacketBuffer_.clear(); + + socket_->disconnectFromServer( isTransfer ); +} + + + +/** + * @brief Return the local IP address of the socket. + * + * This is typically a LAN address, unless the system + * is directly connected to the Internet. + * + * @returns The IP address the socket uses at the system. + */ +const QString MsnConnection::getLocalIp() const +{ +#ifdef KMESSDEBUG_SWITCHBOARD_FILETRANSFER + kDebug() << objectName() << "- Local IP is " << socket_->getLocalIp(); +#endif + + return socket_->getLocalIp(); +} + + + +/** + * @brief Initialize the object + * + * This method should be called before the class is used. + * + * It initializes the socket + * Subclasses may re-implement this method to connect + * to signals which are not available at startup in the constructor. + */ +bool MsnConnection::initialize() +{ + if( initialized_ ) + { + kDebug() << objectName() << "- Already initialized!"; + return false; + } + + // Attach the socket's signals to this class + attachToSocketSignals(); + + initialized_ = true; + return true; +} + + + +/** + * @brief Return whether or the socket is connected. + * @returns True when connected, false otherwise. + */ +bool MsnConnection::isConnected() const +{ + return socket_->isConnected(); +} + + + +/** + * @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. + * + * This method just passes the question to the socket class + * + * @returns True when it's a payload command, false otherwise. + */ +bool MsnConnection::isPayloadCommand( const QString &command ) const +{ + return socket_->isPayloadCommand( command ); +} + + + +// 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 address you have tried to add is not a Live 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("This 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 present in your 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 cannot 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 Live Messenger 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 cannot 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 Live Messenger 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 Live Messenger 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. + * @param mimeMessage The received mime message. + */ +void MsnConnection::parseMultiPacketMimeMessage( const QStringList &command, const MimeMessage &mimeMessage ) +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET + kDebug() << objectName() << "- Message is a multi-packet message, buffering."; +#endif + + // Get associated multi-packet message buffer, create one if it doesn't exist yet. + const QString& messageId( mimeMessage.getValue("Message-ID") ); + MultiPacketMessage *multiPacketMessage; + if( ! multiPacketBuffer_.contains( messageId ) ) + { + multiPacketMessage = new MultiPacketMessage; + multiPacketBuffer_.insert( messageId, multiPacketMessage ); + } + else + { + multiPacketMessage = multiPacketBuffer_[ messageId ]; + } + + // Add the message to the handler. + multiPacketMessage->addChunk( mimeMessage ); + if( ! multiPacketMessage->isComplete() ) + { + return; + } + + // Parse message if complete multi-packet message is received. + const MimeMessage &fullMimeMessage( multiPacketMessage->getMessage() ); + parseMimeMessage( command, fullMimeMessage ); + + // Delete handler class + delete multiPacketBuffer_.take( messageId ); +} + + + +/** + * @brief Send a command to the server + * + * This function automatically inserts the ACK-number + * between the prefix and text. + * This can be used later to track error responses. + * + * @param prefix The three-letter command, which parseCommand() receives in command[0]. + * @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 ack = ack_++; + + // Send the data to the server + const QString command( prefix + " " + QString::number( ack ) + " " + text + "\r\n" ); + writeData( command ); + + // Return the ack used + return ack; +} + + + +/** + * @brief Send a MIME message command to the server. + * @returns, returning the ack + */ +int MsnConnection::sendMimeMessage( AckType ackType, const MimeMessage &message ) +{ + // Determine which type to send. + // Normally a char[4] lookup array would be sufficient, + // but this is easier to use in the string concatenation with Qt + const char *ackTypeStr = "?"; + switch(ackType) + { + case ACK_NONE: ackTypeStr = "U"; break; + case ACK_NAK_ONLY: ackTypeStr = "N"; break; + case ACK_ALWAYS: ackTypeStr = "A"; break; + case ACK_ALWAYS_P2P: ackTypeStr = "D"; break; + } + + // Create the "MSG id type length" header + 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 + writeBinaryData( command.toUtf8() + rawMessage ); + + // Return the ack used + return ack; +} + + + +// Send a payload command to the server, convenience function +int MsnConnection::sendPayloadMessage( const QString &prefix, const QString &arguments, const QString &payload ) +{ + // Send payload, as UTF-8 encoded raw string. + 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 ack = ack_++; + + // Build the command + QString command( prefix + " " + QString::number( ack ) ); + if( ! arguments.isEmpty() ) + { + command += " " + arguments; + } + + command += " " + QString::number( payload.size() ) + "\r\n"; + + // Write the data + if( payload.size() > 0 ) + { + writeBinaryData( command.toUtf8() + payload ); + } + else + { + writeData( command ); + } + + // Return the ack used + return ack; +} + + + +// Specify which accepted commands carry payload data for this connection +void MsnConnection::setAcceptedPayloadCommands( QStringList commandList ) +{ + socket_->setAcceptedPayloadCommands( commandList ); +} + + + +// Set whether we're sending pings or not +void MsnConnection::setSendPings( bool sendPings ) +{ + socket_->setSendPings( sendPings ); +} + + + +/** + * @brief Called when data is received from the server. + * + * This method parses the incoming data for the syntax used by the MSN protocol. + * + * A parsed message to handled to one of the following methods: + * - one-line commands are delivered to parseCommand() + * - MSG commands with MIME payloads are delivered to parseMimeMessage() + * - other commands with payloads are delivered to parsePayloadMessage(). + * This uses isPayloadCommand() to detect if a command has a payload. + */ +void MsnConnection::slotDataReceived( const QStringList &commandLine, const QByteArray &payloadData ) +{ +#ifdef KMESSDEBUG_SERVERMESSAGES + // Display the received command data + kDebug() << objectName() << "- <<< (C) " << commandLine; + if( ! payloadData.isEmpty() ) + { + kDebug() << objectName() << "- <<< (P) " << payloadData; + } +#endif + +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_RECEIVED( this, commandLine.join(" ").toUtf8() ); + // Also display the payload if present + if( ! payloadData.isEmpty() ) + { + KMESS_NET_RECEIVED( this, payloadData ); + } +#endif + + // 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" ) + { + // Other payload message types are parsed in the subclasses. + parsePayloadMessage( commandLine, payloadData ); + } + else + { + // It's a mime message + // Note we can't parse strings here, the message could contain binary p2p data. + // UTF-8 characters are translated in the MimeMessage constructor itself. + MimeMessage mimeMessage( payloadData ); + + // Detect Multi-packet messages + if( ! mimeMessage.hasField("Message-ID") ) + { + // It's a normal message, parse it. + parseMimeMessage( commandLine, mimeMessage ); + } + else + { + // Handle multi-packet message parts. + parseMultiPacketMimeMessage( commandLine, mimeMessage ); + } + } + } + else + { + // It's a normal command, handle it in the subclass. + parseCommand( commandLine ); + } +} + + + +/** + * @brief Called when the socket is disconnected. + */ +void MsnConnection::slotDisconnected() +{ +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_CLOSE(this); +#endif + + emit disconnected(); +} + + + +/** + * @brief If it is possible, switch to the HTTP connection + * + * This method checks what connection is being established, and if is a TCP + * connection, will delete it and re-start connecting using the HTTP method. + * + * This is used when the TCP connection process fails. + */ +bool MsnConnection::switchToHttpSocket() +{ + // Check if we're already using HTTP + if( qobject_cast( socket_ ) ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET + kDebug() << "Cannot switch to HTTP connection. Class is" << socket_->metaObject()->className(); +#endif + return false; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET + kDebug() << "Attempting switch to HTTP connection."; +#endif + + // Save the socket details to use the same ones for the new socket + MsnSocketBase::ServerType serverType = socket_->getServerType(); + QStringList acceptedPayloadCommands = socket_->getAcceptedPayloadCommands(); + + // Close and disable the old server + socket_->blockSignals( true ); + socket_->disconnectFromServer(); + socket_->deleteLater(); + + // Replace it with the new one + 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; +} + + + +/** + * @brief Switch back to the TCP connection + * + * This method checks what connection is being established, and if is an HTTP + * connection, will delete it and start using again the TCP method. + * + * This is used after disconnecting from an HTTP session, to try again with TCP the next time. + */ +bool MsnConnection::switchToTcpSocket() +{ + // Check if we're already using TCP + if( qobject_cast( socket_ ) ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET + kDebug() << "Cannot switch to TCP connection. Class is" << socket_->metaObject()->className(); +#endif + return false; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET + kDebug() << "Attempting to switch back to TCP connection."; +#endif + + // Save the socket details to use the same ones for the new socket + MsnSocketBase::ServerType serverType = socket_->getServerType(); + QStringList acceptedPayloadCommands = socket_->getAcceptedPayloadCommands(); + + // Close and disable the old server + socket_->blockSignals( true ); + disconnect( socket_, 0 ); + socket_->disconnectFromServer(); + socket_->deleteLater(); + + // Replace it with the new one + socket_ = new MsnSocketTcp( serverType ); + socket_->setAcceptedPayloadCommands( acceptedPayloadCommands ); + + // Set the internal socket switch + useHttpSocket_ = false; + + // Attach its signals to this class + attachToSocketSignals(); + + return true; +} + + + +// Write data to the socket without conversions +void MsnConnection::writeBinaryData( const QByteArray& data ) +{ + if( ! isConnected() ) + { + kWarning() << objectName() << "- Attempting to write binary data while disconnected, aborting."; + return; + } + +#ifdef KMESSDEBUG_SERVERMESSAGES +// To display the entire contents: +/* + QByteArray debugData( data ); + for( int i = 0; i < debugData.size(); i++ ) { if( debugData[i] < 10 ) debugData[ i ] = '?'; } + kDebug() << objectName() << "- >>> " << QString::fromUtf8( debugData.data(), debugData.size() ); +*/ +// To display the first readable part: (removing the final \r\n) + kDebug() << objectName() << "- >>> " << QString( data ).trimmed(); +#endif + + // Write to the socket + socket_->writeBinaryData( data ); + + // Append the message to the network window +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_SENT( this, data ); +#endif +} + + + +// Write data to the socket +void MsnConnection::writeData( const QString& data ) +{ + if( ! isConnected() ) + { + kWarning() << objectName() << "- Attempting to write data while disconnected, aborting."; + return; + } + +#ifdef KMESSDEBUG_SERVERMESSAGES + kDebug() << objectName() << "- >>> " << data.trimmed(); +#endif + + 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 + { // changed this since that is the string we send to the socket... (could be wrong here) + kWarning() << objectName() << "- Wanted to write " << data.length() << " bytes to the socket, wrote " << noBytesWritten << "."; + } + + // Append message to the network window +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_SENT( this, data.toUtf8() ); +#endif +} + + +#include "msnconnection.moc" diff --git a/kmess/network/msnconnection.h b/src/network/msnconnection.h similarity index 55% rename from kmess/network/msnconnection.h rename to src/network/msnconnection.h index 36e23ec..36fb496 100644 --- a/kmess/network/msnconnection.h +++ b/src/network/msnconnection.h @@ -18,46 +18,36 @@ #ifndef MSNCONNECTION_H #define MSNCONNECTION_H -#include "kmessbuffer.h" -#include "multipacketmessage.h" +#include "../kmessdebug.h" +#include "msnsocketbase.h" -#include "../kmessinterface.h" +#include +#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include // Forward declarations -class CurrentAccount; -class KMessTest; +class HttpSoapConnection; + +class QByteArray; class MimeMessage; -class QMutex; +class MsnSocketBase; +class MultiPacketMessage; +class QStringList; + + /** - * @brief The base functionality for the MSN server protocol handling. - * + * @brief MSN server protocol implementation. + * * The class provides the following facilities: - * - asynchronous connection to the MSN servers. - * - parsing the network data into protocol commands. - * - sending protocol commands and payloads. - * - built-in handling of PNG commands, to keep the connection alive. + * - parsing the raw network data into protocol commands. + * - sending protocol commands and payloads to the actual connection implementations * - built-in handling of multi-packet MSG commands. * - * Data from the server is handled by the dataReceived() slot. - * This method buffers and processes the data, until a complete command or payload message is received. - * Then, it calls one of the following methods to deliver the message the a derived class: + * Data from the basic I/O implementation is received by the dataReceived() slot. + * This method identifies the data and calls one of the following methods to deliver the message the a derived class: * - parseCommand() - * - parseMessage() + * - parseMimeMessage() * - parsePayloadMessage() * - isPayloadCommand() * @@ -70,6 +60,7 @@ class QMutex; * - sendPayloadMessage() * * @author Mike K. Bennett + * @author Valerio Pilo * @ingroup NetworkCore */ class MsnConnection : public QObject @@ -78,25 +69,34 @@ class MsnConnection : public QObject friend class KMessTest; - public: +#ifdef KMESS_NETWORK_WINDOW + friend class NetworkWindow; +#endif + + public: // Public methods // The destructor - ~MsnConnection(); + virtual ~MsnConnection(); // Whether or not the class is connected bool isConnected() const; - protected: // Protected methods - // If ordering is changed, update sendMimeMessage() + + protected: // Protected enumerations /// Ack type parameter for sendMimeMessage() enum AckType { - ACK_NONE, ///< Don't request any ACK message. - ACK_NAK_ONLY, ///< Send a NAK on failure, but nothing on success. - ACK_ALWAYS, ///< Send a NAK on failure, and ACK on success - ACK_ALWAYS_P2P ///< Special case for P2P data messsages ('D' type). + ACK_NONE, /// Don't request any ACK message. + ACK_NAK_ONLY, /// Send a NAK on failure, but nothing on success. + ACK_ALWAYS, /// Send a NAK on failure, and ACK on success + ACK_ALWAYS_P2P /// Special case for P2P data messsages ('D' type). }; + + protected: // Protected methods // The constructor - MsnConnection( const char *name = 0 ); + MsnConnection( MsnSocketBase::ServerType serverType ); + // Register a SOAP client to the class. + void addSoapClient( HttpSoapConnection *client ); + /** * @brief Close the connection. * @@ -105,15 +105,24 @@ class MsnConnection : public QObject */ virtual void closeConnection() = 0; // Connect to the given server via the socket - bool connectToServer( const QString& server, const int port = 1863 ); + void connectToServer( const QString& server = QString(), const quint16 port = 0 ); + // Disconnect and delete the a SOAP client. + void deleteSoapClient( HttpSoapConnection *client ); + // Disconnect and delete all SOAP clients. + void deleteSoapClients(); // 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 + void setAcceptedPayloadCommands( QStringList commandList ); + /** * @brief Process a received command * @@ -144,11 +153,43 @@ ADC 27 AL N=someone@kmessdemo.org @endcode * * Some commands, like MSG or UBX are followed by a payload. - * These commands are handled by parseMessage() or parsePayloadMessage(). + * These commands are handled by parseMimeMessage() or parsePayloadMessage(). * * @param command The command and arguments. */ 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. * @@ -163,12 +204,12 @@ X-MMS-IM-Format: FN=Arial; EF=; CO=0; CS=0; PF=0 no prob. How is development doing? @endcode - * + * * Notice the MIME-style header, and body below. * 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(). @@ -182,7 +223,10 @@ 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 parseMessage(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 ); + /** * @brief Process a received payload message * @@ -194,10 +238,10 @@ UBX someuser@kmessdemo.org 67 hello everyone @endcode * - * Notice the similarities with parseMessage(). + * Notice the similarities with parseMimeMessage(). * Both methods handle commands followed by payloads, * but differ in the type of messages: - * - parseMessage() only handles MIME payloads of the MSG command. + * - parseMimeMessage() only handles MIME payloads of the MSG command. * - this method handles any payload of a command returned by isPayloadCommand(). * * The value of command[0] indicates which command is received. @@ -205,85 +249,87 @@ UBX someuser@kmessdemo.org 67 * The last argument of command can be ignored. * It indicates the size of the payload, in this case 67 bytes. * - * @param command The received command and it's arguments. - * @param payload The message payload which followed the command. + * @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); - // Set whether we're sending pings or not (also resets ping timer) + 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 + bool switchToHttpSocket(); + //Switch back to the TCP connection + bool switchToTcpSocket(); + // Write data to the socket without conversions + void writeBinaryData( const QByteArray& data ); + // Write data to the socket + void writeData( const QString& data ); - protected: // Protected attributes - /// The instance of the current account - CurrentAccount *currentAccount_; protected slots: // Protected slots + /** * @brief Called when the connection attempt is successful. * * This allows the first command to be sent. */ - virtual void connectionSuccess() = 0; + virtual void slotConnected() = 0; - private: // Private methods - // Resets the ping timer - void resetPingTimer(); - // Write data to the socket - void writeData(const QString& data); - // Write data to the socket without conversions - void writeBinaryData(const QByteArray& data); + /** + * @brief Shows error dialog boxes + * + * Closes the connection, and displays + * a suitable type of message box. + * + * @param error The error reason or explanation + * @param type The type of error + */ + virtual void slotError( QString error, MsnSocketBase::ErrorType type ) = 0; - private slots: // Private slots - // Detect a socket error - void connectionClosed(int state); - // Detect a socket error - void connectionFailed(int error); + private: // private methods + // Connect a new socket's signals to our slots + void attachToSocketSignals(); + + private slots: // Read data from the socket - void dataReceived(); - // Server name lookup has been completed - void lookupFinished(); - // Send a "ping" to the server - void sendPing(); - + void slotDataReceived( const QStringList &commandLine, const QByteArray &payloadData ); + // Called when the connection is lost. + void slotDisconnected(); private: // Private attributes // An acknowledgement number int ack_; - // State variable to detect whether the client or server disconnected - bool disconnected_; // Whether or not the object was initialized bool initialized_; - // Number of errant pings since last good one - int missedPings_; - // Whether the last ping send got a reply - bool pingReceived_; - // A timer to regularly "ping" the server - QTimer pingTimer_; - // Are we sending pings? - bool sendPings_; - // The socket - KExtendedSocket *socket_; // A buffer for multi-packet messages - QDict multiPacketBuffer_; - bool writeLocked_; - // A buffer where we save the data until a command is received complete - KMessBuffer buffer_; + QHash multiPacketBuffer_; + // The persistent soap clients. + QList soapClients_; + // The socket + MsnSocketBase *socket_; - signals: // Public signals + private: // Private static attributes + // Whether or not the fallback HTTP socket is in use + static bool useHttpSocket_; + + + signals: // Signal that the server has disconnected void disconnected(); // Signal that a ping to the connection has been sent void pingSent(); // Signal to send information to the main window's status bar - void statusMessage( QString message, KMessInterface::ConnectionStatus connectStatus ); + void statusMessage( QString message, bool isError ); }; + + #endif diff --git a/src/network/msnnotificationconnection.cpp b/src/network/msnnotificationconnection.cpp new file mode 100644 index 0000000..125a5c9 --- /dev/null +++ b/src/network/msnnotificationconnection.cpp @@ -0,0 +1,3130 @@ +/*************************************************************************** + msnnotificationconnection.cpp - description + ------------------- + begin : Thu Jan 23 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 "msnnotificationconnection.h" + +#include "../contact/contact.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" +#include "msnchallengehandler.h" + +#include // for Qt::escape() +#include +#include + +#include +#include +#include + +#ifdef KMESSDEBUG_CONTACTLISTMODELTEST + #include "../../tests/modeltest/modeltest.h" +#endif + +#ifdef KMESSDEBUG_NOTIFICATION + #define KMESSDEBUG_NOTIFICATION_GENERAL +// #define KMESSDEBUG_NOTIFICATION_AUTH +// #define KMESSDEBUG_NOTIFICATION_MESSAGES +#endif + +// 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 + * + * Initializes the default groups of the ContactList class. + */ +MsnNotificationConnection::MsnNotificationConnection() + : MsnConnection( MsnSocketBase::SERVER_NOTIFICATION ), + addressBookService_(0), + connected_(false), + currentAccount_(0), + enableNotifications_(false), + initialized_(false), + isInitiatingConnection_(false), + offlineImService_(0), + passportLoginService_(0) +{ + setObjectName( "MsnNotificationConnection" ); + + // We manage the contact list + contactList_ = new ContactList(); + // TODO post 2.0: replace with proper impl + connect( contactList_, SIGNAL( dndMoveContactToGroup(QString,QString,QString) ), + this, SLOT ( moveContact(QString,QString,QString) ) ); + +#ifdef KMESSDEBUG_CONTACTLISTMODELTEST + // Start the Contact List model tests + new ModelTest( contactList_ ); +#endif + + // Periodically close expired switchboard requests + connect( this, SIGNAL( pingSent() ), + this, SLOT ( checkSwitchboardsTimeout() ) ); + + // Attach a timer to watch over the login process + loginTimer_.stop(); + loginTimer_.setSingleShot( true ); + connect( &loginTimer_, SIGNAL( timeout() ), + this, SLOT ( slotAuthenticationFailed() ) ); +} + + + +/** + * @brief The destructor + * + * Deletes the contact list. + * The base class closes the connection. + */ +MsnNotificationConnection::~MsnNotificationConnection() +{ + delete contactList_; + + // Remove all open requests. + qDeleteAll( openRequests_ ); + openRequests_.clear(); + + // Remove all offline im messages + qDeleteAll( offlineImMessages_ ); + offlineImMessages_.clear(); + + // closeConnection() also cleans up a lot too. + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +/** + * @brief Add a contact to another group. + * + * It's possible to add a contact to multiple groups, + * typically referred to as "copy contact to group..". + * + * @param handle The contact handle. + * @param groupId The group ID. + */ +void MsnNotificationConnection::addContactToGroup(QString handle, QString groupId) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "adding '" << handle << " to '" << groupId << "'."; +#endif + + AddressBookService *addressBook = createAddressBookService(); + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact == 0 ) + { + return; + } + + addressBook->addContactToGroup( contact->getGuid(), groupId ); +} + + + +/** + * @brief Re-add a known contact to the friends list + * + * The contact will no longer appear in a "allowed contacts" + * 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). + * + * + * @param handle Email address of the contact. + * @param groupsId Groups where to add the contact. + */ +void MsnNotificationConnection::addExistingContact( QString handle, const QStringList& groupsId ) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Re-adding contact " << handle; +#endif + + // Request the re-adding of contact to AB + AddressBookService *addressBook = createAddressBookService(); + addressBook->addContact( handle, groupsId , true ); +} + + + +/** + * @brief Add a new contact to the list. + * + * This is the standard method to add a contact. Optionally, it can also add it to a specific group. + * + * @param handle Email address of the contact. + * @param groupsId groupId's of the groups where to place the new contact. + */ +void MsnNotificationConnection::addNewContact( QString handle, const QStringList& groupsId ) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Adding contact " << handle; +#endif + + // Request the adding of contact to AB + AddressBookService *addressBook = createAddressBookService(); + addressBook->addContact( handle, groupsId ); +} + + + +/** + * @brief Adds the given contact to the allow list only. + * + * It allows the contact to see the online state of the user. + * The contact will not appear in the main window + * until it's also added to the friends list using addExistingContact(). + * + * This method can only be called when the contact exists + * in the reverse list only. This happens when the contact is new to the user, + * or it was completely removed. Call unblockContact() instead when the + * contact needs to be unblocked. + * + * This method is used when a new contact appears: + * - to add the contact to the friends list too, call addNewContact() + * - to allow the contact only, call this method. + * - 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). + * + * @param handle Email address of the contact. + */ +void MsnNotificationConnection::allowContact(QString handle) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Allowing contact " << handle; +#endif + + putAdl( handle, Contact::MSN_LIST_ALLOWED ); + + AddressBookService *addressBook = createAddressBookService(); + addressBook->unblockContact( handle ); +} + + + +/** + * @brief Add a new group + * + * This sends an ADG command to the server. + * When gotAdg() receives the server response, the ContactList object is updated. + * + * @param name Name of the group. + */ +void MsnNotificationConnection::addGroup(QString name) +{ + AddressBookService *addressBook = createAddressBookService(); + addressBook->addGroup( name ); +} + + + +/** + * @brief Block the given contact + * + * When the contact also exists in the friends list, + * it will remain there with a blocked status icon. + * When the contact only exists in the "allowed contacts" group, + * it moves to the "removed contacts" group with a blocked status icon. + * + * This method can also be used when a new contact appears: + * - to add the contact to the friends list too, call addNewContact() + * - to allow the contact only, call allowContact() + * - to block the contact, call this method. + * + * Internally, this method runs the required putAdc() calls to change the contact lists: + * - the contact is added to the block list (BL). + * + * @param handle Email address of the contact. + */ +void MsnNotificationConnection::blockContact(QString handle) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Blocking contact " << handle; +#endif + + putRml( handle, Contact::MSN_LIST_ALLOWED ); + putAdl( handle, Contact::MSN_LIST_BLOCKED ); + + AddressBookService *addressBook = createAddressBookService(); + addressBook->blockContact( handle ); +} + + + +/** + * @brief Change the current media of the user. + * + * This is used to exchange the "now playing" information. + * It sends an UUX command to the server. + * More information about this command can be found + * at: http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes#UUX + * + * @param application Name of the media application, typically empty. iTunes and Winamp are known to be accepted. + * @param mediaType Type of the media, either "Music", "Games" or "Office". + * @param enabled Whether the media setting is enabled or not. + * @param formatString A .Net style formatting string, e.g. "{0} - {1}". + * @param arguments Replacements for the placeholders in the formatStrirng. + */ +void MsnNotificationConnection::changeCurrentMedia( const QString &application, const QString &mediaType, + bool enabled, const QString &formatString, + 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 ); + + // Send personal status and current media + putUux(); +} + + + +/** + * @brief Called when the MSN Object of the current user changed. + * + * 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. + * + * 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. + */ +void MsnNotificationConnection::changedMsnObject() +{ + if(isConnected()) + { + // Send the same status message, with a new msn object + changeStatus(currentAccount_->getStatus()); + } +} + + + +/** + * @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 ( newName.trimmed().isEmpty() ) + { + kWarning() << "Tried to set an empty friendly name; ignoring."; + return; + } + + if( ! currentAccount_->isVerified() ) + { + return; + } + + currentAccount_->setFriendlyName( newName ); + + changeProperty("MFN", newName); + + AddressBookService *addressBook = createAddressBookService(); + addressBook->contactUpdate( AddressBookService::PROPERTY_FRIENDLYNAME, newName ); +} + + + +// Change the personal properties +void MsnNotificationConnection::changePersonalProperties( const QString& friendlyname, const QString& cid, int blp ) +{ + // 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 ); + */ +} + + + +/** + * @brief Change the personal message of the user. + * + * The personal mesage typically contains a short status message + * displayed next to the contact. + * + * This method sends the UUX payload command to the server. + * + * @param newMessage The new status message. + */ +void MsnNotificationConnection::changePersonalMessage( QString newMessage ) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Changing personal message to " << newMessage; +#endif + + lastPsm_ = Qt::escape(newMessage); + putUux(); +} + + + +/** + * @brief Change a user property + * + * It sends the PRP (likely short for property) command to the server. + * + * Valid property types are: + * - MFN: MSN Friendly name + * - PHH: Phone home + * - PHW: Phone work + * - PHM: Phone mobile + * - MOB: MSN Mobile authorised for others: Y or N + * - MBE: MSN Mobile enabled + * - WWE: MSN direct? + * - 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. + */ +void MsnNotificationConnection::changeProperty( QString type, QString value ) +{ + if( value.isEmpty() ) + { + sendCommand( "PRP", type ); + } + else + { + value = QUrl::toPercentEncoding( value ); + + // To avoid problem with a very long nick + value.truncate( 387 ); + + sendCommand( "PRP", type + " " + value ); + } +} + + + +/** + * @brief Change a contact property + * + * It sends the SBP (likely short for set-buddy-property) command to the server. + * + * @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. + */ +void MsnNotificationConnection::changeProperty( QString handle, QString type, QString value ) +{ + // Get contact + const Contact *contact = contactList_->getContactByHandle(handle); + if(KMESS_NULL(contact)) return; + + // Avoid disconnects by the server + if( contact->getGuid().isEmpty() ) + { + kWarning() << "Can't change property, contact GUID is empty" + << " (contact=" << handle << " property=" << type << ")." << endl; + return; + } + + // First guess is that "SBP" means set-buddy-property + if( value.isEmpty() ) + { + sendCommand( "SBP", contact->getGuid() + " " + type ); + } + else + { + value = QUrl::toPercentEncoding( value ); + + // To avoid problem with a very long nick + value.truncate( 387 ); + + sendCommand( "SBP", contact->getGuid() + " " + type + " " + value ); + } +} + + + +/** + * @brief Change the status of the user. + * + * This sends the CHG command to the user. + * This command also informs contacts the user's MsnObject and client capabilities. + * The MsnObject contains the meta-data about the user's display picture. + * The display picture itself is transferred in a chat session. + * + * Note this method advertises the supported client features, like 'winks' and 'webcam'. + * + * @param newStatus The new user status. + * @todo Possibly rename this to putChg() instead, especially when webcam support makes the capabilities dynamic. + */ +void MsnNotificationConnection::changeStatus( const Status newStatus ) +{ +#if NOTIFICATION_HIDE_P2P_SUPPORT + const uint capabilities = 0; +#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 + + const QString& statusCode( MsnStatus::getCode( newStatus ) ); + const QString objStr( QUrl::toPercentEncoding( currentAccount_->getMsnObjectString() ) ); + + /* + // To test the old file transfer: + sendCommand( "CHG", newStatus + " 0"); + return; + */ + + if( objStr.isEmpty() ) + { + // Just don't send it if we don't have it. + sendCommand( "CHG", statusCode + " " + QString::number(capabilities) ); + } + else + { + sendCommand( "CHG", statusCode + " " + QString::number(capabilities) + " " + objStr ); + } +} + + + +// Removes any expired switchboard requests, so new ones can be made +void MsnNotificationConnection::checkSwitchboardsTimeout() +{ + // There are no pending switchboard requests, bail out + if( openRequests_.count() < 1 ) + { + return; + } + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Removing expired switchboard requests."; +#endif + + // Delete any pending switchboard + uint now = QDateTime::currentDateTime().toTime_t(); + foreach( ChatInformation *switchboardInfo, openRequests_ ) + { + if( ( now - switchboardInfo->getTime() ) > 60 ) + { + openRequests_.removeAll( switchboardInfo ); + delete switchboardInfo; + } + } +} + + + +/** + * @brief Close the connection with the server + * + * This disconnects from the server. It also cleans up the + * state variables and objects associated with the session, + * e.g. contactlist data, open chat invitations, pending offline-im messages and SOAP clients. + * + * The ContactList object is saved and reset as well. + */ +void MsnNotificationConnection::closeConnection() +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Close the connection."; +#endif + + // Disconnect from the server first. + // emits the signals so other classes can clean up / save properties. + disconnectFromServer(); + + // Stop the login timer + loginTimer_.stop(); + + // Delete all SOAP clients, and unset local references here. + deleteSoapClients(); + offlineImService_ = 0; + passportLoginService_ = 0; + isInitiatingConnection_ = false; + + + // Remove contacts and non-special groups from the contact list + if ( contactList_ != 0 ) + { +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Resetting contactlist."; +#endif + + // Save the contact list settings + saveProperties(); + + // The contact list is not deleted, like this class it's being + // shared through the entire application, and attached to slots. + contactList_->reset( false ); + } + + // Clear all pending offline messages + pendingOfflineImMessages_.clear(); + + // Delete all offline im messages + qDeleteAll( offlineImMessages_ ); + offlineImMessages_.clear(); + + // Delete all open requets + qDeleteAll( openRequests_ ); + openRequests_.clear(); + + // Reset current account + // TODO: use different connection for this? + if( currentAccount_ != 0 ) + { + currentAccount_->setNoEmails( 0 ); + } +} + + + +/** + * @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( const QString&, const QString& ) ), + contactList_, SLOT( addGroup( const QString&, const QString& ) ) ); + connect( addressBookService_, SIGNAL( groupDeleted( const QString& ) ), + contactList_, SLOT( removeGroup( const QString& ) ) ); + connect( addressBookService_, SIGNAL( groupRenamed( const QString&, const QString& ) ), + contactList_, SLOT( renameGroup( const QString&, const 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 + * + * This service is used to retrieve the Offline-IM messages. + * The signals are attached to receivedOfflineIm() and receivedMailData() + * + * @returns The Offline-IM webservice handler + */ +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; + + foreach( const QString &field, fields ) + { + if( field.startsWith("t=") ) + { + authT = field.mid(2); + } + else if( field.startsWith("p=") ) + { + authP = field.mid(2); + } +#ifdef KMESSDEBUG_NOTIFICATION + else + { + 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. + addSoapClient( oimService ); + + // Register signals + connect( oimService, SIGNAL( messageReceived( const QString&, const QString&, const QString&, + const QDateTime&, const QString&, const QString&, int ) ), + this, SLOT ( receivedOfflineIm( const QString&, const QString&, const QString&, + const QDateTime&, const QString&, const QString&, int ) )); + connect( oimService, SIGNAL( metaDataReceived( QDomElement ) ), + this, SLOT ( receivedMailData( QDomElement ) )); + + return oimService; +} + + + +/** + * @brief Internal function to create the passport login handler. + * + * This service is used by gotUsr() to retrieve the passport authentication token. + * + * @returns The Passport login webservice handler + */ +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() ), + 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 + * + * @returns The model from the contact list managed by this class. + */ +QAbstractItemModel* MsnNotificationConnection::getContactListModel() +{ + return contactList_; +} + + + +/** + * @brief Called when the user is ready to go online. + * + * This method is called by gotSyn() or gotLst() when + * the entire contact list data is received. + * 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 email URL's. + * Finally, the connected() signal is fired. + */ +void MsnNotificationConnection::goOnline() +{ + int ack; + + if(KMESS_NULL(currentAccount_)) return; + + // 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(); + + // Change to the initial status +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Changing initial status to" << MsnStatus::getCode( currentAccount_->getInitialStatus() ); +#endif + changeStatus( currentAccount_->getInitialStatus() ); + + // Reset status fields. + lastCurrentMedia_ = QString::null; + lastPsm_ = QString::null; + + // Start with default personal message (may be empty) + changePersonalMessage( currentAccount_->getPersonalMessage( STRING_ORIGINAL ) ); + + // 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"); + hash.insert( QString::number(ack), "INBOX" ); + + // Ask for compose URL + ack = sendCommand("URL", "COMPOSE"); + hash.insert( QString::number(ack), "COMPOSE" ); + + // 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(); + + // Start a timer: for the first three seconds after connecting, do not display any notifications. + // See unlockNotifications() for more details + QTimer::singleShot( 3000, this, SLOT( unlockNotifications() ) ); +} + + + +// Received response to adl command +void MsnNotificationConnection::gotAdl( const QStringList& command, const QString& payload ) +{ + // The server responds to a successful ADL command + if( command[2] == "OK" ) + { + // Check if already connect + if( ! connected_ ) + { + // Go online + goOnline(); + emit connected(); + connected_ = true; + } + + return; + } + + if( ! payload.isEmpty() ) + { + QRegExp regexp( ".*n=\"([^\"]+)\".*n=\"([^\"]+)\".*l=\"([^\"]+)\"" ); + + int pos = regexp.indexIn( payload ); + int lists = -1; + QString handle; + + if( pos != -1 ) + { + handle = regexp.cap(2) + "@" + regexp.cap(1); + lists = QVariant( regexp.cap(3) ).toInt(); + } + + if( lists == -1 || handle.isEmpty() ) + { + return; + } + + 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 ); + } + } +} + + + +// Received confirmation of the user's status change +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] ) ); +} + + + +// Received a challenge from the server +void MsnNotificationConnection::gotChl( const QStringList& command ) +{ + // Handle challenge query + MSNChallengeHandler handler; + const QString& response( handler.computeHash( command[2] ) ); + + // Send response + sendPayloadMessage( "QRY", handler.getProductId(), response ); +} + + + +// Received a version update from the server +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", "SSO I " + currentAccount_->getHandle() ); +} + + + +// Received notice that a contact went offline +void MsnNotificationConnection::gotFln( const QStringList& command ) +{ + if(KMESS_NULL(contactList_)) return; + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << command[1] << " went offline."; +#endif + + contactList_->changeContactStatus( command[1].toLower(), STATUS_OFFLINE ); +} + + + +// Received notice that a contact is already online +void MsnNotificationConnection::gotIln( const QStringList& command ) +{ + if(KMESS_NULL(contactList_)) return; + + // Get the contact info from the message + 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] << "."; +#endif + + // Check if the received MSN object is empty, a "0" (Kopete), or shorter than the string "" + if( msnObject.isEmpty() || msnObject.compare( QString( "0" ) ) <= 0 || msnObject.length() < 12 ) + { + msnObject = QString::null; + } + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + if( ! msnObject.isEmpty() ) + { + kDebug() << "This person has an msn6 picture: " << msnObject; + } +#endif + + contactList_->changeContactStatus( handle, status, friendlyName, capabilities, msnObject, false ); +} + + + +/** + * @brief Handle the NLN command; a contact changed it's status. + * + * When a user updates it's status with the CHG command, + * all it's contact receive a NLN command. + * KMess sends the CHG command with the changeStatus() method. + * The CHG allows a contact to change it's name, client capabilities or MsnObject. + * + * The capabilities are a bitwise flag. The list of known values + * are described in the ContactBase::MsnClientCapabilities enum. + * + * The MsnObject is an identifier for the display picture. + * To download the actual picture, a client needs to initiate a chat, + * and send an invitation there. + * + * @code +<<< NLN NLN user@kmessdemo.org KMess%20Demo 1342210080 %3Cmsnobj%20Creator%3D%22user%40kmessdemo.org%22%20Size%3D%2211581%22%20Type%3D%223%22%20Location%3D%22KMess.tmp%22%20Friendly%3D%22AA%3D%3D%22%20SHA1D%3D%223VfOMCTTkuYHDjJhPx4sSlPiM%2Bs%3D%22%20SHA1C%3D%22ULeT2WGsdabLGNP3RgbWYw7ve80%3D%22/%3E +@endcode + * + * @param command The command arguments. + * - command[1] is the status code, see changeStatus() + * - command[2] is the contact handle. + * - 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 ) +{ + if(KMESS_NULL(contactList_)) return; + + // Get the contact info from the message + 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(); + + // Check if the contact removes his picture + if( msnObject == "0" ) + { + msnObject = ""; + } + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << handle << " is now " << MsnStatus::getCode( status ) << "."; +#endif + + // Update contact status. + contactList_->changeContactStatus( handle, status, friendlyName, capabilities, msnObject, enableNotifications_ ); +} + + + +// Received notice of disconnection from the server +void MsnNotificationConnection::gotOut( const QStringList& command ) +{ + // If the first command parameter is "OTH", it means that this account has connected from elsewhere. + if( command[1] == "OTH" ) + { + slotError( "Connected from another location", + MsnSocketBase::ERROR_CONNECTION_OTHER ); + + // Don't try reconnecting when connected from elsewhere. + } + else + { + closeConnection(); + + // Try connecting again + emit reconnect( currentAccount_->getHandle() ); + } +} + + + +// Received a property change (friendly name, phone number, etc..) +void MsnNotificationConnection::gotPrp( const QStringList& command ) +{ + const QString& propertyName ( command[1] ); + const QString& propertyValue( QUrl::fromPercentEncoding( command[2].toUtf8() ) ); + + if( propertyName == "MFN" ) + { + currentAccount_->setFriendlyName( propertyValue ); + } + else if( propertyName == "MBE" ) + { + // Unimplemented. + // indicates whether MSN Mobile is enabled. + } + else if( propertyName == "WWE" ) + { + // Unimplemented + // indicates whether MSN Direct is enabled. + } + else + { +// kWarning() << "Received unsupported property name/value: " << propertyName << " " << propertyValue << "!"; + } +} + + + +void MsnNotificationConnection::gotRml( const QStringList &command ) +{ + // The server responds to a successful RML command + if( command[2] == "OK" ) + { + } +} + + + +/** + * @brief Received a connection request from a contact + * + * Format at MSNP15: + * RNG 1295917726 65.54.228.15:1863 CKI 104194101.9520122 email@domain.com Friendly%20Name U messenger.msn.com 1 +*/ +void MsnNotificationConnection::gotRng( const QStringList& command ) +{ + // Pull the data from the message + 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) ); + + bool goodPort; + quint16 port = (quint16) portString.toUInt( &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; +#endif + + // Send connection information object + 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 ) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Got UBX information."; +#endif + + Contact *contact = contactList_->getContactByHandle( command[1].toLower() ); + if(KMESS_NULL(contact)) return; + + if( command[3].toInt() == 0 ) + { + // Size is 0, no personal message + contact->setPersonalStatus( QString::null ); + } + else + { + // Load XML parser + QDomDocument xml; + if( ! xml.setContent(payload) ) + { + kWarning() << "Could not parse personal status message (invalid XML, contact=" << command[1] << ")!"; + kWarning() << "The invalid XML was:" << payload; + } + + // Parse payload + 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. + if( currentMedia.length() > 0 ) + { + // From http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes: + // + // Media string can be something like: + // \0Music\01\0{0} - {1}\0Title\0Artist\0Album\0\0 + // \0Games\01\0Playing {0}\0Game Name\0 + // \0Office\01\0Office Message\0Office App Name\0 + // + // The literal "\0" is the separator char. + // Fields are: application, mediatype, enabled, formatstring, arg1, arg2, arg3 + + // Split media string + const QStringList media( currentMedia.split( "\\0" ) ); + mediaType = media[1]; + + // Check if media is enabled, to find out what this means. + if( media[2] != "1" ) + { +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "CurrentMedia is set, but not enabled."; +#endif + currentMedia = QString::null; + } + else + { + // Replace fields in .Net style format string + currentMedia = media[3]; // format + for( int i = 4; i < media.count(); i++ ) + { + currentMedia = currentMedia.replace( "{" + QString::number(i - 4) + "}", media[i] ); + } + } + } + + // Store personal message + contact->setPersonalStatus( psm, mediaType, currentMedia ); + } +} + + + +// Received the folder and command info for Hotmail's inbox or compose +// 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; + + // Grep the hash where store the informations + QHash& hash( currentAccount_->getUrlInformation() ); + + // 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() ) + { + hash.insert( service, command[2] ); + } +} + + + +/** + * @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 ) +{ + if(KMESS_NULL(currentAccount_)) return; + + const QString& step( command[2] ); + + // This is either asking for authentication or confirming it + if( step == "SSO" ) + { + // 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; + + const QString& policy ( command[4] ); // Policy + nonceBase64_ = command[5]; // Base64 nonce + + // Change statusbar + emit statusMessage( i18n("Authenticating..."), false ); + + // Start the passport based login + passportLoginService_ = createPassportLoginService(); + passportLoginService_->login( policy ); + } + else if( step == "OK" ) + { + // This is a confirmation message. Get the user's friendly name from the message. + bool isVerified = ( command[4].toInt() == 1 ); + currentAccount_->setVerified( isVerified ); + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + if( ! isVerified ) + { + kWarning() << "Passport account of the user is not verified yet."; + } +#endif + + // When users choose an existing account in the InitialView dialog, + // they may alter the password. This value is stored as temporary password. + // The password may be overwritten now, because the login was succesful. + currentAccount_->saveTemporaryPassword(); + + emit statusMessage( i18n( "Authenticated" ), false ); + + // 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 + { + kWarning() << "Received unexpected USR step:" << step; + } +} + + + +// Received version information +void MsnNotificationConnection::gotVer( const QStringList& command ) +{ + Q_UNUSED( command ); // Avoid compiler warning + + 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() ); +} + + + +/** + * @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 + */ +void MsnNotificationConnection::gotXfr(const QStringList& command) +{ + // Get id of transaction + int transactionId = command[1].toInt(); + + // 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; + quint16 port = (quint16) portString.toUInt( &goodPort ); +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Got " << serverType << " transfer to " << server << ":" << port << "."; +#endif + if( ! goodPort ) + { + kDebug() << "Got bad port number : " << portString << "."; + return; + } + + if( serverType == "NS" ) + { +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Disconnecting from old server."; +#endif + // Disconnect from the existing server. + disconnectFromServer( true ); + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Connecting to new server."; +#endif + // This is a notification server transfer. Switch this socket to the given server. + emit statusMessage( i18n("Switching to another server..."), false ); + +#ifdef KMESS_NETWORK_WINDOW + 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 ); + } + else if( serverType == "SB" ) + { +#ifdef KMESSTEST + KMESS_ASSERT( openRequests_.count() > 0 ); + int noChatsBefore = openRequests_.count(); +#endif + + // 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_ ) + { + if( chatInformation->getTransactionId() == transactionId ) + { + switchboardInfo = chatInformation; + break; + } + } + + if( switchboardInfo == 0 ) + { + kWarning() << "Got an XFR response, but there are no corresponding open requests."; + return; + } + + // Update the server information + switchboardInfo->setServerInformation( server, port, command[5] ); +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "emitting startSwitchboard() signal."; +#endif + + // Signal the new connection + emit startSwitchboard( *switchboardInfo ); + + // Remove the first item from the active requests list + openRequests_.removeAll( switchboardInfo ); + delete switchboardInfo; + +#ifdef KMESSTEST + KMESS_ASSERT( openRequests_.count() == ( noChatsBefore - 1 ) ); +#endif + } +} + + + +/** + * @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() +{ + if ( initialized_ ) + { + kDebug() << "already initialized!"; + return false; + } + if ( ! MsnConnection::initialize() ) + { + kDebug() << "Couldn't initialize base class."; + return false; + } + + // Determine which payload commands can be received by the Notification Connection + QStringList payloadCommands; + payloadCommands << "MSG" // Server message + << "UBX" // contact personal status message + << "UBN" + << "GCF" // server config file + << "NOT" // msn alerts, msn calendar + << "IPG" // contact page + << "ADL" + ; + + setAcceptedPayloadCommands( payloadCommands ); + + // Pass the current contactlist reference to the currentaccount + // so other classes can access contacts from a central point. + 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 = qToLittleEndian( 28 ); + blob.cryptMode = qToLittleEndian( 1 ); // CRYPT_MODE_CBC + blob.cipherType = qToLittleEndian( 0x6603 ); // Triple DES + blob.hashType = qToLittleEndian( 0x8004 ); // SHA-1 + blob.ivLength = qToLittleEndian( 8 ); + blob.hashLength = qToLittleEndian( 20 ); // Length of the HMAC hash + blob.cipherLength = qToLittleEndian( 72 ); + + // Copy the IV Bytes, the hash and chiper value in blob struct + memcpy( (char*) blob.ivBytes, iv.constData() , des3hash.size() ); + memcpy( (char*) blob.hashBytes, hash.constData(), hash.size() ); + memcpy( (char*) blob.cipherBytes, des3hash.constData(), des3hash.size() ); + + // Create the byte arrays and send for login + QByteArray blobs( (char*) &blob, 128 ); + + sendCommand( "USR", "SSO S " + currentAccount_->getToken( "MessengerClear" ) + " " + blobs.toBase64() ); +} + + +// The passport login failed, username/password was incorrect +void MsnNotificationConnection::loginIncorrect() +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Passport login was incorrect."; +#endif + + // NOTE: a similar thing also happens in soapRequestFailed(), + // but for fatal SOAP errors. + + slotError( "Authentication failed. Wrong login credentials.", MsnSocketBase::ERROR_AUTH_LOGIN ); +} + + + +// Move the contact to another group. +void MsnNotificationConnection::moveContact(QString handle, QString fromGroupId, QString toGroupId) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Moving '" << handle << "' from '" << fromGroupId << "' to '" << toGroupId << "'."; +#endif + + AddressBookService *addressBook = createAddressBookService(); + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact == 0 ) + { + return; + } + + addressBook->addContactToGroup( contact->getGuid(), toGroupId ); + + // Check if the "from group" is empty or not exists. + if( fromGroupId == "0" || fromGroupId.isEmpty() ) + { + return; + } + + addressBook->deleteContactFromGroup( contact->getGuid(), fromGroupId ); +} + + + +// Open a connection to the server +bool MsnNotificationConnection::openConnection() +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Opening connection."; +#endif + if ( !initialized_ ) + { + kWarning() << "Notification should be initialized before attempting to connect."; + return false; + } + + // If the last connection was using HTTP, try again using TCP first. + switchToTcpSocket(); + + // Initialize the contact list + contactList_->reset( true ); + +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_INIT(this, "NS messenger.hotmail.com"); +#endif + + 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(); + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Socket started connecting to the server. Started timer."; +#endif + + return true; +} + + + +// Parse a regular command +void MsnNotificationConnection::parseCommand( const QStringList& command ) +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Parsing command '" << command[0] << "'."; +#endif + + // Allow some time until the next message is received + if( loginTimer_.isActive() ) + { + 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 ); + + // If it's not a command, something has went wrong. + if( isNumber ) + { + kWarning() << "Invalid command received:" << command; + return; + } + + // Identify and handle the command + if( command[0] == "ADL" ) + { + 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 + } +} + + + +// 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 ) + { +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Removing chat invitation from list."; +#endif + + openRequests_.removeAll( chatInvite ); + delete chatInvite; + break; + } + } + } + + // 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 ) +{ + Q_UNUSED( command ); +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Got " << mainMessage.getSubValue("Content-Type") << "."; +#endif + + const QString& contentType( mainMessage.getSubValue("Content-Type") ); + const MimeMessage& message( mainMessage.getBody() ); + +#ifdef KMESSDEBUG_NOTIFICATION_MESSAGES + mainMessage.print(); + kDebug() << "Message body as mime:"; + message.print(); +#endif + + // Check the message type + if ( contentType == "text/x-msmsgsprofile" ) + { +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Load profile information."; +#endif + uint externalPort = mainMessage.getValue("ClientPort").toUInt(); + externalPort = ((externalPort & 0x00ff) << 8) | ((externalPort & 0xff00) >> 8); // Byte swapped + + currentAccount_->setAccountInformation( mainMessage.getValue("MSPAuth"), + mainMessage.getValue("preferredEmail"), + mainMessage.getValue("sid"), + mainMessage.getValue("lang_preference"), + mainMessage.getValue("EmailEnabled") == "1", + mainMessage.getValue("ClientIP"), + externalPort, + getLocalIp() ); + } + else if ( contentType == "text/x-msmsgsinitialmdatanotification" + || contentType == "text/x-msmsgsinitialemailnotification" + || contentType == "text/x-msmsgsoimnotification" ) + { + // Parse both messages the same way, + // the x-msmsgsinitialmdatanotification message is an extended version of x-msmsgsoimnotification + // description of the fields: http://msnpiki.msnfanatic.com/index.php/MSNP13:Offline_IM + + // Parse the URL fields (msmsgsinitialmdatanotification messages). + if( message.hasField("Post-URL") ) + { + currentAccount_->setEmailUrl( message.getValue("Post-URL") ); + } + + // Parse the Mail-Data field. + const QString& mailDataSrc( message.getValue("Mail-Data") ); + if( mailDataSrc == "too-large" ) + { + // After a certain ammount of messages, the XML is replaced with "too-large". + // Use SOAP to request the actual mail data. + if( offlineImService_ == 0 ) + { + offlineImService_ = createOfflineImService(); + } + offlineImService_->getMetaData(); + } + else + { + // Mail-Data was received directly in the message. + QDomDocument mailData; + if( ! mailData.setContent(message.getValue("Mail-Data")) ) + { + kWarning() << "Could not parse XML Mail-Data field!"; + return; + } + + receivedMailData( mailData.namedItem("MD").toElement() ); + } + } + else if ( contentType == "text/x-msmsgsemailnotification" ) + { +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "An email was received" + << " from \"" << message.getValue("From") << "\"" + << " with the subject \"" << message.getValue("Subject") << "\"" + << " in the folder \"" << message.getValue("Dest-Folder") << "\"." << endl; +#endif + + // If a message delta is to the active folder, emails were moved into it, so use a negative deletion + if ( message.getValue("Dest-Folder") == "ACTIVE" ) + { + // Received in the inbox + currentAccount_->changeNoEmails( 1 ); + } + + emit newEmail( message.decodeRFC2047String( message.getValue("From").toUtf8() ), + message.decodeRFC2047String( message.getValue("Subject").toUtf8() ), + (message.getValue("Dest-Folder") == "ACTIVE"), + message.getValue("id"), + message.getValue("Message-URL"), + message.getValue("Post-URL") ); + } + else if ( contentType == "text/x-msmsgsactivemailnotification" ) + { + int messageDelta = message.getValue("Message-Delta").toInt(); + + // If a message delta is from the active folder, emails were deleted + if ( message.getValue("Src-Folder") == "ACTIVE" ) + { + currentAccount_->changeNoEmails( -1 * messageDelta ); + } + // If a message delta is to the active folder, emails were moved into it + else if ( message.getValue("Dest-Folder") == "ACTIVE" ) + { + currentAccount_->changeNoEmails( messageDelta ); + } + + // When deleting Offline-IM messages, this message contains: + // Src-Folder: .!!OIM + // Dest-Folder: .!!trAsH + // Message-Delta: + } + else if( contentType == "application/x-msmsgssystemmessage" ) + { + // This is a maintenance info message from the server. + + if( message.getValue("Type") == "1" ) + { + int timeLeft = message.getValue("Arg1").toInt(); + 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 ); + } + else + { + slotError( i18nc( "Server maintenance dialog box text", + "The Live Messenger server will be going down in %1 for maintenance.", textTimeLeft ), MsnSocketBase::ERROR_SERVER ); + } + + } + } + else + { + kWarning() << "Content-Type '" << contentType << "' not reconized, message ignored."; + } +} + + + +// Parse a payload command +void MsnNotificationConnection::parsePayloadMessage( const QStringList &command, const QByteArray &payload ) +{ + if( command[0] == "UBX" ) + { + gotUbx( command, payload ); + } + else if( command[0] == "GCF" ) + { + // Ignore this + // Contains policy information, requesting clients + // to disable certain features or possibly block + // certain filenames/contents. +#ifdef KMESSDEBUG_NOTIFICATION_MESSAGES + kDebug() << "Ignoring security configuration file, message dump follows." << endl << QString::fromUtf8( payload.data(), payload.size() ); +#endif + } + else if( command[0] == "NOT" ) + { + // Ignore "notification" messages coming from MSN Calendar, MSN Alerts, and MSN Mobile. +#ifdef KMESSDEBUG_NOTIFICATION_MESSAGES + 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] << "!" + << " (message dump follows)\n" << QString::fromUtf8(payload.data(), payload.size()) << endl; + } +} + + + +/** + * @brief Send the personal status and current media fields. + * + * MSNP13 uses an extra field on the UUX command + * + */ +void MsnNotificationConnection::putUux() +{ + // 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 ); +} + + + +/** + * @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", "MSNP15 MSNP14 MSNP13 CVR0" ); + + // Reset the addressBookService_ because when the connection is closed the + // function deleteSoap in MsnConnection delete the soap class. + addressBookService_ = 0; +} + + + +// Received the Mail-Data field over SOAP or at the notification connection. +void MsnNotificationConnection::receivedMailData( QDomElement mailData ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( mailData.tagName() == "MD" ); +#endif + + QDomNodeList childNodes = mailData.childNodes(); + for( int i = 0; i < childNodes.count(); i++ ) + { + QDomElement childNode = childNodes.item(i).toElement(); + QString childName( childNode.nodeName() ); + + if( childName == "E" ) + { + // Found an initial email status notification. +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Load initial email information."; +#endif + + QDomElement inboxUnread = childNode.namedItem("IU").toElement(); + QDomElement othersUnread = childNode.namedItem("OU").toElement(); + + if( inboxUnread.isNull() || othersUnread.isNull() ) + { + kWarning() << "Reveived email notification, but 'IU' and 'OU' elements are missing!"; + } + +#ifdef KMESSTEST + KMESS_ASSERT( ! inboxUnread.isNull() ); + KMESS_ASSERT( ! othersUnread.isNull() ); +#endif + + currentAccount_->setInitialEmailInformation( inboxUnread.text().toInt(), + othersUnread.text().toInt() ); + } + else if( childName == "M" ) + { + // Using this for-loop, multiple 'M' elements are supported. + + // Extract the message ID. + QString messageId( childNode.namedItem("I").toElement().text() ); + if( messageId.isEmpty() ) + { + kWarning() << "Unable to parse Mail-Data payload, offline-im message-id not found."; + return; + } + +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Received offline-IM notification '" << messageId << "'"; +#endif + + // Create a SOAP client to request the Offline-IM + pendingOfflineImMessages_.append(messageId); + } + else if( childName == "Q" ) + { + // Not implemented + } + else + { + // Warn for unsupported tags. + kWarning() << "Unsupported tag '" << childName << "' encountered in Mail-Data payload!"; + } + } + + // Start a new client if there are pending messages, and no OfflineImService is active + if( ! pendingOfflineImMessages_.isEmpty() ) + { + // Initialize on demand + if( offlineImService_ == 0 ) + { + offlineImService_ = createOfflineImService(); + } + + // Request the first offline-im message if the current class was + // not processing already. (otherwise receivedOfflineIm() picks the next one). + if( offlineImService_->isIdle() ) + { + offlineImService_->getMessage( pendingOfflineImMessages_.first(), false ); + // Processing continues at receivedOfflineIm() + } + } +} + + + +// An Offline-IM message was downloaded +void MsnNotificationConnection::receivedOfflineIm( const QString &messageId, const QString &from, const QString &to, + const QDateTime &date, const QString &body, + const QString &runId, int sequenceNum ) +{ +#ifdef KMESSDEBUG_NOTIFICATION + kDebug() << "Received an offline IM message " + << "(from=" << from + << " runid=" << runId + << " sequenceNum=" << sequenceNum << ")" << endl; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( to == currentAccount_->getHandle() ); +#else + Q_UNUSED( to ); // Avoid compiler warning +#endif + + // 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("SOAP client is no longer valid.") ), + MsnSocketBase::ERROR_INTERNAL ); + + qDeleteAll( offlineImMessages_ ); + offlineImMessages_.clear(); + pendingOfflineImMessages_.clear(); + return; + } + + // Store message until all messages are received. + OfflineImMessage *offlineIm = new OfflineImMessage; + offlineIm->messageId = messageId; + offlineIm->body = body; + offlineIm->date = date; + offlineIm->from = from; + offlineIm->runId = runId; + offlineIm->sequenceNum = sequenceNum; + + // Order by date + uint insertPos = 0; + foreach( OfflineImMessage *nextOfflineIm, offlineImMessages_ ) + { + if( nextOfflineIm->sequenceNum > sequenceNum ) + { +#ifdef KMESSDEBUG_NOTIFICATION + kDebug() << "inserted message '" << date << "', #" << sequenceNum << " " + << "before '" << nextOfflineIm->date << "', #" << nextOfflineIm->sequenceNum << "." << endl; +#endif + break; + } + + insertPos++; + } + + offlineImMessages_.insert( insertPos, offlineIm ); + + + // Remove from pending list + if( pendingOfflineImMessages_.removeAll( messageId ) == 0 ) + { + kWarning() << "Could not remove " + "message '" << messageId << "' from the list!" << endl; + } + + + // If there are more messages, request the next one. + if( ! pendingOfflineImMessages_.isEmpty() ) + { +#ifdef KMESSDEBUG_NOTIFICATION + kDebug() << "Requesting the next offline-im message."; +#endif + + // Not all messages are received yet, request next + offlineImService_->getMessage( pendingOfflineImMessages_.first(), false ); + return; + } + + + // All messages received, and sorted, + // display the messages in the chat windows. + +#ifdef KMESSDEBUG_NOTIFICATION + kDebug() << "All messages received, displaying messages in chat window."; +#endif + + const ContactBase *contact = 0; + QString name; + QString picture; + QStringList messageIds; + + foreach( OfflineImMessage *offlineIm, offlineImMessages_ ) + { + messageIds.append( offlineIm->messageId ); + + // Get contact details + // Re-use previous results if message is from the same contact + if( contact == 0 || contact->getHandle() != offlineIm->from ) + { + contact = CurrentAccount::instance()->getContactByHandle( offlineIm->from ); + if( contact != 0 ) + { + // 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 + { + name = from; + picture = QString::null; + } + } + + // Send out the chat message + emit offlineMessage( ChatMessage( ChatMessage::TYPE_OFFLINE_INCOMING, + ChatMessage::CONTENT_MESSAGE, + true, + offlineIm->body, + offlineIm->from, + name, + picture, + QFont(), + QString::null, + offlineIm->date ) ); + } + + // Delete all local messages + qDeleteAll( offlineImMessages_ ); + offlineImMessages_.clear(); + + // Request to remove the Offline-IM message from the online storage. + offlineImService_->deleteMessages( messageIds ); + // Keep reference to SOAP service so the connection is re-used for other messages. +} + + + +// Remove a contact from the contact list completely +void MsnNotificationConnection::removeContact(QString handle, bool block) +{ + Contact *contact = contactList_->getContactByHandle( handle ); + if(KMESS_NULL(contact)) return; + + QString contactId( contact->getGuid() ); + if( contactId.isEmpty() ) + { + return; + } + + // If the user checks the block option then put the contact in Block Membership list ( if not already present ) + if( block && ! contact->isBlocked() ) + { + // Block the contact + blockContact( handle ); + } + + // Remove the contact from AB + AddressBookService *addressBook = createAddressBookService();; + addressBook->deleteContact( contactId ); +} + + + +//remove a contact from a single group +void MsnNotificationConnection::removeContactFromGroup(QString handle, QString groupId) +{ + AddressBookService *addressBook = createAddressBookService(); + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact == 0 ) + { + return; + } + + addressBook->deleteContactFromGroup( contact->getGuid(), groupId ); +} + + + +// Remove the current media advertising in the personal status. +void MsnNotificationConnection::removeCurrentMedia() +{ + lastCurrentMedia_ = QString::null; + putUux(); +} + + + +// Remove a group +void MsnNotificationConnection::removeGroup(QString id) +{ + AddressBookService *addressBook = createAddressBookService();; + addressBook->deleteGroup( id ); +} + + + +// Rename a group +void MsnNotificationConnection::renameGroup(QString id, QString newName) +{ + AddressBookService *addressBook = createAddressBookService();; + addressBook->renameGroup( id, newName ); +} + + + +// Request a switchboard for a chat with a contact +void MsnNotificationConnection::requestSwitchboard( QString handle, ChatInformation::ConnectionType type ) +{ + // Protect again invalid uses. + if( handle.isEmpty() ) + { + kWarning() << "no contact handle set!"; + return; + } + + // See if there is a open chat request. + foreach( ChatInformation *switchboardInfo, openRequests_ ) + { + if( switchboardInfo->getContactHandle() == handle ) + { +#ifdef KMESSDEBUG_NOTIFICATION + kDebug() << "A pending switchboard for contact " + << handle << " is already present." << endl; +#endif + return; + } + } + + // Open directly fake switchboards for offline contacts + if( type == ChatInformation::CONNECTION_OFFLINE ) + { + ChatInformation *offlineChatInfo = new ChatInformation( this, handle, -1, type ); + emit startSwitchboard( *offlineChatInfo ); + return; + } + + // Send the command + 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 ) ); +} + + + +// Load the contact list properties +void MsnNotificationConnection::readProperties() +{ +#ifdef KMESSDEBUG_NOTIFICATION + kDebug() << "Loading properties for the notification connection"; +#endif + + // Load the contact list's settings + contactList_->readProperties(); +} + + + +// Save the contact list properties +void MsnNotificationConnection::saveProperties() +{ +#ifdef KMESSDEBUG_NOTIFICATION + kDebug() << "Saving properties for the notification connection"; +#endif + + // Do not save account properties when it's a temporary account + if( currentAccount_->isGuestAccount() ) + { + kWarning() << "Requested to save properties, but this is a guest account!"; + return; + } + + // Save the contact list's settings for this account + contactList_->saveProperties(); +} + + + +/** + * @brief The authentication process has timed out + * + * Called by the login timer, when the login timer has expired + */ +void MsnNotificationConnection::slotAuthenticationFailed() +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Connection not successful within time limit."; +#endif + + // Bounce back to the unified error handler to give the user a message + slotError( i18n( "Authentication time limit exceeded" ), MsnSocketBase::ERROR_AUTH_TIME_LIMIT ); +} + + + +// 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; + } + + const 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 ) +{ + // Stop the login timer to allow parsing the address book. + loginTimer_.stop(); + + 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(); + } + + // Allow some time until the next message is received + if( loginTimer_.isActive() ) + { + loginTimer_.start( NOTIFICATION_COMMAND_INTERVAL_TIMEOUT ); + } + + 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. + * + * This method calls putVer() to start the version exchange. + */ +void MsnNotificationConnection::slotConnected() +{ +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Connected to server, sending VER."; +#endif + + // Start the login timer, allowing the defined maximum time between each + // received command + loginTimer_.start( NOTIFICATION_COMMAND_INTERVAL_TIMEOUT ); + + putVer(); +} + + + + +/** + * @brief Shows error dialog boxes + * + * Closes the connection, and displays + * a suitable type of message box. + * + * @param error The error reason or explanation + * @param type The type of error + */ +void MsnNotificationConnection::slotError( QString error, MsnSocketBase::ErrorType type ) +{ + kWarning() << "MSN Notification Connection error type" << type << ":" << error; + + QString message; + QString additionalInfo; + 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 the server can't be contacted, try again with HTTP before giving up + if( ( isInitiatingConnection_ && type == MsnSocketBase::ERROR_DROP ) + || type == MsnSocketBase::ERROR_CONNECTING + || type == MsnSocketBase::ERROR_CONNECTION_TIME_LIMIT ) + { + 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; + } + } + + // 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 + closeConnection(); + + // 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: + case MsnSocketBase::ERROR_AUTH_TIME_LIMIT: + 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: + 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: + 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: + 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: + 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() ); + } +} + + + +// 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() << "Showing error details"; +#endif + +#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 + + // 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; + + 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; + } +} + + + +/** + * @brief Unlock notifications after the first seconds of connections + * + * The first moments KMess is connected notifications are blocked, to avoid receiving popups before + * the user could even look at the contact list, possibly distracting him/her or covering screen space. + */ +void MsnNotificationConnection::unlockNotifications() +{ + enableNotifications_ = true; +} + +#include "msnnotificationconnection.moc" diff --git a/kmess/network/msnnotificationconnection.h b/src/network/msnnotificationconnection.h similarity index 60% rename from kmess/network/msnnotificationconnection.h rename to src/network/msnnotificationconnection.h index c9612da..a8a6cb0 100644 --- a/kmess/network/msnnotificationconnection.h +++ b/src/network/msnnotificationconnection.h @@ -18,16 +18,17 @@ #ifndef MSNNOTIFICATIONCONNECTION_H #define MSNNOTIFICATIONCONNECTION_H -#include -#include -#include -#include - +#include "../contact/msnstatus.h" +#include "../notification/notificationmanager.h" #include "chatinformation.h" #include "msnconnection.h" -#include "tcpconnectionbase.h" -#include "soap/httpsoapconnection.h" +#include +#include +#include +#include + + // Forward declarations @@ -35,11 +36,14 @@ class ChatInformation; class ChatMessage; class Contact; class ContactList; -class KConfig; class KMessTest; class MimeMessage; class PassportLoginService; +class QAbstractItemModel; class OfflineImService; +class AddressBookService; + + /** * @brief The primary connection to the MSN server. @@ -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 @@ -85,13 +89,13 @@ class OfflineImService; * Some contact commands include an MsnObject argument. * This is the "ticket" to request a display picture later, * by "inviting" the contact to transfer the data belonging to the MsnObject. - * Invitations for file and picture transfers are not handled by the notification connection however. - * A chat session needs to be started first. The invitation for the picture or file transfer can be sent there. + * Invitations for file and msnobject transfers are not handled by the notification connection however. + * A chat session needs to be started first. The invitation for the msnobject or file transfer can be sent there. * * 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 @@ -114,35 +120,39 @@ class MsnNotificationConnection : public MsnConnection friend class KMessTest; + public: // The constructor MsnNotificationConnection(); // The destructor - ~MsnNotificationConnection(); + ~MsnNotificationConnection(); // Request a change in the user's status - void changeStatus( const QString& newStatus ); + void changeStatus( const Status newStatus ); // Close the connection with the server - virtual void closeConnection(); - // Return the contact list - const ContactList* getContactList() const; + void closeConnection(); + // Return the contact list model + QAbstractItemModel* getContactListModel(); // Initialize the object bool initialize(); // Open a connection to the server bool openConnection(); - // Save contact list properties - void saveProperties(KConfig *config); + // Load the contact list properties + void readProperties(); + // Save the contact list properties + void saveProperties(); - public slots: // Public slots + + 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); - // 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. @@ -152,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 @@ -177,107 +187,141 @@ class MsnNotificationConnection : public MsnConnection // Unblock the given contact void unblockContact(QString handle); - protected: // Protected methods - // Test whether the given command is a payload command - virtual bool isPayloadCommand(const QString &command) const; - - protected slots: // Protected slots + private slots: // The socket connected, so send the version command. - void connectionSuccess(); + void slotConnected(); + // Show warning notifications + void slotWarning( const QString &warning, bool isImportant ); + // Shows error notifications + void slotError( QString error, MsnSocketBase::ErrorType type ); + // Displays additional info about network errors + void slotErrorEventActivated( NotificationManager::EventSettings settings, NotificationManager::Buttons button ); + private: // Private methods - // Register a SOAP client to the class. - void addSoapClient( HttpSoapConnection *client ); + // 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(); - // Show a .net status message. - void dotNetMessage(QString message); + // 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 parseMessage(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: // Private slots - // Check whether login was successful within time limit - void checkLogin(); + + private slots: // Removes any expired switchboard requests, so new ones can be made void checkSwitchboardsTimeout(); // The passport login failed, username/password was incorrect void loginIncorrect(); // The passport login succeeded - void loginSucceeded(QString authentication); + void loginSucceeded(); // Received the Mail-Data field over SOAP or at the notification connection. void receivedMailData( QDomElement mailData ); // An Offline-IM message was downloaded void receivedOfflineIm( const QString &messageId, const QString &from, const QString &to, const QDateTime &date, const QString &body, const QString &runId, int sequenceNum ); - // A SOAP request failed with an error message - void soapRequestFailed(HttpSoapConnection *client, const QString &reason); - // A SOAP request failed with an SOAP fault - void soapRequestFailed(HttpSoapConnection *client, const QString &faultCode, - const QString &faultString, QDomElement faultNode); + // The authentication process has timed out + void slotAuthenticationFailed(); + // 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; @@ -288,48 +332,52 @@ class MsnNotificationConnection : public MsnConnection int sequenceNum; }; - // The 'p' value for the login - QString authP_; - // The 't' value for the login - QString authT_; // A pointer to the list of contacts - ContactList *contactList_; + ContactList *contactList_; + // A pointer to the shared current account singleton. + 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 timeout the user's logon + // A timer to watch over the login process QTimer loginTimer_; - // The number of contact read in - int noContacts_; // The received offline messages. - QPtrList offlineImMessages_; + QList offlineImMessages_; // The Offline-IM SOAP client - OfflineImService *offlineImService_; + OfflineImService *offlineImService_; // A list of switchboard requests which haven't yet been given servers - QPtrList openRequests_; + QList openRequests_; // The object than handles the passport login - PassportLoginService *passportLoginService_; + PassportLoginService *passportLoginService_; // The pending offline-im messages - QStringList pendingOfflineImMessages_; - // The persistent soap clients. - QPtrList soapClients_; - // The total number of contacts in the contact list - int totalNoContacts_; + QStringList pendingOfflineImMessages_; - signals: // Public signals + + signals: // Signal a chat message, used for offline-im messages void offlineMessage( const ChatMessage &message ); // 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 startedSwitchboard( const ChatInformation &chatInfo ); + void startSwitchboard( const ChatInformation &chatInfo ); + }; + + #endif diff --git a/src/network/msnsocketbase.cpp b/src/network/msnsocketbase.cpp new file mode 100644 index 0000000..c5a2a06 --- /dev/null +++ b/src/network/msnsocketbase.cpp @@ -0,0 +1,165 @@ +/*************************************************************************** + msnsocketbase.cpp - description + ------------------- + begin : Thu Apr 1 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 "msnsocketbase.h" + +#include +#include + +#include +#include +#include + + +/** + * @brief The constructor + */ +MsnSocketBase::MsnSocketBase( ServerType serverType ) +: connected_( false ) +{ + // Set the type of server the derived socket will connect to + serverType_ = serverType; +} + + + +/** + * @brief The destructor + * + * Does nothing. + */ +MsnSocketBase::~MsnSocketBase() +{ +} + + + +/** + * @brief Return which payload commands are accepted by this connection + * + * Returns the list of payload messages which this connection needs to accept. + * + * @return List of 3-letter commands which are recognized as carrying payload. + */ +QStringList MsnSocketBase::getAcceptedPayloadCommands() +{ + return acceptedPayloadCommands_; +} + + + +/** + * @brief Return the type of server connection managed by the socket + */ +MsnSocketBase::ServerType MsnSocketBase::getServerType() const +{ + return serverType_; +} + + + +/** + * @brief Whether or not the connection is active + * + * @returns True when connected, false otherwise. + */ +bool MsnSocketBase::isConnected() const +{ + return ( connected_ ); +} + + + +/** + * @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. + * + * @param command Command to verify + * @returns True when it's a payload command, false otherwise. + */ +bool MsnSocketBase::isPayloadCommand( const QString &command ) const +{ + return acceptedPayloadCommands_.contains( command ); +} + + + +// 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. + * + * Within different kinds of connection, server messages can be different or + * have different meanings; this method ensures that every kind of connection + * is able to recognize its own payload commands only. + * + * @param commandList List of 3-letter commands which will be recognized as carrying payload. + */ +void MsnSocketBase::setAcceptedPayloadCommands( QStringList commandList ) +{ + acceptedPayloadCommands_ = commandList; +} + + + +#include "msnsocketbase.moc" diff --git a/src/network/msnsocketbase.h b/src/network/msnsocketbase.h new file mode 100644 index 0000000..4dbf62e --- /dev/null +++ b/src/network/msnsocketbase.h @@ -0,0 +1,136 @@ +/*************************************************************************** + msnsocketbase.h - description + ------------------- + begin : Thu Apr 1 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 MSNSOCKETBASE_H +#define MSNSOCKETBASE_H + +#include + +// Forward declarations +class CurrentAccount; +class QAuthenticator; +class QNetworkProxy; + + + +/** + * @brief Base class and interface for the MSN Socket classes. + * + * The class defines the interface expected by MsnConnection for all socket implementations. + * Currently there is a socket implementation for normal TCP-based connections (MsnSocketTcp) + * and a socket for MSN-over-HTTP (MsnSocketHttp). + * + * @author Mike K. Bennett + * @author Valerio Pilo + * @ingroup NetworkCore + */ +class MsnSocketBase : public QObject +{ + Q_OBJECT + + public: // Public enumerations + /// Type of server that will be connected from this socket + enum ServerType + { + SERVER_NOTIFICATION /// The connection is to a notification server + , SERVER_SWITCHBOARD /// The connection is to a switchboard server + }; + /// Types of errors with connection sockets + enum ErrorType + { + /// 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 + }; + + + public: // Public methods + // The constructor + MsnSocketBase( ServerType serverType ); + // The destructor + ~MsnSocketBase(); + // Connect to the given server via the socket + virtual void connectToServer( const QString& server = QString(), const quint16 port = 0 ) = 0; + // Disconnect from the server, if connected + virtual void disconnectFromServer( bool isTransfer = false ) = 0; + // Get the IP address of this machine. + virtual QString getLocalIp() const = 0; + // Return which payload commands are accepted by this connection + QStringList getAcceptedPayloadCommands(); + // Return the type of server connection managed by the socket + 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 + virtual void setAcceptedPayloadCommands( QStringList commandList ); + // Set whether we're sending pings or not + virtual void setSendPings( bool sendPings ) = 0; + // Write data to the socket without conversions + virtual qint64 writeBinaryData( const QByteArray& data ) = 0; + // Write data to the socket + virtual qint64 writeData( const QString& data ) = 0; + + + protected: // Protected properties + // List of accepted commands which carry a data payload + QStringList acceptedPayloadCommands_; + // State variable to detect if the connection is active + bool connected_; + // 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(); + // Signal that incoming data is ready to be parsed + void dataReceived( const QStringList &commandLine, const QByteArray &payloadData ); + // Signal that the server has disconnected + void disconnected(); + // Signal that an error has occurred + void error( QString error, MsnSocketBase::ErrorType type ); + // Signal that a ping to the connection has been sent + void pingSent(); + // Signal to send information to the main window's status bar + void statusMessage( QString message, bool isError ); + +}; + +#endif diff --git a/src/network/msnsockethttp.cpp b/src/network/msnsockethttp.cpp new file mode 100644 index 0000000..6ce6b71 --- /dev/null +++ b/src/network/msnsockethttp.cpp @@ -0,0 +1,918 @@ +/*************************************************************************** + msnsockethttp.cpp - description + ------------------- + begin : Thu Apr 4 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 "msnsockethttp.h" + +#include +#include "../kmessdebug.h" + +#include +#include +#include + +#include +#include + + +#ifdef KMESSDEBUG_CONNECTION // Area-specific debug statements + #define KMESSDEBUG_CONNECTION_SOCKET_HTTP + #define KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS +#endif + + +/** + * Default Gateway address/port + * + * This define holds the default address which KMess uses to send HTTP + * messages. The port is usually 80. + */ +#define DEFAULT_GATEWAY_ADDRESS "gateway.messenger.hotmail.com" +#define DEFAULT_GATEWAY_PORT 80 + + + +/** + * @brief The constructor + * + * Initializes the HTTP interface, prepares the default HTTP header we'll use + * throughout the connection, and sets up the request/ping timer. + */ +MsnSocketHttp::MsnSocketHttp( ServerType serverType ) +: MsnSocketBase( serverType ) +, canSendRequests_( true ) +, sendPings_( false ) +{ + setObjectName( "MsnSocketHttp" ); + + // Create the http interface + http_ = new QNetworkAccessManager( this ); + + // Connect the socket's signals for parsing + 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() ) ); + + // 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 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 ); +#endif +} + + + +/** + * @brief The destructor + * + * Closes the connection, cleans up request queues, and deletes the interface. + */ +MsnSocketHttp::~MsnSocketHttp() +{ + // Disconnect from the server on exit + if( connected_ ) + { + disconnectFromServer(); + } + + // Stop the polling timer + pollingTimer_.stop(); + + // Clean up and delete the http interface + cleanUp(); + delete http_; + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "DESTROYED"; +#endif +} + + + +/** + * @brief Clean up the connection + * + * This internal method empties all queues and removes any pending connection - + * including any in-progress ones. + */ +void MsnSocketHttp::cleanUp() +{ + // Clear the request queues + queuedRequests_ .clear(); +} + + + +/** + * @brief Connect to the given server + * + * 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. + * + * @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 MsnSocketHttp::connectToServer( const QString& server, const quint16 port ) +{ + // We use our default HTTP port only + Q_UNUSED( port ); + + // When no server is specified, use the default msn one + QString desiredAddress; + if( server.isEmpty() ) + { + desiredAddress = DEFAULT_GATEWAY_ADDRESS; + } + else + { + desiredAddress = server; + } + +#if KMESS_ENABLE_LOCAL_MODE == 1 + // NOTE Local mode: see src/kmessdebug.h + desiredAddress = "127.0.0.1:8008"; +#endif + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Connecting to server at " << desiredAddress << ":" << DEFAULT_GATEWAY_PORT << "."; +#endif + + // Set up the gateway where to send our messages + setGateway( desiredAddress ); + + // Translate the server type to a 2-letter string to send in our requests + QString serverType; + switch( serverType_ ) + { + case SERVER_NOTIFICATION: serverType = "NS"; break; + case SERVER_SWITCHBOARD: serverType = "SB"; break; + default: + kWarning() << "Unknown type of server" << serverType_ << "!"; + return; + } + + // Set the parameters for the next request + nextRequestParameters_ = "Action=open&Server=" + serverType + "&IP=" + desiredAddress; + + // Flush any active or pending request if the interface is closing a previous connection + cleanUp(); + + // Set our internal state variables + connected_ = true; + canSendRequests_ = true; + + // Signal we're ready + emit connected(); + emit statusMessage( i18n( "Connected" ), false ); +} + + + +/** + * @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 MsnSocketHttp::disconnectFromServer( bool isTransfer ) +{ + // Stop pinging + setSendPings( false ); + pollingTimer_.stop(); + + // Just clean up if we are disconnected already + if( ! connected_ ) + { + return; + } + + connected_ = false; + + // Make sure all remaining requests get sent, so that we don't lose messages. + // Even if we're disconnecting because of an error, send them anyway: we'll ignore the + // responses anyway. + if( ! queuedRequests_.isEmpty() ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Sending" << queuedRequests_.count() << "remaining requests before closing."; +#endif + + QNetworkRequest request( requestHeader_ ); + QByteArray data; + + // 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 + while( ! queuedRequests_.isEmpty() ) + { + const RequestInfo &queuedRequest = queuedRequests_.first(); + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + mergedRequests++; +#endif + + // Merge the data + data.append( queuedRequest.data ); + + // 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 ) + { + request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant() ); + } + + // Send it + http_->post( request, data ); +/* + // Wait until this request has been sent, using a local loop. + QEventLoop loop( this ); + + // Block the timer signals before starting, we're just using it to timeout the request + pollingTimer_.blockSignals( true ); + pollingTimer_.start( 1000 ); + + while( http_->currentId() != 0 && pollingTimer_.isActive() ) + { + loop.processEvents(); + } + + // Enable back its signals now + pollingTimer_.blockSignals( false ); + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + if( http_->currentId() != 0 && ! pollingTimer_.isActive() ) + { + kDebug() << "Could not send the last request within timeout."; +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS + kDebug() << "Full dump:" << endl + << header.toString() + << QString::fromUtf8( data ); +#endif + } +#endif +*/ + } + + // Clear the queues, so pending messages will be ignored + cleanUp(); + + // Do not signal a disconnection when we are transferring to another gateway + if( isTransfer ) + { + return; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Emitting disconnection signal."; +#endif + + emit disconnected(); +} + + + +// 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 + * + * Using HTTP, we don't really care about our address. Not just that, + * we're probably behind a firewall, so finding out our real IP wouldn't + * help either. + * This method just returns "127.0.0.1". + * + * @returns The IP address the socket uses at the system. + */ +QString MsnSocketHttp::getLocalIp() const +{ + // We don't care about our own IP, return a generic one + return QHostAddress( QHostAddress::LocalHost ).toString(); +} + + + +/** + * @brief Sends the next queued request + * + * Data to send is stored in a queue of requests. This method just takes the + * oldest message and sends it. + */ +void MsnSocketHttp::sendNextRequest() +{ + // Verify if we can send another message, if there is any + if( ! connected_ || ! canSendRequests_ ) + { + return; + } + + QTime now( QTime::currentTime() ); + + // Do not send messages too fast, or the server will ignore them + int elapsedMsecs = lastRequestTime_.msecsTo( now ); + if( elapsedMsecs <= 1000 ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Not sending another message in" << elapsedMsecs << "more milliseconds."; +#endif + + // The polling method will call this method back + pollingTimer_.start( 1000 - elapsedMsecs ); + return; + } + + // Lock the sending process: only one message at most can be 'on the wire' in any given moment + canSendRequests_ = false; + + bool sendingPollingRequest = false; + QNetworkRequest request( requestHeader_ ); + QByteArray data; + QString url( gatewayAddress_ + baseServerPath_ ); + + // When the queue is empty, send polling requests + if( queuedRequests_.isEmpty() ) + { + 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 + { + // 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 + while( ! queuedRequests_.isEmpty() ) + { + const RequestInfo &queuedRequest = queuedRequests_.first(); + + // Stop merging requests if we get a special one + if( ! queuedRequest.requestQueryString.isEmpty() ) + { + break; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + mergedRequests++; +#endif + + // Merge the data + data.append( queuedRequest.data ); + + // 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() ); + + 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 ) + { + request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant() ); + } + } + + // Send it + request.setUrl( QUrl( url ) ); + http_->post( request, data ); + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Sent a request. Queue size now:" << queuedRequests_.size(); +#endif +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS + dump( &request, data, true ); +#endif + + + // Set the last request type + lastRequestWasPolling_ = sendingPollingRequest; + + // Stop polling, the response to this message will carry new messages along + pollingTimer_.stop(); + lastRequestTime_ = now; +} + + + +/** + * @brief Change the server connection gateway + * + * Set the address of the gateway, from this point on, all queued data will + * be sent to the new gateway. + * + * @param host The new gateway hostname or IP address. + */ +void MsnSocketHttp::setGateway( QString host ) +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Using server at" << host << ":" << DEFAULT_GATEWAY_PORT << "as gateway."; +#endif + + // Save the server address to use in our requests + requestHeader_.setRawHeader( QByteArray( "Host" ), host.toUtf8() ); + + gatewayAddress_ = "http://" + host; +} + + + +/** + * @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 MsnSocketHttp::setSendPings( bool sendPings ) +{ + sendPings_ = sendPings; +} + + + +/** + * @brief Send a polling message to the server, to retrieve pending commands + * + * This method gets called every two seconds: each time it checks if there still are + * messages queued to be sent, and if not, it polls the gateway for new messages. + */ +void MsnSocketHttp::slotQueryServer() +{ + QDateTime now( QDateTime::currentDateTime() ); + + // Emit a "ping" signal every about 30 seconds, to let the app perform scheduled tasks + if( sendPings_ && ( ! lastPing_.isValid() || lastPing_.secsTo( now ) > 30 ) ) + { + lastPing_ = now; + emit pingSent(); + } + + // Don't send polling messages when: 1) we are disconnected; 2) a message is still being + // responded at (we'll receive new messages along with the response); 3) there still are + // messages to send (same reason as point 2). + if( ! connected_ || ! canSendRequests_ ) + { + return; + } + + // If the queue isn't empty send the next message + if( ! queuedRequests_.isEmpty() ) + { + sendNextRequest(); + return; + } + + // The last response had data; maybe there's more so keep checking +// if( ! lastResponseWasEmpty_ ) +// { + sendNextRequest(); +// } +// else + if( lastResponseWasEmpty_ ) + { + // Send a poll five seconds after the last command and ten after the last polling request + pollingTimer_.start( lastRequestWasPolling_ ? 10000 : 5000 ); + } +} + + + +/** + * @brief Read received data and pass along the contained commands + * + * This method parses the incoming raw data for the syntax used by the MSN protocol. + * Data arrives here only when it's been received completely. This may make it appear + * slower than usual TCP. + * Incoming messages contain all new messages from the server, so we need to bounce + * them back individually to MsnConnection. + * + * 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 + +@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 (e.g. web-based login proxy) + if( reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt() != 200 || ! hasMsnHeader ) + { + kWarning() << "Received a type" << reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt() + << "response."; +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS + dump( reply, responseData, false ); +#endif + + // Report the right type of error + QString errorMsg( reply->errorString() ); + ErrorType errorType; + switch( reply->error() ) + { + case QNetworkReply::NoError: + // Invalid MSN responses (web authentication redirects often replace the + // original response contents). Treat like a connection error. + case QNetworkReply::HostNotFoundError: + case QNetworkReply::ConnectionRefusedError: + case QNetworkReply::TimeoutError: + errorType = ERROR_CONNECTING; + break; + + case QNetworkReply::RemoteHostClosedError: + case QNetworkReply::UnknownNetworkError: + errorType = ERROR_DROP; + break; + + 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( 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; + sendNextRequest(); + return; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS + dump( reply, responseData, false ); +#endif + + // 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 ) ); + + if( key == "SessionID" ) + { + // Every message has a different session ID, which needs to be sent along + // with the next message. + nextRequestId_ = value; + } + else if( key == "GW-IP" ) + { + // Change the gateway, if we didn't do it already + if( ! gatewayAddress_.contains( value ) ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Switching gateways:" << gatewayAddress_ << "->" << value; +#endif + setGateway( value ); + } + } + else if( key == "Session" ) + { + // Session close request. We've been kicked or the connection was closed by us first. + // Do nothing if we are disconnected already. + // TODO Behavior when receiving this command needs to be tested. + if( value == "close" && connected_ ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Received disconnection command"; +#endif + + cleanUp(); + disconnectFromServer(); + } + } + else + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Unknown attribute received in the MSN Header:" << item; +#endif + } + } + + lastResponseWasEmpty_ = true; + + // Extract all new messages from the response data + if( ! responseData.isEmpty() ) + { + int startingPos = 0; + QStringList command; + bool hasPayload = false; + QString commandLine; + int commandLineSize; + QByteArray payloadData; + + // Loop until the entire response has been parsed + while( true ) + { + if( startingPos >= responseData.size() ) + { + break; + } + + // Retrieve the first available command from the response body + 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 + // 'if' statement above ends the loop) + if( command[0].isEmpty() ) + { + break; + } + + // See if it's a payload command, and extract the payload from the response data + + // 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 = responseData.mid( startingPos + commandLineSize, payloadSize ); + + startingPos += commandLineSize + payloadSize; + } + else // Not a payload message, just go on from right after the command + { + payloadData.clear(); + + startingPos += commandLineSize; + } + + // We've received a message, hand it over to MsnConnection for interpretation + emit dataReceived( command, payloadData ); + lastResponseWasEmpty_ = false; + } + } + + // 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 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 MsnSocketHttp::writeBinaryData( const QByteArray &data ) +{ + if( ! connected_ ) + { + kWarning() << "Attempted to write data to a disconnected interface, aborting."; + return -1; + } + + // Create the new request with the data + RequestInfo newRequest; + newRequest.data = data; + + // Special query strings override the default one + if( ! nextRequestParameters_.isEmpty() ) + { + newRequest.requestQueryString = nextRequestParameters_; + nextRequestParameters_ = QString(); + } + else + { + newRequest.requestQueryString = QString(); + } + + // Queue the new request + queuedRequests_.append( newRequest ); + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Queued a new request"; +#endif + + // Try to immediately send the new message, if possible + sendNextRequest(); + + 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 MsnSocketHttp::writeData( const QString &data ) +{ + return writeBinaryData( data.toUtf8() ); +} + + + +#include "msnsockethttp.moc" diff --git a/src/network/msnsockethttp.h b/src/network/msnsockethttp.h new file mode 100644 index 0000000..f776704 --- /dev/null +++ b/src/network/msnsockethttp.h @@ -0,0 +1,164 @@ +/*************************************************************************** + msnsockethttp.h - description + ------------------- + begin : Thu Apr 4 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 MSNSOCKETHTTP_H +#define MSNSOCKETHTTP_H + +#include "msnsocketbase.h" + +#include +#include +#include +#include +#include +#include + +// Forward declarations +class CurrentAccount; +class QNetworkReply; +class QSslError; + + + +/** + * @brief Basic I/O functionality for the MSN server protocol over a HTTP connection. + * + * This is a low-level class used used by MsnConnection. + * The class provides the following facilities: + * - HTTP-only connection to the MSN servers, with exclusive usage of ports 80 and 443. + * - sending/receiving raw protocol data. + * + * With HTTP the server has no way of contacting the client by itself. Everytime we + * send a request to the server (the "MSN HTTP Gateway"), it will send along with the answer + * a full list of messages which we didn't receive yet. So if we've got nothing to send, + * we're forced to periodically send 'poll' requests. These are bogus calls which exist only + * to allow the gateway to send any new message back. + * + * In any given moment, there may only be one active message. This means that if we send two + * subsequent requests, we will be disconnected immediately with a '400 Bad Request' response. + * Therefore, this class implements a 1-item-wide sending window. It's not necessary to apply + * it to receiving also, since the server just responds in order. + * + * Data from the server (the "HTTP Gateway") is handled by the slotDataReceived() slot. + * This method receives responses to HTTP requests made by the class; they contain a list of + * new undelivered messages. The slotDataReceived() method splits it up to individual commands + * and forwards the received commands to MsnConnection individually. + * + * Simple scheme of requests/responses: + * - Got a request to send. Send it immediately. + * - Received a response with messages. Have queued requests? + * - Yes. Send the next now. + * - No. Send a polling request now. + * - Received an empty response (without messages). Have queued requests? + * - Yes. Send the next now. + * - No. What kind of message was last sent? + * - A command. Send a poll in 5 seconds. + * - A poll. Send another poll in 10 seconds. + * + * @author Valerio Pilo + * @ingroup NetworkCore + */ +class MsnSocketHttp : public MsnSocketBase +{ + Q_OBJECT + + + public: // Public methods + // The constructor + MsnSocketHttp( ServerType serverType ); + // The destructor + ~MsnSocketHttp(); + // 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 + // 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 + void setGateway( QString host ); + + + private slots: // Private slots + // Send a polling message to the server, to retrieve pending commands + void slotQueryServer(); + // Read received data and pass along the contained commands + void slotReplyReceived( QNetworkReply *reply ); + + + private: // Private structures + // Structure to hold all the useful data about an HTTP request + struct RequestInfo + { + // Special request parameters to be sent along with the data + QString requestQueryString; + // The actual contents of the request + QByteArray data; + }; + + + private: // Private attributes + // URL to specify in the queries + QString baseServerPath_; + // State variable to detect whether it's possible or not to send another request + bool canSendRequests_; + // Time at which the last request has been sent + QTime lastRequestTime_; + // Saved gateway address + QString gatewayAddress_; + // The HTTP interface + QNetworkAccessManager *http_; + // true if the last sent request was a polling message + bool lastRequestWasPolling_; + // true if the last received response didn't carry any new commands + bool lastResponseWasEmpty_; + // Time counter to regularly report pings to the application + QDateTime lastPing_; + // Next request's ID + QString nextRequestId_; + // Next request's parameters + QString nextRequestParameters_; + // A timer to regularly query the server for new commands + QTimer pollingTimer_; + // List of requests waiting to be sent + QList queuedRequests_; + // Container for never-changing request information + QNetworkRequest requestHeader_; + // Are we sending pings? + bool sendPings_; + // Hashmap of non answered requests + QList unansweredRequests_; + +}; + + + +#endif diff --git a/src/network/msnsockettcp.cpp b/src/network/msnsockettcp.cpp new file mode 100644 index 0000000..88871f1 --- /dev/null +++ b/src/network/msnsockettcp.cpp @@ -0,0 +1,606 @@ +/*************************************************************************** + msnsockettcp.cpp - description + ------------------- + begin : Thu Jan 23 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 "msnsockettcp.h" + +#include +#include +#include + +#include + +#include "../utils/kmessshared.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#ifdef KMESSDEBUG_CONNECTION // Area-specific debug statements + #define KMESSDEBUG_CONNECTION_SOCKET_TCP +#endif + +/** + * @brief Login timer for DNS name resolution + * + * 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 + * + * In milliseconds, the time to wait for the connection to be established. + */ +#define LOGIN_TIMER_CONNECTION 5000 + + +#define MSN_TCP_HOST "messenger.hotmail.com" +#define MSN_TCP_PORT 1863 + + + +/** + * @brief The constructor + * + * Initializes the sockets, buffers and ping timer. + */ +MsnSocketTcp::MsnSocketTcp( ServerType serverType ) +: MsnSocketBase( serverType ) +, missedPings_( 0 ) +, nextPayloadSize_( 0 ) +, sendPings_( false ) +{ + setObjectName( "MsnSocketTcp" ); + + // Create the socket + socket_ = new QTcpSocket( this ); + + // TODO: socket timeout settings.. + + // Forward the socket's raw event signals for further interpretation + connect( socket_, SIGNAL( connected() ), + this, SLOT ( slotConnected() ) ); + connect( socket_, SIGNAL( disconnected() ), + this, SLOT ( slotDisconnected() ) ); + // Connect the socket's signals to parse them internally + connect( socket_, SIGNAL( hostFound() ), + this, SLOT ( slotHostFound() ) ); + connect( socket_, SIGNAL( readyRead() ), + 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(); + connect( &pingTimer_, SIGNAL( timeout() ), + this, SLOT ( slotSendPing() ) ); + + // Attach a timer to watch over the connection process + connectionTimer_.stop(); + connectionTimer_.setSingleShot( true ); + connect( &connectionTimer_, SIGNAL( timeout() ), + this, SLOT ( slotLoginFailed() ) ); + +#ifdef KMESSTEST + KMESS_ASSERT( socket_ != 0 ); +#endif +} + + + +/** + * @brief The destructor + * + * Closes the connection, and deletes the sockets. + */ +MsnSocketTcp::~MsnSocketTcp() +{ + // Disconnect from the server on exit + if( isConnected() ) + { + disconnectFromServer(); + } + + // Delete the socket + delete socket_; + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP + kDebug() << "DESTROYED"; +#endif +} + + + +/** + * @brief Connect to the given server via the socket + * + * The connection attempt is asynchronous. + * When the connection is made, connectionSuccess() is called, + * on error connectionFailed() is called. + * Connection timeouts are not detected here yet. + * + * @param server The server hostname or IP address. + * @param port The port to connect to. + */ +void MsnSocketTcp::connectToServer( const QString& server, const quint16 port ) +{ + quint16 desiredPort; + QString desiredServer; + + if( server.isEmpty() && port == 0 ) + { + desiredServer = MSN_TCP_HOST; + desiredPort = MSN_TCP_PORT; + } + else + { + desiredServer = server; + desiredPort = port; + } + +#if KMESS_ENABLE_LOCAL_MODE == 1 + // NOTE Local mode: see src/kmessdebug.h + desiredServer = "127.0.0.1"; +#endif + +#ifdef KMESSTEST + KMESS_ASSERT( desiredPort < 32768 ); +#endif + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP + kDebug() << "Connecting to server at " << desiredServer << ":" << desiredPort << "."; + kDebug() << "Socket state is " << socket_->state() << "."; +#endif + + // Flush any pending data if the socket is closing a previous connection + socket_->blockSignals( true ); + socket_->flush(); + + // Check if we are disconnected (the socket is idle) + if( socket_->state() != QAbstractSocket::UnconnectedState ) + { + kWarning() << "Socket is not disconnected. Already connected? The socket is in state" << socket_->state() << "."; + } + + // Prepare state vars for the new connection + connected_ = true; + nextPayloadSize_ = 0; + + // Close any previous connection (without firing disconnection signals) + socket_->close(); + + socket_->blockSignals( false ); + + // Start connecting + socket_->connectToHost( desiredServer, desiredPort ); + + // Start the connection timer to watch over the server name resolution + connectionTimer_.start( LOGIN_TIMER_DNS_RESOLVE ); +} + + + +/** + * @brief Disconnect from the server + * + * This function is called after closeConnection() + * It empties all buffers, and resets the sockets. + * + * @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 MsnSocketTcp::disconnectFromServer( bool isTransfer ) +{ + // Stop pinging + setSendPings( false ); + + // Stop the connection timer in case the user closed the connection during login + connectionTimer_.stop(); + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP + kDebug() << "Close the socket."; +#endif + + // Disconnect the socket + socket_->blockSignals( true ); + socket_->disconnectFromHost(); + + // Just clean up if we are disconnected already + if( ! connected_ ) + { + return; + } + + connected_ = false; + + // Do not signal a disconnection when we are transferring to another gateway + if( isTransfer ) + { + return; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP + kDebug() << "Emitting disconnection signal."; +#endif + + emit disconnected(); +} + + + +/** + * @brief Return the local IP address of the socket. + * + * This is typically a LAN address, unless the system + * is directly connected to the Internet. + * + * @returns The IP address the socket uses at the system. + */ +QString MsnSocketTcp::getLocalIp() const +{ + QHostAddress address = socket_->localAddress(); + + return address.toString(); +} + + + +/** + * @brief Return whether or the socket is connected. + * + * @returns True when connected, false otherwise. + */ +bool MsnSocketTcp::isConnected() const +{ + return socket_->isValid() && socket_->state() == QAbstractSocket::ConnectedState; +} + + + +// Set whether we're sending pings or not (also resets ping timer) +void MsnSocketTcp::setSendPings( bool sendPings ) +{ + sendPings_ = sendPings; + missedPings_ = 0; + + pingReceived_ = true; + + if ( sendPings_ ) + { + slotSendPing(); + + pingTimer_.stop(); + pingTimer_.start( 30000 ); // 30s ping timer + } + else + { + pingTimer_.stop(); + } +} + + + +/** + * @brief Called when the connection has been successfully opened + */ +void MsnSocketTcp::slotConnected() +{ + // Stop the connection timer, we're done + connectionTimer_.stop(); + + // Notify about the operation result + emit connected(); +} + + + +/** + * @brief Called when the connection has been closed + * + * This method is not called when using disconnectFromServer(), because + * its signals were blocked. + */ +void MsnSocketTcp::slotDisconnected() +{ + // Stop the connection timer, in case the user had stopped the connection process + connectionTimer_.stop(); + + // Notify about what's happening + if( connected_ ) + { + emit disconnected(); + } +} + + + +/** + * @brief Called when the server's IP address has been found + * + * This method is used to prolong the connection timer, when the DNS query for + * the MSN Server has been successfully completed. + */ +void MsnSocketTcp::slotHostFound() +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP + kDebug() << "Server host address found."; +#endif + + // Restart the connection timer, to watch over the actual connection establishment. + connectionTimer_.stop(); + connectionTimer_.start( LOGIN_TIMER_CONNECTION ); +} + + + +/** + * @brief Called when the connection did not complete within a time limit + * + * This method is used to prolong the connection timer, when the DNS query for + * the MSN Server has been successfully completed. + */ +void MsnSocketTcp::slotLoginFailed() +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP + kDebug() << "Connection not successful within time limit."; +#endif + + // Bounce back to the unified error handler to give the user a message + emit error( i18n( "Connection time limit exceeded" ), MsnSocketBase::ERROR_CONNECTION_TIME_LIMIT ); +} + + + +// Send a "ping" to the server +void MsnSocketTcp::slotSendPing() +{ + QString message; + + if ( pingReceived_ == false ) + { + missedPings_ ++; + + if ( missedPings_ == 1 ) + { + message += i18n( "1 ping lost" ); + } + else + { + message += i18n( "%1 pings lost", missedPings_); + } + + emit statusMessage( message, false ); + } + else + { + emit statusMessage( i18n( "Connected" ), false ); + } + + pingReceived_ = false; + + // Assume the connection was lost when 3 pings are missed. + if ( missedPings_ == 3 ) + { + // 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" ); + + emit pingSent(); +} + + + +/** + * @brief Called when data is received from the server. + * + * This method parses the incoming raw data for the syntax used by the MSN protocol. + * When a command is only partially received, it's buffered until the whole command is received by subsequent dataReceived() calls. + * + * Messages are then signalled back to MsnConnection which perform the parsing. + * Only PNG commands are handled internally. + */ +void MsnSocketTcp::slotSocketDataReceived() +{ + bool gotPayloadCommand = false; + bool hasCompletePayload = false; + QByteArray rawCommandLine; + QByteArray payloadData; + QStringList command; + QString commandLine; + + while( true ) + { + // Read the next command if we're not waiting for a payload. + if( nextPayloadSize_ == 0 ) + { + // Stop when socket didn't receive a full line yet (Qt does the buffering, thanks Qt4!) + if( ! socket_->canReadLine() ) + { + break; + } + + // Read the next line. + rawCommandLine = socket_->readLine(); + + // Parse the command, split in separate fields + commandLine = QString::fromUtf8( rawCommandLine.data(), rawCommandLine.size() ); + command = commandLine.trimmed().split(" "); + + // 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. + nextPayloadCommand_ = command; + } + } + + + // See if we can read the payload + if( nextPayloadSize_ > 0 ) + { + // Check if the full payload is received. + // Otherwise, just wait until "dataReceived" is called again. + hasCompletePayload = ( socket_->bytesAvailable() >= nextPayloadSize_ ); + if( ! hasCompletePayload ) + { + break; + } + + // Full payload received. + payloadData = socket_->read( nextPayloadSize_ ); + + // Copy state from previous loop if needed. + if( ! gotPayloadCommand ) + { + gotPayloadCommand = true; + command = nextPayloadCommand_; + } + + // Reset state for next loop. + nextPayloadSize_ = 0; + } + else + { + payloadData.clear(); + } + + + // Response from the internal ping timer. + if( command[0] == "QNG" ) + { + pingReceived_ = true; + missedPings_ = 0; + } + else // All other data + { + emit dataReceived( command, payloadData ); + } + } +} + + + +/** + * @brief Detect socket errors + * + * Closes the connection, and displays + * the "could not connect to the MSN Messenger service." message box. + * + * @param errorCode The system error. + */ +void MsnSocketTcp::slotSocketError( QAbstractSocket::SocketError errorCode ) +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP + kWarning() << "Received error" << errorCode << "from the socket" + "(socket state=" << socket_->state() << ")."; +#endif + + ErrorType type; + + // Find the most appropriate kind of error to report + switch( errorCode ) + { + case QAbstractSocket::ConnectionRefusedError: + case QAbstractSocket::HostNotFoundError: + type = ERROR_CONNECTING; + break; + + case QAbstractSocket::RemoteHostClosedError: + case QAbstractSocket::NetworkError: + type = ERROR_DROP; + break; + + case QAbstractSocket::DatagramTooLargeError: + case QAbstractSocket::UnknownSocketError: + type = ERROR_DATA; + break; + + default: + type = ERROR_UNKNOWN; + break; + } + + // Ignore errors when disconnected: avoids duplicate error dialogs + if( connected_ ) + { + emit error( socket_->errorString(), type ); + } +} + + + +// Write data to the socket without conversions +qint64 MsnSocketTcp::writeBinaryData( const QByteArray &data ) +{ + qint64 noBytesWritten; + + if( ! isConnected() ) + { + kWarning() << "Attempted to write data to a disconnected socket, aborting."; + return -1; + } + + // Write to the socket + noBytesWritten = socket_->write( data.data(), data.size() ); + if ( noBytesWritten != data.size() ) + { + kWarning() << "Wanted to write " << data.size() << " bytes to the socket, wrote " << noBytesWritten << "."; + } + + return noBytesWritten; +} + + + +// Write data to the socket +qint64 MsnSocketTcp::writeData( const QString &data ) +{ + qint64 noBytesWritten; + + if( ! isConnected() ) + { + kWarning() << "Attempted to write data to a disconnected socket, aborting."; + return -1; + } + + // Write to the socket + QByteArray binData = data.toUtf8(); + noBytesWritten = socket_->write( binData.data(), binData.length() ); + if( noBytesWritten != binData.size() ) + { + kWarning() << "Wanted to write " << binData.size() << " bytes to the socket, wrote " << noBytesWritten << "."; + } + + return noBytesWritten; +} + + + +#include "msnsockettcp.moc" diff --git a/src/network/msnsockettcp.h b/src/network/msnsockettcp.h new file mode 100644 index 0000000..2bff65b --- /dev/null +++ b/src/network/msnsockettcp.h @@ -0,0 +1,117 @@ +/*************************************************************************** + msnsockettcp.h - description + ------------------- + begin : Thu Jan 23 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 MSNSOCKETTCP_H +#define MSNSOCKETTCP_H + +#include "msnsocketbase.h" + +#include +#include +#include + +// Forward declarations +class QTcpSocket; + + + +/** + * @brief Basic I/O functionality for the MSN server protocol over a TCP connection. + * + * The class provides the following facilities: + * - asynchronous connection to the MSN servers. + * - sending/receiving raw protocol data. + * - transparent reconstruction of fragmented received payloads. + * + * Data from the server is handled by the slotSocketDataReceived() slot. + * This method buffers and processes the data, until a complete command or payload message is received. + * Then a signal with the full message contents is forwarded to MsnConnection, which manages it. + * This class only handles the parsing of socket input, the handling the commands + * happens in the MsnConnection class. + * + * @author Mike K. Bennett + * @author Valerio Pilo + * @ingroup NetworkCore + */ +class MsnSocketTcp : public MsnSocketBase +{ + Q_OBJECT + + + public: // Public methods + // The constructor + MsnSocketTcp( ServerType serverType ); + // The destructor + virtual ~MsnSocketTcp(); + // Connect to the given server via the socket + void connectToServer( const QString& server = QString(), const quint16 port = 0 ); + // Disconnect from the server, if connected + void disconnectFromServer( bool isTransfer = false ); + // Get the IP address of this machine. + QString getLocalIp() const; + // Whether or not the class is connected + bool isConnected() const; + // Set whether we're sending pings or not (also resets ping timer) + 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 slots: // Private slots + // Called when the connection has been successfully opened + void slotConnected(); + // Called when the connection has been closed + void slotDisconnected(); + // Called when the connection did not complete within a time limit + void slotLoginFailed(); + // Called when the server's IP address has been found + void slotHostFound(); + // Send a "ping" to the server + void slotSendPing(); + // Read data from the socket + void slotSocketDataReceived(); + // Detect socket errors + void slotSocketError( QAbstractSocket::SocketError errorCode ); + + + private: // Private attributes + // A timer to watch over the connection process + QTimer connectionTimer_; + // Number of errant pings since last good one + int missedPings_; + // The next payload command + QStringList nextPayloadCommand_; + // The size of the next expected payload message + int nextPayloadSize_; + // Whether the last ping send got a reply + bool pingReceived_; + // A timer to regularly "ping" the server + QTimer pingTimer_; + // Are we sending pings? + bool sendPings_; + // The socket + QTcpSocket *socket_; + // List of accepted commands which carry a data payload + QStringList acceptedPayloadCommands_; + +}; + + + +#endif diff --git a/src/network/msnswitchboardconnection.cpp b/src/network/msnswitchboardconnection.cpp new file mode 100644 index 0000000..26f7b39 --- /dev/null +++ b/src/network/msnswitchboardconnection.cpp @@ -0,0 +1,2461 @@ +/*************************************************************************** + msnswitchboardconnection.cpp - description + ------------------- + begin : Fri Jan 24 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 "msnswitchboardconnection.h" + +#include "../contact/contact.h" +#include "../contact/invitedcontact.h" // for cast +#include "../contact/msnobject.h" +#include "../currentaccount.h" +#include "../emoticonmanager.h" +#include "../kmessapplication.h" +#include "../kmessdebug.h" +#include "applications/applicationlist.h" +#include "soap/offlineimservice.h" +#include "chatinformation.h" +#include "chatmessage.h" +#include "mimemessage.h" +#include "msnnotificationconnection.h" +#include "multipacketmessage.h" +#include "p2pmessage.h" + +#include "config-kmess.h" + +#include +#include +#include +#include + +#include + +#include + +#ifdef KMESSDEBUG_SWITCHBOARD + #define KMESSDEBUG_SWITCHBOARD_GENERAL + #define KMESSDEBUG_SWITCHBOARD_P2P + #define KMESSDEBUG_SWITCHBOARD_EMOTICONS +// #define KMESSDEBUG_SWITCHBOARD_CONTACTS +// #define KMESSDEBUG_SWITCHBOARD_KEEPALIVE +// #define KMESSDEBUG_SWITCHBOARD_ACKS +#endif + + + +// The constructor +MsnSwitchboardConnection::MsnSwitchboardConnection() + : MsnConnection( MsnSocketBase::SERVER_SWITCHBOARD ), + abortingApplications_(false), + acksPending_(0), + autoDeleteLater_(false), + backgroundConnection_(true), + closingConnection_(false), + connectionState_(SB_DISCONNECTED), + currentAccount_(0), + initialized_(false), + userStartedChat_(false), + keepAliveTimer_(0), + keepAlivesRemaining_(0), + offlineImService_(0) +{ + setObjectName("MsnSwitchboardConnection"); +} + + + +// The copy constructor +MsnSwitchboardConnection::MsnSwitchboardConnection( const MsnSwitchboardConnection &other ) + : MsnConnection( MsnSocketBase::SERVER_SWITCHBOARD ), + abortingApplications_(false), + acksPending_(0), + autoDeleteLater_( other.autoDeleteLater_ ), + backgroundConnection_( other.backgroundConnection_ ), + chatId_( other.chatId_ ), + closingConnection_(false), + connectionState_(SB_DISCONNECTED), + currentAccount_( other.currentAccount_ ), + firstContact_( other.firstContact_ ), + initialized_(false), + lastContact_( other.lastContact_ ), + pendingMessages_( other.pendingMessages_ ), + userStartedChat_( other.userStartedChat_ ), + keepAliveTimer_(0), + keepAlivesRemaining_(0), + offlineImService_(0) +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "entering copy constructor"; +#endif + + setObjectName("MsnSwitchboardConnection"); +} + + + +// The destructor +MsnSwitchboardConnection::~MsnSwitchboardConnection() +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "entering destructor"; +#endif + + // Close the connection + closeConnection(); + + // If present, destroy the offline message sending service + delete offlineImService_; + + emit deleteMe( this ); + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +// Initialize or restart the last activity timer, for keep alive messages +void MsnSwitchboardConnection::activity() +{ + // Keepalives are not needed in multi-user chats. + if( ! isConnected() || contactsInChat_.count() > 1 ) + { + return; + } + + // Initialize the timer on demand. + if( keepAliveTimer_ == 0 ) + { + keepAliveTimer_ = new QTimer( this ); + keepAliveTimer_->setObjectName( "keepalive-msgs" ); + keepAliveTimer_->setSingleShot( false ); + + // 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. + if( ! backgroundConnection_ ) + { + // A chat connection with a contact will be kept open at least for 15 minutes. + keepAlivesRemaining_ = 18; + } + else + { + // We're much more strict when managing background connections. Make them last at most 5 minutes without activity. + keepAlivesRemaining_ = 6; + } + + // Reset the timer. + keepAliveTimer_->stop(); + keepAliveTimer_->start( 50000 ); + +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << ( backgroundConnection_ ? "Background" : "Chatting" ) + << "keepalive session restarted." << endl; +#endif +} + + + +// Clean the old unacked messages +void MsnSwitchboardConnection::cleanUnackedMessages() +{ + // Standard chat messages are sent with a 'ACK_NAK_ONLY' flag. + // When the messages is received, nothing is sent. + // When the messsage can't be delivered,. a 'NAK' is returned. + // KMess caches the chat messages for 5 minutes to show the + // "the following message could not be delivered:" messages. + // This method cleans up that cache for messages that did not receive a NAK after 5 minutes. + +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + uint mapCount = unAckedMessages_.count(); +#endif + + uint minTime = QDateTime::currentDateTime().toTime_t() - ( 5 * 60 ); + + // Find find the entries, then delete. + QList removeAcks; + QHashIterator it( unAckedMessages_ ); + while( it.hasNext() ) + { + it.next(); + + // Get message info + const UnAckedMessage* unAcked = it.value(); + if( unAcked->time < minTime ) + { + // Message is expired, remove it. + removeAcks.append( it.key() ); + } + } + + + // Remove list + if( ! removeAcks.isEmpty() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + QString join; + foreach( int key, unAckedMessages_.keys() ) + { + if( join.isEmpty() ) join += ","; + join += QString::number( key ); + } + kDebug() << "removing expired messages " << join << "."; +#endif + + foreach( int key, removeAcks ) + { + delete unAckedMessages_.take( key ); + } + } + + +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "removed " << ( mapCount - unAckedMessages_.size() ) << " messages, " + << "kept " << unAckedMessages_.size() << " messages until those expire." << endl; +#endif +} + + + +// Close the connection +void MsnSwitchboardConnection::closeConnection() +{ + connectionState_ = SB_DISCONNECTING; + + // If there are still contacts, it means contactLeft() was not initiated, + // and the user closed the chat window earlier. + if( contactsInChat_.count() > 0 ) + { + // Keep a default for re-connecting. + lastContact_ = contactsInChat_[0]; + + // Make sure all contacts are removed, which will also abort their applications in ApplicationList. + // going in reverse means the lastContact_ set above is always the last to be removed. + for( int i = contactsInChat_.count() - 1; i >=0; i-- ) + { + QString &handle = contactsInChat_[i]; + ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if(! KMESS_NULL(contact)) + { + contact->removeSwitchboardConnection(this, true); // could cause applications to abort. + } + + contactsInChat_.removeAll( handle ); + + // Also signal they're not in chat anymore + emit contactLeftChat( contact, false ); + } + + contactsInChat_.clear(); + } + + + if( isConnected() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Still connected, closing the connection."; +#endif + + disconnectFromServer(); + } + + // Reset state, so messages are queued when the connection + // is back up but the contact is not yet in the chat. + connectionState_ = SB_DISCONNECTED; + closingConnection_ = false; + + // Also stop the activity timer + if( keepAliveTimer_ != 0 ) + { + keepAliveTimer_->stop(); + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Session ended."; +#endif +} + + + +// Clean up, close the connection, destroy this object +void MsnSwitchboardConnection::closeConnectionLater( bool autoDelete ) +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "aborting applications nicely and closing connection."; +#endif + + ContactBase *contact; + bool hasAbortingApplications = false; + closingConnection_ = true; + + // this method is called when the user wants to close the chat window (allowing everything to close nicely). + // If there are no contacts in the chat, we can close directly. + if( ! contactsInChat_.isEmpty() ) + { + // There are still contacts. + // Verify whether they still have applications running. + // Allow those applications to abort, and report back when the connection can be closed. + QList contactsToRemove; + foreach( const QString &handle, contactsInChat_ ) + { + contact = currentAccount_->getContactByHandle( handle ); + if( ! KMESS_NULL(contact) && contact->hasApplicationList() ) + { + ApplicationList *appList = contact->getApplicationList(); + bool aborting = appList->contactLeavingChat(this, true); + if( aborting ) + { + connect(appList, SIGNAL( applicationsAborted(const QString&) ), + this, SLOT ( slotApplicationsAborted(const QString&) )); + hasAbortingApplications = true; + } + else + { + contactsToRemove.append(contact); + } + } + } + + // All contacts that don't need any aborting are removed now (not in the iterator loop) + // The remaining ones are removed in slotApplicationsAborted(). + foreach( ContactBase *contact, contactsToRemove ) + { + contactsInChat_.removeAll( contact->getHandle() ); + contact->removeSwitchboardConnection( this, true ); + } + } + + + if( hasAbortingApplications ) + { + // Wait for all applications to abort. + // Set variables to use in slotApplicationsAborted. + abortingApplications_ = true; + autoDeleteLater_ = autoDelete; + } + else + { + // No applications are aborting. + // Close the connection directly + closeConnection(); + + // Automatically delete ourself + if(autoDelete) + { + this->deleteLater(); + } + } +} + + + +// Do what's required when a contact joined +void MsnSwitchboardConnection::contactJoined( const QString& handle, const QString& friendlyName, const uint capabilities ) +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Contact " << handle << " has joined."; +#endif + + // Update states + connectionState_ = SB_CHAT_STARTED; + + // Add the contact to the list if the contact isn't there already + if ( ! contactsInChat_.contains( handle ) ) + { + contactsInChat_.append( handle ); + } + + // Stop the keep-alive timer when initiating a group chat + if( keepAliveTimer_ && contactsInChat_.count() > 1 ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << "Starting group chat: stopping keepalive session." << endl; +#endif + keepAliveTimer_->stop(); + delete keepAliveTimer_; + keepAliveTimer_ = 0; + } + + // Indicate the contact is active in this session. + ContactBase *contact = currentAccount_->getContactByHandle(handle); + if( contact == 0 ) // We don't have this contact in our list + { + contact = currentAccount_->addInvitedContact( handle, friendlyName, capabilities ); + } + + // Add switchboard connection to the contact. + if( ! KMESS_NULL(contact) ) + { + contact->addSwitchboardConnection( this ); + } + + // Inform the contact about our version + // Also do this when the contact left and re-entered the chat, it might connect with a different client. + sendClientCaps(); + + // Send all pending messages + sendPendingMessages(); + + // Notify the join to the Chat Master. + emit contactJoinedChat( contact ); +} + + + +// Remove a contact from the list of contacts in the chat +void MsnSwitchboardConnection::contactLeft(const QString& handle) +{ +#ifdef KMESSTEST + KMESS_ASSERT( connectionState_ == SB_CHAT_STARTED ); +#endif +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Contact " << handle << " has left."; +#endif + + // Check if the contact is in the chat.. + contactsInChat_.removeAll( handle ); + + // update the last contact. + if ( lastContact_ == handle && contactsInChat_.count() > 0) + { + lastContact_ = contactsInChat_[0]; + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "emitting that '" << handle << "' left chat."; +#endif + + // Start the keep-alive timer again when ending a group chat + if( contactsInChat_.count() == 1 ) + { + activity(); + } + + // Indicate the contact is not active anymore in this session. + ContactBase *contact = currentAccount_->getContactByHandle(handle); + if( ! KMESS_NULL(contact) ) + { + contact->removeSwitchboardConnection(this, false); + } + + // Emit the signal to the Chat Window. + if( ! backgroundConnection_ ) + { + + if( ! KMESS_NULL(contact) ) + { + // The conversation went idle if isExpired() returns true + emit contactLeftChat( contact, isExpired() ); + } + } +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + else + { + kDebug() << "Not sending contactLeftChat() signal for background chats."; + } +#endif + + // Check if all contacts went away + if( contactsInChat_.count() == 0 ) + { + // Store contact to have a default when re-connecting. + lastContact_ = handle; + + // The last contact left the chat. + connectionState_ = SB_CONTACTS_LEFT; + + // NOTE: Behavior changed since WLM 8+, emoticon data must be sent every time. + // Reset the list of sent emoticons, so they will be sent again if the chat restarts + // sentEmoticons_.clear(); + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "last contact left chat, closing connection."; +#endif + // No contacts left in the chat, close connection since it is of little use. + // - the connection can still be used to 'CAL' the last contact again + // - when the contact resumes the connection, it uses a different server, + // so startChat() needs to reconnect. + closeConnection(); + } +} + + + +// Convert an html format (#RRGGBB) color to an msn format (BBGGRR) color +const QString MsnSwitchboardConnection::convertHtmlColorToMsnColor( const QString &color ) const +{ +#ifdef KMESSTEST + KMESS_ASSERT( color.length() == 7 ); +#endif + + // Get the color components + 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" ) + { + return blue + green + red; + } + else if ( green != "00" ) + { + return green + red; + } + else if ( red != "00" ) + { + return red; + } + else + { + return "0"; + } +} + + + +// Convert and msn format color (BBGGRR) to an html format (#RRGGBB) color +const QString MsnSwitchboardConnection::convertMsnColorToHtmlColor( QString& color ) const +{ + // If the color isn't present, use black + if( color == "0" ) + { + return "#000000"; + } + + // Remove any character apart from the last six (stripping any initial '#' character) + if( color.length() > 6 ) + { + color = color.right( 6 ); + } + // Fill the color out to six characters + else if( color.length() < 6 ) + { + color.rightJustified( 6, '0' ); + } + + // Get the color components + 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; +} + + + +// Make a list of the contacts in the chat +const QStringList MsnSwitchboardConnection::getContactsInChat() const +{ + if( contactsInChat_.isEmpty() ) + { + return QStringList( lastContact_ ); + } + + // Note this object may contain no contacts at all, and lastContact_ has the last one to re-invite. + return contactsInChat_; +} + + + +// Return the first contact the chat started with. +const QString & MsnSwitchboardConnection::getFirstContact() const +{ + return firstContact_; +} + + +// Return the last contact who left the chat. +const QString & MsnSwitchboardConnection::getLastContact() const +{ + return lastContact_; +} + + + +// Return whether the user started the chat +bool MsnSwitchboardConnection::getUserStartedChat() const +{ + return userStartedChat_; +} + + + +// Received a positive delivery message. +void MsnSwitchboardConnection::gotAck( const QStringList& command ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( unAckedMessages_.count() > 0 ); +#endif + + // Remove the ACKed message from the queue. + int ackNumber = command[1].toUInt(); + if( ! unAckedMessages_.contains( ackNumber ) ) + { + kWarning() << "Received an ACK message but message is not in sent queue."; + return; + } + + delete unAckedMessages_.take( ackNumber ); + acksPending_--; + +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Received one ACK message, still " << acksPending_ << " unacked."; +#endif + + // Signal that the switchboard is no longer busy and can accept new application messages. + if( acksPending_ < 2 ) + { + emit readySend(); + } +} + + + +// Received notification that a contact is no longer in session. +void MsnSwitchboardConnection::gotBye(const QStringList& command) +{ + contactLeft( command[1].toLower() ); +} + + + +// Received the initial roster information for new contacts joining a session. +void MsnSwitchboardConnection::gotIro(const QStringList& command) +{ + const QString& handle ( command[4].toLower() ); + QString friendlyName( QUrl::fromPercentEncoding( command[5].toUtf8() ) ); + uint capabilities = command[6].toUInt(); + + const QString& altFriendlyName( currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED ) ); + if( ! altFriendlyName.isEmpty() ) + { + friendlyName = altFriendlyName; + } + + contactJoined( handle, friendlyName, capabilities ); +} + + + +// Received notification of a new client in the session. +void MsnSwitchboardConnection::gotJoi(const QStringList& command) +{ + const QString& handle ( command[1].toLower() ); + QString friendlyName( QUrl::fromPercentEncoding( command[2].toUtf8() ) ); + uint capabilities = command[3].toUInt(); + + const QString& altFriendlyName( currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED ) ); + if( ! altFriendlyName.isEmpty() ) + { + friendlyName = altFriendlyName; + } + + contactJoined( handle, friendlyName, capabilities ); +} + + + +// Received a negative acknowledgement of the receipt of a message. +void MsnSwitchboardConnection::gotNak( const QStringList& command ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( unAckedMessages_.count() > 0 ); +#endif + + // Check if the ACK exists in the map. + int ackNumber = command[1].toUInt(); + if( ! unAckedMessages_.contains( ackNumber ) ) + { + kWarning() << "Received a NAK message but message is not in sent queue."; + return; + } + + // Get message from queue, copy the MimeMessage, and remove it. + UnAckedMessage *unAcked = unAckedMessages_[ ackNumber ]; + const MimeMessage mimeMessage( unAcked->message ); + delete unAckedMessages_.take( ackNumber ); + acksPending_--; + +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Received one NAK message, still " << acksPending_ << " unacked."; +#endif + + + + // Signal that the switchboard is no longer busy and can accept new application messages. + if( acksPending_ < 2 ) + { + emit readySend(); + } + + // Do not notify errors for background connections + if( backgroundConnection_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Not displaying undelivered message for background chats."; +#endif + return; + } + + QString sender; + if( mimeMessage.hasField( "To" ) ) + { + sender = mimeMessage.getValue( "To" ); + } + else if( mimeMessage.hasField( "P2P-Dest" ) ) + { + sender = mimeMessage.getValue( "P2P-Dest" ); + } +#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( mimeMessage.getValue( "Content-Type" ) ); + if( ! contentType.startsWith( "text/plain" ) + && ! contentType.startsWith( "text/x-msnmsgr-datacast" ) + && ! contentType.startsWith( "image/gif" ) + && ! contentType.startsWith( "application/x-ms-ink" ) ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Not displaying undelivered message for a service message of type" << contentType; +#endif + return; + } + + // 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 ); + + // 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, mimeMessage ); + } + 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( "*", mimeMessage ); + } +} + + + +// Received notification of the termination of a client-server session. +void MsnSwitchboardConnection::gotOut(const QStringList& /*command*/) +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Switchboard - got OUT."; +#endif + + closeConnection(); +} + + + +// Received a client-server authentication message. +void MsnSwitchboardConnection::gotUsr(const QStringList& command) +{ +#ifdef KMESSTEST + KMESS_ASSERT( ! firstContact_.isEmpty() ); + KMESS_ASSERT( connectionState_ == SB_AUTHORIZING ); +#endif + + // This should just be a confirmation + if ( command[2] != "OK" ) + { + kWarning() << "Switchboard authentication failed"; + return; + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "authentication successful, inviting " << firstContact_; +#endif + + connectionState_ = SB_INVITING_CONTACTS; + + // Now call the other user to the conversation. + sendCommand( "CAL", firstContact_ ); + + // If there are other pending invites, send them now + if( pendingInvitations_.count() > 0 ) + { + foreach( const QString &handle, pendingInvitations_ ) + { + inviteContact( handle ); + } + pendingInvitations_.clear(); + } +} + + + +// Initialize the object, optionally presetting a contact to reinvite +bool MsnSwitchboardConnection::initialize( QString handle ) +{ + if ( initialized_ ) + { + kDebug() << "already initialized!"; + return false; + } + if ( ! MsnConnection::initialize() ) + { + kDebug() << "Couldn't initialize base class."; + return false; + } + + currentAccount_ = CurrentAccount::instance(); + + // Determine which payload commands can be received by the Switchboard Connection + const QStringList payloadCommands( "MSG" ); + + setAcceptedPayloadCommands( payloadCommands ); + + firstContact_ = lastContact_ = handle; + + initialized_ = true; + return true; +} + + + +// Invite a contact into the chat +void MsnSwitchboardConnection::inviteContact( const QString& handle ) +{ + if( handle.isEmpty() ) + { + return; + } + + if( ! isConnected() ) + { + // Request a new switchboard session + emit requestNewSwitchboard( lastContact_ ); + // Add this contact to the list of pending invitations + pendingInvitations_.append( handle ); + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Added pending invitation for contact " << handle; +#endif + + return; + } + + if ( backgroundConnection_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Chat is still in the background, requesting chat window."; +#endif + + backgroundConnection_ = false; + emit requestChatWindow( this ); + } + + sendCommand( "CAL", handle ); + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Invited contact " << handle; +#endif +} + + + +// Check if a certain contact is in the chat +bool MsnSwitchboardConnection::isContactInChat( const QString& handle ) const +{ +#ifdef KMESSDEBUG_SWITCHBOARD_CONTACTS + kDebug() << "Checking handle " << handle << " - participants are: " << contactsInChat_.join(",") << " - lastContact: " << lastContact_; + kDebug() << "returning " << ( ( (contactsInChat_.count() == 0) ? (lastContact_ == handle) : (contactsInChat_.contains( handle )) ) ? "true" : "false" ); +#endif + + return ( (contactsInChat_.count() == 0) ? (lastContact_ == handle) : (contactsInChat_.contains( handle )) ); +} + + + +// Check whether the switchboard is buzy (has too many pending messages) +bool MsnSwitchboardConnection::isBusy() const +{ + // unAckedMessages_ also contains messages what have a "NAK_ONLY" flag. + // keep a special variable that only lists the normal ACKs. + return acksPending_ > 3; +} + + + +// Check if all contacts left +bool MsnSwitchboardConnection::isEmpty() const +{ + return contactsInChat_.empty(); +} + + + +// Check if only the given contact is in the chat +bool MsnSwitchboardConnection::isExclusiveChatWithContact(const QString& handle) const +{ +#ifdef KMESSDEBUG_SWITCHBOARD_CONTACTS + kDebug() << "Checking if chat is exclusive with " << handle + << " (contacts=" << contactsInChat_.join(",") << ", lastContact=" << lastContact_ << ")" << endl; +#endif + + // Also check for last contact, contact can be re-invited to resume the session. + // Previously, one contact was always left in the contactsInChat_ list. + + int count = contactsInChat_.count(); + bool result = ( count == 1 && contactsInChat_[0] == handle) + || ( count == 0 && lastContact_ == handle); + +#ifdef KMESSDEBUG_SWITCHBOARD_CONTACTS + kDebug() << "returning " << ( result ? "true" : "false" ); +#endif + + return result; +} + + + +// 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 disconnected or disconnecting. +bool MsnSwitchboardConnection::isInactive() const +{ + return ( connectionState_ == SB_DISCONNECTED || connectionState_ == SB_DISCONNECTING ); +} + + + +// Check whether the switchboard is waiting for a new connection +bool MsnSwitchboardConnection::isWaiting() const +{ + return ( connectionState_ == SB_REQUESTING_CHAT ); +} + + + +// Parse a regular command +void MsnSwitchboardConnection::parseCommand(const QStringList& command) +{ + if ( command[0] == "ACK" ) + { + gotAck( command ); + } + else if ( command[0] == "ANS" ) + { + // Do nothing. + } + else if ( command[0] == "BYE" ) + { + gotBye( command ); + } + else if ( command[0] == "CAL" ) + { + // Do nothing + } + else if ( command[0] == "IRO" ) + { + gotIro( command ); + } + else if ( command[0] == "JOI" ) + { + gotJoi( command ); + } + else if ( command[0] == "NAK" ) + { + gotNak( command ); + } + else if ( command[0] == "OUT" ) + { + gotOut( command ); + } + else if ( command[0] == "USR" ) + { + gotUsr( command ); + } + else + { + kDebug() << "got unhandled command " << command[0] << " (contacts=" << contactsInChat_ << ")."; + } +} + + + +// Parse a normal plain text chat message +void MsnSwitchboardConnection::parseChatMessage( const QString &contactHandle, const QString &friendlyName, const QString &contactPicture, const MimeMessage &message ) +{ + // 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 ); + if( message.hasField( "P4-Context" ) ) + { + const QString& friendlyNameP4( message.getValue( "P4-Context" ) ); + if( ! friendlyNameP4.isEmpty() ) + { + messageFriendlyName = friendlyNameP4; + } + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Got message by " << contactHandle << ": " << message.getBody(); +#endif + + // Get the font and color from the format string + 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 ); + + QFont font; + font.setFamily( family ); + font.setBold( effects.contains("B") ); + font.setItalic( effects.contains("I") ); + font.setUnderline( effects.contains("U") ); + + // Send the chat message + emit chatMessage( ChatMessage( ChatMessage::TYPE_INCOMING, + ChatMessage::CONTENT_MESSAGE, + true, + message.getBody(), + contactHandle, + messageFriendlyName, + contactPicture, + font, + color ) ); +} + + + +// Parse the clientcaps message, exchanged by a lot of third party clients. +void MsnSwitchboardConnection::parseClientCapsMessage( const QString &contactHandle, const MimeMessage &message ) +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Got third-party client info message. (message dump follows)" << endl + << message.getMessage().data() << endl; +#endif + + // Example message + // Client-Name: Client-Name/Version-Major.Version-Minor + // Chat-Logging: Y + + // Possible values for Chat-Logging: + // Y: Nonsecure logging is enabled. + // S: log is encrypted + // N: not logging + + // Retrieve client identifier from the message + const MimeMessage& subMessage( message.getBody() ); + const QString& clientFullName( 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->setClientFullName( clientFullName ); +} + + + +// Parse a datacast message (e.g. nudge or voice clip) +void MsnSwitchboardConnection::parseDatacastMessage( const QString &contactHandle, const MimeMessage &message ) +{ + // Get the contact + ContactBase *contact = CurrentAccount::instance()->getContactByHandle( contactHandle ); + if( KMESS_NULL(contact) ) return; + + 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_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "chat is still in the background, requesting chat window."; +#endif + backgroundConnection_ = false; + emit requestChatWindow( this ); + emit contactJoinedChat( contact ); + } + + // Each ID has a different meaning. + 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."; +#endif + + // 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 ) +{ + // 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 + + // Request a chat window when the chat is still in the background. + if( backgroundConnection_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Chat is still in the background, requesting chat window."; +#endif + backgroundConnection_ = false; + emit requestChatWindow( this ); + 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") ); + for( QStringList::Iterator it = msnObjects.begin(); it != msnObjects.end(); ++it ) + { + emoticonCode = *it; + + ++it; + + // If the number of fields is odd, this custom emoticons list contains errors. + if( it == msnObjects.end() ) + { + kWarning() << "Emoticon message has an unexpected format: odd number of fields! " + << "(ignoring msnobject, contact=" << contactHandle << ")." << endl; + break; + } + + msnObjectData = *it; + + // Perform a syntax check. + if( msnObjectData.length() < 20 ) + { + kWarning() << "Emoticon message has an unexpected format " + << "(ignoring msnobject, contact=" << contactHandle << ", message='" << msnObjectData << "')." << endl; + continue; + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Adding emoticon code " << emoticonCode << "."; +#endif + + // Store the emoticon code for the contact. + const MsnObject& msnObject(msnObjectData); + contact->addEmoticonDefinition(emoticonCode, msnObject.getDataHash()); + + // Ask the ChatMaster to download emoticons. + emit gotMsnObject(msnObjectData, 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 + 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 + const QString& contactHandle( command[1] ); + QString friendlyName; + QString contactPicture; + + // Get the contact details + ContactBase *contact = currentAccount_->getContactByHandle( contactHandle ); + if( contact == 0 ) + { + // There was no current friendly name, so get one from the message + friendlyName = QUrl::fromPercentEncoding( command[2].toUtf8() ); + } + else + { + // get name from contact + friendlyName = contact->getFriendlyName( STRING_ORIGINAL ); + contactPicture = contact->getContactPicturePath(); + } + + + // Link a chat window to this switchboard if it's needed. + if( backgroundConnection_ ) + { + if( contentType == "text/plain" + || contentType == "text/x-msnmsgr-datacast" + || contentType == "image/gif" + || contentType == "application/x-ms-ink" ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "chat is still in the background, requesting chat window."; +#endif + + // We've just received a message over a background connection: whoever + // had started it initially, consider it as started by a contact. + // That's because if we send a message first, the chat is immediately + // changed to a foreground one. + userStartedChat_ = false; + + backgroundConnection_ = false; + emit requestChatWindow( this ); + emit contactJoinedChat( contact ); + } + } + + + if( contentType == "text/plain" ) + { + // A normal chat message + parseChatMessage( contactHandle, friendlyName, contactPicture, message ); + } + else if( contentType == "text/x-msmsgscontrol" ) + { + // A typing notification + parseTypingMessage( contactHandle, message ); + } + else if( contentType == "text/x-msmsgsinvite" ) + { + // 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. + const MimeMessage& subMessage( message.getBody() ); + emit gotMessage( subMessage, contactHandle ); + } + else if( contentType == "application/x-msnmsgrp2p" ) + { + // This is an p2p message, the new format for invitations. + parseP2PMessage( contactHandle, message ); + } + else if( contentType == "text/x-mms-emoticon" || contentType == "text/x-mms-animemoticon" ) + { + // Message contains the MSN objects for the emoticons. + parseEmoticonMessage( contactHandle, message.getBody() ); + } + else if( contentType == "text/x-msnmsgr-datacast" ) + { + // This is a datacast message, contact wants to send a nudge or voice clip + const MimeMessage& subMessage( message.getBody() ); + parseDatacastMessage( contactHandle, subMessage ); + } + else if( contentType == "image/gif" || contentType == "application/x-ms-ink" ) + { + // This is an ink message. + // Source: http://msdn.microsoft.com/en-us/library/ms818340.aspx + // warning: WLM doesn't even seem to adhere to that standard... + emit gotInkMessage( message.getBody(), contactHandle ); + } + else if( contentType == "text/x-clientcaps" ) + { + // This is a message exchanged by a lot of third party clients. + parseClientCapsMessage( contactHandle, message ); + } + else if( contentType == "text/x-keepalive" ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << "Keep alive message from " << contactHandle << "."; +#endif + } + else + { + kDebug() << "got unhandled message type (type=" << contentType << " contact=" << contactHandle << ")."; + } + + // Messages which are part of the switchboard session management, will not be considered "activity" + if( contentType != "text/x-clientcaps" && contentType != "text/x-keepalive" ) + { + // Signal presence of activity + activity(); + } +} + + + +// Parse a payload command +void MsnSwitchboardConnection::parsePayloadMessage(const QStringList &command, const QByteArray &/*payload*/) +{ + // Switchboard has no payload commands yet. + // This method is added because the functionality is generic in the base class. + kWarning() << "Unhandled payload command: " << command[0] << "!"; +} + + + +// Parse a p2p message, used for invitations +void MsnSwitchboardConnection::parseP2PMessage( const QString &contactHandle, const MimeMessage &message ) +{ + // The switchboad is a "broadcast" channel for all messages, + // so in a multi-chat the message could be for an other contact. + 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) + // Also seen with amsn 0.97 once. + kWarning() << "Unable to handle P2P message, P2P-Dest field is empty " + "(contact=" << contactHandle << ")." << endl; + return; + } + else if( p2pDest != currentAccount_->getHandle() ) + { + // Ignore messages ment for other contacts +#ifdef KMESSDEBUG_SWITCHBOARD_P2P + kDebug() << "Received a P2P message, but it's for '" << p2pDest << "'."; +#endif + return; + } + + // 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). + const P2PMessage& subMessage( message.getBinaryBody() ); + emit gotMessage( subMessage, contactHandle ); +} + + + +// Parse a contact is typing message. +void MsnSwitchboardConnection::parseTypingMessage( const QString &/*contactHandle*/, const MimeMessage &message ) +{ + // Avoid crashes due race conditions + if( closingConnection_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Not emitting typing message because switchboard is closing."; +#endif + return; + } + + // The contact informs it's typing a normal message + const QString& typingUser( message.getValue( "TypingUser" ) ); + + ContactBase *contact = currentAccount_->getContactByHandle( typingUser ); + + if( KMESS_NULL(contact) ) + { + return; + } + + emit contactTyping( contact ); +} + + + +// Deliver a message for an P2PApplication object. +void MsnSwitchboardConnection::sendApplicationMessage( const MimeMessage &message ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( ! isBusy() ); +#endif + + // Check which type of message is sent + const QString& contentType( message.getValue("Content-Type") ); + if( contentType == "application/x-msnmsgrp2p" ) + { + // Message contains binary P2P message data +#ifdef KMESSTEST + KMESS_ASSERT( message.getBinaryBody().size() >= 52 ); // header is 48, footer is 4 +#endif + + sendMimeMessageWhenReady( ACK_ALWAYS_P2P, message ); + } + else if( contentType == "text/x-msmsgsinvite" + || contentType.section(";", 0, 0) == "text/x-msmsgsinvite" ) // for ; charset= suffix + { + // Message contains old-style invitation fields. + sendMimeMessageWhenReady( ACK_NAK_ONLY, message ); + } + else + { + kWarning() << "unknown message type '" << contentType << "', can't send message!" << endl; + return; + } + + // Signal the presence of activity on this switchboard + activity(); +} + + +/** + * Send a message to the contact(s) + * + * 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( const QString& text ) +{ + int maxSendableSingleMessageLength = 1400; + + if ( currentAccount_ == 0 ) + { + kWarning() << "currentAccount_ is null!"; + return; + } + + // Check if any custom emoticon is being sent in the message. + // This has to be sent first so the receiving client will be aware that + // there will be custom emoticons in the next message. + QString code, pictureFile; + QString emoticonObjects; + 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() ) + { + while( true ) + { + // First find if there's any custom emoticon + matchStart = emoticonRegExp.indexIn( text, lastPos ); + if( matchStart == -1 ) + { + break; + } + + // 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 ]; + + // Do not add emoticons to the list more than once + if( addedEmoticons.contains( code ) ) + { + continue; + } + + // 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 ) + { + 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() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_EMOTICONS + kDebug() << "Custom emoticon '" << code << "' not found!"; +#endif + + continue; + } + +#ifdef KMESSDEBUG_SWITCHBOARD_EMOTICONS + kDebug() << "Found custom emoticon '" << code << "' which file is '" + << ( emoticonThemePath + pictureFile ) << "'." << endl; +#endif + + QFile iFile( emoticonThemePath + pictureFile ); + if( ! iFile.open( QIODevice::ReadOnly ) ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_EMOTICONS + kDebug() << "Unable to read picture '" << pictureFile << "'!"; +#endif + iFile.close(); + continue; + } + + // Read the file and create an MSNObject of the emoticon + const QByteArray& data( iFile.readAll() ); + iFile.close(); + MsnObject test( currentAccount_->getHandle(), pictureFile, QString::null, MsnObject::EMOTICON, data ); + + // Only divide items between each other + if( ! emoticonObjects.isEmpty() ) + { + emoticonObjects += "\t"; + } + + emoticonObjects += code + "\t" + test.objectString(); + } + } + + // Don't send the message if there is no emoticon to send + if( ! emoticonObjects.isEmpty() ) + { + MimeMessage emoticonMessage; + emoticonMessage.addField("MIME-Version", "1.0"); + emoticonMessage.addField("Content-Type", "text/x-mms-emoticon"); + emoticonMessage.setBody( emoticonObjects ); + + sendMimeMessageWhenReady( ACK_NAK_ONLY, emoticonMessage ); + } + + // Then send the real text message + + // Get the formatting properties and convert them to MSN's IM format + 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"; + + // Determine text direction + const QString& rtl( text.isRightToLeft() ? "; RL=1" : "" ); + + // Create the message + MimeMessage message; + message.addField("MIME-Version", "1.0"); + message.addField("Content-Type", "text/plain; charset=UTF-8"); + message.addField("X-MMS-IM-Format", "FN=" + fontFamily + "; EF=" + effects + "; CO=" + color + "; CS=0; PF=0" + rtl); + message.setBody(text); + + // Send the message + int bodyLength = text.toUtf8().length(); + if( bodyLength > maxSendableSingleMessageLength ) + { + // Check if the remote clients support the recieving of huge messages. + ContactBase *contact; + bool capable = true; + foreach( const QString &handle, contactsInChat_ ) + { + contact = currentAccount_->getContactByHandle( handle ); + if( ! contact->hasCapability( ContactBase::MSN_CAP_MULTI_PACKET ) ) + { + capable = false; + break; + } + } + + if( capable ) + { + // Create a multipacket message + MultiPacketMessage multiMessage( message ); + sendMimeMessageWhenReady( ACK_NAK_ONLY, multiMessage ); + } + else + { + // Split the huge message and send all parts + int pos = 0; + int prevPos = 0; + QString messagePart; + const QString& body( message.getBody() ); + + int parts = (int) ceil( ( (float) bodyLength / (float) maxSendableSingleMessageLength ) ); + + for( int i = 0; i < parts - 1; i++ ) + { + prevPos = pos; + pos += maxSendableSingleMessageLength; + + // search backwards from the new split position. + int spacePos = body.lastIndexOf( " ", pos ); + + messagePart = body.mid( prevPos, pos - prevPos ); + + if( spacePos > prevPos ) + { + // use that one! + pos++; + } + + // send messagePart + sendMimeMessageWhenReady( ACK_NAK_ONLY, message ); + } + + messagePart = body.mid( pos, body.length() - pos ); + + sendMimeMessageWhenReady( ACK_NAK_ONLY, message ); + } + } + else + { + // Send the simple MimeMessage + sendMimeMessageWhenReady( ACK_NAK_ONLY, message ); + } + + // Signal the presence of activity on this switchboard + activity(); +} + + + +// Send a ink to the contact(s) +void MsnSwitchboardConnection::sendInk( const QByteArray& ink ) +{ + bool capable = true; + ContactBase *contact; + + foreach( const QString &handle, contactsInChat_ ) + { + contact = currentAccount_->getContactByHandle( handle ); + + if( ! contact->hasCapability( ContactBase::MSN_CAP_MULTI_PACKET ) || + ! contact->hasCapability( ContactBase::MSN_CAP_INK_GIF) ) + { + capable = false; + break; + } + } + + if( ! capable ) + { + return; + } + + // Create the message for ink + // Source: http://msdn.microsoft.com/en-us/library/ms818340.aspx + // To send the WLM 2009 content-type (maybe ISF): + //message.addField( "Content-Type", "application/x-ms-ink" ); + // According to the specs we also need to send: + //message.addField( "Content-Transfer-Encoding", "base64" ); + // but even WLM itself doesn't do that. + MimeMessage message; + message.addField("MIME-Version", "1.0"); + message.addField("Content-Type", "image/gif"); + message.setBody( "base64:" + QString( ink.toBase64() ) ); + MultiPacketMessage multiMessage( message ); + + // Send the ink packet + sendMimeMessageWhenReady( ACK_NAK_ONLY, multiMessage ); +} + + + +// Send a client caps message to the contacts +void MsnSwitchboardConnection::sendClientCaps() +{ + // All third-party clients send this message. + // It also makes debugging easier. + MimeMessage message; + message.addField("MIME-Version", "1.0"); + message.addField("Content-Type", "text/x-clientcaps"); + message.setBody( "Client-Name: KMess/" KMESS_VERSION "\r\n" ); + sendMimeMessageWhenReady( ACK_NONE, message ); +} + + + +// Send a "ping" to avoid MSN closing the connection +void MsnSwitchboardConnection::sendKeepAlive() +{ + // Stop the keepalive sending if it's passed too much time + if( keepAlivesRemaining_ < 1 ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << "Session has expired, letting it timeout."; +#endif + + if( keepAliveTimer_ != 0 ) + { + keepAliveTimer_->stop(); + } + + // Close background connections immediately when the timer expires + if( backgroundConnection_ ) + { + closeConnectionLater( true ); + } + + return; + } + else + { + 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() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << "Cannot send keep alive while disconnected!"; +#endif + return; + } + + // Also check if there actually is a receiver for the message + if( contactsInChat_.isEmpty() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << "Stopping keep alive, no contacts in chat."; +#endif + + keepAliveTimer_->stop(); + return; + } + +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << "Sending a keep alive message," << keepAlivesRemaining_ << "left before expiration."; +#endif + + // Build the keepalive message + MimeMessage message; + message.addField( "MIME-Version", "1.0" ); + message.addField( "Content-Type", "text/x-keepalive" ); + + sendMimeMessage( ACK_NONE, message ); +} + + + +void MsnSwitchboardConnection::sendMimeMessageWhenReady( AckType ackType, MultiPacketMessage &message ) +{ + while( ! message.isComplete() ) + { + sendMimeMessageWhenReady( ackType, message.getNextPart() ); + } +} + + + +// Send a message to the contact(s), or leave it pending until a connection is restored +void MsnSwitchboardConnection::sendMimeMessageWhenReady(AckType ackType, const MimeMessage &message) +{ + // If the connection is ready, send the message + if( isConnected() && ! contactsInChat_.empty() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Sending mime message of type '" << message.getValue("Content-Type") << "'."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( connectionState_ == SB_CHAT_STARTED ); +#endif + + const QString &contentType( message.getSubValue( "Content-Type" ) ); + + if( backgroundConnection_ ) + { + if( contentType == "text/plain" + || contentType == "text/x-msnmsgr-datacast" + || contentType == "image/gif" + || contentType == "application/x-ms-ink" ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "chat is still in the background, requesting chat window."; +#endif + backgroundConnection_ = false; + emit requestChatWindow( this ); + } + } + + // Send and store for acknowledgement. + int ack = sendMimeMessage(ackType, message); + storeMessageForAcknowledgement(ack, ackType, message); + + // Clean cache of old entries, it does not need to run with every storeMessage..() call. + cleanUnackedMessages(); + + return; + } + + // 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 + QPair *newPendingMessage = new QPair( ackType, message ); + pendingMessages_.append( newPendingMessage ); + + + // See what needs to be done to restore the chat. + if( isConnected() ) + { + switch( connectionState_ ) + { + 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 the connection to be authorized..."; +#endif + 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 + return; + + case SB_INVITING_CONTACTS: +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Already waiting for contacts to join the chat..."; +#endif + return; + + default: +#ifdef KMESSTEST + KMESS_ASSERT( connectionState_ == SB_CONTACTS_LEFT ); +#endif + if( contactsInChat_.count() > 1 ) + { + kWarning() << "failed to re-connect; multiple contacts are left in chat!"; + return; + } + + if( message.hasField("P2P-Dest") && message.getValue("P2P-Dest") != lastContact_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + 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") ); + } + else + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "All contacts left the chat, calling the last contact left."; +#endif + + if( lastContact_.isEmpty() ) + { + kWarning() << "Switchboard failed to re-connect; no contact left to invite!"; + return; + } + + connectionState_ = SB_INVITING_CONTACTS; + 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. + +#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; + } + + 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; + } + + // 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 + pendingMessages_.removeAll( newPendingMessage ); + 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(const QString&,const MimeMessage&) ), + this, SIGNAL( sendingFailed(const QString&,const MimeMessage&) ) ); + } + + // Send the message (only the text contained in the body) + offlineImService_->sendMessage( lastContact_, message.getBody() ); + + // The message has been sent as an OIM, remove it to avoid it + // being sent twice + pendingMessages_.removeAll( newPendingMessage ); + 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_ ); +} + + + +// Send messages that weren't sent because a contact had to be re-called +void MsnSwitchboardConnection::sendPendingMessages() +{ + // 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 + if( contactsInChat_.isEmpty() ) + { + kWarning() << "No contacts available in the chat."; + return; + } + + // Send all messages + QPair *pendingMessage; // doesn't seam to fit in foreach() + foreach( pendingMessage, pendingMessages_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Sending pending messages, " << ( pendingMessages_.count() -1 ) << " remaining."; +#endif + + // Send the message + int ack = sendMimeMessage( pendingMessage->first, pendingMessage->second ); + storeMessageForAcknowledgement( ack, pendingMessage->first, pendingMessage->second ); + } + + // Clear the pending messages + qDeleteAll( pendingMessages_ ); + pendingMessages_.clear(); + + // Clean cache of old entries, it does not need to run with every storeMessage..() call. + cleanUnackedMessages(); +} + + + +// The user is typing so send a typing message +void MsnSwitchboardConnection::sendTypingMessage() +{ + if( contactsInChat_.isEmpty() ) + { + if( lastContact_.isEmpty() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Not sending typing notification, no contacts in chat, nor one to re-invite."; +#endif + return; + } + + + // When we need to re-invite a contact to send the typing message, see if the contact is offline + // This avoids repeated "the contact is offline" typing messages. + const ContactBase *contact = currentAccount_->getContactByHandle(lastContact_); + if( contact == 0 || contact->isOffline() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Not sending typing notification, last contact is offline."; +#endif + return; + } + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Sending typing notification."; +#endif + + // Build the typing notification message + MimeMessage message; + message.addField("MIME-Version", "1.0"); + message.addField("Content-Type", "text/x-msmsgscontrol"); + message.addField("TypingUser", currentAccount_->getHandle()); + + // if disconnected, reconnect to send the typing message + // (maybe the other contact still has it's window open) + sendMimeMessageWhenReady(ACK_NONE, message); + + // Signal the presence of activity on this switchboard + activity(); +} + + + +// Send wink +void MsnSwitchboardConnection::sendWink( const MsnObject& msnobject ) +{ + MimeMessage message; + message.addField("MIME-Version", "1.0"); + message.addField("Content-Type", "text/x-msnmsgr-datacast"); + message.setBody( "ID: 2\r\nData: " + msnobject.objectString() + "\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) +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "All applications of contact '" << handle << "' have been aborted."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( abortingApplications_ ); +#endif + + // Remove the contact from the chat now. + contactsInChat_.removeAll(handle); + + // Disconnect from signal source again. + ContactBase *contact = currentAccount_->getContactByHandle(handle); + if( ! KMESS_NULL(contact) ) + { + if( ! KMESS_NULL(contact->getApplicationList()) ) + { + disconnect(contact->getApplicationList(), SIGNAL( applicationsAborted(const QString&) ), + this, SLOT ( slotApplicationsAborted(const QString&) )); + } + + // Remove the reference to the switchboard here or we could get crashes later! + contact->removeSwitchboardConnection(this, true); + } + + + // If all contacts have aborted, close connection. + if( contactsInChat_.isEmpty() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "No other contacts need to abort, closing connection."; +#endif + + abortingApplications_ = false; + closeConnection(); + + // If the switchboard should clean up afterwards, do so. + if( autoDeleteLater_ ) + { + this->deleteLater(); + } + } + else + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Waiting for applications of " << contactsInChat_.count() << " other contacts to abort..."; +#endif + } +} + + + +// The connection was established, so send the version command. +void MsnSwitchboardConnection::slotConnected() +{ +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Connected to server, sending authentication."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( connectionState_ == SB_CONNECTING || connectionState_ == SB_REQUESTING_CHAT ); +#endif + + connectionState_ = SB_AUTHORIZING; + + if( userStartedChat_ ) + { // This is a user-initiated chat + // Set the usr information to the server. + sendCommand( "USR", currentAccount_->getHandle() + " " + authorization_ ); + } + else + { // This is a contact-initiated chat + // Answer the chat with the authorization + sendCommand( "ANS", currentAccount_->getHandle() + " " + authorization_ + " " + chatId_ ); + } +} + + + +/** + * @brief Shows error dialog boxes + * + * All switchboard errors are annoying and mostly useless. So we ignore most of them. + * + * @param error The error reason or explanation. + * @param type The type of error. + */ +void MsnSwitchboardConnection::slotError( QString error, MsnSocketBase::ErrorType type ) +{ + kWarning() << "MSN Switchboard Connection error type" << type << " (contacts=" << contactsInChat_ << "):" << error; + + // Decide what kind of message to show + switch( type ) + { + case MsnSocketBase::ERROR_DROP: + // FIXME Completely unreliable, at least with WLM. + // 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; + } +} + + + +// Send a nudge to a contact +void MsnSwitchboardConnection::sendNudge() +{ + // Create the message + MimeMessage message; + message.addField( "MIME-Version", "1.0" ); + message.addField( "Content-Type", "text/x-msnmsgr-datacast" ); + message.setBody( "ID: 1\r\n" ); // ID 1 indicates it's a nudge + + // Sent the message, re-establishing the connection if it was lost. + sendMimeMessageWhenReady( ACK_NAK_ONLY, message ); + + // Signal the presence of activity on this switchboard + activity(); +} + + + +// Start a switchboard connection +void MsnSwitchboardConnection::start( const ChatInformation &chatInfo ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( currentAccount_ != 0 ); +#endif + + if(isConnected()) + { + if( ! contactsInChat_.isEmpty() && ! isExclusiveChatWithContact(chatInfo.getContactHandle())) + { + kWarning() << "already connected, can't start new chat with '" << chatInfo.getContactHandle() << "'!" << endl; + return; + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Resuming a connection with a different server, reconnecting."; +#endif + closeConnection(); + } + + // Remove any contact from this switchboard session. + if( ! contactsInChat_.isEmpty() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Deleting active contacts: " << contactsInChat_.join(","); +#endif + + // Make sure all contacts are removed, which will also abort their applications in ApplicationList. + ContactBase *contact; + foreach( const QString &handle, contactsInChat_ ) + { + contact = currentAccount_->getContactByHandle( handle ); + if( KMESS_NULL(contact) ) continue; + contact->removeSwitchboardConnection(this, true); // could cause applications to abort. + } + + contactsInChat_.clear(); + } + + // Prepare the class for the new connection, setting some values to good defaults + // sentEmoticons_.clear(); // NOTE: Behavior changed since WLM 8+, emoticon data must be sent every time. + closingConnection_ = false; + firstContact_ = // Assign chatInfo.getContactHandle() to both first and last contact. + lastContact_ = chatInfo.getContactHandle(); + + // If requested, start an offline connection instead of a normal one + if( chatInfo.getType() == ChatInformation::CONNECTION_OFFLINE ) + { +#ifdef KMESSTEST + KMESS_ASSERT( connectionState_ == SB_DISCONNECTED ); +#endif + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Initializing offline connection with " << chatInfo.getContactHandle() << "."; +#endif + + // lastContact_ gets set even when making offline connections, so isExclusiveChatWithContact() returns true; + // otherwise a chat window would be spawned for every offline message. + + userStartedChat_ = chatInfo.getUserStartedChat(); + backgroundConnection_ = false; + + // Ask for a chat window; if one already exists, it will be raised. + emit requestChatWindow( this ); + return; + } + + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Initializing connection with " << chatInfo.getContactHandle() + << ": Connecting to SB " << chatInfo.getIp() << ":" << chatInfo.getPort() << "." << endl; +#endif + + // Store information from the chatinfo object + authorization_ = chatInfo.getAuthorization(); + chatId_ = chatInfo.getChatId(); + userStartedChat_ = chatInfo.getUserStartedChat(); + + // Connect to the server. +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_INIT(this, "SB " + chatInfo.getIp()); +#endif + + connectionState_ = SB_CONNECTING; + connectToServer( chatInfo.getIp(), chatInfo.getPort() ); + + // Link a chat window to this switchboard if it's needed. + if( backgroundConnection_ && chatInfo.getType() == ChatInformation::CONNECTION_CHAT ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "requesting chat window for initiated chat invitation."; +#endif + emit requestChatWindow( this ); + backgroundConnection_ = false; + } +} + + + +// Store a message for later acknowledgement +void MsnSwitchboardConnection::storeMessageForAcknowledgement(int ack, AckType ackType, const MimeMessage& message) +{ + // don't store if the ack-type indicates so + if(ackType == ACK_NONE) return; + + // Only update pending ack list when we'll always get an ack back. + if(ackType == ACK_ALWAYS || ackType == ACK_ALWAYS_P2P) + { + acksPending_++; + } + + // Create a record of the unacked message + UnAckedMessage* unAcked = new UnAckedMessage(); + unAcked->ackType = ackType; + unAcked->time = QDateTime::currentDateTime().toTime_t(); + unAcked->message = message; // no problem with data size, uses shared reference. + + // Add to QHash + unAckedMessages_.insert( ack, unAcked ); + +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Stored message for acknowledgement. " + << "There are currently " << unAckedMessages_.count() << " messages kept, " + << acksPending_ << " need to be ACKed." << endl; +#endif +} + + + +#include "msnswitchboardconnection.moc" diff --git a/kmess/network/msnswitchboardconnection.h b/src/network/msnswitchboardconnection.h similarity index 69% rename from kmess/network/msnswitchboardconnection.h rename to src/network/msnswitchboardconnection.h index df15ddf..32b7031 100644 --- a/kmess/network/msnswitchboardconnection.h +++ b/src/network/msnswitchboardconnection.h @@ -18,17 +18,12 @@ #ifndef MSNSWITCHBOARDCONNECTION_H #define MSNSWITCHBOARDCONNECTION_H -#include -#include -#include -#include -#include -#include -#include - #include "msnconnection.h" #include "mimemessage.h" -#include "../chat/chatmaster.h" + +#include +#include +#include // Forward declarations @@ -39,6 +34,11 @@ class MsnObject; class P2PMessage; class ContactBase; class ChatMessage; +class OfflineImService; + +class QFont; +class QTimer; + /** @@ -53,29 +53,49 @@ 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 + MsnSwitchboardConnection( const MsnSwitchboardConnection &other ); // The destructor - ~MsnSwitchboardConnection(); + virtual ~MsnSwitchboardConnection(); // Close the connection, only for emergaincy situations virtual void closeConnection(); // 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. const QString& getLastContact() const; // Return whether the user started the chat bool getUserStartedChat() const; - // Initialize the object - bool initialize(); + // 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 @@ -84,32 +104,46 @@ 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; - // Start a switchboard connection - void connectTo( const ChatInformation &chatInfo ); + // Check whether the switchboard is waiting for a new connection + bool isWaiting() 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(); - // Deliver a message for an Application object. - void sendApplicationMessage( const MimeMessage &message ); - - public slots: // Public slots - // Send a message to the contact(s) - void sendChatMessage(QString text); - // Send a "ping" to avoid MSN closing the connection - void sendKeepAlive(); // The user is typing so send a typing message void sendTypingMessage(); + // Send wink + void sendWink( const MsnObject& 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 ); - protected slots: // Protected slots + + public slots: + // Send a "ping" to avoid MSN closing the connection + void sendKeepAlive(); + + + protected slots: // The socket connected, so send the version command. - void connectionSuccess(); + virtual void slotConnected(); + // Shows error dialog boxes + void slotError( QString error, MsnSocketBase::ErrorType type ); + 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(); + private: // private structs struct UnAckedMessage @@ -119,6 +153,7 @@ class MsnSwitchboardConnection : public MsnConnection MimeMessage message; }; + private: // Private methods // Initialize or restart the last activity timer, for keep alive messages void activity(); @@ -129,13 +164,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 - void convertHtmlColorToMsnColor(QString &color) const; + const QString convertHtmlColorToMsnColor( const QString &color ) const; // Convert and msn format color (BBGGRR) to an html format (#RRGGBB) color - void convertMsnColorToHtmlColor(QString &color) const; - // Get a font from the message - void getFontFromMessageFormat(QFont &font, const MimeMessage& message) const; - // Get an html font color from the message - void getFontColorFromMessageFormat(QString &color, const MimeMessage& message) 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. @@ -152,39 +183,38 @@ class MsnSwitchboardConnection : public MsnConnection void gotUsr(const QStringList& command); // Parse a regular command void parseCommand(const QStringList& command); + // Parse a normal plain text chat message + void parseChatMessage(const QString &contactHandle, const QString &friendlyName, const QString &contactPicture, const MimeMessage &message); + // Parse the clientcaps message, exchanged by a lot of third party clients. + void parseClientCapsMessage(const QString &contactHandle, const MimeMessage &message); // Parse a datacast message (e.g. nudge or voice clip) 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 parseMessage(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); + // Parse a p2p message, used for invitation + void parseP2PMessage( const QString &contactHandle, const MimeMessage &message ); + // Parse a contact is typing message. + void parseTypingMessage( const QString &contactHandle, const MimeMessage &message ); // Send a client caps message to the contacts void sendClientCaps(); // Send a message to the contact(s), or leave it pending until a connection is restored void sendMimeMessageWhenReady(AckType ackType, const MimeMessage &message); + // Send a multipacket message to contact(s), or leave it pending until a connection is restored + void sendMimeMessageWhenReady( AckType ackType, MultiPacketMessage &message ); // Send messages that weren't sent because a contact had to be re-called void sendPendingMessages(); // Store a message for later acknowledgement void storeMessageForAcknowledgement(int ack, AckType ackType, const MimeMessage& message); + private: // Private attributes - // Whether this object is aborting all it's applications - bool abortingApplications_; - // The number of ACK messages pending - int acksPending_; - // The authorization used to connect to the switchboard server - QString authorization_; - // Whether this object should be deleted after finishing closeConnectionLater() - bool autoDeleteLater_; - // The id of the chat, used for authenticating a contact-started chat - QString chatId_; - // Whether this switchboard is connected to a chatwindow or it's a background connection. - bool backgroundConnection_; - // Whether this object is closing it's connection using closeConnectionLater() - bool closingConnection_; - // Current status of connection to the switchboard server + enum ConnectionState { SB_DISCONNECTED, @@ -193,10 +223,30 @@ class MsnSwitchboardConnection : public MsnConnection SB_INVITING_CONTACTS, SB_CHAT_STARTED, SB_CONTACTS_LEFT, - SB_REQUESTING_CHAT - } connectionState_; + SB_REQUESTING_CHAT, + SB_DISCONNECTING + }; + + // Whether this object is aborting all it's applications + bool abortingApplications_; + // The number of ACK messages pending + int acksPending_; + // The authorization used to connect to the switchboard server + QString authorization_; + // Whether this object should be deleted after finishing closeConnectionLater() + bool autoDeleteLater_; + // Whether this switchboard is connected to a chatwindow or it's a background connection. + bool backgroundConnection_; + // The id of the chat, used for authenticating a contact-started chat + QString chatId_; + // Whether this object is closing it's connection using closeConnectionLater() + bool closingConnection_; + // Current status of connection to the switchboard server + ConnectionState connectionState_; // A list of the contacts in the chat QStringList contactsInChat_; + // A pointer to the shared current account singleton. + CurrentAccount *currentAccount_; // The last contact that was participating to the chat. QString firstContact_; // Whether or not the object has been initialized @@ -209,25 +259,30 @@ class MsnSwitchboardConnection : public MsnConnection // NOTE: Behavior changed since WLM 8+, emoticon data must be sent every time. // QStringList sentEmoticons_; // A list of messages that should be sent to the contact when connection is reestablished - QPtrList< QPair > pendingMessages_; + 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. QTimer *keepAliveTimer_; // Timer to keep track of last activities, to manage keep alive messages. int keepAlivesRemaining_; + // Service to send offline messages + OfflineImService *offlineImService_; - signals: // Public signals + + 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 + void gotInkMessage( const QString &inkData, const QString &handle ); // The switchboard received a Mime message, requesting processing by ChatMaster void gotMessage( const MimeMessage &message, const QString &handle ); // The switchboard received a P2P message, requesting processing by ChatMaster @@ -235,7 +290,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 @@ -243,9 +298,14 @@ 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 ); + }; + + #endif diff --git a/kmess/network/multipacketmessage.cpp b/src/network/multipacketmessage.cpp similarity index 56% rename from kmess/network/multipacketmessage.cpp rename to src/network/multipacketmessage.cpp index ae20033..11f9862 100644 --- a/kmess/network/multipacketmessage.cpp +++ b/src/network/multipacketmessage.cpp @@ -16,7 +16,10 @@ ***************************************************************************/ #include "multipacketmessage.h" + +#include "../utils/kmessshared.h" #include "../kmessdebug.h" +#include // Many thanks to Siebe Tolsma for the following documentation: @@ -28,7 +31,7 @@ MultiPacketMessage::MultiPacketMessage() : chunks_(0) , lastChunk_(0) { - buffer_.open( IO_ReadWrite ); + buffer_.open( QIODevice::ReadWrite ); // TODO: add a live-time to the message, so it will be removed // automatically (avoiding yet another denial-of-service attack). @@ -36,6 +39,27 @@ MultiPacketMessage::MultiPacketMessage() +// The constructor for sending huge messages +MultiPacketMessage::MultiPacketMessage( const MimeMessage& message ) + : lastChunk_(0) +{ + // Max single MimeMessage length + int maxSendableMessageLength = 1400; + + // Grep body of MimeMessage + messageText_ = message.getBody(); + + // Set the MimeMessage and the number of chunks ( round up ) + result_ = message; + float a = (float) messageText_.toUtf8().length() / (float) maxSendableMessageLength; + chunks_ = (int) ceil( a ); + + // Set message guid + messageId_ = KMessShared::generateGUID(); +} + + + // The destructor MultiPacketMessage::~MultiPacketMessage() { @@ -55,12 +79,12 @@ void MultiPacketMessage::addChunk( const MimeMessage &message ) if( isComplete() ) { - kdWarning() << "MultiPacketMessage::addChunk: already received last chunk!" << endl; + kWarning() << "already received last chunk!"; return; } #ifdef KMESSTEST - ASSERT( message.hasField("Message-ID") ); + KMESS_ASSERT( message.hasField("Message-ID") ); #endif if( message.hasField("Chunks") ) @@ -68,19 +92,19 @@ void MultiPacketMessage::addChunk( const MimeMessage &message ) // Test whether the object is already initialized. if( ! messageId_.isNull() ) { - kdWarning() << "MultiPacketMessage::addChunk: reveived message contains 'Chunks' header, but is not the first message!" << endl; + kWarning() << "reveived message contains 'Chunks' header, but is not the first message!"; return; } // This is the first message. messageId_ = message.getValue("Message-ID"); chunks_ = message.getValue("Chunks").toInt(); - lastChunk_ = 0; + lastChunk_ = 0; // incremented below (this message is the first chunk) // Avoid denial-of-service attacks. if( chunks_ > 20 ) { - kdWarning() << "MultiPacketMessage::addChunk: about to receive a message of more then 20 chunks, ignoring message!" << endl; + kWarning() << "about to receive a message of more then 20 chunks, ignoring message!"; return; } @@ -103,14 +127,14 @@ void MultiPacketMessage::addChunk( const MimeMessage &message ) // Test whether this is the correct chunk if( message.getValue("Chunk").toInt() != lastChunk_ ) { - kdWarning() << "MultiPacketMessage::addChunk: received message chunk " - << message.getValue("Chunk") << ", expecting chunk " << lastChunk_ << "!" << endl; + kWarning() << "received message chunk " << message.getValue("Chunk").toInt() << + ", expecting chunk " << lastChunk_ << "!" << endl; return; } } else { - kdWarning() << "MultiPacketMessage::addChunk: received message without 'Chunks' or 'Chunk' field, ignoring message!" << endl; + kWarning() << "received message without 'Chunks' or 'Chunk' field, ignoring message!"; return; } @@ -119,9 +143,10 @@ void MultiPacketMessage::addChunk( const MimeMessage &message ) // UTF-8 characters will be correctly merged later. const QByteArray &chunkData = message.getBinaryBody(); #ifdef KMESSTEST - ASSERT( message.getBinaryBody().size() > 0 ); + KMESS_ASSERT( message.getBinaryBody().size() > 0 ); #endif - buffer_.writeBlock( chunkData ); + buffer_.write( chunkData ); + // Update chunk count lastChunk_++; @@ -130,9 +155,13 @@ void MultiPacketMessage::addChunk( const MimeMessage &message ) // Test whether this was the last message. if( lastChunk_ == chunks_ ) { +#ifdef KMESSDEBUG_MULTIPACKETMESSAGE + kDebug() << "Stored final part, restoring message."; +#endif + // Read all data buffer_.reset(); - QByteArray bufferData = buffer_.readAll(); + const QByteArray &bufferData = buffer_.data(); // Determine how to merge the data. if( result_.getValue("Content-Type") == "application/x-msnmsgrp2p" ) @@ -146,6 +175,12 @@ void MultiPacketMessage::addChunk( const MimeMessage &message ) result_.setBody( QString::fromUtf8(bufferData.data(), bufferData.size()) ); } } + else + { +#ifdef KMESSDEBUG_MULTIPACKETMESSAGE + kDebug() << "Stored part " << lastChunk_ << " of " << chunks_; +#endif + } } @@ -158,10 +193,57 @@ const MimeMessage &MultiPacketMessage::getMessage() const -// Return whether the full message is received +// Return whether the full message is received/sended bool MultiPacketMessage::isComplete() const { return (chunks_ > 0 && lastChunk_ == chunks_); } + +// Get the next part of one multipacket message +const MimeMessage& MultiPacketMessage::getNextPart() +{ + // Max single MimeMessage length + int maxSendableMessageLength = 1400; + + // If this is not the first chunk (FIXME variable name?), clear all fields + if( lastChunk_ != 0 ) + { + result_.clearFields(); + } + + // Add the GUID (Windows Live Messenger 8.5 requires this to be sent before Chunks/Chunk) + result_.addField( "Message-ID", messageId_ ); + + if( lastChunk_ == 0 ) + { + // If it's the first chunk add the total number of chunks + result_.addField( "Chunks", QString::number( chunks_, 10 ) ); + } + else + { + // Else set the chunk order number + result_.addField( "Chunk", QString::number( lastChunk_, 10 ) ); + } + + // Add the body + if( lastChunk_ == chunks_ - 1 ) + { + result_.setBody( messageText_.mid( lastChunk_ * maxSendableMessageLength, + messageText_.length() - lastChunk_ * maxSendableMessageLength ) ); + } + else + { + result_.setBody( messageText_.mid( lastChunk_ * maxSendableMessageLength, maxSendableMessageLength ) ); + } + + // Increment lastChunk + lastChunk_++; + +#ifdef KMESSDEBUG_MULTIPACKETMESSAGE + kDebug() << "Sending part: " << lastChunk_; +#endif + + return result_; +} diff --git a/kmess/network/multipacketmessage.h b/src/network/multipacketmessage.h similarity index 80% rename from kmess/network/multipacketmessage.h rename to src/network/multipacketmessage.h index ff49ec9..bc64cbe 100644 --- a/kmess/network/multipacketmessage.h +++ b/src/network/multipacketmessage.h @@ -20,11 +20,12 @@ #include "mimemessage.h" -#include -#include +#include + /** * @author Diederik van der Boor + * @ingroup NetworkCore */ class MultiPacketMessage { @@ -32,6 +33,8 @@ class MultiPacketMessage // The constructor MultiPacketMessage(); + // The constructor for sending huge messages + MultiPacketMessage( const MimeMessage &message ); // The destructor virtual ~MultiPacketMessage(); @@ -40,20 +43,24 @@ class MultiPacketMessage void addChunk( const MimeMessage &message ); // Returh the complete message const MimeMessage & getMessage() const; - // Return whether the full message is received + // Return whether the full message is received/sended bool isComplete() const; + //Return the next part of multipacket message + const MimeMessage & getNextPart(); private: // The buffer for the data QBuffer buffer_; // The number of chunks the message consists of int chunks_; - // The last chunk received. + // The last chunk received/sended int lastChunk_; // The message ID QString messageId_; - // The result message + // The current/result message MimeMessage result_; + // The message + QString messageText_; }; diff --git a/kmess/network/p2pmessage.cpp b/src/network/p2pmessage.cpp similarity index 82% rename from kmess/network/p2pmessage.cpp rename to src/network/p2pmessage.cpp index 6c280c1..ad32b54 100644 --- a/kmess/network/p2pmessage.cpp +++ b/src/network/p2pmessage.cpp @@ -11,11 +11,8 @@ #include "../kmessdebug.h" -#include - /* - // Constructor to create an empty P2P message P2PMessage::P2PMessage() : sessionID_(0) @@ -28,9 +25,7 @@ P2PMessage::P2PMessage() , ackUniqueID_(0) , ackDataSize_(0) { - } - */ @@ -38,11 +33,7 @@ P2PMessage::P2PMessage() P2PMessage::P2PMessage(const char *data, uint size) { // Copy the binary data to our own managed copy - message_.duplicate(data, size); - -#ifdef KMESSTEST - ASSERT(message_.size() == size); -#endif + message_ = QByteArray( data, size ); parseP2PHeader(); } @@ -59,55 +50,55 @@ 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_; } @@ -117,7 +108,7 @@ unsigned long P2PMessage::getAckDataSize() const QString P2PMessage::getNonce() const { #ifdef KMESSTEST - ASSERT( isConnectionHandshake() ); + KMESS_ASSERT( isConnectionHandshake() ); #endif return extractNonce(message_.data()); } @@ -170,6 +161,7 @@ bool P2PMessage::isError() const } + // Return true if this is MsnObject data (e.g. pictures) or file data. bool P2PMessage::isData() const { @@ -253,7 +245,7 @@ void P2PMessage::parseP2PHeader() { // This clearly indicates an internal parsing error (in MimeMessage) // bodyData may be NULL - kdWarning() << "P2PMessage: no data found to parse!" << endl; + kWarning() << "no data found to parse!"; sessionID_ = 0; messageID_ = 0; dataOffset_ = 0; @@ -287,10 +279,10 @@ void P2PMessage::parseP2PHeader() // Verify data size! if( (uint) message_.size() < ( 48 + dataSize_ ) ) // message size could also contain the footer code. { - kdWarning() << "P2PMessage: corrupt data size header detected " - "(header=48" - " datasize=" << dataSize_ << - " total=" << message_.size() << ")"; + kWarning().nospace() << "corrupt data size header detected " + "(header=48" + " datasize=" << dataSize_ << + " total=" << message_.size() << ")"; dataSize_ = message_.size() - 48; } } @@ -302,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, @@ -329,21 +323,17 @@ 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 - ASSERT( fixedNonce.length() == 32 ); // 32 hex codes will be saved as 16 bytes. - ASSERT( buffer.size() >= (uint) (offset + 16) ); // buffer needs to have 16 bytes of space left. + KMESS_ASSERT( fixedNonce.length() == 32 ); // 32 hex codes will be saved as 16 bytes. + KMESS_ASSERT( buffer.size() >= (offset + 16) ); // buffer needs to have 16 bytes of space left. #endif // fields 7-9 (ack-msgid/uniqueid/ack-size) will be overwritten with the nonce. @@ -358,10 +348,28 @@ void P2PMessage::insertNonce(QByteArray &buffer, const QString &nonce, const int }; for(int i = 0; i < 16; i++) { - buffer[offset + i] = fixedNonce.mid(noncePos[i] * 2, 2).toUInt(0, 16); + buffer[offset + i] = (char)( fixedNonce.mid(noncePos[i] * 2, 2).toUInt(0, 16) ); } } + + +// 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. @@ -371,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] ) @@ -381,7 +391,7 @@ unsigned long P2PMessage::extractLongBytes(const char *data, const int offset) // FIXME: gcc complains that the shift width is larger then the actual data type supports.. // as long as the msn servers don't send huge messages, we don't have much to worry.. - // otherwise cast the data to Q_INT64 first. + // otherwise cast the data to qint64 first. // | ((unsigned char) data[offset + 4] << 32) // | ((unsigned char) data[offset + 5] << 40) // | ((unsigned char) data[offset + 6] << 48) @@ -389,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 @@ -415,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/kmess/network/p2pmessage.h b/src/network/p2pmessage.h similarity index 67% rename from kmess/network/p2pmessage.h rename to src/network/p2pmessage.h index 70b7f23..21a0f15 100644 --- a/kmess/network/p2pmessage.h +++ b/src/network/p2pmessage.h @@ -10,8 +10,8 @@ #ifndef P2PMESSAGE_H #define P2PMESSAGE_H -#include -class QString; +#include + /** @@ -46,105 +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 isData() 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; + 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; + bool isNegativeAck() const; // Return true if this is part of an SLP message. - bool isSlpData() const; + 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..6341d75 --- /dev/null +++ b/src/network/soap/addressbookservice.cpp @@ -0,0 +1,1040 @@ +/*************************************************************************** + 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 property the property that has changed (see ContactProperty in addressbookservice.h) + * @param newValue the new value for that property. + */ +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 "ABFindAll". + * 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 = 0; // = 0 fixes compile time warning + 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 different soap replies: + * 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 message the SOAP response message. + * @see PassportLoginService::parseSoapResult(). + */ +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..d5ca8f6 --- /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( const QString& groupId, const QString& name ); + // Group was removed + void groupDeleted( const QString& groupId ); + // Group was renamed + void groupRenamed( const QString& groupId, const 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 new file mode 100644 index 0000000..294880a --- /dev/null +++ b/src/network/soap/httpsoapconnection.cpp @@ -0,0 +1,640 @@ +/*************************************************************************** + httpsoapconnection.cpp - description + ------------------- + begin : Sun Sep 25 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 "httpsoapconnection.h" + +#include "../../utils/kmessshared.h" +#include "../../utils/xmlfunctions.h" +#include "../../kmessdebug.h" +#include "../mimemessage.h" +#include "soapmessage.h" +#include "config-kmess.h" + +#include +#include +#include +#include +#include + +#include + + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION + #define KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + #define KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP +#endif + + +/** + * 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 60000 + + + +/** + * @brief The constructor + * + * Initializes the class. + * The actual connection is established when a SOAP call is made. + * + * @param parent The Qt parent object. The object is deleted when the parent is deleted. + */ +HttpSoapConnection::HttpSoapConnection( QObject *parent ) +: QObject( parent ) +, currentRequest_( 0 ) +, isSending_( false ) +{ +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "CREATED."; +#endif + + // Create the network request object + http_ = new QNetworkAccessManager( this ); + + // Make signal connections + 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&) ) ); + + // Initialize the timeout timer + responseTimer_.setSingleShot( true ); + responseTimer_.setInterval( SOAPCONNECTION_RESPONSE_TIMEOUT ); + connect( &responseTimer_, SIGNAL( timeout() ), + this, SLOT ( slotRequestTimeout() ) ); +} + + + +/** + * @brief The destructor. + * + * Closes the sockets if these are still open. + */ +HttpSoapConnection::~HttpSoapConnection() +{ + qDeleteAll( requests_ ); + delete currentRequest_; + delete http_; + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +/** + * @brief Abort all queued requests + * + * This removes any pending requests and ignores responses for already sent messages. + */ +void HttpSoapConnection::abort() +{ + qDeleteAll( requests_ ); + requests_.clear(); + + delete currentRequest_; + currentRequest_ = 0; + + responseTimer_.stop(); +} + + + +/** + * @brief Return the current request message, if any + * + * It only returns a message if a request is currently being sent, or if its response is being processed. + * + * @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. + */ +SoapMessage *HttpSoapConnection::getCurrentRequest( bool copy ) const +{ + if( copy ) + { + return new SoapMessage( *currentRequest_ ); + } + else + { + return currentRequest_; + } +} + + + +/** + * @brief Return whether the connection is idle. + * @return Returns true when the connection is idle, false when a SOAP request is pending / being processed. + */ +bool HttpSoapConnection::isIdle() +{ + return ( ! isSending_ ); +} + + +#if 0 +/** + * @brief Parse the received server response. + * + * This body extracts the XML message from the body. + * It detects SOAP Faults automatically. + * Other responses are returned to parseSoapResult(). + * + * @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 + kDebug() << "Request finished, pasing body."; +#endif + + // Attempt to convert to XML + // see http://doc.trolltech.com/4.3/qdomdocument.html#setContent + QString xmlError; + QDomDocument xml; + if( ! xml.setContent( responseBody, true, &xmlError ) ) // true for namespace processing. + { + kWarning() << "Unable to parse XML " + "(error='" << xmlError << "' endpoint=" << endpoint_ << ")" << endl; + return false; + } + + // See if there is a header element + QDomElement headerNode = XmlFunctions::getNode(xml, "/Envelope/Header").firstChild().toElement(); + + // See if there is a Fault in the main Envelope (happens with passport RST service). + QDomElement faultNode = XmlFunctions::getNode(xml, "/Envelope/Fault").toElement(); + if( ! faultNode.isNull() ) + { +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Found soap fault outside the body!"; +#endif + closeConnection(); + parseSoapFault( faultNode, headerNode ); + return true; // no parsing error, it's a valid response. + } + + // Get the main body node + QDomElement resultNode = XmlFunctions::getNode(xml, "/Envelope/Body").firstChild().toElement(); + if( resultNode.isNull() ) + { + kWarning() << "Unable to parse response: result node is null " + << "(root=" << xml.nodeName() << " endpoint=" << endpoint_ << ")." << endl; + return false; + } + + // See if it's a soap error message, fault in the body. + // NOTE: the test is done with localName() instead of nodeName(), because the prefix may differ. + if( resultNode.localName() == "Fault" + && resultNode.namespaceURI() == XMLNS_SOAP ) + { +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Found soap fault."; +#endif + closeConnection(); + parseSoapFault( resultNode, headerNode ); + return true; // no parsing error, it's a valid response. + } + + // 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() ); + if( resultNodeName.endsWith("Response") + && resultNode.childNodes().length() == 1 + && resultNode.firstChild().nodeName() == resultNodeName.replace("Response", "Result") ) + { + resultNode = resultNode.firstChild().toElement(); + } + + // Request completed, indicate derived class and listeners. +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Request finished, signalling to start parsing of the result node " + "(name:" << resultNode.nodeName() << + " prefix:" << resultNode.prefix() << + " localName:" << resultNode.localName() << + " namespace:" << resultNode.namespaceURI() << ")" << endl; +#endif + + // Notify listeners + parseSoapResult( resultNode, headerNode ); + return true; +} +#endif + + + +/** + * @brief Parse the SOAP fault. + * + * This method extracts the node data, and emits a soapError() signal. + * Overwrite this method to implement custom error handling. + * + * @param message The message containing a soap fault conXML node which contains the SOAP fault. + */ +void HttpSoapConnection::parseSoapFault( SoapMessage *message ) +{ + // Assemble a generic error message + emit soapError( QString( "%1 (%2)" ).arg( message->getFaultDescription() ) + .arg( message->getFaultCode() ), + MsnSocketBase::ERROR_SOAP_UNKNOWN ); +} + + + +/** + * @brief Send the next request in queue to the endpoint. + */ +void HttpSoapConnection::sendNextRequest() +{ + if( isSending_ || requests_.isEmpty() ) + { + return; + } + +#ifdef KMESSTEST + KMESS_ASSERT( currentRequest_ == 0 ); +#endif + + // 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( endpoint.host() ) ) + { + endpoint.setHost( redirections_[ endpoint.host() ] ); + +#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 KMESS_ENABLE_LOCAL_MODE == 1 + // NOTE Local mode: see src/kmessdebug.h + request.setUrl( QUrl( "https://127.0.0.1:4430/" ) ); +#endif + + if( ! soapAction.isNull() ) + { + QString quotedAction( "\"" + soapAction + "\"" ); + request.setRawHeader( "SOAPAction", quotedAction.toLatin1() ); + } + + http_->post( request, contents ); + + // 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() ); + } + else + { + KMESS_NET_INIT( this, "SOAP " + endpoint.path() ); + } + + KMESS_NET_SENT( this, contents ); +#endif + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP + kDebug() << "Request contents:"; + kDebug() << contents; +#endif +} + + + +/** + * @brief Send a SOAP request to the webservice. + * + * 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 message The message to send. + * @param urgent Whether the request needs to be sent before everything else. + */ +void HttpSoapConnection::sendRequest( SoapMessage *message, bool urgent ) +{ +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + if( urgent ) + { + kDebug() << "Immediately sending message to endpoint:" << message->getEndPoint(); + } + else + { + kDebug() << "Queueing message to endpoint:" << message->getEndPoint(); + } +#endif + + if( urgent ) + { + requests_.prepend( message ); + } + else + { + requests_.append( message ); + } + + // Try sending the request now + sendNextRequest(); +} + + + +/** + * @brief Called when the remote server requires authentication. + */ +void HttpSoapConnection::slotAuthenticationRequired( QNetworkReply *reply, QAuthenticator *authenticator ) +{ + // A response has arrived, stop the timeout detection timer + responseTimer_.stop(); + + kWarning() << "Got http authentication request for" << authenticator->realm() << + "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::slotRequestFinished( QNetworkReply *reply ) +{ + // An unexpected response has arrived + if( currentRequest_ == 0 ) + { + return; + } + + // A response has arrived, stop the timeout detection timer + responseTimer_.stop(); + + QByteArray replyContents( reply->readAll() ); + int statusCode = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt(); + QString error( reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString() ); + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + bool requestSuccess = false; + QUrl replyUrl( reply->url() ); + kDebug() << "Received response: code" << statusCode + << reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ) + << " from" << replyUrl; +#endif +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP + kDebug() << "Reply contents:"; + kDebug() << replyContents; +#endif + + // Parse the body of the HTTP response (copying the other attributes from the request) + SoapMessage *currentResponse = getCurrentRequest( true /* copy */ ); + currentResponse->setMessage( replyContents ); + +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_RECEIVED( this, replyContents ); +#endif + + // Check for errors + bool success = currentResponse->isValid(); + if( success ) + { +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + requestSuccess = true; +#endif + + // Parse the message contents + if( currentResponse->isFaultMessage() ) + { + // Verify if the server is redirecting us to another server + if( currentResponse->getFaultCode() == "psf:Redirect" ) + { + const QUrl& originalUrl( currentResponse->getEndPoint() ); + const QUrl& redirectUrl( XmlFunctions::getNodeValue( currentResponse->getFault(), "redirectUrl" ) ); + const QString& originalHost( originalUrl.host() ); + const QString& redirectHost( redirectUrl.host() ); + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Received redirection from:" << originalHost << "to:" << redirectHost; +#endif + + // Save the redirection target + if( ! redirectionCounts_.contains( originalHost ) ) + { + redirectionCounts_[ originalHost ] = 0; + } + redirections_[ originalHost ] = redirectHost; + redirectionCounts_[ originalHost ] = redirectionCounts_[ originalHost ] + 1; + + // Limit the number of redirects from the original host + if( redirectionCounts_[ originalHost ] > 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 QUrl& originalUrl( currentResponse->getEndPoint() ); + const QString& originalHost( originalUrl.host() ); + QString preferredHostName( XmlFunctions::getNodeValue( currentResponse->getHeader(), + "ServiceHeader/PreferredHostName" ) ); + + // Verify if the server is suggesting us to use another server + if( ! preferredHostName.isEmpty() && ! redirections_.contains( originalHost ) ) + { +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Received hostname suggestion from:" << originalUrl << "to:" << preferredHostName; +#endif + + redirectionCounts_[ originalHost ] = 0; + redirections_[ originalHost ] = preferredHostName; + } + + // 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 + { + // 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 ); + } + + // 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 +#if QT_VERSION > 0x040500 + // Work around a Qt-4.5.1-devel bug which doesn't clean up correctly after each request. + QTimer::singleShot( 250, this, SLOT(sendNextRequest())); +#else + sendNextRequest(); +#endif + return; +} + + + +/** + * @brief Called when a timeout occurred while sending a request. + */ +void HttpSoapConnection::slotRequestTimeout() +{ + // Inform listeners that the request failed + emit soapError( i18nc( "Error message", + "No response from web service" ), + MsnSocketBase::ERROR_SOAP_TIME_LIMIT ); +} + + + +/** + * @brief Called when an ssl error occurred while setting up the connection. + */ +void HttpSoapConnection::slotSslErrors( QNetworkReply *reply, const QList &sslErrors ) +{ + foreach( QSslError error, sslErrors ) + { + 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. + 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 ); +} + + + +#include "httpsoapconnection.moc" diff --git a/src/network/soap/httpsoapconnection.h b/src/network/soap/httpsoapconnection.h new file mode 100644 index 0000000..00d140c --- /dev/null +++ b/src/network/soap/httpsoapconnection.h @@ -0,0 +1,148 @@ +/*************************************************************************** + httpsoapconnection.h - description + ------------------- + begin : Sun Sep 25 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. * + * * + ***************************************************************************/ + +#ifndef HTTPSOAPCONNECTION_H +#define HTTPSOAPCONNECTION_H + +#include "../msnsocketbase.h" + +#include +#include +#include +#include +#include + + +class QAuthenticator; +class QNetworkAccessManager; +class QNetworkReply; +class QSslError; + +class SoapMessage; +class MimeMessage; + + + +/** + * @brief SOAP transport over a HTTP connection. + * + * The SOAP protocol is used to implement webservices. + * It's commonly used by .Net applications, + * MSN Messenger is not an exception here. + * SOAP is used for new features like: + * - games / activities. + * - offline-im. + * - passport 3.0 authentication. + * - addressbook data (as of Windows Live Messenger). + * + * The class implements SOAP at a basic level. + * - it operates much like the XmlHttpRequest class works in web browsers. + * - sniffed XML strings can be sent directly with sendRequest(). + * - no need to translate XML to SOAP encodings. + * - no need to reverse engineer a WSDL to send SOAP messages. + * - 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. + * 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 +{ + Q_OBJECT + + public: // public methods + // The constructor + explicit HttpSoapConnection( QObject *parent = 0 ); + // The destructor + virtual ~HttpSoapConnection(); + + // Abort all queued requests + void abort(); + // Whether the connection is idle, not processing a SOAP request/response + bool isIdle(); + + protected: + // Return the current request message, if any + SoapMessage *getCurrentRequest( bool copy = false ) const; + // Parse the SOAP fault + 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 slots: + // Send the next request in queue to the endpoint. + void sendNextRequest(); + // Called when the remote server requires authentication + void slotAuthenticationRequired( QNetworkReply *reply, QAuthenticator *authenticator ); + // Called when the request to the remote server finished + 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( QNetworkReply *reply, const QList &sslErrors ); + + + private: // private attributes + /// 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 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 soapError( QString error, MsnSocketBase::ErrorType type ); + /** + * @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 soapWarning( const QString &warning, bool isImportant ); +}; + +#endif diff --git a/src/network/soap/msnappdirectoryservice.cpp b/src/network/soap/msnappdirectoryservice.cpp new file mode 100644 index 0000000..68ada02 --- /dev/null +++ b/src/network/soap/msnappdirectoryservice.cpp @@ -0,0 +1,182 @@ +/*************************************************************************** + msnappdirectoryservice.cpp - description + ------------------- + begin : Sun Sep 25 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 "msnappdirectoryservice.h" + +#include "../../utils/xmlfunctions.h" +#include "../../kmessdebug.h" +#include "httpsoapconnection.h" +#include "soapmessage.h" + + +#ifdef KMESSDEBUG_APPDIRECTORYSERVICE +#define KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL +#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( parent ) +{ +#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL + kDebug() << "CREATED."; +#endif + + setObjectName( "MsnAppDirectoryService" ); +} + + + +// Destructor +MsnAppDirectoryService::~MsnAppDirectoryService() +{ + qDeleteAll( entries_ ); + +#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +// Return an application entry with a certain ID +const MsnAppDirectoryService::Entry * MsnAppDirectoryService::getEntryById( int entryId ) +{ + foreach( Entry *entry, entries_ ) + { + if( entry->entryId == entryId ) + { + return entry; + } + } + + return 0; +} + + + +// Return all entries +const QList& MsnAppDirectoryService::getEntries() const +{ + return entries_; +} + + + +// A soap request finished +void MsnAppDirectoryService::parseSoapResult( SoapMessage *message ) +{ +#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL + kDebug() << "Got query response"; +#endif + + // Parse the list of result entries + 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 ) ); + + int entryId = XmlFunctions::getNodeValue( entryProperties, "EntryID" ).toInt(); + if( getEntryById( entryId ) != 0 ) + { + // Ignore entries that are already present + continue; + } + + // 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->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 << "."; +#endif + + // Add to the list + entries_.append( entry ); + } + +#ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL + kDebug() << "Emitting that request was successful"; +#endif +} + + + +// Request a list of all services +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" + "" ); + + sendRequest( new SoapMessage( SERVICE_URL_APPDIRSERVICE, + "http://www.msn.com/webservices/Messenger/Client/GetFilteredDataSet2", + QString(), + body ) ); +} + + + +#include "msnappdirectoryservice.moc" diff --git a/kmess/network/soap/msnappdirectoryservice.h b/src/network/soap/msnappdirectoryservice.h similarity index 89% rename from kmess/network/soap/msnappdirectoryservice.h rename to src/network/soap/msnappdirectoryservice.h index 4f643de..e31c137 100644 --- a/kmess/network/soap/msnappdirectoryservice.h +++ b/src/network/soap/msnappdirectoryservice.h @@ -18,13 +18,16 @@ #ifndef MSNAPPDIRECTORYSERVICE_H #define MSNAPPDIRECTORYSERVICE_H -#include -#include - #include "httpsoapconnection.h" +#include +#include + + class QDomElement; + + /** * Wrapper for SOAP calls to the MSN application directory service. * @@ -42,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; }; @@ -83,18 +87,18 @@ class MsnAppDirectoryService : public HttpSoapConnection // Return an application entry with a certain ID const Entry * getEntryById(int entryId); // Return all entries - const QPtrList& getEntries() const; + 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: // A list of all received entries - QPtrList entries_; + QList entries_; }; #endif diff --git a/src/network/soap/offlineimservice.cpp b/src/network/soap/offlineimservice.cpp new file mode 100644 index 0000000..09c9b30 --- /dev/null +++ b/src/network/soap/offlineimservice.cpp @@ -0,0 +1,590 @@ +/*************************************************************************** + offlineimservice.cpp - description + ------------------- + begin : Thu Sep 07 2006 + copyright : (C) 2006 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 "offlineimservice.h" + +#include "../../utils/xmlfunctions.h" +#include "../../utils/kmessshared.h" +#include "../../currentaccount.h" +#include "../../kmessdebug.h" +#include "../applications/p2papplication.h" +#include "../chatmessage.h" +#include "../mimemessage.h" +#include "../msnchallengehandler.h" +#include "soapmessage.h" + +#include + +#include + + +#ifdef KMESSDEBUG_OFFLINE_IM +#define KMESSDEBUG_OFFLINE_IM_GENERAL +#endif + + + +/** + * @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" + + + + + +/** + * @brief The receiving mode constructor. + * + * Initializes the client to receive offline messages using the Offline-IM webservice. + * + * @param authT The t value of the passport cookie. + * @param authP The p value of the passport cookie. + * @param parent The Qt parent object, when it's destroyed this class will be cleaned up automatically too. + */ +OfflineImService::OfflineImService( const QString &authT, const QString &authP, + QObject *parent ) +: PassportLoginService( parent ) +, authT_(authT) +, authP_(authP) +, nextSequenceNum_(0) +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "CREATED offline IM receiver service"; +#endif + + setObjectName( "OfflineImService[receiver]" ); + + // Initialize the header once. The tokens are escaped after getting copied (mid(0) returns a copy) + passportCookieHeader_ = + " \n" + " " + KMessShared::htmlEscape( authT.mid( 0 ) ) + "\n" + "

    " + KMessShared::htmlEscape( authP.mid( 0 ) ) + "

    \n" + "
    "; +} + + + +/** + * @brief The sending mode constructor. + * + * Initializes the client to send offline messages using the Offline-IM webservice. + * + * @param parent The Qt parent object, when it's destroyed this class will be cleaned up automatically too. + */ +OfflineImService::OfflineImService( QObject *parent ) + : PassportLoginService( parent ) + , nextSequenceNum_(0) +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "CREATED offline IM sender service"; +#endif + + setObjectName( "OfflineImService[sender]" ); +} + + + +/** + * @brief The destructor. + */ +OfflineImService::~OfflineImService() +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "DESTROYED."; +#endif +} + + + +/** + * @brief SOAP call to delete messages from the remote storage. + * @param messageIds List of messages to delete. + */ +void OfflineImService::deleteMessages( const QStringList &messageIds ) +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "requesting deletion of messages:" << messageIds; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( ! messageIds.isEmpty() ); +#endif + + QString body( " \n" + " \n" + " " + messageIds.join("\n ") + "\n" + " \n" + " " ); + + 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 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 email address. + * @returns The email address of the contact. + */ +QString OfflineImService::extractRFC822Address( const QString &address ) +{ + if( address.endsWith(">") ) + { + int pos = address.lastIndexOf('<'); + if( pos != -1 ) + { + return address.mid( pos + 1, address.length() - pos - 2 ); + } + } + + return address; +} + + + +/** + * @brief SOAP call to download an offline message. + * + * The message ID can be extracted from + * the following messages types received at the notification connection: + * - text/x-msmsgsoimnotification + * - text/x-msmsgsinitialmdatanotification + * + * The messageReceived() signal is fired when the webservice returns the message. + * + * @param messageId The ID of the message. + * @param markAsRead Whether the message should be marked as read. + */ +void OfflineImService::getMessage( const QString &messageId, bool markAsRead ) +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "requesting message with ID:" << messageId; +#endif + + // 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 soapBody( + " \n" + " " + KMessShared::htmlEscape( messageId ) + "\n" + " " + ( markAsRead ? "true" : "false" ) + "\n" + " " ); + + // Send the request. + sendRequest( new SoapMessage( SERVICE_URL_INCOMING_OFFLINE_IM_SERVICE, + "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage", + passportCookieHeader_, + soapBody, + data ) ); +} + + + +/** + * @brief SOAP call to download the value of the Mail-Data field. + * + * The value of the Mail-Data field is normally received by the notification server. + * If there are many offline-IM messages, the value of this field is literally too-large. + * In that case, the message data can be downloaded using this method. + * + * The metaDataReceived() signal is fired when the webservice returns the data. + */ +void OfflineImService::getMetaData() +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "requesting Mail-Data field"; +#endif + + // 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 ) ); +} + + + +/** + * @brief Process the SOAP fault returned when sending an offline message. + */ +void OfflineImService::parseSecureFault( SoapMessage *message ) +{ + // Should never happen + if( ! message->isFaultMessage() ) + { + kWarning() << "Incorrect fault detected on incoming message"; + return; + } + + // 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() ); + + // Get the OIM mime message, and replace its Base64-encoded body with the original message, + // in case we need an usable mime message for error reporting. + MimeMessage originalMessage( XmlFunctions::getNodeValue( getCurrentRequest()->getBody(), "Content" ) ); + originalMessage.setBody( contents ); + + // See which fault we received + if( faultCode == "q0:AuthenticationFailed" ) + { + 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 the LockKey hash (together the Product Key and Product id of MSN). + + // Compute hash with MSN product key/id for the identification + MSNChallengeHandler handler; + + // Compute the lock key using the MSNP11 Challenge algorithm + currentAccount_->setOfflineImKey( handler.computeHash( lockKeyChallenge ) ); + +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "Lock key to compute:" << lockKeyChallenge; + kDebug() << "Computed lock key:" << currentAccount_->getOfflineImKey(); +#endif + // Check if there is a TweenerChallenge, and if not re-send the message with the new lock key + if( tweenerChallenge.isEmpty() ) + { + storeMessage( recipient, contents, sequenceNum ); + return; + } + } + + // See if a tweener challenge was requested. + if( ! tweenerChallenge.isEmpty() ) + { + // Start the login attempt using the base class + login( tweenerChallenge ); + return; + } + + // Any other situation means something is wrong. + kWarning() << "Unknown challenge type received"; + emit sendMessageFailed( recipient, originalMessage ); + } + else if( faultCode == "q0:SystemUnavailable" // contact does not exist OR has blocked you (unlikely) + || faultCode == "q0:InvalidContent" // malformed request? + || faultCode == "q0:DeliveryFailed" // happens with unverified passport accounts + || faultCode == "q0:InvalidParameter" // seen with SOAP syntax error + || faultCode == "q0:SenderThrottleLimitExceeded" ) // TODO: Implement throttle control in HttpSoapConnection + { + // failed, can't send offline IM's + emit sendMessageFailed( recipient, originalMessage ); + + // Also report at the console. + 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: fault code:" << faultCode + << "endpoint:" << message->getEndPoint(); + + // Notify the sender if this error was + // in response of a sent offline im. + if( ! info.isEmpty() ) + { + emit sendMessageFailed( recipient, originalMessage ); + } + } +} + + + +/** + * @brief Internal function to process the response of the webservice. + * + * This handles the following response nodes: + * - GetMessageResponse is handled by processGetMessageResult(). + * - GetMetadataResponse is sent with the metaDataReceived() signal. + * - DeleteMessagesResponse is ignored because it's always empty. + * + * Other unrecognized response types result in a warning message at the console. + * + * @param message The SOAP response message. + */ +void OfflineImService::parseSecureResult( SoapMessage *message ) +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "parsing SOAP response."; +#endif + + QDomElement body ( message->getBody().toElement() ); + QString resultName( body.firstChildElement().localName() ); + + if( resultName == "GetMessageResponse" ) + { + processGetMessageResult( message ); + } + else if( resultName == "GetMetadataResponse" ) + { + emit metaDataReceived( body.namedItem("MD").toElement() ); + } + else if( resultName == "DeleteMessagesResponse" ) + { + // do nothing + } + else if( resultName == "StoreResponse" ) + { +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + 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 + runID_ = QString(); + } + else + { + kWarning() << "Unknown response type" << resultName << "received from endpoint" << message->getEndPoint(); + } +} + + + +/** + * @brief Internal function to process the response of the getMessage() call. + * + * This method parses the XML data, extracts the relevant fields, + * and fires the messageReceived() signal with the results. + * + * @param message The response message, containing a GetMessageResponse node. + */ +void OfflineImService::processGetMessageResult( SoapMessage *message ) +{ +#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL + kDebug() << "Parsing downloaded Offline-IM message."; +#endif + + // Retrieve the data stored in the SOAP message + QString messageId( message->getData().value.toString() ); + + // Parse as MIME message + MimeMessage mimeMessage( message->getBody().toElement().text() ); + + // Extract the fields + 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 ); + to = extractRFC822Address( to ); + + // Convert the date from RFC 2822 format, e.g. "15 Nov 2005 14:24:27 -0800" + // NOTE: QDateTime ignores the timezone (and doesn't know about the RFC2822 format). + // Also, QDateTime only knows about UTC and local time: we'll be able to compare dates with + // precision only if we convert from KDateTime to local time or UTC! + // Of course, KDateTime::dateTime() takes care of this. + QDateTime date( KDateTime::fromString( dateString, KDateTime::RFCDate ).toClockTime().dateTime() ); + + // Also check for invalid dates + if( ! date.isValid() ) + { + date = QDateTime::currentDateTime(); + } + + // Validate content type + QString contentType( mimeMessage.getValue( "Content-Type" ) ); + if( contentType.toLower() != "text/plain; charset=utf-8" ) + { + kWarning() << "Received unexpected content type:" << contentType; + } + + // Validate transfer encoding + QString transferEncoding( mimeMessage.getValue( "Content-Transfer-Encoding" ) ); + if( transferEncoding != "base64" ) + { + kWarning() << "Received unexpected transfer encoding:" << transferEncoding; + } + + // Validate message type + QString messageType( mimeMessage.getValue( "X-OIM-Message-Type" ) ); + if( messageType != "OfflineMessage" ) + { + kWarning() << "Received unexpected message type:" << messageType; + } + + // Process the body + QByteArray decodedBody( QByteArray::fromBase64( mimeMessage.getBody().toUtf8() ) ); + QString body ( QString::fromUtf8( decodedBody.data(), decodedBody.length() ) ); + + // Return to caller + emit messageReceived( messageId, from, to, date, body, runId, sequenceNum ); +} + + + +/** + * @brief Send an offline message. + * + * Sends an Offline Message. With the message the lockKey is empty, so the server will respond with a SOAP fault. + * At parseSoapFault(), this error will be detected and the message is sent again with the proper lock key. + * + * @param to Handle of the message sender. + * @param message Message body. + */ +void OfflineImService::sendMessage( const QString &to, const QString &message ) +{ + // Increment sequence counter. + ++nextSequenceNum_; + + // Call internal version with sequence number + storeMessage( to, message, nextSequenceNum_ ); +} + + + +/** + * @brief Internal method to store a message in the offline-im storage. + * + * 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. + * @param message Message body. + * @param sequenceNum The sequence number. + */ +void OfflineImService::storeMessage( const QString &to, const QString &message, int sequenceNum ) +{ + MSNChallengeHandler handler; + + const QByteArray &windowsNewLine( "\r\n" ); + const QString &from ( currentAccount_->getHandle() ); + + // Limit the friendly name to 48 chars to avoid the server doesn't accept the oim + // The loop is necessary to avoid the cutting of one multi-byte character + const QString &originalFriendlyName( currentAccount_->getFriendlyName( STRING_CLEANED ) ); + QByteArray friendlyName; + int size = 48; + + do + { + friendlyName = originalFriendlyName.left( size ).toUtf8(); + --size; + } + while( friendlyName.size() > 48 ); + + const QString &offlineImKey( currentAccount_->getOfflineImKey() ); + + // 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() ) + { + runID_ = KMessShared::generateGUID(); + } + + // Get a copy of the message with Windows linefeeds + QString messageCopy( message ); + messageCopy.replace( QRegExp("\r?\n"), windowsNewLine ); + // Encode it to Base64 + QByteArray contentBody( messageCopy.toUtf8() ); + contentBody = contentBody.toBase64(); + + // Insert newlines each 77 base64 chars. + // NOTE: I know, this sounds pretty much unreasonable. But if we don't do it, the server + // will answer with an HTTP/500 response and the SOAP fault code "q0:InvalidContent". + // Is there a reason for this requirement? + int contentBodySize = contentBody.size(); + if( contentBodySize > 77 ) + { + for( int i = 76; i < contentBodySize; i += 77 ) + { + contentBody.insert( i, windowsNewLine ); + } + } + + // Build the request + QString header( "\n" + "\n" + "" // This attribute is filled by the base class + "\n" + " http://messenger.msn.com\n" + " " + QString::number( sequenceNum ) + "\n" + "" ); + + QString body( "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" + + contentBody + "\r\n" + "" ); + + // 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" ); +} + + + +#include "offlineimservice.moc" diff --git a/kmess/network/soap/offlineimservice.h b/src/network/soap/offlineimservice.h similarity index 77% rename from kmess/network/soap/offlineimservice.h rename to src/network/soap/offlineimservice.h index b44c4c8..17509c3 100644 --- a/kmess/network/soap/offlineimservice.h +++ b/src/network/soap/offlineimservice.h @@ -18,11 +18,16 @@ #ifndef OFFLINEIMSERVICE_H #define OFFLINEIMSERVICE_H -#include "httpsoapconnection.h" +#include "passportloginservice.h" + +#include + class ChatMessage; class QDateTime; + + /** * @brief SOAP calls to the Offline-IM webservice. * @@ -42,13 +47,15 @@ class QDateTime; * @author Diederik van der Boor * @ingroup NetworkSoap */ -class OfflineImService : public HttpSoapConnection +class OfflineImService : public PassportLoginService { Q_OBJECT public: // public methods - // The constructor + // The receiving mode constructor OfflineImService( const QString &authT, const QString &authP, QObject *parent = 0 ); + // The sending mode constructor + OfflineImService( QObject *parent ); // The destructor virtual ~OfflineImService(); @@ -58,22 +65,35 @@ class OfflineImService : public HttpSoapConnection void getMessage( const QString &messageId, bool markAsRead = false ); // Request the Mail-Data field over SOAP. void getMetaData(); + // Send an offline message + void sendMessage( const QString &to, const QString &message ); private: - // 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 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: /// The t value of the passport cookie. QString authT_; /// The p value of the passport cookie. QString authP_; + // Offline message sequence number + int nextSequenceNum_; /// The passport header to send with SOAP QString passportCookieHeader_; + // The passport service for require the new ticket + PassportLoginService *passportService_; + // GuID for the OIM session + QString runID_; + signals: /** @@ -104,6 +124,8 @@ class OfflineImService : public HttpSoapConnection void messageReceived( const QString &messageId, const QString &from, const QString &to, const QDateTime &date, const QString &body, const QString &runId, int sequenceNum ); + + void sendMessageFailed( const QString &to, const MimeMessage &message ); }; #endif diff --git a/src/network/soap/passportloginservice.cpp b/src/network/soap/passportloginservice.cpp new file mode 100644 index 0000000..93d2fc8 --- /dev/null +++ b/src/network/soap/passportloginservice.cpp @@ -0,0 +1,901 @@ +/*************************************************************************** + passportloginservice.cpp - description + ------------------- + begin : Sun Apr 22 2007 + copyright : (C) 2007 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 "passportloginservice.h" + +#include "../../utils/kmessshared.h" +#include "../../utils/xmlfunctions.h" +#include "../../currentaccount.h" +#include "../mimemessage.h" +#include "soapmessage.h" + +#include + +#include +#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( parent ) +, currentAccount_( CurrentAccount::instance() ) +, isWaitingForNewTokens_( false ) +{ + // RST stands for "Request Security Token" + // This class is called "PassportLoginService" since "RequestSecurityTokenService" is too hard to understand. + + setObjectName( "PassportLoginService" ); +} + + + +/** + * @brief The destructor + */ +PassportLoginService::~PassportLoginService() +{ + qDeleteAll( queuedRequests_.keys() ); +} + + + +/** + * @brief Start the login process + * + * The loginSucceeded() signal is fired when the webservice accepted the login data. + * The loginIncorrect() signal is fired when the login data is incorrect. + * + * @param parameters The login parameters found in the USR command of notification server. + */ +void PassportLoginService::login( const QString ¶meters ) +{ +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Logging in..."; +#endif + + // Store the account and login data + authenticationParameters_ = parameters; + handle_ = currentAccount_->getHandle(); + + // Get the right password + if( password_.isEmpty() ) + { + // Try to login with the new password, if there is one + if( ! currentAccount_->getTemporaryPassword().isEmpty() ) + { + password_ = currentAccount_->getTemporaryPassword(); + } + else + { + // Use the current password otherwise + password_ = currentAccount_->getPassword(); + } + } + +#ifdef KMESSTEST + KMESS_ASSERT( ! handle_ .isEmpty() ); + KMESS_ASSERT( ! password_.isEmpty() ); +#endif + + // Send the login request + requestMultipleSecurityTokens(); +} + + + +// Compute the string for live hotmail access +const QString PassportLoginService::createHotmailToken( const QString &passportToken, + const QString &proofToken, + const QString &folder ) +{ + // Create the nonce + QByteArray nonce; + for( int i = 0; i < 24; i++ ) + { + nonce += (char)( ( rand() % 74 ) + 48 ); + } + + // 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 + const QByteArray& key1( QByteArray::fromBase64( proofToken.toLatin1() ) ); + + const QByteArray& magic( "WS-SecureConversation" + nonce ); + + const QByteArray& key2( KMessShared::deriveKey( key1, magic ) ); + + const QByteArray& hash( KMessShared::createHMACSha1( key2, token.toLatin1() ) ); + + token += "&hash=" + QUrl::toPercentEncoding( hash.toBase64() ); + + return token; +} + + + +/** + * @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 soapError(). + * + * It also traps SOAP fauls which are used to redirect the client. + * So far this has been observed with \@msn.com passport accounts. + * + * The SOAP fault for an incorrect login looks like: + * @code + + + + + 1 + 0x80048800 + 0x80048821 + BAYPPLOGN2B32 2006.10.31.02.02.43 + + + + + + wsse:FailedAuthentication + Authentication Failure + + + * @endcode + * + * The SOAP fault for a redirect looks like: + * @code + + + + + 1 + 0x80048800 + 0x80048852 + BAYPPLOGN2A01 2007.04.23.14.59.31 + + + + + + psf:Redirect + https://msnia.login.live.com/pp450/RST.srf + Authentication Failure + + +@endcode + * + * Note the Fault object is not in + * a Body but Envelope element. + * + * @param message The SOAP response message. + */ +void PassportLoginService::parseSoapFault( SoapMessage *message ) +{ + // 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" ) + { +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Authentication failed!"; +#endif + + emit loginIncorrect(); + } + // The tickets have expired, require new ones + else if( faultCode == "q0:BadContextToken" ) + { + login(); + + // Resend the failed message + SoapMessage *message = getCurrentRequest( true /* copy */ ); + sendSecureRequest( message, inProgressRequests_.value( getCurrentRequest() ) ); + } + else + { + // Relay parsing to subclasses + parseSecureFault( message ); + } + + // Remove the request from the list + inProgressRequests_.remove( getCurrentRequest() ); +} + + + +/** + * @brief Internal function to extract security tokens from the server response. + * + * This handles the wst:RequestSecurityTokenResponseCollection response node. + * + * The result messsage looks like: + * @code + + + + + 1 + 0006000087144D8E + 3.100.2199.0 + 3.0.869.0 + 0x48803 + 0x0 + BAYPPLOGN2B29 2007.04.23.14.59.31 + + + MH=; path=/; domain=.msn.com; expires=Wed, 30-Dec-2037 16:00:00 GMT + MHW=; path=/; domain=.msn.com; expires=Thu, 30-Oct-1980 16:00:00 GMT + MH=; path=/; domain=.live.com; expires=Wed, 30-Dec-2037 16:00:00 GMT + MHW=; path=/; domain=.live.com; expires=Thu, 30-Oct-1980 16:00:00 GMT + + + + + true + e95c54c3221ebb92 + + + + + + + + + urn:passport:legacy + + + http://Passport.NET/tb + + + + 2007-04-29T11:30:36Z + 2007-04-30T11:30:36Z + + + + + + http://Passport.NET/STS + + + ...the token for live authentication... + + + + + + + + + ...other token for live authentication... + + + + urn:passport:legacy + + + messenger.msn.com + + + + 2007-04-29T11:30:36Z + 2007-04-29T11:38:56Z + + + ...the token for the USR command... + + + + + + + + + +@endcode + * + * @param message The SOAP response message. + */ +void PassportLoginService::parseSoapResult( SoapMessage *message ) +{ + 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() << "Current date:" << QDateTime::currentDateTime(); + kDebug() << "Obtaining security tokens.."; +#endif + + const QDomNodeList& authTokens( body.childNodes() ); + if( authTokens.count() == 0 ) + { + // Likely a login error. + emit loginIncorrect(); + return; + } + + const QDateTime &now = QDateTime::currentDateTime(); +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Current date and time:" << now; +#endif + + // 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 ) ); + + const QString &referenceEndPoint( XmlFunctions::getNodeValue( tokenResponse, "AppliesTo/EndpointReference/Address" ) ); + + // Extract the token's expiration date + const QString creationString ( XmlFunctions::getNodeValue( tokenResponse, "LifeTime/Created" ) ); + const QString expirationString( XmlFunctions::getNodeValue( tokenResponse, "LifeTime/Expires" ) ); + + const QDateTime &creationDate = QDateTime::fromString( creationString, Qt::ISODate ); + const QDateTime &expirationDate = QDateTime::fromString( expirationString, Qt::ISODate ); + + int ticketDuration; + + /** + * Compute the duration in seconds of the token, and apply it to the current local time. + * This allows us to avoid meddling with timezones. Which sucks, specially in the cases where: + * 1) The system is not set to the correct timezone; + * 2) KDE lacks timezone packages; + * 3) Bugs in KDE (maybe..); + * Also consider that QDateTime discards the timezone in ISO dates, and you will have an idea + * why we're doing this. + * + * Also this process doesn't take into account any time passed from the ticket generation to the + * computation: if a ticket which expires in 100 seconds is generated at 16:30:20 but we receive + * it at 16:30:24, our computed duration will 100 seconds, but it should be 96 seconds. + * However we take this possible delay into account elsewhere: when we need to use a token, we + * check the token validity with 10 seconds margin (ie if we need a token which expires in 9s, + * it's expired already for us. + */ + if( ! creationDate.isValid() || ! expirationDate.isValid() ) + { +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Invalid token creation/expiration dates. Defaulting to 8 hours duration for token on next line:"; +#endif + ticketDuration = 3600 * 8; + } + else + { + ticketDuration = creationDate.secsTo( expirationDate ); + } + + const QDateTime &localExpirationDate = now.addSecs( ticketDuration ); + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "--"; + kDebug() << "Found token for endpoint:" << referenceEndPoint << "with a duration of" << ticketDuration << "seconds."; + kDebug() << "Created:" << creationString + << "Expires:" << expirationString; + kDebug() << "Expires at local time:" << localExpirationDate; +#endif + + if( referenceEndPoint == "http://Passport.NET/tb" ) + { + tokens.insert( "Passport", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/EncryptedData/CipherData/CipherValue" ) ); + tokens.insert( "PassportProof", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedProofToken/BinarySecret" ) ); + tokenExpirationDates_.insert( "Passport", localExpirationDate ); + } + else if( referenceEndPoint == "messengerclear.live.com" ) + { + tokens.insert( "MessengerClear", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokens.insert( "MessengerClearProof", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedProofToken/BinarySecret" ) ); + tokenExpirationDates_.insert( "MessengerClear", localExpirationDate ); + } + else if( referenceEndPoint == "messenger.msn.com" ) + { + tokens.insert( "Messenger", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "Messenger", localExpirationDate ); + } + else if( referenceEndPoint == "contacts.msn.com" ) + { + tokens.insert( "Contacts", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "Contacts", localExpirationDate ); + } + else if( referenceEndPoint == "messengersecure.live.com" ) + { + tokens.insert( "MessengerSecure", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "MessengerSecure", localExpirationDate ); + } + else if( referenceEndPoint == "storage.msn.com" ) + { + tokens.insert( "Storage", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "Storage", localExpirationDate ); + } + } + +#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() ) + { + it.next(); + sendSecureRequest( it.key(), it.value() ); + } +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Sent" << queuedRequests_.count() << "queued messages."; +#endif + + + emit loginSucceeded(); +} + + + +/** + * @brief SOAP call to request the login tokens. + * + * This method is called by login(). + * It sends a huge binary blob which looks like this: + * @code + + + + + {7108E71A-9926-4FCB-BCC9-9A9D3F32E423} + 4 + 1 + + AQAAAAIAAABsYwQAAAAzMDg0 + + + + ...the login() username... + ...the login() password... + + + + + + + http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue + + + http://Passport.NET/tb + + + + + http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue + + + messenger.msn.com + + + + + + + +@endcode + */ +void PassportLoginService::requestMultipleSecurityTokens() +{ +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Requesting security tokens"; +#endif + + 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" + " " + KMessShared::htmlEscape( handle_ ) + "\n" + " " + KMessShared::htmlEscape( password_ ) + "\n" + " \n" + "" ); + + QString body( "\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" + + // 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() << "Current time:" << QDateTime::currentDateTime(); + 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 + login(); + 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 new file mode 100644 index 0000000..c1bacad --- /dev/null +++ b/src/network/soap/passportloginservice.h @@ -0,0 +1,140 @@ +/*************************************************************************** + passportloginservice.h - description + ------------------- + begin : Sun Apr 22 2007 + copyright : (C) 2007 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 SSLLOGINHANDLER_H +#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 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, + * this class has to send an large XML blob instead. + * The webservice is actually called "RST", which likely stands + * for "Request Security Token" considering the XML contents. + * + * For additional documentation about Passport 3.0, see + * http://msnpiki.msnfanatic.com/index.php/MSNP13:SOAPTweener + * + * @author Diederik van der Boor + * @author Valerio Pilo + * @ingroup NetworkSoap + */ +class PassportLoginService : public HttpSoapConnection +{ + Q_OBJECT + + public: + // The constructor + PassportLoginService( QObject *parent = 0 ); + // The destructor + virtual ~PassportLoginService(); + // Start the login process + void login( const QString ¶meters = QString() ); + // Compute the string for live hotmail access + 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( SoapMessage *message ); + // Process server responses + void parseSoapResult( SoapMessage *message ); + // Send the authentication request + void requestMultipleSecurityTokens(); + + 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_; + /// 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 + /** + * @brief Fired when the login failed because a wrong username/password was used. + */ + void loginIncorrect(); + + /** + * @brief Fired when the login succeeded. (version for MSN Protocol 15) + */ + 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 new file mode 100644 index 0000000..47261f1 --- /dev/null +++ b/src/network/soap/soapmessage.cpp @@ -0,0 +1,279 @@ +/*************************************************************************** + soapmessage.cpp - description + ------------------- + begin : Sun Jul 24 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 "soapmessage.h" + +#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 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 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_ ) +{ +} + + + +// The destructor +SoapMessage::~SoapMessage() +{ +} + + + +// Return the message action +const QString& SoapMessage::getAction() const +{ + return action_; +} + + + +// Return the associated request data +const MessageData& SoapMessage::getData() const +{ + return data_; +} + + + +// Return the URL of the SOAP endpoint to which the message will be sent +const QString& SoapMessage::getEndPoint() const +{ + return endPoint_; +} + + + +// Return the message fault's xml tree +const QDomNode& SoapMessage::getFault() const +{ + return fault_; +} + + + +// Return the error code +const QString& SoapMessage::getFaultCode() const +{ + return faultCode_; +} + + + +// Return the error description +const QString &SoapMessage::getFaultDescription() const +{ + return faultDescription_; +} + + + +// Return the entire message as a byte array +QByteArray SoapMessage::getMessage() const +{ + // Just do nothing if there's no data + if( ! isValid_ ) + { + return QByteArray(); + } + + QByteArray contents; + QTextStream stream( &contents, QIODevice::Append ); + + // Write the header + if( ! header_.isNull() ) + { + stream << header_ << "\n"; +// stream << "\n" << header_ << "\n"; + } + + // Write the body + if( ! body_.isNull() ) + { + stream << body_ << "\n"; +// stream << "\n" << body_ << "\n"; + } + + // Other blocks are not included, since this method is used for common use, not corner cases + + // Return the complete data message + return "\n" + "\n" + + contents + + "\n"; +} + + + +// Return the message body's xml tree +const QDomNode& SoapMessage::getBody() const +{ + return body_; +} + + + +// Return the message header's xml tree +QDomNode& SoapMessage::getHeader() +{ + return header_; +} + + + +// Return whether this was an error response. Note that you should only use this method on valid messages. +bool SoapMessage::isFaultMessage() const +{ + return ( ! faultCode_.isEmpty() ); +} + + + +// Return whether this message contains valid useable data +bool SoapMessage::isValid() const +{ + return isValid_; +} + + + +// Change the associated request data +void SoapMessage::setData( const MessageData &data ) +{ + data_ = data; +} + + + +// Parse the incoming message +void SoapMessage::setMessage( const QString &message ) +{ + QDomDocument xml; + + // Reset the error indicator + faultCode_ = QString(); + + // Parse the XML + // see http://doc.trolltech.com/4.3/qdomdocument.html#setContent + isValid_ = xml.setContent( message, true, &faultDescription_ ); // true for namespace processing. + + // Create an error message if the message can't be parsed + if( ! isValid_ ) + { + faultCode_ = "parsingFailed"; + body_ = QDomNode(); + fault_ = QDomNode(); + header_ = QDomNode(); + + kWarning() << "XML parsing failed (code" << faultCode_ << "):" << faultDescription_ << "."; + return; + } + + // Get the message's child nodes + header_ = XmlFunctions::getNode( xml, "/Envelope/Header" ); + body_ = XmlFunctions::getNode( xml, "/Envelope/Body" ); + + // Verify if any faults are present in the message + QDomNode rootFault = XmlFunctions::getNode( xml, "/Envelope/Fault" ); + QDomNode bodyFault; + // Only check body_ if it's not null, or the assert in getNode will fail + if( ! body_.isNull() ) + { + bodyFault = XmlFunctions::getNode( body_, "/Fault" ); + } + + if( ! rootFault.isNull() ) + { + 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; + } +} + + + diff --git a/src/network/soap/soapmessage.h b/src/network/soap/soapmessage.h new file mode 100644 index 0000000..619b8a5 --- /dev/null +++ b/src/network/soap/soapmessage.h @@ -0,0 +1,121 @@ +/*************************************************************************** + soapmessage.h - description + ------------------- + begin : Sun Sep 25 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. * + * * + ***************************************************************************/ + +#ifndef SOAPMESSAGE_H +#define SOAPMESSAGE_H + +#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; +}; + + + +/** + * @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 + 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(); + + // Return the action type + const QString& getAction() 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 + const QString& getFaultCode() const; + // Return the error description + const QString& getFaultDescription() const; + // Return the message header's xml tree + QDomNode& getHeader(); + // Return the entire message as string + 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 properties + // The message type + QString action_; + // 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/kmess/network/upnp/igdcontrolpoint.cpp b/src/network/upnp/igdcontrolpoint.cpp similarity index 77% rename from kmess/network/upnp/igdcontrolpoint.cpp rename to src/network/upnp/igdcontrolpoint.cpp index 880906e..4327063 100644 --- a/kmess/network/upnp/igdcontrolpoint.cpp +++ b/src/network/upnp/igdcontrolpoint.cpp @@ -17,18 +17,18 @@ #include "igdcontrolpoint.h" +#include "../../kmessdebug.h" #include "rootservice.h" #include "layer3forwardingservice.h" #include "wanconnectionservice.h" -#include -#include "../../kmessdebug.h" #ifdef KMESSDEBUG_UPNP #define KMESSDEBUG_UPNP_GENERAL #endif + namespace UPnP { @@ -37,7 +37,7 @@ namespace UPnP // The constructor -IgdControlPoint::IgdControlPoint(const QString &hostname, int port, const QString &rootUrl) +IgdControlPoint::IgdControlPoint(const QString &hostname, quint16 port, const QString &rootUrl) : QObject() , forwardingService_(0) , gatewayAvailable_(false) @@ -46,9 +46,8 @@ IgdControlPoint::IgdControlPoint(const QString &hostname, int port, const QStrin , wanConnectionService_(0) { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "CREATED UPnP::IgdControlPoint: Created control point" - << " url='" << hostname << ":" << port << "/" << rootUrl << "'." << endl; - kdDebug() << "UPnP::IgdControlPoint: querying services..." << endl; + kDebug() << "Created control point url='" << hostname << ":" << port << "/" << rootUrl << "'." << endl; + kDebug() << "querying services..."; #endif // Store device url @@ -70,7 +69,7 @@ IgdControlPoint::~IgdControlPoint() delete wanConnectionService_; #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "DESTROYED UPnP::IgdControlPoint [host=" << igdHostname_ << ", port=" << igdPort_ << "]" << endl; + kDebug() << "DESTROYED. [host=" << igdHostname_ << ", port=" << igdPort_ << "]"; #endif } @@ -96,8 +95,8 @@ QString IgdControlPoint::getExternalIpAddress() const void IgdControlPoint::initialize() { #ifdef KMESSTEST - ASSERT( rootService_ != 0 ); - ASSERT( rootService_->getDeviceType().isNull() ); + KMESS_ASSERT( rootService_ != 0 ); + KMESS_ASSERT( rootService_->getDeviceType().isNull() ); #endif rootService_->queryDevice(); @@ -117,14 +116,14 @@ bool IgdControlPoint::isGatewayAvailable() void IgdControlPoint::slotDeviceQueried(bool error) { #ifdef KMESSTEST - ASSERT( rootService_ != 0 ); - ASSERT( forwardingService_ == 0 ); + KMESS_ASSERT( rootService_ != 0 ); + KMESS_ASSERT( forwardingService_ == 0 ); #endif if(! error) { #ifdef KMESSTEST - ASSERT( rootService_->getDeviceType() == InternetGatewayDeviceType ); + KMESS_ASSERT( rootService_->getDeviceType() == InternetGatewayDeviceType ); #endif // Get the Layer3ForwardingService from the retrieved service list @@ -133,7 +132,7 @@ void IgdControlPoint::slotDeviceQueried(bool error) if(! params.controlUrl.isNull()) { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::IgdControlPoint: Services found, " + kDebug() << "Services found, " << "querying service '" << params.serviceId << "' for port mapping service..." << endl; #endif @@ -155,22 +154,22 @@ void IgdControlPoint::slotDeviceQueried(bool error) void IgdControlPoint::slotWanConnectionFound(bool error) { #ifdef KMESSTEST - ASSERT( rootService_ != 0 ); - ASSERT( forwardingService_ != 0 ); - ASSERT( wanConnectionService_ == 0 ); + KMESS_ASSERT( rootService_ != 0 ); + KMESS_ASSERT( forwardingService_ != 0 ); + KMESS_ASSERT( wanConnectionService_ == 0 ); #endif 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()) { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::IgdControlPoint: wan/ipconnection service found, " + kDebug() << "wan/ipconnection service found, " << "querying service '" << params.serviceId << "' for external ip address..." << endl; #endif @@ -192,21 +191,21 @@ void IgdControlPoint::slotWanConnectionFound(bool error) void IgdControlPoint::slotWanQueryFinished(bool error) { #ifdef KMESSTEST - ASSERT( rootService_ != 0 ); - ASSERT( wanConnectionService_ != 0 ); + KMESS_ASSERT( rootService_ != 0 ); + KMESS_ASSERT( wanConnectionService_ != 0 ); #endif if(! error) { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "IgdControlPoint: UPnP Gateway Device found." << endl; + kDebug() << "UPnP Gateway Device found."; #endif gatewayAvailable_ = true; } else { // Just started, the request for the external IP failed. This should succeed, abort portation - kdWarning() << "Requesting external IP address failed, leaving UPnP Gateway Device untouched." << endl; + kWarning() << "Requesting external IP address failed, leaving UPnP Gateway Device untouched."; } } diff --git a/kmess/network/upnp/igdcontrolpoint.h b/src/network/upnp/igdcontrolpoint.h similarity index 94% rename from kmess/network/upnp/igdcontrolpoint.h rename to src/network/upnp/igdcontrolpoint.h index 73dcd15..89e1211 100644 --- a/kmess/network/upnp/igdcontrolpoint.h +++ b/src/network/upnp/igdcontrolpoint.h @@ -18,7 +18,9 @@ #ifndef UPNP_IGDCONTROLPOINT_H #define UPNP_IGDCONTROLPOINT_H -#include +#include + + namespace UPnP { @@ -45,7 +47,7 @@ class IgdControlPoint : public QObject public: // public methods // The constructor - IgdControlPoint(const QString &hostname, int port, const QString &rootUrl); + IgdControlPoint( const QString &hostname, quint16 port, const QString &rootUrl ); // The destructor virtual ~IgdControlPoint(); @@ -72,7 +74,7 @@ class IgdControlPoint : public QObject // The host of the gateway QString igdHostname_; // The port of the gateway - int igdPort_; + quint16 igdPort_; // The root service RootService *rootService_; // The wan connection service diff --git a/kmess/network/upnp/layer3forwardingservice.cpp b/src/network/upnp/layer3forwardingservice.cpp similarity index 76% rename from kmess/network/upnp/layer3forwardingservice.cpp rename to src/network/upnp/layer3forwardingservice.cpp index 764da55..92fc836 100644 --- a/kmess/network/upnp/layer3forwardingservice.cpp +++ b/src/network/upnp/layer3forwardingservice.cpp @@ -19,14 +19,15 @@ #include "../../kmessdebug.h" -#include -#include +#include + #ifdef KMESSDEBUG_UPNP -#define KMESSDEBUG_UPNP_GENERAL + #define KMESSDEBUG_UPNP_GENERAL #endif + namespace UPnP { @@ -66,8 +67,7 @@ QString Layer3ForwardingService::getConnectionServiceId() const void Layer3ForwardingService::gotActionResponse(const QString &responseType, const QMap &resultValues) { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Layer3ForwardingService: Got action response" - << " type='" << responseType << "'." << endl; + kDebug() << "Got action response type='" << responseType << "'." << endl; #endif // Example: @@ -83,15 +83,15 @@ void Layer3ForwardingService::gotActionResponse(const QString &responseType, con if(responseType == "GetDefaultConnectionServiceResponse" ) { - QString newService = resultValues["NewDefaultConnectionService"]; - QStringList serviceItems = QStringList::split(',', newService); + QString newService ( resultValues["NewDefaultConnectionService"] ); + QStringList serviceItems = newService.split( ',', QString::SkipEmptyParts ); QString uuid; QString urn; // Extract the uuid and urn from the NewDefaultConnectionService value - for(uint i = 0; i < serviceItems.count(); i++) + 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::: @@ -103,21 +103,18 @@ void Layer3ForwardingService::gotActionResponse(const QString &responseType, con } else { - kdWarning() << "UPnP::Layer3ForwardingService - Unexpected section" - << " '" << type << "' encountered in NewDefaultConnectionService value." << endl; + kWarning() << "Unexpected section '" << type << "' encountered in NewDefaultConnectionService value." << endl; } } #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Layer3ForwardingService:" - << " udn='" << connectionDeviceUdn_ << "'" - << " serviceid='" << connectionServiceId_ << "'." << endl; + kDebug() << " udn='" << connectionDeviceUdn_ << "'" + << " serviceid='" << connectionServiceId_ << "'." << endl; #endif } else { - kdWarning() << "UPnP::Layer3ForwardingService - Unexpected response type" - << " '" << responseType << "' encountered." << endl; + kWarning() << "Unexpected response type '" << responseType << "' encountered." << endl; } } diff --git a/kmess/network/upnp/layer3forwardingservice.h b/src/network/upnp/layer3forwardingservice.h similarity index 99% rename from kmess/network/upnp/layer3forwardingservice.h rename to src/network/upnp/layer3forwardingservice.h index fa36d4c..f8e5de8 100644 --- a/kmess/network/upnp/layer3forwardingservice.h +++ b/src/network/upnp/layer3forwardingservice.h @@ -20,6 +20,8 @@ #include "service.h" + + namespace UPnP { /** diff --git a/kmess/network/upnp/manager.cpp b/src/network/upnp/manager.cpp similarity index 86% rename from kmess/network/upnp/manager.cpp rename to src/network/upnp/manager.cpp index c039050..9a7037b 100644 --- a/kmess/network/upnp/manager.cpp +++ b/src/network/upnp/manager.cpp @@ -17,19 +17,19 @@ #include "manager.h" +#include "../../kmessdebug.h" #include "igdcontrolpoint.h" #include "ssdpconnection.h" -#include +#include -#include -#include "../../kmessdebug.h" #ifdef KMESSDEBUG_UPNP -#define KMESSDEBUG_UPNP_GENERAL + #define KMESSDEBUG_UPNP_GENERAL #endif + namespace UPnP { @@ -63,10 +63,10 @@ Manager::~Manager() void Manager::initialize() { #ifdef KMESSTEST - ASSERT( ssdpConnection_ == 0 ); + KMESS_ASSERT( ssdpConnection_ == 0 ); #endif #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Manager: Initiating a broadcast to detect UPnP devices..." << endl; + kDebug() << "Initiating a broadcast to detect UPnP devices..."; #endif @@ -82,7 +82,8 @@ void Manager::initialize() // Start a UPnP broadcast broadcastFailed_ = false; ssdpConnection_->queryDevices(); - ssdpTimer_->start(2000, true); + ssdpTimer_->setSingleShot( true ); + ssdpTimer_->start( 2000 ); } @@ -124,10 +125,10 @@ bool Manager::isGatewayAvailable() void Manager::slotBroadcastTimeout() { #ifdef KMESSTEST - ASSERT( ! broadcastFailed_ ); + KMESS_ASSERT( ! broadcastFailed_ ); #endif #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Manager: Timeout, no broadcast response received!" << endl; + kDebug() << "Timeout, no broadcast response received!"; #endif broadcastFailed_ = true; @@ -136,10 +137,10 @@ void Manager::slotBroadcastTimeout() // A device was discovered by the SSDP broadcast -void Manager::slotDeviceFound(const QString &hostname, int port, const QString &rootUrl) +void Manager::slotDeviceFound(const QString &hostname, quint16 port, const QString &rootUrl) { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Manager: Device found, initializing IgdControlPoint to query it." << endl; + kDebug() << "Device found, initializing IgdControlPoint to query it."; #endif IgdControlPoint *controlPoint = new IgdControlPoint(hostname, port, rootUrl); diff --git a/kmess/network/upnp/manager.h b/src/network/upnp/manager.h similarity index 94% rename from kmess/network/upnp/manager.h rename to src/network/upnp/manager.h index e1bfd7d..dcde3ef 100644 --- a/kmess/network/upnp/manager.h +++ b/src/network/upnp/manager.h @@ -18,11 +18,14 @@ #ifndef UPNPMANAGER_H #define UPNPMANAGER_H -#include -#include +#include +#include + class QTimer; + + namespace UPnP { @@ -61,7 +64,7 @@ class Manager : public QObject // The broadcast failed void slotBroadcastTimeout(); // A device was discovered by the SSDP broadcast - void slotDeviceFound(const QString &hostname, int port, const QString &rootUrl); + void slotDeviceFound( const QString &hostname, quint16 port, const QString &rootUrl ); private: // private methods @@ -82,7 +85,7 @@ class Manager : public QObject // The instance of the singleton class static Manager *instance_; // A list of all detected gateway devices - QPtrList igdControlPoints_; + QList igdControlPoints_; // The SSDP connection to find all UPnP devices SsdpConnection *ssdpConnection_; // The timer to detect a broadcast timeout diff --git a/kmess/network/upnp/rootservice.cpp b/src/network/upnp/rootservice.cpp similarity index 93% rename from kmess/network/upnp/rootservice.cpp rename to src/network/upnp/rootservice.cpp index ac4cf2b..f0d04f8 100644 --- a/kmess/network/upnp/rootservice.cpp +++ b/src/network/upnp/rootservice.cpp @@ -17,14 +17,16 @@ #include "rootservice.h" -#include "../extra/xmlfunctions.h" +#include "../../utils/xmlfunctions.h" #include "../../kmessdebug.h" + #ifdef KMESSDEBUG_UPNP #define KMESSDEBUG_UPNP_GENERAL #endif + namespace UPnP { @@ -124,7 +126,7 @@ namespace UPnP // The contructor -RootService::RootService(const QString &hostname, int port, +RootService::RootService(const QString &hostname, quint16 port, const QString &rootUrl) : Service(hostname, port, rootUrl) , hostname_(hostname) @@ -145,12 +147,12 @@ RootService::~RootService() void RootService::addDeviceServices(const QDomNode &device) { #ifdef KMESSTEST - ASSERT( ! device.isNull() ); - ASSERT( device.nodeName() == "device" ); + KMESS_ASSERT( ! device.isNull() ); + KMESS_ASSERT( device.nodeName() == "device" ); #endif #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP Discovered device " << XmlFunctions::getNodeValue(device, "/UDN") << endl; + kDebug() << "UPnP Discovered device " << XmlFunctions::getNodeValue(device, "/UDN"); #endif // Insert the given device node @@ -160,7 +162,7 @@ void RootService::addDeviceServices(const QDomNode &device) // Find all embedded device nodes QDomNodeList embeddedDevices = device.namedItem("deviceList").childNodes(); - for(uint i = 0; i < embeddedDevices.count(); i++) + for( int i = 0; i < embeddedDevices.count(); i++ ) { if(embeddedDevices.item(i).nodeName() != "device") continue; addDeviceServices(embeddedDevices.item(i)); @@ -206,8 +208,7 @@ ServiceParameters RootService::getServiceById(const QString &serviceId, const QS #ifdef KMESSTEST else { - kdWarning() << "UPnP::RootService::getServiceById -" - << " id '" << serviceId << "' not found for device '" << deviceUdn << "'." << endl; + kWarning() << "id '" << serviceId << "' not found for device '" << deviceUdn << "'." << endl; } #endif @@ -245,8 +246,7 @@ ServiceParameters RootService::getServiceByType(const QString &serviceType, cons #ifdef KMESSTEST else { - kdWarning() << "UPnP::RootService::getServiceByType -" - << " type '" << serviceType << "' not found for device '" << deviceUdn << "'." << endl; + kWarning() << "type '" << serviceType << "' not found for device '" << deviceUdn << "'." << endl; } #endif @@ -260,7 +260,7 @@ void RootService::gotInformationResponse(const QDomNode &response) { #ifdef KMESSTEST // Get "/root/device/deviceType/text()" - ASSERT( response.nodeName() == "root" ); + KMESS_ASSERT( response.nodeName() == "root" ); #endif // Register all device UDN nodes for later diff --git a/kmess/network/upnp/rootservice.h b/src/network/upnp/rootservice.h similarity index 95% rename from kmess/network/upnp/rootservice.h rename to src/network/upnp/rootservice.h index d18fd05..7f88f35 100644 --- a/kmess/network/upnp/rootservice.h +++ b/src/network/upnp/rootservice.h @@ -21,6 +21,7 @@ #include "service.h" + namespace UPnP { @@ -37,7 +38,7 @@ class RootService : public Service public: // public methods // The constructor - RootService(const QString &hostname, int port, const QString &rootUrl); + RootService( const QString &hostname, quint16 port, const QString &rootUrl ); // The destructor virtual ~RootService(); @@ -75,7 +76,7 @@ class RootService : public Service // The hostname of the device QString hostname_; // The port of the device - int port_; + quint16 port_; // The udn of the root device QString rootUdn_; }; diff --git a/kmess/network/upnp/service.cpp b/src/network/upnp/service.cpp similarity index 70% rename from kmess/network/upnp/service.cpp rename to src/network/upnp/service.cpp index bf85ded..86055ab 100644 --- a/kmess/network/upnp/service.cpp +++ b/src/network/upnp/service.cpp @@ -17,18 +17,19 @@ #include "service.h" -#include "../extra/xmlfunctions.h" +#include "../../utils/xmlfunctions.h" #include "../../kmessdebug.h" -#include // QHttp -#include // QByteArray -#include // kdDebug() +#include +#include + #ifdef KMESSDEBUG_UPNP #define KMESSDEBUG_UPNP_GENERAL // #define KMESSDEBUG_UPNP_SOAP_RESPONSE #endif + // This implementation was created with the help of the following documentation: // http://www.upnp.org/standardizeddcps/documents/UPnP_IGD_1.0.zip // http://zacbowling.com/upnp/ @@ -41,7 +42,7 @@ namespace UPnP // The constructor for information services -Service::Service(const QString &hostname, int port, const QString &informationUrl) +Service::Service( const QString &hostname, quint16 port, const QString &informationUrl ) : informationUrl_(informationUrl) , pendingRequests_(0) { @@ -50,7 +51,7 @@ Service::Service(const QString &hostname, int port, const QString &informationUr this, SLOT( slotRequestFinished(int,bool) ) ); #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Service: Created information service url='" << informationUrl_ << "'." << endl; + kDebug() << "Created information service url='" << informationUrl_ << "'."; #endif } @@ -67,7 +68,7 @@ Service::Service(const ServiceParameters ¶ms) this, SLOT( slotRequestFinished(int,bool) ) ); #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "CREATED UPnP::Service: url='" << controlUrl_ << "' id='" << serviceId_ << "'." << endl; + kDebug() << "CREATED url='" << controlUrl_ << "' id='" << serviceId_ << "'."; #endif } @@ -77,7 +78,7 @@ Service::Service(const ServiceParameters ¶ms) Service::~Service() { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "DESTROYED UPnP::Service [url=" << controlUrl_ << ", id=" << serviceId_ << "]" << endl; + kDebug() << "DESTROYED. [url=" << controlUrl_ << ", id=" << serviceId_ << "]"; #endif delete http_; @@ -106,29 +107,29 @@ int Service::callAction(const QString &actionName, const QMap & int Service::callActionInternal(const QString &actionName, const QMap *arguments) { #ifdef KMESSTEST - ASSERT( ! controlUrl_ .isEmpty() ); - ASSERT( ! serviceId_ .isEmpty() ); - ASSERT( ! actionName .isEmpty() ); + KMESS_ASSERT( ! controlUrl_ .isEmpty() ); + KMESS_ASSERT( ! serviceId_ .isEmpty() ); + KMESS_ASSERT( ! actionName .isEmpty() ); #endif #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Service: calling remote prodecure '" << actionName << "'." << endl; + kDebug() << "calling remote procedure '" << actionName << "'."; #endif // Create the data message - QString soapMessage = "" - "" - ""; + QString soapMessage( "" + "" + "" ); // Do we have any arguments? if(arguments != 0) { // Add the arguments - QMapConstIterator it; + QMap::ConstIterator it; for(it = arguments->begin(); it != arguments->end(); ++it) { - QString argumentName = it.key(); - soapMessage += "<" + argumentName + ">" + it.data() + ""; + QString argumentName( it.key() ); + soapMessage += "<" + argumentName + ">" + it.value() + ""; } } @@ -136,7 +137,7 @@ int Service::callActionInternal(const QString &actionName, const QMap"; // Get an utf8 encoding string - QCString content = soapMessage.utf8(); + QByteArray content = soapMessage.toUtf8(); // Create the HTTP header QHttpRequestHeader header("POST", controlUrl_); @@ -156,10 +157,10 @@ int Service::callActionInternal(const QString &actionName, const QMap &/*resultValues*/) { - kdWarning() << "UPnP::Service - Action response '" << responseType << "' is not handled." << endl; + kWarning() << "Action response '" << responseType << "' is not handled."; } @@ -203,8 +204,8 @@ void Service::gotActionResponse(const QString &responseType, const QMap resultValues; @@ -266,9 +267,9 @@ void Service::slotRequestFinished(int /*id*/, bool error) // 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(uint i = 0; i < children.count(); i++) + for( int i = 0; i < children.count(); i++ ) { - QString key = children.item(i).nodeName(); + QString key( children.item(i).nodeName() ); resultValues[ key ] = children.item(i).toElement().text(); } @@ -279,7 +280,7 @@ void Service::slotRequestFinished(int /*id*/, bool error) else { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::Service: SOAP Error detected, calling gotActionResponse()." << endl; + kDebug() << "SOAP Error detected, calling gotActionResponse()."; #endif // Action failed gotActionErrorResponse(resultNode); @@ -288,7 +289,7 @@ void Service::slotRequestFinished(int /*id*/, bool error) } else { - kdWarning() << "UPnP::Service - XML Parsing failed: " << errorMessage << endl; + kWarning() << "XML Parsing failed: " << errorMessage; } // Only emit when bytes>0 @@ -298,13 +299,13 @@ void Service::slotRequestFinished(int /*id*/, bool error) } else { - kdWarning() << "UPnP::Service - HTTP Request failed: " << http_->errorString() << endl; + kWarning() << "HTTP Request failed: " << http_->errorString(); pendingRequests_--; emit queryFinished(error); } #ifdef KMESSTEST - ASSERT(pendingRequests_ >= 0); + KMESS_ASSERT(pendingRequests_ >= 0); #endif } diff --git a/kmess/network/upnp/service.h b/src/network/upnp/service.h similarity index 95% rename from kmess/network/upnp/service.h rename to src/network/upnp/service.h index 2dee5fa..725742e 100644 --- a/kmess/network/upnp/service.h +++ b/src/network/upnp/service.h @@ -18,13 +18,16 @@ #ifndef UPNP_CONTROLPOINT_H #define UPNP_CONTROLPOINT_H -#include -#include -#include -#include +#include +#include +#include +#include + class QHttp; + + namespace UPnP { @@ -33,7 +36,7 @@ namespace UPnP struct ServiceParameters { QString hostname; - int port; + quint16 port; QString scdpUrl; QString controlUrl; QString serviceId; @@ -57,7 +60,7 @@ class Service : public QObject public: // public methods // The constructor for the root service - Service(const QString &hostname, int port, + Service(const QString &hostname, quint16 port, const QString &informationUrl); // The constructor for action services Service(const ServiceParameters ¶ms); diff --git a/src/network/upnp/ssdpconnection.cpp b/src/network/upnp/ssdpconnection.cpp new file mode 100644 index 0000000..2dfea6a --- /dev/null +++ b/src/network/upnp/ssdpconnection.cpp @@ -0,0 +1,149 @@ +/*************************************************************************** + ssdpconnection.cpp - description + ------------------- + begin : Fri Jul 29 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 "ssdpconnection.h" + +#include "../../kmessdebug.h" + +#include +#include +#include + +#include + + +#ifdef KMESSDEBUG_UPNP +#define KMESSDEBUG_UPNP_GENERAL +#endif + + + +namespace UPnP +{ + + +// The constructor +SsdpConnection::SsdpConnection() +: QObject() +, socket_(new QUdpSocket) +{ + connect(socket_, SIGNAL( readyRead() ) , + this, SLOT( slotDataReceived() ) ); +} + + +// The destructor +SsdpConnection::~SsdpConnection() +{ + if(socket_ != 0) + { + socket_->close(); + delete socket_; + } +} + + + +// Data was received by the socket +void SsdpConnection::slotDataReceived() +{ +#ifdef KMESSDEBUG_UPNP_GENERAL + kDebug() << "received " << socket_->bytesAvailable() << " bytes."; +#endif + +/* + Response from my Alcatel router: + + HTTP/1.1 200 OK + CACHE-CONTROL:max-age=1800 + EXT: + LOCATION:http://10.0.0.138:80/IGD.xml + SERVER:SpeedTouch 510 4.0.2.0.0 UPnP/1.0 (0313QZ6S2) + ST:upnp:rootdevice + USN:uuid:UPnP-SpeedTouch510-1_00-90-D0-8E-A1-6F::upnp:rootdevice +*/ + + QByteArray datagram; + + while( socket_->hasPendingDatagrams() ) + { + datagram.clear(); + datagram.resize( (int)socket_->pendingDatagramSize() ); + + // Get the HTTP-like content + socket_->readDatagram( datagram.data(), datagram.size() ); + QString sspdResponse( datagram ); + + // Find the location field manually, MimeMessage is not required + int locationStart = sspdResponse.indexOf( "LOCATION:", 0, Qt::CaseInsensitive ); + int locationEnd = sspdResponse.indexOf( "\r\n", locationStart ); + + locationStart += 9; // length of field name + QString location( sspdResponse.mid( locationStart, locationEnd - locationStart ) ); + + // Parse the URL syntax using KUrl + KUrl url(location); + + // Emit success + // TODO: How to handle multiple packets arriving from different devices? + emit deviceFound(url.host(), url.port(), url.path()); + } +} + + +// Send a broadcast to detect all devices +void SsdpConnection::queryDevices( quint16 bindPort ) +{ +#ifdef KMESSDEBUG_UPNP_GENERAL + kDebug() << "Sending broadcast packet."; +#endif + + // Send a packet to a broadcast address + QHostAddress address; + address.setAddress("239.255.255.250"); + + QString data( "M-SEARCH * HTTP/1.1\r\n" + "Host:239.255.255.250:1900\r\n" + "Man:\"ssdp:discover\"\r\n" + "MX:3\r\n" + "ST:urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n" +// "ST:urn:schemas-upnp-org:device:WANIPConnection:1\r\n" +// "ST:urn:schemas-upnp-org:device:WANPPPConnection:1\r\n" +// "ST:upnp:rootdevice\r\n" + "\r\n" ); + + // Bind the socket to a certain port + bool success = socket_->bind( QHostAddress(), bindPort ); + if(! success) + { + kWarning() << "Failed to bind to port " << bindPort << "."; + } + + // Send the data + qint64 bytesWritten = socket_->writeDatagram( data.toAscii(), address, 1900 ); + + if(bytesWritten == -1) + { + kWarning() << "Failed to send the UPnP broadcast packet."; + } +} + + + +} // end of namespace + +#include "ssdpconnection.moc" diff --git a/kmess/network/upnp/ssdpconnection.h b/src/network/upnp/ssdpconnection.h similarity index 92% rename from kmess/network/upnp/ssdpconnection.h rename to src/network/upnp/ssdpconnection.h index b09fd08..1351bd4 100644 --- a/kmess/network/upnp/ssdpconnection.h +++ b/src/network/upnp/ssdpconnection.h @@ -18,11 +18,14 @@ #ifndef UPNP_SSDPCONNECTION_H #define UPNP_SSDPCONNECTION_H -#include +#include -class QSocketDevice; + +class QUdpSocket; class QSocketNotifier; + + namespace UPnP { @@ -49,7 +52,7 @@ class SsdpConnection : public QObject virtual ~SsdpConnection(); // Send a broadcast to detect all devices - void queryDevices(int bindPort = 1500); + void queryDevices( quint16 bindPort = 1500 ); private slots: // Data was received by the socket @@ -57,8 +60,7 @@ class SsdpConnection : public QObject private: - QSocketDevice *socket_; - QSocketNotifier *notifier_; + QUdpSocket *socket_; signals: // Called when a query completed diff --git a/kmess/network/upnp/wanconnectionservice.cpp b/src/network/upnp/wanconnectionservice.cpp similarity index 86% rename from kmess/network/upnp/wanconnectionservice.cpp rename to src/network/upnp/wanconnectionservice.cpp index 7e86bae..1572113 100644 --- a/kmess/network/upnp/wanconnectionservice.cpp +++ b/src/network/upnp/wanconnectionservice.cpp @@ -17,14 +17,17 @@ #include "wanconnectionservice.h" -#include #include "../../kmessdebug.h" +#include + + #ifdef KMESSDEBUG_UPNP #define KMESSDEBUG_UPNP_GENERAL #endif + namespace UPnP { @@ -96,7 +99,7 @@ bool WanConnectionService::getNatEnabled() const // Return the port mappings -const QPtrList& WanConnectionService::getPortMappings() const +const QList& WanConnectionService::getPortMappings() const { return portMappings_; } @@ -107,7 +110,7 @@ const QPtrList& WanConnectionService::getPortMappings() const void WanConnectionService::gotActionResponse(const QString &responseType, const QMap &resultValues) { #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::WanConnectionService: Parsing action response:" + kDebug() << "Parsing action response:" << " type='" << responseType << "'." << endl; #endif @@ -118,7 +121,7 @@ void WanConnectionService::gotActionResponse(const QString &responseType, const externalIpAddress_ = resultValues["NewExternalIPAddress"]; #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::WanConnectionService: externalIp='" << externalIpAddress_ << "'." << endl; + kDebug() << "externalIp='" << externalIpAddress_ << "'."; #endif } else if(responseType == "GetNATRSIPStatusResponse") @@ -127,7 +130,7 @@ void WanConnectionService::gotActionResponse(const QString &responseType, const natEnabled_ = (resultValues["NewNATEnabled"] == "1"); #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::WanConnectionService: natEnabled=" << natEnabled_ << "." << endl; + kDebug() << "natEnabled=" << natEnabled_ << "."; #endif } else if(responseType == "GetGenericPortMappingEntryResponse") @@ -149,15 +152,14 @@ void WanConnectionService::gotActionResponse(const QString &responseType, const portMappings_.append(map); #ifdef KMESSDEBUG_UPNP_GENERAL - kdDebug() << "UPnP::WanConnectionService - Got mapping: " << map->protocol << " " << map->remoteHost << ":" << map->externalPort - << " to " << map->internalClient << ":" << map->internalPort - << " max " << map->leaseDuration << "s '" << map->description << "' " << (map->enabled ? "enabled" : "disabled") << endl; + kDebug() << "Got mapping: " << map->protocol << " " << map->remoteHost << ":" << map->externalPort + << " to " << map->internalClient << ":" << map->internalPort + << " max " << map->leaseDuration << "s '" << map->description << "' " << (map->enabled ? "enabled" : "disabled") << endl; #endif } else { - kdWarning() << "UPnP::WanConnectionService - Unexpected response type" - << " '" << responseType << "' encountered." << endl; + kWarning() << "Unexpected response type '" << responseType << "' encountered." << endl; } } diff --git a/kmess/network/upnp/wanconnectionservice.h b/src/network/upnp/wanconnectionservice.h similarity index 96% rename from kmess/network/upnp/wanconnectionservice.h rename to src/network/upnp/wanconnectionservice.h index e577fe7..64f93c3 100644 --- a/kmess/network/upnp/wanconnectionservice.h +++ b/src/network/upnp/wanconnectionservice.h @@ -20,7 +20,9 @@ #include "service.h" -#include +#include + + namespace UPnP { @@ -69,7 +71,7 @@ class WanConnectionService : public Service // Return true if NAT is enabled bool getNatEnabled() const; // Return the port mappings - const QPtrList& getPortMappings() const; + const QList& getPortMappings() const; // Query for the external IP address void queryExternalIpAddress(); @@ -91,7 +93,7 @@ class WanConnectionService : public Service // True if NAT is enabled bool natEnabled_; // The current port mappings - QPtrList portMappings_; + QList portMappings_; }; } diff --git a/src/notification/chatnotification.cpp b/src/notification/chatnotification.cpp new file mode 100644 index 0000000..63752c9 --- /dev/null +++ b/src/notification/chatnotification.cpp @@ -0,0 +1,284 @@ +/*************************************************************************** + chatnotification.cpp - notifies when a + contact communicates with the user + ------------------- + 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 "chatnotification.h" + +#include "../chat/chat.h" +#include "../chat/chatwindow.h" +#include "../contact/contactextension.h" +#include "../contact/invitedcontact.h" +#include "../model/contactlist.h" +#include "../network/chatmessage.h" +#include "../kmessdebug.h" +#include "../currentaccount.h" +#include "notificationmanager.h" + +#include + +#include +#include + + +// How long a message can be without being cropped away +#define MAX_BALLOON_MESSAGE_SIZE 64 + + + +// Class constructor +ChatNotification::ChatNotification( NotificationManager* 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 ChatNotification::activate( NotificationManager::EventSettings settings, NotificationManager::Buttons button ) +{ + // The signal wasn't meant for us + if( settings.sender != this ) + { + return; + } + + switch( button ) + { + case NotificationManager::BUTTON_VIEW_MESSAGE: +#ifdef KMESSDEBUG_CHATNOTIFICATION + 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 *chat ) +{ + // End if the event is coming from us instead of from a contact + if( ! message.isIncoming() ) + { +#ifdef KMESSDEBUG_CHATNOTIFICATION + kDebug() << "Not displaying a popup for an outgoing message."; +#endif + return; + } + + // Check the chat pointer, we need it + if( ! chat ) + { +#ifdef KMESSDEBUG_CHATNOTIFICATION + kDebug() << "Invalid pointer to chat window."; +#endif + return; + } + + // 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() << "Window is active, skipping."; +#endif + return; + } + + + QString text; + int messageType = message.getType(); + QString body( message.getBody() ); + const QString &handle = message.getContactHandle(); + CurrentAccount *currentAccount = CurrentAccount::instance(); + ContactBase *contact; + + Contact *contactDetail = currentAccount->getContactList()->getContactByHandle( handle ); + if( contactDetail != 0 ) + { + if( contactDetail->getExtension()->getDisableNotifications() ) + { + kDebug() << "The contact: " << handle << " has the notification disabled, skip it"; + return; + } + contact = static_cast (contactDetail); + } + else + { + contact = currentAccount->getContactByHandle( handle ); + } + + // When the contact doesn't exist, only use the handle + if( contact == 0 ) + { + contact = currentAccount->addInvitedContact( handle ); + } + + const QString& friendlyName( contact->getFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); + +#ifdef KMESSDEBUG_CHATNOTIFICATION + kDebug() << "Contact" << handle; +#endif + + // Truncate the message so it doesn't make the balloon too big + if( body.length() > MAX_BALLOON_MESSAGE_SIZE ) + { + body.truncate( MAX_BALLOON_MESSAGE_SIZE ); + 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_PRESENCE: + case ChatMessage::TYPE_NOTIFICATION: + text = i18n( "In %1's chat:
    %2", friendlyName, body ); + break; + + case ChatMessage::TYPE_INCOMING: + 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 ); + break; + + case ChatMessage::TYPE_APPLICATION: + case ChatMessage::TYPE_APPLICATION_WEBCAM: + case ChatMessage::TYPE_APPLICATION_FILE: + case ChatMessage::TYPE_APPLICATION_AUDIO: + text = i18n( "%1's chat requests attention!", friendlyName ); + break; + + case ChatMessage::TYPE_SYSTEM: + default: + text = i18n( "%1:
    %2", friendlyName, body ); + break; + } + + switch( message.getContentsClass() ) + { + case ChatMessage::CONTENT_MESSAGE_INK: + text = i18n( "%1 has sent you a handwritten message!", friendlyName ); + break; + + case ChatMessage::CONTENT_NOTIFICATION_NUDGE: + text = i18n( "%1 has sent you a nudge!", friendlyName ); + break; + + case ChatMessage::CONTENT_NOTIFICATION_WINK: + text = i18n( "%1 has sent you a wink!", friendlyName ); + break; + + case ChatMessage::CONTENT_APP_INVITE: + switch( messageType ) + { + case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 wants to use the webcam!", friendlyName ); break; + case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "%1 is sending you a file!", friendlyName ); break; + default: text = i18n( "%1 has sent you an invitation!", friendlyName ); break; + } + break; + + case ChatMessage::CONTENT_APP_CANCELED: + switch( messageType ) + { + case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 has canceled the webcam session!", friendlyName ); break; + case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "%1 has canceled the file transfer!", friendlyName ); break; + default: text = i18n( "%1's activity has been canceled!", friendlyName ); break; + } + break; + + case ChatMessage::CONTENT_APP_STARTED: + switch( messageType ) + { + case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 has accepted to use the webcam!", friendlyName ); break; + case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "%1 has accepted the file transfer!", friendlyName ); break; + default: text = i18n( "%1 has accepted your invitation!", friendlyName ); break; + } + break; + + case ChatMessage::CONTENT_APP_ENDED: + switch( messageType ) + { + case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1 has ended the webcam session!", friendlyName ); break; + case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "The file transfer with %1 is done!", friendlyName ); break; + default: text = i18n( "%1's activity has ended!", friendlyName ); break; + } + break; + + case ChatMessage::CONTENT_APP_FAILED: + switch( messageType ) + { + case ChatMessage::TYPE_APPLICATION_WEBCAM: text = i18n( "%1's webcam session has failed!", friendlyName ); break; + case ChatMessage::TYPE_APPLICATION_FILE: text = i18n( "The file transfer with %1 has failed!", friendlyName ); break; + default: text = i18n( "%1's activity has ended with an error!", friendlyName ); break; + } + break; + + default: + 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"; + } + + NotificationManager::EventSettings settings; + settings.sender = this; + settings.widget = chat; + settings.contact = contact; + settings.buttons = NotificationManager::BUTTON_HIDE | NotificationManager::BUTTON_VIEW_MESSAGE; + + manager_->notify( eventName, text, settings ); +} + + + +#include "chatnotification.moc" diff --git a/kmess/notification/notificationchat.h b/src/notification/chatnotification.h similarity index 52% rename from kmess/notification/notificationchat.h rename to src/notification/chatnotification.h index 77b1a11..f3ff115 100644 --- a/kmess/notification/notificationchat.h +++ b/src/notification/chatnotification.h @@ -4,7 +4,7 @@ ------------------- begin : Tuesday April 10 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -16,57 +16,51 @@ * * ***************************************************************************/ -#ifndef NOTIFICATIONCHAT_H -#define NOTIFICATIONCHAT_H +#ifndef CHATNOTIFICATION_H +#define CHATNOTIFICATION_H -#include "passivepopup.h" #include "notificationmanager.h" -#include "../chat/chatwindow.h" -#include "../chat/chatmessage.h" -#include "../contact/contactbase.h" + +#include + + +// Forward declarations +class Chat; +class ChatMessage; /** - * @brief Notifies the user when a contact has sent him/her a message. - * - * Notification is made via a popup balloon and a sound (which can be customized) - * - * @author Valerio Pilo - */ -class NotificationChat : public QObject + * @brief Notifies the user when a contact has sent him/her a message. + * + * Notification is made via a popup balloon and a sound (which can be customized) + * + * @author Valerio Pilo + * @ingroup Notification + */ +class ChatNotification : public QObject { Q_OBJECT public: // Public methods // Class constructor - NotificationChat( 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( ChatWindow *chatWindow, bool force ); + void raiseChat( Chat *chatWindow, bool force ); public slots: // Notify the user about this event (a contact has contacted the user) - void notify( const ChatMessage &message, ChatWindow *chatWindow ); + 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 new file mode 100644 index 0000000..34e1791 --- /dev/null +++ b/src/notification/contactstatusnotification.cpp @@ -0,0 +1,207 @@ +/*************************************************************************** + contactstatusnotification.cpp - notifies when a + contact changes their msn status + ------------------- + begin : Saturday July 28 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 "contactstatusnotification.h" + +#include "../contact/contact.h" +#include "../contact/contactextension.h" +#include "../currentaccount.h" +#include "../kmess.h" +#include "../kmessapplication.h" +#include "../kmessdebug.h" +#include "notificationmanager.h" + +#include +#include + +#include +#include +#include +#include + + + +// Class constructor +ContactStatusNotification::ContactStatusNotification( NotificationManager* 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 ContactStatusNotification::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_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; + } +} + + + +// Obtains a status string like "contact has come online" for a MSN status code +const QString ContactStatusNotification::getStatusString( const Status status, const QString& friendlyName ) const +{ + 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 ); + default: + kWarning() << "Invalid status" << status << "!"; + return getStatusString( STATUS_ONLINE, friendlyName ); + } +} + + + +// Notify the user about this event (a contact has changed its status) +void ContactStatusNotification::notify( Contact *contact, bool isNeeded ) +{ + if( contact == 0 ) + { + kWarning() << "Contact is null!"; + return; + } + + // If notification for this event is disabled + // or the user decided to don't show the notification about this contact + // don't show a balloon. + if( ! isNeeded || contact->getExtension()->getDisableNotifications() ) + { +#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION + kDebug() << "Not needed, skipping."; +#endif + return; + } + + + const 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 ) << "->" << 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 ) + { + text = getStatusString( STATUS_ONLINE, friendlyName ); + } + else + { + text = getStatusString( status, friendlyName ); + } + +// TODO Fix custom contact sound, possibly using contexts and setComponentData() from KNotification +/* + // Play a sound + QString soundPath( contact->getExtension()->getContactSoundPath() ); + QFile soundFile( soundPath ); + + // If a custom audio file exists, play it + if ( soundFile.exists() ) + { +#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION + kDebug() << "Play sound " << soundPath; +#endif + + // Play the custom sound instead of the generic sound + Phonon::MediaObject* media = Phonon::createPlayer( Phonon::NotificationCategory ); + media->setCurrentSource( soundPath ); + media->play(); + } +*/ + + QString eventName; + if( lastStatus == STATUS_OFFLINE ) + { + eventName = "contact online"; + } + else if( status == STATUS_OFFLINE ) + { + eventName = "contact offline"; + } + else + { + eventName = "contact status"; + } + + // Associate the list events with the contact list window + const KMessApplication *kmessApp = static_cast( kapp ); + QWidget *mainWindow = kmessApp->getContactListWindow()->window(); + + 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; + } + + manager_->notify( eventName, text, settings ); +} + + + +#include "contactstatusnotification.moc" diff --git a/kmess/notification/notificationcontactstatus.h b/src/notification/contactstatusnotification.h similarity index 51% rename from kmess/notification/notificationcontactstatus.h rename to src/notification/contactstatusnotification.h index 18c78f5..6786e79 100644 --- a/kmess/notification/notificationcontactstatus.h +++ b/src/notification/contactstatusnotification.h @@ -1,10 +1,10 @@ /*************************************************************************** - notificationcontactstatus.h - notifies when a + contactstatusnotification.h - notifies when a contact changes their msn status ------------------- begin : Saturday July 28 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -16,59 +16,56 @@ * * ***************************************************************************/ -#ifndef NOTIFICATIONCONTACTSTATUS_H -#define NOTIFICATIONCONTACTSTATUS_H +#ifndef CONTACTSTATUSNOTIFICATION_H +#define CONTACTSTATUSNOTIFICATION_H -#include "passivepopup.h" +#include "../contact/msnstatus.h" +#include "../network/chatinformation.h" #include "notificationmanager.h" -#include "../contact/contact.h" + +#include + + +// Forward declarations +class Contact; /** - * @brief Notifies the user when a contact has changed its MSN status - * - * Notification is made via a popup balloon and a sound (which can be customized) - * - * @author Valerio Pilo -*/ -class NotificationContactStatus : public QObject + * @brief Notifies the user when a contact has changed its MSN status + * + * Notification is made via a popup balloon and a sound (which can be customized) + * + * @author Valerio Pilo + * @ingroup Notification + */ +class ContactStatusNotification : public QObject { Q_OBJECT public: // Public methods // Class constructor - NotificationContactStatus( 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 - QString getStatusString( QString status ); + const QString getStatusString( const Status status, const QString& friendlyName ) const; 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 new file mode 100644 index 0000000..1e165f0 --- /dev/null +++ b/src/notification/newemailnotification.cpp @@ -0,0 +1,108 @@ +/*************************************************************************** + newemailnotification.cpp - notifies when a + new email has arrived + ------------------- + 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 "newemailnotification.h" + +#include "../currentaccount.h" +#include "../kmessdebug.h" +#include "notificationmanager.h" + +#include + +#include +#include + + + +// Class constructor +NewEmailNotification::NewEmailNotification( NotificationManager* 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; + } +} + + + +// 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 ); + +#ifdef KMESSDEBUG_NEWEMAILNOTIFICATION + kDebug() << "New email from" << sender << "- Is in inbox?" << inInbox; +#else + Q_UNUSED( inInbox ); +#endif + + + 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 ) ) ); + + NotificationManager::EventSettings settings; + settings.sender = this; + settings.widget = 0; + settings.contact = 0; + settings.data = folder; + settings.buttons = NotificationManager::BUTTON_HIDE | NotificationManager::BUTTON_OPEN_MAILBOX; + + manager_->notify( "new email", text, settings ); +} + + + +#include "newemailnotification.moc" diff --git a/kmess/notification/notificationnewemail.h b/src/notification/newemailnotification.h similarity index 60% rename from kmess/notification/notificationnewemail.h rename to src/notification/newemailnotification.h index 4ccbf60..897ed55 100644 --- a/kmess/notification/notificationnewemail.h +++ b/src/notification/newemailnotification.h @@ -1,10 +1,10 @@ /*************************************************************************** - notificationnewemail.h - notifies when a + newemailnotification.h - notifies when a new email has arrived ------------------- begin : Tuesday April 10 2007 copyright : (C) 2007 by Valerio Pilo - email : amroth@coldshock.net + email : valerio@kmess.org ***************************************************************************/ /*************************************************************************** @@ -16,49 +16,50 @@ * * ***************************************************************************/ -#ifndef NOTIFICATIONNEWEMAIL_H -#define NOTIFICATIONNEWEMAIL_H +#ifndef NEWEMAILNOTIFICATION_H +#define NEWEMAILNOTIFICATION_H -#include "passivepopup.h" #include "notificationmanager.h" -#include "../currentaccount.h" + +#include + + +// Forward declarations +class NotificationManager; +class PassivePopup; +class CurrentAccount; /** - * @brief Notifies the user when a new email is in the mailbox - * - * Notification is made via a popup balloon and a sound (which can be customized) - * - * @author Valerio Pilo - */ -class NotificationNewEmail : public QObject + * @brief Notifies the user when a new email is in the mailbox + * + * Notification is made via a popup balloon and a sound (which can be customized) + * + * @author Valerio Pilo + * @ingroup Notification + */ +class NewEmailNotification : public QObject { Q_OBJECT public: // Public methods // Class constructor - NotificationNewEmail( NotificationManager* manager ); - // Enable or disable the new email notifications - void setEnabled( bool activate ); + 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_; - // Notification status - bool isEnabled_; // 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 new file mode 100644 index 0000000..434b642 --- /dev/null +++ b/src/notification/notificationmanager.cpp @@ -0,0 +1,338 @@ +/*************************************************************************** + notificationmanager.cpp - manage the notifications + stack and updates them as needed + ------------------- + begin : Thursday April 19 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 "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 +#include +#endif + + +// Initialize the instance to zero +NotificationManager* NotificationManager::instance_(0); + + + +// Class constructor +NotificationManager::NotificationManager() +{ + // Initialize the interfaces to screen saver and fullscreen apps checks + autoLock_ = new XAutoLock(); +} + + + +// Class destructor +NotificationManager::~NotificationManager() +{ + 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() +{ + return trayObject_; +} + + + +// 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 notifications."; +#endif + return; + } + + CurrentAccount *currentAccount = CurrentAccount::instance(); + + // 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; + } + + bool isFullscreen = false; + +#ifdef Q_WS_X11 + // Check if a full screen application is running by querying the window manager and asking + // the state of the currently active window + KWindowInfo info = KWindowSystem::windowInfo( KWindowSystem::activeWindow(), NET::WMState | NET::FullScreen ); + isFullscreen = ( info.valid() && info.hasState( NET::FullScreen ) ); +#else + #ifdef Q_WS_WIN + // Windows version + HWND hwnd = GetForegroundWindow(); + RECT rcWindow; + GetWindowRect( hwnd, &rcWindow ); + int screenWidth = GetSystemMetrics( SM_CXSCREEN ); + int screenHeight = GetSystemMetrics( SM_CYSCREEN ); + + int windowWidth = ( rcWindow.right - rcWindow.left ); + int windowHeight = ( rcWindow.bottom - rcWindow.top ); + + isFullscreen = ( screenWidth == windowWidth && screenHeight == windowHeight ); + #else + #warning Full screen application detection is not implemented for this platform yet. + #endif +#endif + + if( isFullscreen ) + { + 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 so, it is not fullscreen, showing notifications."; + #endif +#endif + + KNotification *notification; + + // An event already exists for this contact, update it + notification = events_.key( settings.contact, (KNotification*)0 ); + if( notification ) + { +#ifdef KMESSDEBUG_NOTIFICATIONMANAGER + kDebug() << "Updating existing notification" << notification; +#endif + notification->setText ( text ); + notification->setActions( getButtonsLabels( settings.buttons ) ); + // We can't update the event ID, crap. + + if( settings.contact != 0 ) + { + notification->setPixmap( QPixmap( settings.contact->getContactPicturePath() ) ); + } + + eventSettings_[ notification ] = settings; + + notification->update(); + return; + } + + // We have to send a new event + + // Create the notification + notification = new KNotification( event ); + +#ifdef KMESSDEBUG_NOTIFICATIONMANAGER + kDebug() << "Showing notification" << notification << "for event" << event; +#endif + + // Add it to our lists to be able to find it later + events_ .insert( notification, settings.contact ); + eventSettings_.insert( notification, settings ); + + // Set it up + notification->setWidget( settings.widget ); + notification->setText ( text ); + notification->setActions( getButtonsLabels( settings.buttons ) ); + notification->setFlags ( KNotification::CloseOnTimeout + | KNotification::CloseWhenWidgetActivated ); + + if( settings.contact != 0 ) + { + notification->setPixmap( QPixmap( settings.contact->getContactPicturePath() ) ); + } + + // 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*) ) ); + + notification->sendEvent(); +} + + + +// Return a singleton instance of the current account +NotificationManager* NotificationManager::instance() +{ + // If the instance is null, create a new manager and return that. + if ( instance_ == 0 ) + { + instance_ = new NotificationManager(); + } + return instance_; +} + + + +// Forward an activation action to the class which will manage it +void NotificationManager::relayActivation( unsigned int action ) +{ + KNotification *notification = static_cast( sender() ); + if( ! notification || ! eventSettings_.contains( notification ) ) + { + kWarning() << "Cannot relay notification activation, pointer" << notification << "not found!"; + return; + } + +#ifdef KMESSDEBUG_NOTIFICATIONMANAGER + 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 +} + + + +// Set the tray object that will be used +void NotificationManager::setTrayObject( QSystemTrayIcon *trayObject ) +{ + trayObject_ = trayObject; +} + + + +#include "notificationmanager.moc" diff --git a/src/notification/notificationmanager.h b/src/notification/notificationmanager.h new file mode 100644 index 0000000..79f98f9 --- /dev/null +++ b/src/notification/notificationmanager.h @@ -0,0 +1,124 @@ +/*************************************************************************** + notificationmanager.h - manage the notifications + stack and updates them as needed + ------------------- + begin : Thursday April 19 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 NOTIFICATIONMANAGER_H +#define NOTIFICATIONMANAGER_H + +#include +#include + + +// Forward declarations +class QSystemTrayIcon; + +class KNotification; + +class ContactBase; +class XAutoLock; + + + +/** + * @brief Manages the notifications stack + * + * Notification balloons are handled as a vertical stack to avoid overlapping. + * + * @author Valerio Pilo + * @ingroup Notification + */ +class NotificationManager : public QObject +{ + Q_OBJECT + + 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( const QString &event, const QString &text, EventSettings settings ); + // Return the current tray widget object + QSystemTrayIcon *getTrayObject(); + // Set the tray widget object that will be used + void setTrayObject( QSystemTrayIcon *trayObject ); + + public: // Public static methods + // Return a singleton instance of the current account + static NotificationManager *instance(); + + 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_; + // 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_; + // The instance of the singleton manager + static NotificationManager *instance_; + + signals: + // A notification button has been pressed + void eventActivated( NotificationManager::EventSettings settings, + NotificationManager::Buttons clickedButton ); +}; + + + +#endif diff --git a/src/notification/systemtraywidget.cpp b/src/notification/systemtraywidget.cpp new file mode 100644 index 0000000..24b60ef --- /dev/null +++ b/src/notification/systemtraywidget.cpp @@ -0,0 +1,257 @@ +/*************************************************************************** + systemtraywidget.cpp - description + ------------------- + begin : Sun Dec 29 2002 + copyright : (C) 2002 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 "systemtraywidget.h" + +#include "contact/msnstatus.h" +#include "config-kmess.h" +#include "currentaccount.h" +#include "kmessdebug.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifdef Q_WS_WIN +#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 + * + * This method, taken from the Basket Note Pads project (see the related links below), is used when + * the user closes the main KMess contact list window. Then a custom dialog window is shown to notify + * that the app will still run in background. This useful method adds to it a screenshot of the system + * tray area of the users' desktop, highlighting the application's icons. + * The original code was KDE3, it's been ported to make better use of the new features of Qt4 and KDE4. + * + * @see http://basket.kde.org/ - Official site of the Basket Note Pads project + * @see http://basket.kde.org/systemtray-on-close-info.php - Specific tray dialog page + */ +void SystemTrayWidget::displayCloseMessage( QString /*fileMenu*/ ) +{ + // Don't do all the computations if they are unneeded: + if ( ! KMessageBox::shouldBeShownContinue("hideOnCloseInfo") ) + return; + + 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() ) + { +#ifdef KMESSDEBUG_SYSTEMTRAY + kDebug() << "Displaying simple dialog with no screenshot."; +#endif + + KMessageBox::information( kapp->activeWindow(), message, + i18n( "Docking in System Tray" ), + "hideOnCloseInfo" ); + return; + } + +#ifdef KMESSDEBUG_SYSTEMTRAY + kDebug() << "Displaying dialog with tray icon screenshot: generating image..."; +#endif + + // 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 + const int xRadius = desktopArea.width() / 8; + const int yRadius = desktopArea.height() / 16; + pictureArea.adjust( -xRadius, -yRadius, xRadius, yRadius ); + + + // 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 + + // Grab an image of the screen which contains the tray icon + QPixmap shot; +#ifdef Q_WS_X11 + shot = QPixmap::grabWindow( QX11Info::appRootWindow(), pictureArea.x(), pictureArea.y(), pictureArea.width(), pictureArea.height() ); +#else + #warning Screen capture code not implemented for this platform. +#endif + + // Now we want to draw a circle around the icon + if( ! shot.isNull() ) + { + // Some properties about the circle we'll draw + const int CIRCLE_WIDTH = 3; + const int SHADOW_OFFSET = 2; + const int IMAGE_BORDER = 1; + const int CIRCLE_MARGINS = 6; + + QRect circleArea = pictureGeometry; + circleArea.adjust( -CIRCLE_MARGINS, -CIRCLE_MARGINS, CIRCLE_MARGINS, CIRCLE_MARGINS ); + +#ifdef KMESSDEBUG_SYSTEMTRAY + kDebug() << "Picture geometry is" << pictureGeometry << "and circle area is" << circleArea; +#endif + + // Draw the circle with a dark shadow + QPainter painter( &shot ); + painter.setPen( QPen(KApplication::palette().dark(), CIRCLE_WIDTH) ); + painter.drawArc( circleArea.adjusted( SHADOW_OFFSET, SHADOW_OFFSET, 0, 0 ), 0, 16*360 ); + painter.setPen( QPen(Qt::red, CIRCLE_WIDTH) ); + painter.drawArc( circleArea, 0, 16*360); + + // Draw the tray icon over the screenshot again, in case a window is hiding the icon + icon().paint( &painter, geometry() ); + painter.end(); + + // Then, we add a border around the image, to make it more visible + QPixmap finalShot( pictureArea.size() ); + finalShot.fill( KApplication::palette().color( QPalette::Active, QPalette::Foreground ) ); + painter.begin( &finalShot ); + painter.drawPixmap( QRect( IMAGE_BORDER, IMAGE_BORDER, shot.width() - IMAGE_BORDER*2, shot.height() - IMAGE_BORDER*2 ), shot ); + painter.end(); + + // Save the pixmap into a temporary file to allow using it in a dialog + QTemporaryFile tempFile( QDir::tempPath() + "/kmess_temp_XXXXXX.png" ); + tempFile.open(); + finalShot.save( tempFile.fileName() ); + +#ifdef KMESSDEBUG_SYSTEMTRAY + kDebug() << "Temp file info" + << "- Name:" << tempFile.fileName() + << "- Exists?" << tempFile.exists(); +#endif + + // Show the dialog + KMessageBox::information(kapp->activeWindow(), + "

    " + message + "

    ", + i18n("Docking in System Tray"), "hideOnCloseInfo"); + + // Close the temporary file, it will be deleted when the function returns + tempFile.close(); + } + else + { + // Dialog without the shot. + KMessageBox::information(kapp->activeWindow(), + "

    " + message + "

    ", + i18n("Docking in System Tray"), "hideOnCloseInfo"); + } + +#ifdef KMESSDEBUG_SYSTEMTRAY + kDebug() << "Dialog closed."; +#endif +} + + + +// The destructor +SystemTrayWidget::~SystemTrayWidget() +{ +#ifdef KMESSDEBUG_SYSTEMTRAY + kDebug() << "DESTROYED."; +#endif +} + + + +// Return the context menu +QMenu* SystemTrayWidget::menu() const +{ + return contextMenu(); +} + + + +// Change the icon when the user's status changes +void SystemTrayWidget::statusChanged() +{ + 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 + QString newTooltip( "KMess " KMESS_VERSION ); + + if( status != STATUS_OFFLINE ) + { +#if !defined(Q_WS_WIN) + 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 += i18nc( "Tray icon tooltip, text version", + " - %1 (%2)", + currentAccount_->getFriendlyName( STRING_CLEANED ), + MsnStatus::getName( status ) ); +#endif + } + + setToolTip( newTooltip ); +} + + + +#include "systemtraywidget.moc" diff --git a/kmess/systemtraywidget.h b/src/notification/systemtraywidget.h similarity index 81% rename from kmess/systemtraywidget.h rename to src/notification/systemtraywidget.h index 75988ab..b288bb2 100644 --- a/kmess/systemtraywidget.h +++ b/src/notification/systemtraywidget.h @@ -18,8 +18,14 @@ #ifndef SYSTEMTRAYWIDGET_H #define SYSTEMTRAYWIDGET_H -#include -#include +#include + + +// Forward declarations +class CurrentAccount; +class KMenu; + + /** * @brief System tray event handling. @@ -31,21 +37,23 @@ * @author Mike K. Bennett * @ingroup Root */ -class SystemTrayWidget : public KSystemTray +class SystemTrayWidget : public KSystemTrayIcon { Q_OBJECT public: // The constructor - SystemTrayWidget(QWidget *parent=0, const char *name=0); + SystemTrayWidget( QWidget *parent=0 ); // The destructor - ~SystemTrayWidget(); - // Initialize the class - bool initialize(); + virtual ~SystemTrayWidget(); // Display a customized close window with a screenshot of the app's tray icon void displayCloseMessage( QString fileMenu = QString::null ); // Return the context menu - KPopupMenu *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 new file mode 100644 index 0000000..a853fc3 --- /dev/null +++ b/src/settings/accountpage.cpp @@ -0,0 +1,589 @@ +/*************************************************************************** + accountpage.cpp - description + ------------------- + copyright : (C) 2004 by Madelman + (C) 2006 by Diederik van der Boor + email : mkb137b@hotmail.com + "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 "accountpage.h" + +#include "../dialogs/userpicturesdialog.h" +#include "../utils/kmessconfig.h" +#include "../utils/kmessshared.h" +#include "../kmessdebug.h" +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + + + + +/** + * Constructor + */ +AccountPage::AccountPage( QWidget* parent ) +: QWidget(parent) +, Ui::AccountPage() +, hasTempPicture_(false) +, userPicturesDialog_(0) +{ + // 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() ) ); + connect( noPictureCheckbox_, SIGNAL( toggled(bool) ), this, SLOT( showPictureToggled(bool) ) ); + connect( registerButton_, SIGNAL(leftClickedUrl() ), this, SLOT( showRegisterPassport() ) ); + connect( rememberCheckbox_, SIGNAL( toggled(bool) ), this, SLOT( rememberMeToggled(bool) ) ); + + // Find the default picture + KStandardDirs *dirs = KGlobal::dirs(); + QString defaultPicture ( dirs->findResource( "data", "kmess/pics/kmesspic.png" ) ); + + // Load the picture in the X-Server: + defaultPixmap_ = QPixmap(defaultPicture); + customPixmap_ = defaultPixmap_; + + // 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 ); + connect( browseSimple, SIGNAL(activated()), this, SLOT(pictureBrowseSimple() ) ); + connect( browseResize, SIGNAL(activated()), this, SLOT(pictureBrowseResize() ) ); + connect( setPrevious, SIGNAL(activated()), this, SLOT( pictureSetPrevious() ) ); + + // Plug the items into the browse menu button + browsePopup->addAction( browseSimple ); + browsePopup->addAction( browseResize ); + browsePopup->addAction( setPrevious ); + + // Assign the new popup to the button and detach old connection + browseButton_->setMenu( browsePopup ); + disconnect( browseButton_, SIGNAL( clicked() ) ); + + // Add the items to the initial status combo box + QStringList states; + states << i18n("Online") + << i18n("Away") + << i18n("Be Right Back") + << i18n("Busy") + << i18n("Out to Lunch") + << i18n("On the Phone") + << i18n("Invisible"); + initialStatus_->addItems( states ); + + // Default the path to the display picture original + originalPicturePath_ = QString(); +} + + + +/** + * Destructor + */ +AccountPage::~AccountPage() +{ + delete userPicturesDialog_; + + // Clean up the temp file. + if( hasTempPicture_ ) + { + QFile::remove( tempPictureFile_ ); + } + + // no need to delete child widgets, Qt does it all for us +} + + + +// Send a signal to the Chat Style page with the new account settings +void AccountPage::forwardSettingsUpdate() +{ + emit settingsUpdated( handleEdit_->text(), friendlyNameEdit_->text(), tempPictureFile_ ); +} + + + +// Return the currently entered handle. +const QString AccountPage::getEnteredHandle() const +{ + return handleEdit_->text(); +} + + + +// return the entered friendly name. +const QString AccountPage::getEnteredFriendlyName() const +{ + return friendlyNameEdit_->text(); +} + + + +/** + * Load the dialog settings. + */ +void AccountPage::loadSettings( const Account *account, bool isCurrentAccount) +{ + bool showPicture; + + // Read settings + myHandle_ = account->getHandle(); + pictureFile_ = account->getPicturePath(); + 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 ) ); + handleEdit_ ->setText( myHandle_ ); + rememberPasswordCheckBox_->setChecked( account->getSavePassword() ); + passwordEdit_ ->setText( account->getPassword() ); + + 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; + switch( account->getInitialStatus() ) + { + case STATUS_AWAY: item = 1; break; + case STATUS_BE_RIGHT_BACK: item = 2; break; + case STATUS_BUSY: item = 3; break; + case STATUS_INVISIBLE: item = 6; break; + case STATUS_ON_THE_PHONE: item = 5; break; + case STATUS_OUT_TO_LUNCH: item = 4; break; + case STATUS_ONLINE: + default: item = 0; break; + } + initialStatus_->setCurrentIndex( item ); + + // Show or hide the help links + if( isCurrentAccount ) + { + registerLabel_ ->hide(); + registerButton_ ->hide(); + friendlyNameEdit_->setEnabled( account->isVerified() ); + handleEdit_ ->setEnabled( false ); + + // We can only know whether the account is verified when we're logged in + verifyLabel_ ->setVisible( ! account->isVerified() ); + verifyButton_ ->setVisible( ! account->isVerified() ); + } + else + { + verifyLabel_ ->hide(); + verifyButton_ ->hide(); + friendlyNameEdit_->setEnabled( false ); + handleEdit_ ->setEnabled( true ); + + // Only show the Register link when creating new accounts + bool hasInvalidHandle = ( account->getHandle() == i18n("you@hotmail.com") ); + registerLabel_ ->setVisible( hasInvalidHandle ); + registerButton_ ->setVisible( hasInvalidHandle ); + } + + // When the account is a guest account, offer a method to upgrade to a real account. + if( account->isGuestAccount() ) + { + // Disable settings that require a real account which is saved in the config file. + rememberMeToggled(false); + } + else + { + // Hide the upgrade function + rememberCheckbox_->hide(); + } + + // Load the custom pixmap if we have one. + customPixmap_ = QPixmap( pictureFile_ ); + + if( customPixmap_.isNull() ) + { + // Failed to load + customPixmap_ = defaultPixmap_; + pictureFile_ = QString(); + } + + // Load the pixmap + pictureLabel_->setPixmap(customPixmap_); + + // Set the "Show Picture" checkbox + // Run the event manually this time to update the GUI. + noPictureCheckbox_->setChecked( ! showPicture ); + showPictureToggled( ! showPicture ); + + // Force update of the preview in the Chat Style settings page + forwardSettingsUpdate(); +} + + + +// Show the normal browse dialog to change display picture +void AccountPage::pictureBrowseSimple() +{ + selectPicture( false ); +} + + + +// Show the browse dialog to change display picture and then allow the user to crop it +void AccountPage::pictureBrowseResize() +{ + selectPicture( true ); +} + + + +// Show the browse dialog to view the used user images +void AccountPage::pictureSetPrevious() +{ + if( userPicturesDialog_ == 0 ) + { + userPicturesDialog_ = new UserPicturesDialog(); + connect( userPicturesDialog_, SIGNAL( pictureUpdate( bool, QString ) ), + this, SLOT( selectPicture( bool, QString ) ) ); + } + + userPicturesDialog_->updateWidgets( myHandle_ ); + userPicturesDialog_->show(); +} + + + +/** + * Save the settings in the account object. + */ +void AccountPage::saveSettings( Account *account ) +{ + QString password; + QString pictureName; + Status initialStatus; + QString newFriendlyName; + QDir pictureFolder; + bool showPicture; + + // Read settings + showPicture = ! noPictureCheckbox_->isChecked(); + + // Update the picture if we have one. This is done before changing the handle, so the new picture is saved at the old account dir + // and can be moved to the new one easily + if( hasTempPicture_ ) + { + if( ! showPicture ) + { + // The temporary file is no longer needed. + QFile::remove( tempPictureFile_ ); + hasTempPicture_ = false; + + // Leaving variable 'pictureName' empty, which means no image is selected + } + else + { + // Retrieve the picture's hash + QString msnObjectHash( KMessShared::generateFileHash( tempPictureFile_ ).toBase64() ); + const QString safeMsnObjectHash( msnObjectHash.replace( QRegExp("[^a-zA-Z0-9+=]"), "_" ) ); + + // Save the new display picture with its hash as name, to ensure correct caching + pictureName = msnObjectHash + ".png"; + pictureFolder = QDir( pictureDir_ ); + + // Do not overwrite identical pictures + if( ! pictureFolder.exists( pictureName ) ) + { + if( pictureFolder.rename( tempPictureFile_, pictureName ) ) + { + // The temp picture has now its final name, nothing is left to be removed + hasTempPicture_ = false; + } + else + { + kWarning() << "The display picture file could not be renamed from" << tempPictureFile_ << "to" << pictureName << "."; + } + } + } + + // Set the new picture + 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() ) + { + account->setGuestAccount(false); + } + } + + // If the account is not verified, don't change the nickname. + if( ! account->isVerified() ) + { + newFriendlyName = account->getFriendlyName( STRING_ORIGINAL ); + } + else + { + newFriendlyName = friendlyNameEdit_->text(); + } + + // Update the settings + account->setLoginInformation( handleEdit_->text(), newFriendlyName, passwordEdit_->text() ); + // Switch option "remember password" to true only if also the password is not empty + account->setSavePassword( rememberPasswordCheckBox_->isChecked() && ! account->getPassword().isEmpty() ); + // Switch option "autologin" to true only if the option "save password" is true + account->setUseAutologin( autologinCheckBox_->isChecked() && account->getSavePassword() ); + account->setShowPicture( showPicture ); + + // Update the initial status + switch( initialStatus_->currentIndex() ) + { + case 1: initialStatus = STATUS_AWAY; break; + case 2: initialStatus = STATUS_BE_RIGHT_BACK; break; + case 3: initialStatus = STATUS_BUSY; break; + case 6: initialStatus = STATUS_INVISIBLE; break; + case 5: initialStatus = STATUS_ON_THE_PHONE; break; + case 4: initialStatus = STATUS_OUT_TO_LUNCH; break; + case 0: + default: initialStatus = STATUS_ONLINE; break; + } + account->setInitialStatus( initialStatus ); + + account->setStatusOptions( useIdleTimerCheckBox_->isChecked(), idleTimeSpinBox_->value(), + hideNotificationsWhenBusyCheckBox_->isChecked() ); +} + + + +/** + * The user toggled the remember me option + */ +void AccountPage::rememberMeToggled(bool noGuest) +{ + autologinCheckBox_->setEnabled( noGuest ); + initialStatus_->setEnabled( noGuest ); +} + + + +/* + * Allow the user to select a picture, and convert it to 96x96, then place it in a temp file. + */ +void AccountPage::selectPicture( bool resize, QString picturePath ) +{ + // This code is partially borrowed from Kopete. + + KStandardDirs *dirs = KGlobal::dirs(); + bool isRemoteFile = false; + KUrl filePath; + QString localFilePath; + QImage pictureData; + + // 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 + + const QStringList& kdmDirs( dirs->findDirs( "data", "kdm/pics/users/" ) ); + QDir kdmDir; + int fileCount = 0; + + foreach( const QString& kdmPath, kdmDirs ) + { + kdmDir.setPath( kdmPath ); + const QStringList& pngFiles( kdmDir.entryList( QStringList( "*.png" ) ) ); + + if( pngFiles.size() > fileCount ) + { + fileCount = pngFiles.size(); + startDir = kdmPath; + } + } + } + + filePath = KFileDialog::getImageOpenUrl( startDir, this, i18n( "Display Picture" ) ); + } + else + { + filePath = picturePath; + } + + if( filePath.isEmpty() ) + { + return; + } + + // Save location if the user selected the image. + if( picturePath.isEmpty() ) + { + originalPicturePath_ = filePath.pathOrUrl(); + } + + // Read the path. + if( filePath.isLocalFile() ) + { + localFilePath = filePath.path(); + } + else + { + // File is remote, download it to a local folder + // first because QPixmap doesn't have KIO magic. + // KIO::NetAccess::download fills the localFilePath field. + if( ! KIO::NetAccess::download(filePath, localFilePath, this ) ) + { + KMessageBox::sorry( this, i18n( "Downloading of display picture failed" ), i18n("KMess") ); + return; + } + + isRemoteFile = true; + } + + + // Convert the picture to the correct format. + // We use a temporary filename first and replace the original if you press OK. + pictureData = QImage( localFilePath ); // Load picture data + + // Remove any temporary files + if( isRemoteFile ) + { + KIO::NetAccess::removeTempFile( localFilePath ); + } + + // Allow the user to select a region of the picture + if( resize ) + { + pictureData = KPixmapRegionSelectorDialog::getSelectedImage( QPixmap::fromImage( pictureData ), 96, 96, this ); + } + + // Close the dialog if cancel was clicked + if( pictureData.isNull() ) + { + return; + } + + pictureData = pictureData.scaled( 96, 96, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation ); // Makes smallest edge 96 pixels, preserving aspect ratio + + if( pictureData.width() != 96 || pictureData.height() != 96 ) + { + // Copy the middle part of the picture. + pictureData = pictureData.copy( (pictureData.width() - 96) / 2, // X + (pictureData.height() - 96) / 2, // Y + 96, 96 ); + } + + // Create any missing directories. + QDir dir; + const QFileInfo file( tempPictureFile_ ); + + if( ! dir.mkpath( file.absolutePath() ) ) + { + kWarning() << "Making the account folder failed! Path was" << file.absolutePath(); + } + + if( pictureData.save( tempPictureFile_, "PNG" ) ) + { + // Sucess! Update the preview picture + customPixmap_ = QPixmap( tempPictureFile_ ); + pictureLabel_->setPixmap( customPixmap_ ); + hasTempPicture_ = true; + } + else + { + KMessageBox::sorry( this, + i18n( "An error occurred while trying to change the display picture.\n" + "Make sure that you have selected an existing image file." ), + i18n( "KMess" ) ); + } + + // Signal the update to the settings + forwardSettingsUpdate(); +} + + + +// Slot running when the "Show picture" checkbox was toggled. +void AccountPage::showPictureToggled( bool noPicture ) +{ + browseButton_->setEnabled( ! noPicture ); + pictureLabel_->setEnabled( ! noPicture ); +} + + + +// The user pressed the "Create new account" button +void AccountPage::showRegisterPassport() +{ + // Launch the browser for the given URL + 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 ); +} + + +#include "accountpage.moc" diff --git a/src/settings/accountpage.h b/src/settings/accountpage.h new file mode 100644 index 0000000..72d32b7 --- /dev/null +++ b/src/settings/accountpage.h @@ -0,0 +1,102 @@ +/*************************************************************************** + accountpage.h - description + ------------------- + begin : 03-08-2004 + copyright : (C) 2004 by Madelman + (C) 2006 by Diederik van der Boor + email : mkb137b@hotmail.com + "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 ACCOUNTPAGE_H +#define ACCOUNTPAGE_H + +#include "../account.h" +#include "ui_accountpage.h" + +#include +#include + +class UserPicturesDialog; + +/** + * The main account settings page. + * + * @author Mike K. Bennet, Diederik van der Boor + * @ingroup Settings + */ +class AccountPage : public QWidget, private Ui::AccountPage +{ + Q_OBJECT + + public: + // Constructor + AccountPage( QWidget* parent = 0 ); + // Destructor + virtual ~AccountPage(); + // Return the handle which is currently entered. + const QString getEnteredHandle() const; + // Return the friendly name currently entered + const QString getEnteredFriendlyName() const; + // Request to load the settings + void loadSettings( const 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 + void pictureBrowseSimple(); + // Show the browse dialog to change display picture and then allow the user to crop it + void pictureBrowseResize(); + // Show the browse dialog to view the used user images + void pictureSetPrevious(); + // The user toggled the remember me option + void rememberMeToggled(bool noGuest); + // The user pressed the browse picture button + void selectPicture( bool resize, QString picturePath = QString() ); + // The user togged the show picture checkbox + void showPictureToggled(bool noPicture); + // The user pressed the "Create new account" button + void showRegisterPassport(); + + private: + // The handle of the account + QString myHandle_; + // The picture file of the account + QString pictureFile_; + // The location where display pictures are saved + QString pictureDir_; + // The location for the custom display picture. + QString tempPictureFile_; + // Do we have a custom display picture or not? + bool hasTempPicture_; + // The pixmap for the default kmess icon + QPixmap defaultPixmap_; + // The pixmap for the custom user icon + 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 + void forwardSettingsUpdate(); + + signals: + // Send to the Chat Style page the new account details, to update the preview + void settingsUpdated( const QString &handle, const QString &name, const QString &picture ); +}; + +#endif // ACCOUNTSWIDGET_H diff --git a/src/settings/accountpage.ui b/src/settings/accountpage.ui new file mode 100644 index 0000000..e85d9cf --- /dev/null +++ b/src/settings/accountpage.ui @@ -0,0 +1,706 @@ + + + AccountPage + + + + 0 + 0 + 581 + 494 + + + + Form + + + + + + 0 + + + + Account &Info + + + + + + + + + 0 + 0 + + + + Your Account Information + + + + + + Enter a name other contacts should see when you are connected. + + + &Friendly name: + + + false + + + friendlyNameEdit_ + + + + + + + + + + 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 + + + + QLineEdit::PasswordEchoOnEdit + + + + + + + Click here to have your password saved by KMess + + + If you enable this option, KMess will save your account's password. This way you will not have to enter your password on every start up, in order to log in. Please keep in mind, that other persons that have access to this computer may easily log in to your account, if this option is enabled. + + + &Remember password + + + + + + + + + + + 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 + + + + + + + + + + Enable this option, if you do not want to use a display picture. + + + &Do not use + + + Alt+Y + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + + + + + + <html>The option "Remember account" was left unchecked while logging in, so your settings will not be saved by default. Enable this option if you want to save your account settings permanently on this system. + +It is recommended to enable this option, unless you are using KMess as guest or you are using a public system (e.g. Internet cafe).</html> + + + 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_ + + + + + + + Here you can select which status KMess should set, after logging in. + + + 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 cannot 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 + + + + + + + + + + + + + <html>You need a Passport account to connect to the Live Messenger network. You can register your current email address at register.passport.com or use a Live Mail account to connect.</html> + + + To connect to the Live 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 "Idle" when you are 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 "Idle". + + + Become idle after + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + idleTimeSpinBox_ + + + + + + + Controls the number of minutes before KMess changes the status to "Idle". + + + + + + + Controls the number of minutes before KMess changes the status to "Idle". + + + minutes + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 71 + 20 + + + + + + + + + + + true + + + + <html>This happens because KMess was built without support for the "XScreenSaver" Xorg extension, which is used to detect user activity. Refer to your package manager for more details.</html> + + + Cannot enable auto idle: KMess was built without inactivity detection. + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 17 + 17 + + + + + + + + If enabled, you will not receive any notifications when your status is set to "Busy". + + + &Disable notifications when your status is set to "Busy" + + + + + + + Qt::Vertical + + + + 17 + 317 + + + + + + + + + + + + + KLineEdit + QLineEdit +
    klineedit.h
    +
    + + KPushButton + QPushButton +
    kpushbutton.h
    +
    + + KUrlLabel + QLabel +
    kurllabel.h
    +
    +
    + + + + useIdleTimerCheckBox_ + toggled(bool) + idleTimeSpinBox_ + setEnabled(bool) + + + 226 + 59 + + + 191 + 91 + + + + +
    diff --git a/src/settings/accountsettingsdialog.cpp b/src/settings/accountsettingsdialog.cpp new file mode 100644 index 0000000..edf41f5 --- /dev/null +++ b/src/settings/accountsettingsdialog.cpp @@ -0,0 +1,324 @@ +/*************************************************************************** + accountsettingsdialog.cpp - description + ------------------- + begin : Sat Jan 11 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 "accountsettingsdialog.h" + +#include "../network/chatmessage.h" +#include "../utils/kmessconfig.h" +#include "../accountsmanager.h" +#include "../account.h" +#include "../currentaccount.h" +#include "../emoticonmanager.h" +#include "../kmess.h" +#include "../kmessapplication.h" +#include "../kmessdebug.h" +#include "accountpage.h" +#include "contactlistpage.h" +#include "chatloggingpage.h" +#include "chatstylepage.h" +#include "emoticonspage.h" + +#include +#include + +#include + + + +// Initialize the instance to zero +AccountSettingsDialog* AccountSettingsDialog::instance_(0); + + + +// The constructor +AccountSettingsDialog::AccountSettingsDialog( QWidget *parent ) +: KPageDialog( parent ) +, account_(0) +, initialPage_( PageAccount ) +{ + // Open the config group we'll use throughout the class + config_ = KMessConfig::instance()->getGlobalConfig( "AccountSettingsDialog" ); + + // Set up the dialog box + setObjectName( "AccountSettings" ); + setButtons( Help | Ok | Apply | Cancel | User1 ); + setButtonText( User1, i18n( "&Delete" ) ); + setDefaultButton( Ok ); + setCaption( i18n("Settings") ); + restoreDialogSize( config_ ); + + // Create the widgets that belong in the pages + accountPage_ = new AccountPage(); + contactListPage_ = new ContactListPage(); + chattingPage_ = new ChatStylePage(); + chatLoggingPage_ = new ChatLoggingPage(); + emoticonPage_ = new EmoticonsPage(); + + // Connect the account page signal to update the chatting page preview + connect( accountPage_, SIGNAL( settingsUpdated(const QString&,const QString&,const QString&) ), + chattingPage_, SLOT( updatePreviewDetails(const QString&,const QString&,const QString&) ) ); + + // Add the pages to the dialog and set them up + KPageWidgetItem *page; + + page = addPage( accountPage_, i18n("Account") ); + page->setHeader( i18n( "My Account" ) ); + page->setIcon( KIcon( "user-identity" ) ); + pageWidgets_.insert( PageAccount, page ); + pageWidgets_.insert( PageAccountStatus, 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" ) ); + page->setIcon( KIcon( "emoticons" ) ); + pageWidgets_.insert( PageEmoticons, page ); + pageWidgets_.insert( PageEmoticonsTabCustom, page ); + + page = addPage( chattingPage_, i18n("Chatting") ); + page->setHeader( i18n( "Chatting" ) ); + page->setIcon( KIcon( "format-stroke-color" ) ); // preferences-desktop-color, insert-text? + pageWidgets_.insert( PageChatStyle, page ); + pageWidgets_.insert( PageChatStyleTabText, page ); + + page = addPage( chatLoggingPage_, i18n("Chat Logging") ); + page->setHeader( i18n( "Chat Logging" ) ); + page->setIcon( KIcon( "document-save-as" ) ); + pageWidgets_.insert( PageChatLogging, page ); +} + + + +// The destructor +AccountSettingsDialog::~AccountSettingsDialog() +{ + // Save the window size before deleting it + saveDialogSize( config_ ); + + pageWidgets_.clear(); + + instance_ = 0; + +#ifdef KMESSDEBUG_ACCOUNTSETTINGSDIALOG + kDebug() << "DESTROYED."; +#endif +} + + + +// Load the settings for the given account +void AccountSettingsDialog::loadSettings( Account *account, bool isCurrentAccount, Page initialPage ) +{ + account_ = account; + + if( account == 0 ) + { + kWarning() << "Invalid account given!"; + return; + } + + // Load account information into the widgets + accountPage_ ->loadSettings( account, isCurrentAccount ); + contactListPage_->loadSettings( account ); + chattingPage_ ->loadSettings( account ); + chatLoggingPage_->loadSettings( account ); + emoticonPage_ ->loadSettings( account ); + + // 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 + initialPage_ = initialPage; +} + + + +// Save options before closing. +void AccountSettingsDialog::closeEvent( QCloseEvent *event ) +{ + saveDialogSize( config_ ); + event->accept(); +} + + + +// Return a singleton instance of the settings dialog window +AccountSettingsDialog* AccountSettingsDialog::instance( QWidget *parent ) +{ + // If the instance is null, create a new dialog and return that. + if ( instance_ == 0 ) + { + instance_ = new AccountSettingsDialog( parent ); + } + + return instance_; +} + + + +// Save all widget settings +bool AccountSettingsDialog::saveAccountSettings() +{ + if( account_ == 0 ) + { + return false; + } + + // 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 ) ); + + // Make sure the account handle was changed off the default + if( newHandle.isEmpty() || ! Account::isValidEmail( newHandle ) + || newHandle == i18n( "you@hotmail.com" ) ) + { + KMessageBox::error( 0, i18n( "The email address you have entered is not valid, and cannot be used as an account: '%1'", newHandle ) ); + return false; + } + + // Also verify that the account name is not already listed + if( oldHandle != newHandle + && AccountsManager::instance()->getAccountByHandle( newHandle ) != 0 ) + { + KMessageBox::error( 0, i18n( "The email address you have entered is already in use: '%1'", newHandle ) ); + return false; + } + + if ( accountPage_->getEnteredFriendlyName().trimmed().isEmpty() ) + { + KMessageBox::error( 0, i18n( "Please enter a friendly name for this account." ) ); + setCurrentPage( pageWidgets_.at( PageAccount ) ); + return false; + } + + // Save information from the widgets + accountPage_ ->saveSettings( account_ ); + contactListPage_->saveSettings( account_ ); + chattingPage_ ->saveSettings( account_ ); + chatLoggingPage_->saveSettings( account_ ); + emoticonPage_ ->saveSettings( account_ ); + + // Let the Accounts Manager know the settings have changed. It will also make sure + // that the updated settings get synced to disk. + emit changedSettings( account_, oldHandle, oldFriendlyName ); + + return true; +} + + + +// 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_ == PageEmoticonsTabCustom ) + { + emoticonPage_->switchToTab( 1 ); + } + else if( initialPage_ == PageChatStyleTabText ) + { + chattingPage_->switchToTab( 1 ); + } + else if ( initialPage_ == PageAccountStatus ) + { + accountPage_->switchToTab( 1 ); + } + + initialPage_ = PageNone; +} + + + +// A button has been pressed, act accordingly +void AccountSettingsDialog::slotButtonClicked( int button ) +{ + switch( button ) + { + case KDialog::Ok: + if( ! saveAccountSettings() ) + { + return; + } + + accept(); + break; + + case KDialog::Apply: + saveAccountSettings(); + + // Do not delete the dialog, we still need it + return; + break; + + case KDialog::Cancel: + case KDialog::Close: + reject(); + break; + + case KDialog::User1: + // Delete the account, but first ask the user for confirmation + if( KMessageBox::warningYesNo( this, i18n("Are you sure you want to delete this account?") ) == KMessageBox::Yes ) + { + emit deleteAccount( account_ ); + reject(); + } + else + { + // Do not delete the dialog, we still need it + return; + } + break; + + default: + KDialog::slotButtonClicked( button ); + break; + } + + // Schedule the dialog for deletion, to save memory + deleteLater(); +} + + + +#include "accountsettingsdialog.moc" diff --git a/src/settings/accountsettingsdialog.h b/src/settings/accountsettingsdialog.h new file mode 100644 index 0000000..debd47f --- /dev/null +++ b/src/settings/accountsettingsdialog.h @@ -0,0 +1,115 @@ +/*************************************************************************** + accountsettingsdialog.h - description + ------------------- + begin : Sat Jan 11 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 ACCOUNTSETTINGSDIALOG_H +#define ACCOUNTSETTINGSDIALOG_H + +//#include + +#include + + +// Forward declarations +class Account; +class ContactListPage; +class AccountPage; +class ChatLoggingPage; +class ChatMessage; +class ChatMessageStyle; +class ChatMessageView; +class ChatStylePage; +class EmoticonsPage; + + + +/** + * The account settings dialog. + * + * @author Mike K. Bennett + * @ingroup Settings + */ +class AccountSettingsDialog : public KPageDialog +{ + Q_OBJECT + + public: // Public enumerations + // A list of all the settings tabs, used to switch the dialog to a determined page and tab when needed + enum Page + { + PageNone = -1 /// Used to stop switching pages + , PageAccount = 0 + , PageAccountStatus + , PageContactList + , PageEmoticons + , PageEmoticonsTabCustom + , PageChatStyle + , PageChatStyleTabText + , PageChatLogging + }; + + public: + // The constructor + AccountSettingsDialog( QWidget *parent = 0 ); + // The destructor + ~AccountSettingsDialog(); + // Show the settings dialog for the given account + void loadSettings( Account *account, bool isCurrentAccount, Page initialPage ); + // Return a singleton instance of the settings dialog window + static AccountSettingsDialog *instance( QWidget *parent ); + + private: // Private methods + // Save all widget settings + bool saveAccountSettings(); + // Select the Account page when showing the settings dialog + void showEvent( QShowEvent *event ); + + private slots: // Private slots + // Save the window options before closing. + void closeEvent( QCloseEvent *event ); + // A button has been pressed, act accordingly + void slotButtonClicked( int button ); + + private: // Private attributes + // The account being edited + Account *account_; + // The configuration group from which window size is loaded from and saved to + KConfigGroup config_; + // The widget for entering profile data (handle, name, password). + AccountPage *accountPage_; + // Page widgets of the settings, saved to switch to a determined tab + QList pageWidgets_; + // 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 + ChatLoggingPage *chatLoggingPage_; + // The widget for selecting emoticon styles + EmoticonsPage *emoticonPage_; + // The page where to open the settings dialog at + Page initialPage_; + // The instance of the singleton settings dialog window + static AccountSettingsDialog *instance_; + + signals: + // The settings have been changed + void changedSettings( Account *account, QString oldHandle, QString oldFriendlyName ); + // Request that the given account be deleted + void deleteAccount( Account *account ); +}; + +#endif diff --git a/src/settings/accountsmanagerpage.cpp b/src/settings/accountsmanagerpage.cpp new file mode 100644 index 0000000..e8345e3 --- /dev/null +++ b/src/settings/accountsmanagerpage.cpp @@ -0,0 +1,207 @@ +/*************************************************************************** + emoticonspage.cpp - description + ------------------- + begin : Sat May 3 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 "accountsmanagerpage.h" + +#include "../utils/kmessconfig.h" +#include "../account.h" +#include "../accountsmanager.h" +#include "../currentaccount.h" +#include "../kmess.h" +#include "../kmessapplication.h" +#include "../kmessdebug.h" + +#include + +#include + + + + +/** + * Constructor + * + * @param parent Parent widget + */ +AccountsManagerPage::AccountsManagerPage( QWidget *parent ) +: QWidget(parent) +, Ui::AccountsManagerPage() +{ + // First setup the user interface + 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( 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() ) ); + + readProperties(); +} + + + +/** + * Destructor + */ +AccountsManagerPage::~AccountsManagerPage() +{ +} + + + +/** + * Update the buttons status when accounts get selected + */ +void AccountsManagerPage::accountSelected() +{ + bool hasSelection = ( ! accountsList_->selectedItems().isEmpty() ); + + configureAccountButton_->setEnabled( hasSelection ); + removeAccountButton_ ->setEnabled( hasSelection ); + + // Disallow removal of the currently connected account. + if( hasSelection ) + { + const KMessApplication *kmessApp = static_cast( kapp ); + const QListWidgetItem *selection = accountsList_->selectedItems().first(); + + const QString &handle( selection->data( Qt::UserRole ).toString() ); + + if( kmessApp->getContactListWindow()->isConnected() + && CurrentAccount::instance()->getHandle() == handle ) + { + removeAccountButton_->setEnabled( false ); + } + } +} + + + +/** + * Open the currently selected account's settings + */ +void AccountsManagerPage::configureAccount() +{ + if( accountsList_->selectedItems().isEmpty() ) + { + return; + } + + const QListWidgetItem * selection = accountsList_->selectedItems().first(); + const QString& accountHandle( selection->data( Qt::UserRole ).toString() ); + +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Opening Account Settings for account" << accountHandle << "."; +#endif + + Account *account = accountsManager_->getAccountByHandle( accountHandle ); + accountsManager_->showAccountSettings( account, window() ); +} + + + +/** + * Delete the currently selected account + */ +void AccountsManagerPage::deleteAccount() +{ + if( accountsList_->selectedItems().isEmpty() ) + { + kWarning() << "No account was selected for deletion!"; + return; + } + + const QListWidgetItem *selection = accountsList_->selectedItems().first(); + const QString &handle( selection->data( Qt::UserRole ).toString() ); + + // Prevent deletion of the currently connected account + const 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; + } + + int result = KMessageBox::warningYesNo( + this, + 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(); +} + + + +/** + * Load the settings of the dialog + */ +void AccountsManagerPage::readProperties() +{ + accountsList_->clear(); + const QList& accountsList( AccountsManager::instance()->getAccounts() ); + + foreach( Account *account, accountsList ) + { + const QString text( account->getFriendlyName() + "\n" + account->getHandle() ); + QListWidgetItem *item = new QListWidgetItem( QIcon( account->getPicturePath() ), text, accountsList_ ); + item->setData( Qt::UserRole, account->getHandle() ); + } + + // Update the viewport and the buttons + accountSelected(); +} + + + +/** + * Show the Account Settings dialog for a new account + */ +void AccountsManagerPage::showAddAccountDialog() +{ + accountsManager_->showAccountSettings(); +} + + + +#include "accountsmanagerpage.moc" diff --git a/src/settings/accountsmanagerpage.h b/src/settings/accountsmanagerpage.h new file mode 100644 index 0000000..086b9ff --- /dev/null +++ b/src/settings/accountsmanagerpage.h @@ -0,0 +1,78 @@ +/*************************************************************************** + accountsmanagerpage.h - description + ------------------- + begin : Sat May 3 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 ACCOUNTSMANAGERPAGE_H +#define ACCOUNTSMANAGERPAGE_H + +#include "ui_accountsmanagerpage.h" + +#include + + +// Forward declarations +class AccountsManager; + + + +/** + * Settings page for the various accounts. + * + * @author Valerio Pilo + * @ingroup Settings + */ +class AccountsManagerPage : public QWidget, private Ui::AccountsManagerPage +{ + Q_OBJECT + + + public: // public methods + + // The constructor + AccountsManagerPage( QWidget *parent = 0 ); + // The destructor + virtual ~AccountsManagerPage(); + + + + public slots: + + // Open the currently selected account's settings + void configureAccount(); + // Delete the given account + void deleteAccount(); + // Show the Account Settings dialog for a new account + void showAddAccountDialog(); + + + private slots: + + // Update the buttons status when accounts get selected + void accountSelected(); + // Load the settings of the dialog + void readProperties(); + + + private: // private properties + + AccountsManager *accountsManager_; + + + +}; + +#endif + diff --git a/src/settings/accountsmanagerpage.ui b/src/settings/accountsmanagerpage.ui new file mode 100644 index 0000000..eee7834 --- /dev/null +++ b/src/settings/accountsmanagerpage.ui @@ -0,0 +1,133 @@ + + + AccountsManagerPage + + + + 0 + 0 + 438 + 366 + + + + + 0 + + + + + + 0 + 0 + + + + Saved accounts: + + + false + + + + + + + true + + + QAbstractItemView::SelectRows + + + + 62 + 62 + + + + + 0 + 64 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 170 + 21 + + + + + + + + Click here to create a new KMess account for an email already associated to a Live account + + + &Add Account... + + + Alt+W + + + + + + + false + + + Select an account and click here to modify it + + + &Edit + + + Alt+V + + + + + + + false + + + Select an account and click here to remove it + + + &Remove + + + Alt+V + + + + + + + + + qPixmapFromMimeSource + + + KListWidget + QListWidget +
    klistwidget.h
    +
    +
    + + +
    diff --git a/src/settings/chatloggingpage.cpp b/src/settings/chatloggingpage.cpp new file mode 100644 index 0000000..9bf76d9 --- /dev/null +++ b/src/settings/chatloggingpage.cpp @@ -0,0 +1,138 @@ +/*************************************************************************** + chatloggingpage.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 "chatloggingpage.h" + +#include "../account.h" + +#include + + + +/** + * The constructor + */ +ChatLoggingPage::ChatLoggingPage( QWidget *parent ) +: QWidget( parent ) +, Ui::ChatLoggingPage() +{ + setupUi( this ); + + // Connect our signals + connect( chatSavePathButton_, SIGNAL( clicked() ), + this, SLOT ( chooseDirectory() ) ); + + // Disallow to directly edit the chat logs saving path + chatSavePathEdit_->setReadOnly( true ); +} + + + +/** + * @brief Get a directory from the user + * + * Asks the user for a directory and sets the path widget with the chosen folder + */ +void ChatLoggingPage::chooseDirectory() +{ + // Let the user choose a folder, starting from the previously set path (if any) + const QString& dir( KFileDialog::getExistingDirectory( chatSavePathEdit_->text() ) ); + + if( ! dir.isEmpty() ) + { + chatSavePathEdit_->setText( dir ); + } +} + + + +/** + * @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 ChatLoggingPage::loadSettings( const Account *account ) +{ + 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() ) + { + 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; + } +} + + + +/** + * @brief Save account information from the chat logging 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 ChatLoggingPage::saveSettings( Account *account ) +{ + int directoryStructure = Account::BYMONTH; + + if( singleDirectoryRadioButton_->isChecked() ) + { + directoryStructure = Account::SINGLEDIRECTORY; + } + else if( yearRadioButton_->isChecked() ) + { + directoryStructure = Account::BYYEAR; + } + else if( monthRadioButton_->isChecked() ) + { + directoryStructure = Account::BYMONTH; + } + else if( dayRadioButton_->isChecked() ) + { + directoryStructure = Account::BYDAY; + } + + 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 ); +} + + +#include "chatloggingpage.moc" diff --git a/src/settings/chatloggingpage.h b/src/settings/chatloggingpage.h new file mode 100644 index 0000000..d4bf7e2 --- /dev/null +++ b/src/settings/chatloggingpage.h @@ -0,0 +1,56 @@ +/*************************************************************************** + chatloggingpage.h - 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. * + * * + ***************************************************************************/ + +#ifndef CHATLOGGINGPAGE_H +#define CHATLOGGINGPAGE_H + +#include "ui_chatloggingpage.h" + +#include + + +// Forward class declarations +class Account; + + + +/** + * Setttings page for the alerts settings page. + * + * @ingroup Settings + */ +class ChatLoggingPage : public QWidget, private Ui::ChatLoggingPage +{ + Q_OBJECT + + public: + // Constructor + ChatLoggingPage( 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 ); + + private slots: + // Get a directory from the user + void chooseDirectory(); +}; + + +#endif diff --git a/src/settings/chatloggingpage.ui b/src/settings/chatloggingpage.ui new file mode 100644 index 0000000..2e40c88 --- /dev/null +++ b/src/settings/chatloggingpage.ui @@ -0,0 +1,371 @@ + + + ChatLoggingPage + + + + 0 + 0 + 373 + 362 + + + + + + + Enable this option to have your chats saved for later viewing + + + <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 chat logs 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> + + + Enable chat logging + + + true + + + + + + + If enabled, KMess additionaly saves your chat logs as HTML or plain text files + + + Additionally save chat logs to file + + + false + + + true + + + + + + With this option, you can choose how KMess will save your chats + + + Save chat logs as: + + + yearRadioButton_ + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + <html> +<p>The file format you choose here is important.</p> +<p>Chat logs saved in the HTML format can be easily read in any web browser, but if they are opened on another computer, display pictures and emoticons cannot not be displayed.</p> +<p>Chat logs saved as plain text, on the other side, 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 chat logs within the directory specified below. + + + <html>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.</html> + + + Separate logged chats by: + + + yearRadioButton_ + + + + + + + + 0 + 0 + + + + Create a directory to organize chats by year + + + <html><p>This option tells KMess to divide your chat logs 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.</p> + +<p>A chat had on November 29, 2008 will be saved in your chat logs directory as:</p> +<p>&lt;chat logs directory here&gt;/2008/date-and-contact-name.html</p></html> + + + Year + + + 1 + + + + + + + + 0 + 0 + + + + Create directories to organize chats by year then by month + + + <html><p>This option tells KMess to divide your chat logs 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.</p> +<p>A chat had on November 29, 2008 will be saved in your chat logs directory as:</p> +<p>&lt;chat logs directory here&gt;/2008/11/date-and-contact-name.html</p></html> + + + Year then Month + + + + + + + + 0 + 0 + + + + Create directories to organize chats by year, by month, then by day + + + <html><p>This option tells KMess to divide your chat logs 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.</p> + +<p>A chat had on November 29, 2008 will be saved in your chat logs directory as:</p> +<p>&lt;chat logs directory here&gt;/2008/11/29/date-and-contact-name.html</p></html> + + + Year, Month then Day + + + 1 + + + + + + + Place all saved chat logs directly in the directory specified below + + + This option tells KMess to save all your chat logs in the same folder, without organizing them at all. + + + Do not organize files + + + false + + + 1 + + + + + + + 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 a directory where you would like to save your chat logs. + + + Save chat logs in the following directory: + + + false + + + chatSavePathEdit_ + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + qPixmapFromMimeSource + + logChatsCheckBox_ + 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 new file mode 100644 index 0000000..eeeda09 --- /dev/null +++ b/src/settings/chatstylepage.cpp @@ -0,0 +1,426 @@ +/*************************************************************************** + chatstylepage.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 "chatstylepage.h" + +#include "../chat/chatmessagestyle.h" +#include "../chat/chatmessageview.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include + +#include +#include +#include +#include + + + +/** + * The constructor + */ +ChatStylePage::ChatStylePage( QWidget *parent ) +: QWidget( parent ) +, Ui::ChatStylePage() +{ + setupUi( this ); + + newStylesButton_->setIcon( KIcon( "get-hot-new-stuff" ) ); + + QPixmap pixmap; + const QString& emoticonDir ( CurrentAccount::instance()->getEmoticonStyle() ); + KStandardDirs *dirs = KGlobal::dirs(); + + // Set up the emoticons which explain what the graphics elements in chat are + pixmap.load( dirs->findResource( "emoticons", emoticonDir + "/teeth.png" ) ); + pixmapLabel1_->setPixmap( pixmap ); + pixmap.load( dirs->findResource( "emoticons", emoticonDir + "/rainbow.png" ) ); + pixmapLabel2_->setPixmap( pixmap ); + pixmap.load( dirs->findResource( "emoticons", emoticonDir + "/dog.png" ) ); + pixmapLabel3_->setPixmap( pixmap ); + + // Connect our signals + connect( contactFontColorButton_,SIGNAL( changed(const QColor&) ), + 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() ), + this, SLOT ( fontClicked() ) ); + connect( contactFontButton_, SIGNAL( clicked() ), + this, SLOT ( contactFontClicked() ) ); + connect( chatStyle_, SIGNAL( activated(const QString&) ) , + this, SLOT ( slotChatStyleChanged(const QString&) ) ); + connect( useEmoticonsCheckBox_, SIGNAL( toggled(bool) ), + this, SLOT ( updatePreview() ) ); + connect( useFontEffectsCheckBox_,SIGNAL( toggled(bool) ), + 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 + + // Insert a KHTMLPart in the placeholder + chatMessageView_ = new ChatMessageView( khtmlPlaceholder_ ); + + // Create a layout to maximize the KHTMLPart + 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 + const QString& text( chatStyle_->currentText() ); + + // Remove any previous items, in case they're in + chatStyle_->clear(); + + // Get all available chat styles for the "chatting" widget, avoiding duplicate entries + const QStringList& stylesDirectories( KGlobal::dirs()->findDirs( "data", "kmess/styles" ) ); + + foreach( const QString &dir, stylesDirectories ) + { + const QDir styleDir( dir ); + const QStringList& styles( styleDir.entryList( QDir::Dirs, QDir::Name | QDir::IgnoreCase ) ); + + foreach( const QString &styleName, styles ) + { + // e.g. share/apps/kmess/styles/Demo/Demo.xsl + const QString xslFile( styleDir.path() + '/' + styleName + '/' + styleName + ".xsl" ); + if( QFile::exists( xslFile ) && ( chatStyle_->findText( styleName ) == -1 ) ) + { + chatStyle_->addItem( styleName ); + } + } + } + + // Prepare the XSL transformation + chatStyleTransform_ = chatMessageView_->getStyle(); + + if( ! text.isEmpty() ) + { + chatStyle_->setCurrentIndex( chatStyle_->findText( text, Qt::MatchExactly ) ); + } +} + + + +// 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: if they get + // changed, set the new font to the button + if( ! getFont( contactFont_ ) ) + { + return; + } + + contactFontButton_->setText( contactFont_.family().replace( '&', "&&" ) ); + contactFontButton_->setFont( contactFont_ ); + contactFontButton_->setShortcut( QKeySequence() ); + + // Update the preview + chatStyleTransform_->setContactFont( contactFont_ ); + updatePreview(); +} + + + +// 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: if they get + // changed, set the new font to the button + if( ! getFont( userFont_ ) ) + { + 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(); +} + + + +// Get a font and cleaned-up font family from a dialog +bool ChatStylePage::getFont( QFont &font ) const +{ + bool accepted; + int result; + QFont selection = font; + + result = KFontDialog::getFont( selection ); + accepted = ( result == KFontDialog::Accepted ); + + if ( accepted ) + { + font = selection; + } + + return accepted; +} + + + +/** + * @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 ChatStylePage::loadSettings( const Account *account ) +{ + userFont_ = account->getFont(); + contactFont_ = account->getContactFont(); + userColor_ .setNamedColor( account->getFontColor() ); + contactColor_.setNamedColor( account->getContactFontColor() ); + + fontButton_->setText( userFont_.family().replace( '&', "&&" ) ); + fontButton_->setFont( userFont_ ); + fontButton_->setShortcut( QKeySequence() ); + fontColorButton_->setColor( userColor_ ); + + contactFontButton_->setText( contactFont_.family().replace( '&', "&&" ) ); + contactFontButton_->setFont( contactFont_ ); + contactFontButton_->setShortcut( QKeySequence() ); + 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() ); + 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 ); + if( item == -1 ) + { + kWarning() << "Current chat style was not found, attempting to revert to the default setting."; + item = chatStyle_->findText( "Default", Qt::MatchExactly | Qt::MatchCaseSensitive ); + } + + if( item != -1 ) + { + chatStyle_->setCurrentIndex( item ); + slotChatStyleChanged( chatStyle_->currentText() ); + } + + // Also load contact font settings into the chatStyle object, + // other settings are set in updatePreview() + chatStyleTransform_->setContactFont( contactFont_ ); + chatStyleTransform_->setContactFontColor( contactColor_.name() ); +} + + + +/** + * @brief Save account information from the chat style 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 ChatStylePage::saveSettings( Account *account ) +{ + account->setChatInformation( useContactFontCheckBox_->isChecked(), + useEmoticonsCheckBox_->isChecked(), + showWinksCheckBox_->isChecked(), + useFontEffectsCheckBox_->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( userFont_, userColor_ .name(), + contactFont_, contactColor_.name() ); +} + + + +// The chat style was changed. +void ChatStylePage::slotChatStyleChanged(const QString &style) +{ + // Update the chat style object + chatStyleTransform_->setStyle( style ); + + // Update the preview + updatePreview(); +} + + + +// 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() ) + { + kWarning() << "Invalid tab index" << tabIndex << "selected!"; + return; + } + + tabWidget_->setCurrentIndex( tabIndex ); +} + + + +// Update the chat style preview +void ChatStylePage::updatePreview() +{ + if( chatStyleTransform_ == 0 || ! chatStyleTransform_->hasStyle() ) + { + // Don't bother updating the preview for every event fired by the load...Settings() methods. + return; + } + + // Update the boolean settings (other settings are updated in their slots) + 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_, 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_, userFont_, userColor_.name() ); + + // Remove any old chat samples + chatMessageView_->clearView( true ); + + // Display the sample chat + 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 ) +{ + previewHandle_ = handle; + previewPicture_ = picture; + + previewUsername_ = ( name.isEmpty() ? handle : name ); +} + + + +// Enable or disable the contact font and color selectors +void ChatStylePage::useContactFontToggled( bool checked ) +{ + // Enable/disable buttons + contactFontButton_->setEnabled( checked ); + contactFontColorButton_->setEnabled( checked ); + + // Update preview + chatStyleTransform_->setUseContactFont( checked ); + updatePreview(); +} + + + +// 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 new file mode 100644 index 0000000..5f32f60 --- /dev/null +++ b/src/settings/chatstylepage.h @@ -0,0 +1,108 @@ +/*************************************************************************** + chatstylepage.h - 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. * + * * + ***************************************************************************/ + +#ifndef CHATSTYLEPAGE_H +#define CHATSTYLEPAGE_H + +#include "ui_chatstylepage.h" + +#include +#include +#include + + +// Forward class declarations +class Account; +class ChatMessageStyle; +class ChatMessageView; + + + +/** + * Setttings page for the alerts settings page. + * + * @ingroup Settings + */ +class ChatStylePage : public QWidget, private Ui::ChatStylePage +{ + Q_OBJECT + + public: + // Constructor + ChatStylePage( QWidget* parent = 0 ); + // Destructor + ~ChatStylePage(); + + 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: // Private methods + // Get a font and cleaned-up font family from a dialog + bool getFont( QFont &font ) const; + + public slots: + // Update the data shown in the message preview + 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. + void contactFontClicked(); + // The font button was pressed. Show a font dialog to get a new font. + 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_; + // Color used for user messages + QColor userColor_; + // Font used for user messages + QFont userFont_; +}; + + +#endif diff --git a/src/settings/chatstylepage.ui b/src/settings/chatstylepage.ui new file mode 100644 index 0000000..6bda443 --- /dev/null +++ b/src/settings/chatstylepage.ui @@ -0,0 +1,756 @@ + + + ChatStylePage + + + + 0 + 0 + 530 + 412 + + + + + + + + 0 + + + + + 0 + + + + St&yle + + + + + + QLayout::SetMinimumSize + + + + + Allows you to change the theme KMess uses to display all chat messages. + + + &Chat style: + + + false + + + chatStyle_ + + + + + + + + 200 + 0 + + + + + + + + Get &New Styles... + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 211 + 20 + + + + + + + + + + + 0 + 0 + + + + + 0 + 100 + + + + + 16777215 + 300 + + + + false + + + QFrame::NoFrame + + + QFrame::Plain + + + + + + + Chat Settings + + + + + + + + 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 + + + + + + + + + + Enables the appearance of winks in the chat window. + + + If enabled, winks you send or receive will be displayed in the chat window. Please note that in order to use this feature, you need to have a working Flash-plugin installed. + + + Show &winks + + + + + + + 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 + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 16 + 16 + + + + + + + + false + + + Show &date + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 16 + 16 + + + + + + + + false + + + Show s&econds + + + + + + + + + + + + + &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 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 16 + + + + + + + + This option allows you to override the font style and color of your contacts' messages with the chosen font style and color below. + + + &Force messages from your contacts to use this font: + + + + + + + + + + 250 + 0 + + + + + + + + + + + + 0 + 0 + + + + + 80 + 32767 + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 331 + 20 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 16 + + + + + + + + Chat Window Formatting + + + + + + <html>Enables the use of font effects. Typing *bold*, /italic/, and _underline_ causes those words to appear in a bold, italic or underlined font respectively.</html> + + + Use font &effects in messages, like *bold*, /italic/, and _underline_ + + + Alt+E + + + + + + + <html>Enables the use of "Messenger Plus!" formattings in the chat window. For example, [b]this text[/b] will be replaced with <b>this text</b>.</html> + + + Enable "Messenger Plus!" formatting + + + + + + + + + + Qt::Vertical + + + + 16 + 16 + + + + + + + + + &Behavior + + + + + + <qt><p>When contacts would like to have your attention they can send you 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>Even if 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 this option is enabled, your own display picture will be shown in the contacts panel, along with the pictures of the contacts in that chat. + + + Display your own &display picture in the chat window + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 16 + 16 + + + + + + + + + + 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 + + + + + + + + + + + + + KColorButton + QPushButton +
    kcolorbutton.h
    +
    + + KPushButton + QPushButton +
    kpushbutton.h
    +
    +
    + + chatStyle_ + useEmoticonsCheckBox_ + groupFollowupCheckbox_ + fontButton_ + fontColorButton_ + useContactFontCheckBox_ + contactFontButton_ + contactFontColorButton_ + + + + + 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/contactlistpage.h b/src/settings/contactlistpage.h new file mode 100644 index 0000000..db5d5dd --- /dev/null +++ b/src/settings/contactlistpage.h @@ -0,0 +1,53 @@ +/*************************************************************************** + contactlistpage.h - 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. * + * * + ***************************************************************************/ + +#ifndef CONTACTLISTPAGE_H +#define CONTACTLISTPAGE_H + +#include "ui_contactlistpage.h" + +#include + + +// Forward class declarations +class Account; + + + +/** + * Setttings page for the contact list settings. + * + * @ingroup Settings + * @author Andrea Decorte + */ +class ContactListPage : public QWidget, private Ui::ContactListPage +{ + Q_OBJECT + + public: + // Constructor + 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 ); +}; + + +#endif diff --git a/src/settings/contactlistpage.ui b/src/settings/contactlistpage.ui new file mode 100644 index 0000000..768abdc --- /dev/null +++ b/src/settings/contactlistpage.ui @@ -0,0 +1,108 @@ + + + ContactListPage + + + + 0 + 0 + 536 + 250 + + + + + + + Display Options + + + + + + If enabled, a notification is shown when an email message is received in your inbox. The number of unread email messages is shown above the contact list. This option is only available for Live Mail accounts. + + + Display a count of &unread mail + + + + + + + If enabled, your contacts can see which song you are listening to. This information is retrieved from the currently active media player. + + + Show contacts w&hich song I am listening to + + + Alt+H + + + + + + + If enabled, the KMess logo will be displayed in the background of the contact list. + + + Show background &image + + + Alt+H + + + + + + + + + + List Formatting + + + + + + <html>Enables the use of "Messenger Plus!" formattings in the chat window. For example, [b]this text[/b] will be replaced with <b>this text</b>.</html> + + + Enable "Messenger &Plus!" formatting + + + + + + + Show the &email address of contacts instead of their friendly name + + + + + + + + + + Qt::Vertical + + + + 16 + 16 + + + + + + + + qPixmapFromMimeSource + + showEmailInfoCheckBox_ + nowListeningCheckBox_ + + + + diff --git a/src/settings/emoticonspage.cpp b/src/settings/emoticonspage.cpp new file mode 100644 index 0000000..fd6501d --- /dev/null +++ b/src/settings/emoticonspage.cpp @@ -0,0 +1,428 @@ +/*************************************************************************** + emoticonspage.cpp - description + ------------------- + begin : Sun Dev 11 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 "emoticonspage.h" + +#include "../dialogs/addemoticondialog.h" +#include "../currentaccount.h" +#include "../emoticonmanager.h" +#include "../kmessdebug.h" + +#include +#include +#include + +#include +#include + + +#ifdef KMESSDEBUG_EMOTICONS + #define KMESSDEBUG_EMOTICONS_SETTINGS +#endif + + + +/** + * Constructor + * + * @param parent Parent widget + */ +EmoticonsPage::EmoticonsPage( QWidget* parent ) + : QWidget(parent) + , Ui::EmoticonsPage() + , emoticonTheme_(0) +{ + // First setup the user interface + setupUi( this ); + + // Connect the signals we'll need for the Custom Emoticons tab + connect( addEmoticonButton_, SIGNAL( clicked() ), + this, SLOT( showAddEmoticonDialog() ) ); + connect( renameEmoticonButton_, SIGNAL( clicked() ), + this, SLOT( renameCustomEmoticon() ) ); + connect( removeEmoticonButton_, SIGNAL( clicked() ), + this, SLOT( removeCustomEmoticon() ) ); + connect( customEmoticonsView_, SIGNAL( itemActivated(QListWidgetItem*) ), + this, SLOT( renameCustomEmoticon() ) ); + connect( customEmoticonsView_, SIGNAL( itemChanged(QListWidgetItem*) ), + this, SLOT( customEmoticonRenamed(QListWidgetItem*) ) ); + connect( customEmoticonsView_, SIGNAL( itemSelectionChanged() ), + this, SLOT( customEmoticonSelected() ) ); + + // the other properties of the widget are initialized + // in the loadSettings() method +} + + + +/** + * Destructor + */ +EmoticonsPage::~EmoticonsPage() +{ + if( emoticonTheme_ != 0 ) + { +#ifdef KMESSDEBUG_EMOTICONS_SETTINGS + kDebug() << "Deleting temporary theme."; +#endif + delete emoticonTheme_; + } +} + + + +/** + * Rename the currently selected custom emoticon + * + * @param item The changed item + */ +void EmoticonsPage::customEmoticonRenamed( QListWidgetItem *item ) +{ + QString newName( item->text() ); + +#ifdef KMESSDEBUG_EMOTICONS_SETTINGS + kDebug() << "Renaming emoticon '" << renamedItemName_ << "' to '" << newName << "'"; +#endif + + // Do nothing if the name ain't changed, or there is no old name (when creating the list) + if( renamedItemName_.isEmpty() || newName.isEmpty() || renamedItemName_ == newName ) + { + // Restore the original name if needed + if( newName.isEmpty() ) + { + item->setText( renamedItemName_ ); + } + + return; + } + + // 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 + int result; + if( emoticonTheme_->getEmoticon( newName )->isValid() ) + { + result = KMessageBox::questionYesNo( this, + i18n( "The emoticon \"%1\" already exists. Do you want to replace it?", newName ), + i18nc( "Dialog box title", "Replace Existing Emoticon" ) + ); + } + else + { + result = KMessageBox::Yes; + } + + // The user doesn't want to overwrite the emoticon, cancel the operation + if( result != KMessageBox::Yes ) + { + item->setText( renamedItemName_ ); + renamedItemName_ = QString(); + return; + } + else + { + emoticonTheme_->removeEmoticon( newName ); + } + } + + // If no other emoticons with that shortcut exist, update the name + emoticonTheme_->renameEmoticon( renamedItemName_, newName ); + + // Reset the old name for future rename operations + renamedItemName_ = QString(); + + // Update the viewport and the buttons + customEmoticonSelected(); +} + + + +/** + * Update the Remove Button status when emoticons get selected + */ +void EmoticonsPage::customEmoticonSelected() +{ + bool hasSelection = ( ! customEmoticonsView_->selectedItems().isEmpty() ); + + renameEmoticonButton_->setEnabled( hasSelection ); + removeEmoticonButton_->setEnabled( hasSelection ); + + // Clear the variable controlling the item rename logic + renamedItemName_ = QString(); +} + + + +/** + * Load the settings of the dialog + * + * @param account Account instance which settings will be loaded + */ +void EmoticonsPage::loadSettings( const Account *account ) +{ + accountHandle_ = account->getHandle(); + +#ifdef KMESSDEBUG_EMOTICONS_SETTINGS + kDebug() << "Loading emoticon settings for account " << accountHandle_ << " - Current is " << accountHandle_ << " ."; +#endif + + // Read the settings and set current emoticons + emoticonStyle_ = account->getEmoticonStyle(); + + emoticonTheme_ = new EmoticonTheme(); + emoticonTheme_->loadTheme( accountHandle_, true ); + + // Update the emoticon themes widget + updateThemesList(); + + // Update the custom emoticons widget + updateCustomEmoticonView(); + +#ifdef KMESSDEBUG_EMOTICONS_SETTINGS + kDebug() << "Done!"; +#endif +} + + + +/** + * Delete the selected custom emoticon from the theme and the view + */ +void EmoticonsPage::removeCustomEmoticon() +{ + const QList& selectedItems( customEmoticonsView_->selectedItems() ); + + if( selectedItems.isEmpty() ) + { + return; + } + + const 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 ) + { + // Safe, takeItem() returns 0 on failure + delete customEmoticonsView_->takeItem( itemRow ); + + // Forcibly update the buttons status to disable the rename&remove buttons + customEmoticonSelected(); + } +} + + + +/** + * Starts in-place renaming of the selected custom emoticon + */ +void EmoticonsPage::renameCustomEmoticon() +{ + QListWidgetItem *item = customEmoticonsView_->currentItem(); + + if( item == 0 ) + { + return; + } + + // Save the current shortcut of the emoticon, so that we'll know what the + // original shortcut was when the user renames it + renamedItemName_ = item->text(); + + // Temporarily set the item as editable + item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable ); + + customEmoticonsView_->setFocus(); + customEmoticonsView_->editItem( item ); + + // Remove its "Editable" flag + item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled ); +} + + + +/** + * Save the settings to the account object + * + * @param account Account instance which settings will be saved + */ +void EmoticonsPage::saveSettings( Account *account ) +{ + // Save the changes we've made + emoticonTheme_->saveTheme(); + + // Enable emoticon styles only if there's one selected (the list may be empty) + if( emoticonThemesList_->currentItem() ) + { + account->setEmoticonStyle( emoticonThemesList_->currentItem()->text() ); + } + else + { + account->setEmoticonStyle( QString() ); + } + + // Apply the changes to the current account, too + if( accountHandle_ == CurrentAccount::instance()->getHandle() ) + { + EmoticonManager::instance()->replaceCustomTheme( emoticonTheme_ ); + } +} + + + +/** + * Show the Add New Emoticon dialog to create a new custom emoticon + */ +void EmoticonsPage::showAddEmoticonDialog() +{ + AddEmoticonDialog *dialog = new AddEmoticonDialog( emoticonTheme_, this ); + + connect( dialog, SIGNAL( addedEmoticon(QString) ), + this, SLOT( updateCustomEmoticonView() ) ); +} + + + +// Force the page onto a specific tab +void EmoticonsPage::switchToTab( int tabIndex ) +{ + if( ( tabIndex < 0 ) || tabIndex > tabWidget_->count() ) + { + kWarning() << "Invalid tab index" << tabIndex << "selected!"; + return; + } + + tabWidget_->setCurrentIndex( tabIndex ); +} + + + +/** + * Fill the widget which contains all the user's custom emoticons + */ +void EmoticonsPage::updateCustomEmoticonView() +{ + QListWidgetItem *item; + + customEmoticonsView_->clear(); + + // Add all emoticons to the list + const QList& emoticons( emoticonTheme_->getEmoticons() ); + foreach( Emoticon *emoticon, emoticons ) + { + if( ! emoticon->isValid() ) + { + continue; + } + + item = new QListWidgetItem( QIcon( emoticon->getPicturePath() ), emoticon->getShortcut(), customEmoticonsView_ ); + item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled ); + } + + // Force an update of the view's buttons + customEmoticonSelected(); +} + + + +/** + * Initialize the standard emoticon theme chooser + */ +void EmoticonsPage::updateThemesList() +{ + emoticonThemesList_->clear(); + + // Browse all emoticon dirs, to get all emoticons + const QStringList& themesDirs( KGlobal::dirs()->findDirs("emoticons", "") ); + +#ifdef KMESSDEBUG_EMOTICONS_SETTINGS + kDebug() << "Theme dirs: " << themesDirs; +#endif + + QDir themesDir; + foreach( const QString& themesPath, themesDirs ) + { + // Browse for all themes in the emoticon dir + themesDir.setPath( themesPath ); + + // Grep all themes in current dir + const QStringList& themes( themesDir.entryList( QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::IgnoreCase ) ); + + foreach( const QString& themePath, themes ) + { +#ifdef KMESSDEBUG_EMOTICONS_SETTINGS + kDebug() << "Folder: " << themesPath << " - Theme: " << themePath; +#endif + // Add the theme to the list, using the directory name; its first valid emoticon is used as a preview + const QPixmap previewPixmap( EmoticonTheme::getThemeIcon( themesPath + themePath ) ); + new QListWidgetItem( previewPixmap, themePath, emoticonThemesList_ ); + } + } + + // Highlight the selected emoticon + QListWidgetItem* item = 0; + QList items( emoticonThemesList_->findItems( emoticonStyle_, Qt::MatchExactly | Qt::MatchCaseSensitive ) ); + + if( items.isEmpty() ) + { + kWarning() << "Current emoticon style was not found, attempting to revert to the default setting."; + items = emoticonThemesList_->findItems( "KMess-new", Qt::MatchExactly | Qt::MatchCaseSensitive ); + } + else + { + item = items.first(); + } + + // If there is an item, select it + if( item != 0 ) + { + emoticonThemesList_->setCurrentItem( item ); + } + else + { + // select the first item otherwise + emoticonThemesList_->setCurrentRow( 0 ); + } +} + + + +#include "emoticonspage.moc" diff --git a/kmess/settings/emoticonwidget.h b/src/settings/emoticonspage.h similarity index 80% rename from kmess/settings/emoticonwidget.h rename to src/settings/emoticonspage.h index 77c9cd9..58274c9 100644 --- a/kmess/settings/emoticonwidget.h +++ b/src/settings/emoticonspage.h @@ -1,5 +1,5 @@ /*************************************************************************** - emoticonwidget.h - description + emoticonspage.h - description ------------------- begin : Sun Dev 11 2005 copyright : (C) 2005 by Diederik van der Boor @@ -15,16 +15,20 @@ * * ***************************************************************************/ +#ifndef EMOTICONSPAGE_H +#define EMOTICONSPAGE_H -#ifndef EMOTICONWIDGET_H -#define EMOTICONWIDGET_H +#include "ui_emoticonspage.h" -#include "emoticonwidgetinterface.h" +// Forward declarations class Account; class EmoticonManager; class EmoticonTheme; -class QIconViewItem; + +class QListWidgetItem; + + /** * @brief Allows to choose a standard emoticon theme, and to organize custom emoticons @@ -34,21 +38,24 @@ class QIconViewItem; * will overwrite the current set; otherwise it'll get destroyed. * * @author Diederik Van Der Boor, Valerio Pilo + * @ingroup Settings */ -class EmoticonWidget : public EmoticonWidgetInterface +class EmoticonsPage : public QWidget, private Ui::EmoticonsPage { Q_OBJECT public: // public methods // The constructor - EmoticonWidget( QWidget* parent = 0, const char* name = 0 ); + EmoticonsPage( QWidget* parent = 0 ); // The destructor - ~EmoticonWidget(); + virtual ~EmoticonsPage(); // Load the settings of the dialog - void loadSettings( Account *account ); + void loadSettings( const Account *account ); // Save the settings to the account object void saveSettings( Account *account ); + // Force the page onto a specific tab + void switchToTab( int tabIndex ); private: // private methods // Initialize the standard emoticon theme chooser @@ -56,7 +63,7 @@ class EmoticonWidget : public EmoticonWidgetInterface private slots: // Rename the currently selected custom emoticon - void customEmoticonRenamed( QIconViewItem *item ); + void customEmoticonRenamed( QListWidgetItem *item ); // Update the Remove Button status when emoticons get selected void customEmoticonSelected(); // Delete the selected custom emoticon from the theme and the view @@ -75,6 +82,8 @@ class EmoticonWidget : public EmoticonWidgetInterface EmoticonTheme *emoticonTheme_; // Selected emoticon style name QString emoticonStyle_; + // Old name of renamed emoticons + QString renamedItemName_; }; #endif diff --git a/src/settings/emoticonspage.ui b/src/settings/emoticonspage.ui new file mode 100644 index 0000000..85d67e1 --- /dev/null +++ b/src/settings/emoticonspage.ui @@ -0,0 +1,233 @@ + + + EmoticonsPage + + + + 0 + 0 + 509 + 440 + + + + + 0 + + + + + 0 + + + + &Emoticon Themes + + + + + + + 0 + 0 + + + + Available emoticon themes: + + + false + + + + + + + true + + + QAbstractItemView::SelectRows + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + + &Custom Emoticons + + + + + + Available custom emoticons: + + + 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 + + + + + + + + Click here to add a new custom emoticon + + + Add Ne&w... + + + Alt+W + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 12 + 12 + + + + + + + + false + + + Click here to rename the selected emoticon + + + Re&name + + + Alt+N + + + + + + + false + + + Click here to remove the selected emoticon + + + Remo&ve + + + Alt+V + + + + + + + + + + + + + qPixmapFromMimeSource + + + KListWidget + QListWidget +
    klistwidget.h
    +
    +
    + + +
    diff --git a/src/settings/globalsettingsdialog.cpp b/src/settings/globalsettingsdialog.cpp new file mode 100644 index 0000000..38ac98c --- /dev/null +++ b/src/settings/globalsettingsdialog.cpp @@ -0,0 +1,180 @@ +/*************************************************************************** + globalsettingsdialog.cpp - description + ------------------- + begin : Sat Apr 3 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 "globalsettingsdialog.h" + +#include "../utils/kmessconfig.h" +#include "../kmessdebug.h" +#include "accountsmanagerpage.h" +#include "miscellaneouspage.h" + +#include +#include + + + +// Initialize the instance to zero +GlobalSettingsDialog* GlobalSettingsDialog::instance_(0); + + + +// The constructor +GlobalSettingsDialog::GlobalSettingsDialog( QWidget *parent ) +: KPageDialog( parent ) +{ + // Open the config group we'll use throughout the class + config_ = KMessConfig::instance()->getGlobalConfig( "GlobalSettingsDialog" ); + + // Set up the dialog box + setObjectName( "GlobalSettings" ); + setButtons( Help | Ok | Apply | Cancel ); + setDefaultButton( Ok ); + setCaption( i18n("KMess Settings") ); + restoreDialogSize( config_ ); + + // Create the widgets that belong in the pages + accountsManagerPage_ = new AccountsManagerPage(); + notificationPage_ = new KNotifyConfigWidget( this ); + notificationPage_->setApplication( "kmess" ); + miscellaneousPage_ = new MiscellaneousPage(); + + // Add the pages to the dialog and set them up + KPageWidgetItem *page; + + page = addPage( accountsManagerPage_, i18n("Accounts") ); + page->setHeader( i18n( "Accounts" ) ); + page->setIcon( KIcon( "system-users" ) ); + + page = addPage( notificationPage_, i18n( "Notifications" ) ); + page->setIcon( KIcon( "text-speak" ) ); + page->setHeader( i18n( "Notifications" ) ); + + page = addPage( miscellaneousPage_, i18n("Settings") ); + page->setHeader( i18n( "Settings" ) ); + page->setIcon( KIcon( "configure" ) ); + + // Let all the tabs load their settings + loadSettings(); +} + + + +// The destructor +GlobalSettingsDialog::~GlobalSettingsDialog() +{ + // Save the window size before deleting it + saveDialogSize( config_ ); + + instance_ = 0; + +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "DESTROYED."; +#endif +} + + + +// Save options before closing. +void GlobalSettingsDialog::closeEvent( QCloseEvent *event ) +{ + saveDialogSize( config_ ); + event->accept(); +} + + + +// Return a singleton instance of the settings dialog window +GlobalSettingsDialog* GlobalSettingsDialog::instance( QWidget *parent ) +{ + // If the instance is null, create a new dialog and return that. + if ( instance_ == 0 ) + { + instance_ = new GlobalSettingsDialog( parent ); + } + + return instance_; +} + + + +// Load the settings to all tabs +void GlobalSettingsDialog::loadSettings() +{ + const KConfigGroup& group( KMessConfig::instance()->getGlobalConfig( "General" ) ); + + miscellaneousPage_->loadSettings( group ); +} + + + +// Save the settings from all tabs +bool GlobalSettingsDialog::saveSettings() +{ + KConfigGroup group( KMessConfig::instance()->getGlobalConfig( "General" ) ); + + if( ! miscellaneousPage_->saveSettings( group ) ) + { + return false; + } + + notificationPage_ ->save(); + + // Force the saving to be sure the KMessShared Class gets the correct options + group.sync(); + + return true; +} + + + +// A button has been pressed, act accordingly +void GlobalSettingsDialog::slotButtonClicked( int button ) +{ + switch( button ) + { + case KDialog::Ok: + if( ! saveSettings() ) + { + return; + } + + accept(); + break; + + case KDialog::Apply: + saveSettings(); + + // Do not delete the dialog, we still need it + return; + break; + + case KDialog::Cancel: + case KDialog::Close: + reject(); + break; + + default: + KDialog::slotButtonClicked( button ); + break; + } + + // Schedule the dialog for deletion, to save memory + deleteLater(); +} + + +#include "globalsettingsdialog.moc" diff --git a/src/settings/globalsettingsdialog.h b/src/settings/globalsettingsdialog.h new file mode 100644 index 0000000..b094928 --- /dev/null +++ b/src/settings/globalsettingsdialog.h @@ -0,0 +1,77 @@ +/*************************************************************************** + globalsettingsdialog.h - description + ------------------- + begin : Sat Apr 3 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 GLOBALSETTINGSDIALOG_H +#define GLOBALSETTINGSDIALOG_H + +#include +#include + + +// Forward declarations +class AccountsManagerPage; +class MiscellaneousPage; + +class KConfigGroup; + + + +/** + * @author Valerio Pilo + * @ingroup Settings + */ +class GlobalSettingsDialog : public KPageDialog +{ + Q_OBJECT + + public: + // The constructor + GlobalSettingsDialog( QWidget *parent = 0 ); + // The destructor + ~GlobalSettingsDialog(); + // Return a singleton instance of the settings dialog window + static GlobalSettingsDialog *instance( QWidget *parent = 0 ); + + private slots: // Private slots + // Save the window options before closing. + void closeEvent( QCloseEvent *event ); + // Load the settings to all tabs + void loadSettings(); + // Save the settings from all tabs + bool saveSettings(); + // A button has been pressed, act accordingly + void slotButtonClicked( int button ); + + private: // Private attributes + // The configuration group from which window size is loaded from and saved to + KConfigGroup config_; + // The page where to manage the saved MSN accounts + AccountsManagerPage *accountsManagerPage_; + // The page where to manage the miscellaneous settings + MiscellaneousPage *miscellaneousPage_; + // The page where to manage the notification settings + KNotifyConfigWidget *notificationPage_; + // The instance of the singleton settings dialog window + static GlobalSettingsDialog *instance_; + + signals: + // The settings have been changed + void changedGlobalSettings(); + +}; + +#endif diff --git a/src/settings/miscellaneouspage.cpp b/src/settings/miscellaneouspage.cpp new file mode 100644 index 0000000..c37c998 --- /dev/null +++ b/src/settings/miscellaneouspage.cpp @@ -0,0 +1,416 @@ +/*************************************************************************** + miscellaneouspage.h - description + ------------------- + begin : Sat May 3 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 "miscellaneouspage.h" +#include "kmessdebug.h" + +#include +#include +#include +#include +#include +#include + + + +/** + * Constructor + * + * @param parent Parent widget + */ +MiscellaneousPage::MiscellaneousPage( QWidget *parent ) +: QWidget(parent) +{ + // First setup the user interface + setupUi( this ); + + // Connect the radio buttons signals + connect( useListedBrowserRadio_, SIGNAL( toggled(bool) ), browsersCombo_, SLOT( setEnabled(bool) ) ); + connect( useCustomBrowserRadio_, SIGNAL( toggled(bool) ), customBrowserEdit_, SLOT( setEnabled(bool) ) ); + connect( useCustomBrowserRadio_, SIGNAL( toggled(bool) ), customBrowserInfo_, SLOT( setEnabled(bool) ) ); + connect( useListedMailClientRadio_, SIGNAL( toggled(bool) ), mailClientsCombo_, SLOT( setEnabled(bool) ) ); + connect( useCustomMailClientRadio_, SIGNAL( toggled(bool) ), customMailClientEdit_, SLOT( setEnabled(bool) ) ); + connect( useCustomMailClientRadio_, SIGNAL( toggled(bool) ), customMailClientInfo_, SLOT( setEnabled(bool) ) ); + connect( lowestTransferPort_, SIGNAL( valueChanged(int) ), this, SLOT( checkPortsInterval() ) ); + connect( highestTransferPort_, SIGNAL( valueChanged(int) ), this, SLOT( checkPortsInterval() ) ); + + // Prepare and browse the list of available browsers + const KService::List browserServices = KMimeTypeTrader::self()->query( "text/html", "Application" ); + for( KService::List::ConstIterator it = browserServices.begin() ; it != browserServices.end() ; ++it ) + { + KService::Ptr servicePointer = *it; + KService *service = servicePointer.data(); + + // This application isn't valid or is already listed + if( ! service || browsersCombo_->findData( QVariant( service->exec() ) ) != -1 ) + { + continue; + } + +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Adding browser to list:" << service->name() << " -> " << service->exec(); +#endif + browsersCombo_->addItem( KIcon( service->icon() ), service->name(), QVariant( service->exec() ) ); + } + + if( browsersCombo_->count() == 0 ) + { + useCustomBrowserRadio_->setChecked( true ); + useListedBrowserRadio_->setEnabled( false ); + browsersCombo_->addItem( i18n("No selectable web browsers detected.") ); + browsersCombo_->setEnabled( false ); + } + + // Prepare and browse the list of available email clients + const KService::List mailServices = KMimeTypeTrader::self()->query( "application/x-mimearchive", "Application" ); + for( KService::List::ConstIterator it = mailServices.begin() ; it != mailServices.end() ; ++it ) + { + KService::Ptr servicePointer = *it; + KService *service = servicePointer.data(); + + // This application isn't valid or is already listed + if( ! service || mailClientsCombo_->findData( QVariant( service->exec() ) ) != -1 ) + { + continue; + } + +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Adding mail client to list:" << service->name() << " -> " << service->exec(); +#endif + mailClientsCombo_->addItem( KIcon( service->icon() ), service->name(), QVariant( service->exec() ) ); + } + + if( mailClientsCombo_->count() == 0 ) + { + useCustomMailClientRadio_->setChecked( true ); + useCustomMailClientRadio_->setEnabled( false ); + mailClientsCombo_->addItem( i18n("No selectable email clients detected.") ); + mailClientsCombo_->setEnabled( false ); + } + + // Prepare and connect the directory selection button + chooseDirButton_->setIcon( KIcon( "folder-open" ) ); + connect( chooseDirButton_, SIGNAL( clicked() ), this, SLOT( slotChooseDirectory() ) ); + + // Make the directory selection friendlier + KUrlCompletion *dirCompletion = new KUrlCompletion( KUrlCompletion::DirCompletion ); + dirCompletion->setParent( this ); + receivedFilesDirEdit_->setCompletionObject( dirCompletion ); + receivedFilesDirEdit_->setClearButtonShown( true ); +} + + + +/** + * Destructor + */ +MiscellaneousPage::~MiscellaneousPage() +{ +} + + + +/** + * @brief Ensure that the specified P2P ports interval is valid + */ +void MiscellaneousPage::checkPortsInterval() +{ + int lowerPortValue = lowestTransferPort_->value(); + + // Allow a minimum of two ports in the interval + if( lowerPortValue >= highestTransferPort_->value() ) + { + highestTransferPort_->setValue( lowerPortValue + 1 ); + } +} + + + +/** + * @brief Load the widget state + */ +void MiscellaneousPage::loadSettings( const KConfigGroup &group ) +{ + // Read the settings into the widgets + customBrowserEdit_ ->setText ( group.readEntry( "customBrowser", QString() ) ); + customMailClientEdit_->setText ( group.readEntry( "customMailClient", QString() ) ); + receivedFilesDirEdit_->setText ( group.readEntry( "receivedFilesDir", QDir::homePath() ) ); + useLiveMailCheckbox_ ->setChecked( group.readEntry( "useLiveMail", true ) ); + useReceivedFilesDir_ ->setChecked( group.readEntry( "useReceivedFilesDir", false ) ); + lowestTransferPort_ ->setValue ( group.readEntry( "lowestTransferPort", 6891 ) ); + highestTransferPort_ ->setValue ( group.readEntry( "highestTransferPort", 6900 ) ); + + int pos; + QString userChoice; + KService::Ptr servicePointer; + KService *service; + + // Read the browser's radio buttons setting + userChoice = group.readEntry( "useBrowser", "KDE" ); + if( userChoice == "KDE" ) + { + useKDEBrowserRadio_->setChecked( true ); + } + else if( userChoice == "listed" ) + { + useListedBrowserRadio_->setChecked( true ); + } + else + { + useCustomBrowserRadio_->setChecked( true ); + } + + userChoice = group.readEntry( "useMailClient", "KDE" ); + if( userChoice == "KDE" ) + { + useKDEMailClientRadio_->setChecked( true ); + } + else if( userChoice == "listed" ) + { + useListedMailClientRadio_->setChecked( true ); + } + else + { + useCustomMailClientRadio_->setChecked( true ); + } + + // Find the browser and select it + pos = browsersCombo_->findData( group.readEntry( "listedBrowser", QString() ) ); + if( pos > -1 ) + { +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Browser setting - Changing current index to" << pos; +#endif + browsersCombo_->setCurrentIndex( pos ); + } + else + { + // If there's no preference set, allow KDE to choose + servicePointer = KMimeTypeTrader::self()->preferredService( "text/html", "Application" ); + service = servicePointer.data(); + + if( service ) + { + pos = browsersCombo_->findData( service->exec() ); + + if( pos > -1 ) + { +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Setting system preferred browser to" << pos; +#endif + browsersCombo_->setCurrentIndex( pos ); + } + else + { +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Not setting any browser"; +#endif + } + } +#ifdef KMESSDEBUG_SETTINGSDIALOG + else + { + kDebug() << "No service found: not setting any browser"; + } +#endif + } + + // Find the mail client and select it + pos = mailClientsCombo_->findData( group.readEntry( "listedMailClient", QString() ) ); + if( pos > -1 ) + { +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Mail Client setting - Changing current index to" << pos; +#endif + mailClientsCombo_->setCurrentIndex( pos ); + } + else + { + // If there's no preference set, allow KDE to choose + servicePointer = KMimeTypeTrader::self()->preferredService( "application/x-mimearchive", "Application" ); + service = servicePointer.data(); + + if( service ) + { + pos = mailClientsCombo_->findData( service->exec() ); + + if( pos > -1 ) + { +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Setting system preferred mail client to" << pos; +#endif + mailClientsCombo_->setCurrentIndex( pos ); + } + else + { +#ifdef KMESSDEBUG_SETTINGSDIALOG + kDebug() << "Not setting any mail client"; +#endif + } + } +#ifdef KMESSDEBUG_SETTINGSDIALOG + else + { + kDebug() << "No service found: not setting any mail client"; + } +#endif + } +} + + + +/** + * @brief Save account information from the misc options widget + */ +bool MiscellaneousPage::saveSettings( KConfigGroup &group ) +{ + // Make sure there's a custom browser selected if the relevant option is set + if( useCustomBrowserRadio_->isChecked() ) + { + if( customBrowserEdit_->text().isEmpty() ) + { + KMessageBox::error( 0, i18n( "You have to specify a console command to launch a custom web browser!" ) ); + return false; + } + else if( ! customBrowserEdit_->text().contains( "%u" ) ) + { + int result = KMessageBox::warningYesNoCancel( 0, i18n( "The console command you have specified to launch a custom web browser " + "does not contain the '%u' parameter. Without this, opening web " + "sites will not work.
    Do you want KMess to add it for you?" ) ); + + // Only add the parameter if the user wants to + switch( result ) + { + case KMessageBox::Yes: + customBrowserEdit_->setText( customBrowserEdit_->text().append( " %u" ) ); + break; + + case KMessageBox::No: + break; + + default: + return false; + } + } + } + + // Make sure there's a custom mail client selected if the relevant option is set + if( useCustomMailClientRadio_->isChecked() ) + { + if( customMailClientEdit_->text().isEmpty() ) + { + 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 console command you specified to launch a custom email client " + "does not contain the '%u' parameter. Without this, composing " + "emails will not work.
    Do you want KMess to add it for you?" ) ); + + // Only add the parameter if the user wants to + switch( result ) + { + case KMessageBox::Yes: + customMailClientEdit_->setText( customMailClientEdit_->text().append( " %u" ) ); + break; + + case KMessageBox::No: + break; + + default: + return false; + } + } + } + + // Make sure there's a selected directory if the Save files in a directory option is set + if( useReceivedFilesDir_->isChecked() && receivedFilesDirEdit_->text().isEmpty() ) + { + KMessageBox::error( 0, i18n( "You have to select a directory for the received files!" ) ); + return false; + } + + QString userChoice; + + // Save the checked browser option + if( useKDEBrowserRadio_->isChecked() ) + { + userChoice = "KDE"; + } + else if( useListedBrowserRadio_->isChecked() ) + { + userChoice = "listed"; + } + else + { + userChoice = "custom"; + } + group.writeEntry( "useBrowser", userChoice ); + + // Save the checked mail client option + if( useKDEMailClientRadio_->isChecked() ) + { + userChoice = "KDE"; + } + else if( useListedMailClientRadio_->isChecked() ) + { + userChoice = "listed"; + } + else + { + userChoice = "custom"; + } + group.writeEntry( "useMailClient", userChoice ); + + // Save the state of the other widgets + group.writeEntry( "customBrowser", customBrowserEdit_ ->text() ); + group.writeEntry( "customMailClient", customMailClientEdit_->text() ); + group.writeEntry( "receivedFilesDir", receivedFilesDirEdit_->text() ); + group.writeEntry( "useReceivedFilesDir", useReceivedFilesDir_ ->isChecked() ); + group.writeEntry( "useLiveMail", useLiveMailCheckbox_ ->isChecked() ); + group.writeEntry( "lowestTransferPort", lowestTransferPort_ ->value() ); + group.writeEntry( "highestTransferPort", highestTransferPort_ ->value() ); + + int index = browsersCombo_->currentIndex(); + group.writeEntry( "listedBrowser", browsersCombo_ ->itemData( index ) ); + index = mailClientsCombo_->currentIndex(); + group.writeEntry( "listedMailClient", mailClientsCombo_->itemData( index ) ); + + return true; +} + + + +/** + * Allow the user to navigate the filesystem and choose a directory + */ +void MiscellaneousPage::slotChooseDirectory() +{ + const KUrl url( KFileDialog::getExistingDirectoryUrl( receivedFilesDirEdit_->text(), + this, + i18n( "Select Directory") ) ); + + if( ! url.isEmpty() ) + { + receivedFilesDirEdit_->setText( url.path() ); + } +} + + + +#include "miscellaneouspage.moc" diff --git a/src/settings/miscellaneouspage.h b/src/settings/miscellaneouspage.h new file mode 100644 index 0000000..1df6eed --- /dev/null +++ b/src/settings/miscellaneouspage.h @@ -0,0 +1,63 @@ +/*************************************************************************** + miscellaneouspage.h - description + ------------------- + begin : Sat May 3 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 MISCELLANEOUSPAGE_H +#define MISCELLANEOUSPAGE_H + +#include "ui_miscellaneouspage.h" + +#include + + + +/** + * @brief Allows to choose the miscellaneous settings + * + * @author Antonio Nastasi + * @ingroup Settings + */ +class MiscellaneousPage : public QWidget, private Ui::MiscellaneousPage +{ + Q_OBJECT + + + public: // public methods + + // The constructor + MiscellaneousPage( QWidget *parent = 0 ); + // The destructor + virtual ~MiscellaneousPage(); + // Load the widget state + void loadSettings( const KConfigGroup &group ); + // Save account information from the misc options widget + bool saveSettings( KConfigGroup &group ); + + + private slots: + // Ensure that the specified ports interval is valid + void checkPortsInterval(); + // Allow the user to navigate the filesystem and choose a directory + void slotChooseDirectory(); + + private: // Private properties + + // A list of browser executables, mapped by browser name + QMap browsersList_; +}; + +#endif + diff --git a/src/settings/miscellaneouspage.ui b/src/settings/miscellaneouspage.ui new file mode 100644 index 0000000..876b1f9 --- /dev/null +++ b/src/settings/miscellaneouspage.ui @@ -0,0 +1,481 @@ + + + MiscellaneousPage + + + + 0 + 0 + 490 + 241 + + + + + + + + 0 + + + + + 0 + + + + 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 + + + + + + + + false + + + + + + + + + Choose this option to enter the path to your favorite browser. + + + &Specify a custom command: + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + 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. + + + + + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + + 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 + + + + + + + Choose this option to use the email client used by the rest of KDE. + + + Use the &KDE default email client + + + + + + + Select this option to choose from a list of installed browsers. + + + Use an &installed email client: + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + false + + + + + + + + + Choose this option to enter the path to your favorite browser. + + + &Specify a custom command: + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + 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. + + + + + + + + + + + Qt::Vertical + + + + 20 + 27 + + + + + + + + + File Transfers + + + + + + true + + + &Save all received files in one directory: + + + false + + + + + + + + + false + + + + + + + false + + + ... + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 16 + 16 + + + + + + + + + + &Use ports between + + + lowestTransferPort_ + + + + + + + + 0 + 0 + + + + true + + + 65534 + + + + + + + and + + + highestTransferPort_ + + + + + + + + 0 + 0 + + + + true + + + 1 + + + 65535 + + + + + + + for file transfers + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + KLineEdit + QLineEdit +
    klineedit.h
    +
    +
    + + browsersCombo_ + + + + + useReceivedFilesDir_ + toggled(bool) + receivedFilesDirEdit_ + setEnabled(bool) + + + 73 + 58 + + + 78 + 89 + + + + + useReceivedFilesDir_ + toggled(bool) + chooseDirButton_ + setEnabled(bool) + + + 192 + 52 + + + 426 + 88 + + + + +
    diff --git a/src/utils/crashhandler.cpp b/src/utils/crashhandler.cpp new file mode 100644 index 0000000..f6a8fb8 --- /dev/null +++ b/src/utils/crashhandler.cpp @@ -0,0 +1,219 @@ +/*************************************************************************** + (filename).cpp - description + ------------------- + begin : (Weekday) (Month) (day) 2008 + copyright : (C) 2008 by (yourname) + email : (email 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 "crashhandler.h" +#include "../kmessdebug.h" +#include "../config-kmess.h" + +#include // pid_t +#include // waitpid() +#include // getpid(), alarm() +#include // abort() + +#include +#include +#include + + + +// Static vars need to be declared too +// appName_ contains the exact name of the binary. +// is overwritten by setAppName() with the full path or argv[0]. +QLatin1String CrashHandler::appName_("kmess"); + + + +/** + * @brief Activate the handler. + * + * If the platform supports it (currently only X11), the custom crash handler will be activated. + * This makes sure kmessCrashed() will be called when a crash (SIGSEGV, ABRT, etc..) occurs. + */ +void CrashHandler::activate() +{ +#ifdef Q_WS_X11 + KCrash::setCrashHandler( CrashHandler::kmessCrashed ); +#endif + +#ifdef KMESSDEBUG_CRASHHANDLER +#ifdef Q_WS_X11 + kDebug() << "Enabled custom crash handler"; +#else + kDebug() << "NOTICE: Crash handler is not enabled for this platform!"; +#endif +#endif +} + + + +/** + * @brief The crash handler C function. + * + * This function collects all relevant application data in a report to display. + * It also tries to run gdb to get a useful backtrace. + * Currently the backtrace is dumped at the console only. + * + * @param signal The received signal. + */ +void CrashHandler::kmessCrashed( int signal ) +{ + // We cannot use kDebug() here, it requires a KApplication! + // Crashes when closing go even more wrong with it. + + Q_UNUSED( signal ); + + // Console message first. + qDebug() << "KMess crashed! -- This should not happen.\n" + "Please submit a report at http://www.kmess.org/board/ or bugs@kmess.org .\n" + "\n" + "Application version: " KMESS_VERSION "\n" + "Compiled at: KDE " KDE_VERSION_STRING ", Qt " QT_VERSION_STR "\n" + "Running at: KDE " + QLatin1String( KDE::versionString() ) + ", Qt " + QLatin1String( qVersion() ) + "\n"; + +#ifdef Q_OS_UNIX + /* + * The main guts of this function are based + * on the Amarok crash handler by Max Howell. + */ + + // Avoid loops + KCrash::setCrashHandler(); + + // We need to fork to be able to get a decent backtrace. + // No idea why, perhaps some kdeinit magic causing trouble? + const pid_t pid = ::fork(); + if( pid < 0 ) + { + // fork failed + } + else if( pid > 0 ) + { + // the parent, waits for the child. + ::alarm( 0 ); + ::waitpid( pid, NULL, 0 ); + ::abort(); + } + + // The child process +#ifdef KMESSDEBUG_CRASHHANDLER + qDebug() << "Running gdb for binary " << appName_ << " (pid " << getppid() << ")"; +#endif + + KProcess gdb; + gdb.setOutputChannelMode( KProcess::SeparateChannels ); + + gdb << "gdb" << "--quiet" // avoid banners at startup + << "--batch" // exit after processing + << "--nw" // no window interface + << "--nx" // don't read the .gdbinit file + << "--ex" << "set width 0" // no terminal width + << "--ex" << "set height 0" // no terminal height + << "--ex" << "echo \\n==== (gdb) bt ====\\n" + << "--ex" << "bt" + //<< "--ex" << "echo ==== (gdb) thread apply all bt ====\\n" + //<< "--ex" << "thread apply all bt" + << appName_ << QByteArray::number( ::getppid() ); // attach to the process + +#ifdef KMESSDEBUG_CRASHHANDLER + QString commandLine; + QStringList fullCommand = gdb.program(); + foreach( const QString &arg, fullCommand ) + { + if( ! commandLine.isEmpty() ) + { + commandLine += " "; + } + + commandLine += ( arg.contains(" ") ? "'" + arg + "'" : arg ); + } + qDebug() << "GDB command:" << commandLine; +#endif + + // Start gdb. + gdb.start(); + + bool showKdeBacktrace = false; + + // Wait maximum 30 seconds for gdb to finish. + if( ! gdb.waitForFinished( 30000 ) ) + { + // Something went wrong + int returnCode = gdb.exitCode(); + + if( returnCode == -2 ) + { + qDebug() << "No backtrace could be generated, gdb not found. Printing KDE backtrace."; + } + else if( returnCode == -1 ) + { + qDebug() << "No backtrace could be generated, gdb crashed."; + } + else if( returnCode != 0 ) + { + qDebug() << "No backtrace could be generated, gdb returned: " << returnCode; + } + else + { + qDebug() << "No backtrace could be generated, gdb timed out."; + } + + showKdeBacktrace = true; + } + else + { + // gdb finished, read and check its output. + QString backtrace( gdb.readAll() ); + + if ( backtrace.contains( "No stack." ) + || backtrace.contains( "Backtrace stopped" ) ) + { + showKdeBacktrace = true; + } + + qDebug() << "KMess backtrace:" << backtrace; + } + + if( showKdeBacktrace ) + { + qDebug() << "KDE backtrace:" << kBacktrace(); + } +#else + #warning Crash handler code is not implemented for this platform. +#endif + + //_exit() exits immediately, otherwise this + //function is called repeatedly ad infinitum + ::_exit( 255 ); +} + + + +/** + * @brief Assign the app binary name. + * + * This function is called from the main() method to make sure the exact binary + * (as passed to argv[0]) is known by the crash handler. This makes it possible + * to run gdb properly. By default the appname is set to "kmess". + * + * @param appName Filename of the application binary. + */ +void CrashHandler::setAppName( const QLatin1String &appName ) +{ + appName_ = appName; +} + + diff --git a/src/utils/crashhandler.h b/src/utils/crashhandler.h new file mode 100644 index 0000000..5be29b2 --- /dev/null +++ b/src/utils/crashhandler.h @@ -0,0 +1,46 @@ +/*************************************************************************** + crashhandler.h - description + ------------------- + begin : Mon Apr 21 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 + + + +/** + * @brief Custom handling of crashes. + * + * The kmessCrashed() function in this class is called when a crash occurs. + * This allows us to produce custom reports with all information we need. + * + * @author Diederik van der Boor, based on Amarok code. + * @ingroup Utils + * @todo The GUI dialogs still need to be implemented. + */ +class CrashHandler +{ + public: + // Activate the handler + static void activate(); + // The crash handler C function + static void kmessCrashed( int signal ); + // Assign the app name + static void setAppName( const QLatin1String &appName ); + + private: + static QLatin1String appName_; +}; + + diff --git a/kmess/idletimer.cpp b/src/utils/idletimer.cpp similarity index 87% rename from kmess/idletimer.cpp rename to src/utils/idletimer.cpp index 14f2d4f..ab1ab38 100644 --- a/kmess/idletimer.cpp +++ b/src/utils/idletimer.cpp @@ -17,12 +17,12 @@ #include "idletimer.h" -#include - -#include "currentaccount.h" -#include "kmessdebug.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" #include "xautolock.h" + + // The constructor IdleTimer::IdleTimer() : QObject() @@ -46,7 +46,7 @@ IdleTimer::~IdleTimer() { delete watcher_; #ifdef KMESSDEBUG_IDLETIMER - kdDebug() << "DESTROYED IdleTimer" << endl; + kDebug() << "DESTROYED."; #endif } @@ -72,26 +72,26 @@ void IdleTimer::slotActivity() void IdleTimer::updateWatcher() { #ifdef KMESSDEBUG_IDLETIMER - kdDebug() << "IdleTimer::updateWatcher()" << endl; + kDebug(); #endif Account *account = CurrentAccount::instance(); watcher_->setTimeOut( account->getIdleTime() * 60 ); if ( account->getUseIdleTimer() ) { #ifdef KMESSDEBUG_IDLETIMER - kdDebug() << "IT: Start the timer." << endl; + kDebug() << "Start the timer."; #endif watcher_->startTimer(); } else { #ifdef KMESSDEBUG_IDLETIMER - kdDebug() << "IT: Stop the timer." << endl; + kDebug() << "Stop the timer."; #endif watcher_->stopTimer(); } #ifdef KMESSDEBUG_IDLETIMER - kdDebug() << "IT: Done updateWatcher()." << endl; + kDebug() << "Done updateWatcher()."; #endif } diff --git a/kmess/idletimer.h b/src/utils/idletimer.h similarity index 98% rename from kmess/idletimer.h rename to src/utils/idletimer.h index b9c58d1..e2af47b 100644 --- a/kmess/idletimer.h +++ b/src/utils/idletimer.h @@ -18,12 +18,15 @@ #ifndef IDLETIMER_H #define IDLETIMER_H -#include +#include + // Forward declarations class CurrentAccount; class XAutoLock; + + /** * @brief Wrapper for XAutoLock to fire idle-events based on account settings. * @@ -32,7 +35,7 @@ class XAutoLock; * whether the idle detection should be active. * * @author Mike K. Bennett - * @ingroup Root + * @ingroup Utils */ class IdleTimer : public QObject { Q_OBJECT 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..242e029 --- /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("kmess"); + + 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..1529616 --- /dev/null +++ b/src/utils/kmess-send/kmesssendplugin.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Service +Name=Send with KMess +Name[ca]=Envia amb KMess +Name[de]=Mit KMess senden +Name[es]=Enviar con KMess +Name[fr]=Envoyez avec KMess +Name[it]=Invia con KMess +Name[nl]=Verzenden met KMess +Name[pt_BR]=Enviando com o KMess +Name[zh_TW]=以 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 new file mode 100644 index 0000000..bac1a60 --- /dev/null +++ b/src/utils/kmessconfig.cpp @@ -0,0 +1,428 @@ +/*************************************************************************** + kmessconfig.h - description + ------------------- + begin : Thu May 1 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 "kmessconfig.h" +#include "../contact/msnobject.h" +#include "../notification/notificationmanager.h" +#include "../kmessdebug.h" + +#include + +#include +#include + + +// Initialize the instance to zero +KMessConfig* KMessConfig::instance_(0); + + + +// Constructor +KMessConfig::KMessConfig() +: tempConfigFile_( 0 ) +{ +} + + + +// Destructor +KMessConfig::~KMessConfig() +{ + // Force the saving to be sure the config is written + KConfig *config; + foreach( config, accountsConfigs_ ) + { + config->sync(); + } + foreach( config, listsConfigs_ ) + { + config->sync(); + } + + // Clean up the instance + qDeleteAll( accountsConfigs_ ); + qDeleteAll( listsConfigs_ ); + accountsConfigs_.clear(); + listsConfigs_.clear(); + instance_ = 0; + + delete tempConfigFile_; + + kDebug() << "DESTROYED"; +} + + + +void KMessConfig::destroy() +{ + delete instance_; + instance_ = 0; +} + + + +// Recursively delete an account's configuration directory and all of its contents +bool KMessConfig::destroyConfigDir( const QString &fullDirPath ) +{ + QDir dir( fullDirPath ); + QList filesList = dir.entryInfoList( QDir::AllEntries | QDir::NoDotAndDotDot ); + foreach( QFileInfo entry, filesList ) + { + QString entryPath( entry.absoluteFilePath() ); + + if( entry.isDir() ) + { + if( ! destroyConfigDir( entryPath ) ) + { + kWarning() << "Cannot remove directory entry" << entryPath << "!"; + } + } + else + { + dir.remove( entryPath ); + } + } + + dir.cdUp(); + if( ! dir.rmdir( fullDirPath ) ) + { + kWarning() << "Cannot remove processed directory" << fullDirPath << "!"; + return false; + } + + return true; +} + + + +KMessConfig* KMessConfig::instance() +{ + // If the instance is null, create a new current config and return that. + if ( instance_ == 0 ) + { + instance_ = new KMessConfig(); + } + return instance_; +} + + + +/** + * @brief Return an account's data directory + * + * This method returns the full path where an account's data are stored. + * + * @param accountHandle The account name + * @return QString + */ +const QString KMessConfig::getAccountDirectory( const QString &accountHandle ) +{ + KStandardDirs localKdeDir; + QDir appsDir, kmessDir; + + appsDir.setPath( localKdeDir.localkdedir() + "/share/apps" ); + kmessDir.setPath( appsDir.absolutePath() + "/kmess/" + accountHandle ); + + return kmessDir.absolutePath(); +} + + + +/** + * @brief Return the accounts directory + * + * This method returns the full path where all the accounts folders are stored. + * + * @return QString + */ +const QString KMessConfig::getAccountsDirectory() +{ + KStandardDirs localKdeDir; + QDir appsDir, kmessDir; + + appsDir.setPath( localKdeDir.localkdedir() + "/share/apps" ); + kmessDir.setPath( appsDir.absolutePath() + "/kmess" ); + + return kmessDir.absolutePath(); +} + + + +/** + * @brief Return a list of saved account handles + * + * This method returns a list of all saved accounts + * + * @return QStringList + */ +QStringList KMessConfig::getAccountsList() +{ + QDir dirs( getAccountsDirectory() ); + + return dirs.entryList( QStringList( "*@*" ), QDir::Dirs | QDir::NoDotAndDotDot ); +} + + + +/** + * @brief Select a group from an account's general config + * + * This method returns a directly usable configuration group. It will be a config group named groupName in + * the config file of account accountHandle. + * + * @param accountHandle The account name + * @param groupName The name of the requested configuration group in the account's config file + */ +KConfigGroup KMessConfig::getAccountConfig( const QString &accountHandle, const QString &groupName ) +{ + KConfigGroup configGroup; + + // Search for config in QHash + if( accountsConfigs_.contains( accountHandle ) ) + { + 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 ); + } + + // 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; +} + + + +/** + * @brief Select a group from an account's contact list config + * + * This method returns a directly usable configuration group. It will be the config group named groupName, + * in the account directory which handle is accountHandle. + * + * @param accountHandle The account name + * @param groupName The name of the config group in the account's configuration, like "Contacts" or "Groups" + */ +KConfigGroup KMessConfig::getContactListConfig( const QString &accountHandle, const QString &groupName ) +{ + KConfigGroup configGroup; + + // Search for config in QHash + if( listsConfigs_.contains( accountHandle ) ) + { + 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 ); + } + + // 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; +} + + + +/** + * @brief Select a group from the application-wide config + * + * This method returns a directly usable configuration group. It will be the config group named groupName + * contained in the KMess global configuration file. + * + * @param groupName The name of the config group + */ +KConfigGroup KMessConfig::getGlobalConfig( const QString &groupName ) +{ + QString generalGroup( "KMess" ); + + // Search for config in QHash + if( accountsConfigs_.contains( generalGroup ) ) + { + return accountsConfigs_.value( generalGroup )->group( groupName ); + } + + KConfig *config = new KConfig(); + + // insert current config into QHash for future search + accountsConfigs_.insert( generalGroup, config ); + + 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. + * + * This is used to store display pictures, custom emoticons, winks, etc.. + * + * @param msnObject The MSNObject the other contact uses to identify his resource. + * + * @returns A file name string. + */ +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() ); + const QString safeSha1 = sha1d.replace(QRegExp("[^a-zA-Z0-9+=]"), "_"); + + // Be friendly for file managers. + QString extension; + QString path; + QDir dir; + QStringList files; + + switch( msnObject.getType() ) + { + case MsnObject::DISPLAYPIC: + path = "displaypics"; + + // Check if there is already the file + dir.setPath( KStandardDirs::locateLocal( "data", QString("kmess/") + path + "/" ) ); + files = dir.entryList( QStringList( safeSha1 + ".*" ), QDir::Files ); + + // If the list isn't empty check for image file + if( ! files.isEmpty() ) + { + foreach( const QString &file, files ) + { + if( ! file.contains( ".dat" ) ) + { + return dir.absolutePath() + "/" + file; + } + } + } + break; + + case MsnObject::BACKGROUND: + extension = ".png"; + path = "backgrounds"; + break; + + case MsnObject::EMOTICON: + extension = ".png"; + path = "customemoticons"; + break; + + case MsnObject::WINK: + extension = ".cab"; + path = "winks"; + break; + + case MsnObject::VOICECLIP: + extension = ".wav"; + path = "voiceclips"; + break; + + default: + extension = ".dat"; + path = QString::null; + } + + // Locate filename + return KStandardDirs::locateLocal( "data", QString("kmess/") + path + "/" + safeSha1 + extension ); +} + + + +/** + * 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 new file mode 100644 index 0000000..a0ca033 --- /dev/null +++ b/src/utils/kmessconfig.h @@ -0,0 +1,81 @@ +/*************************************************************************** + kmessconfig.h - description + ------------------- + begin : Thu May 1 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 KMESSCONFIG_H +#define KMESSCONFIG_H + +#include +#include + +#include +#include +#include + +class MsnObject; + + +/** + * @brief Central query location for config paths. + * + * @author Antonio Nastasi + * @ingroup Utils + */ +class KMessConfig +{ + + public: // Public methods + // Return a singleton instance of the current config + static KMessConfig *instance(); + // Delete the instance of the contact config + static void destroy(); + + // Recursively delete an account's configuration directory and all of its contents + bool destroyConfigDir( const QString &fullDirPath ); + // Select a group from an account's general config + KConfigGroup getAccountConfig( const QString &accountHandle, const QString &groupName ); + // Return an account's data directory + const QString getAccountDirectory( const QString &accountHandle ); + // Return the accounts directory + const QString getAccountsDirectory(); + //Return a list of saved account handles + QStringList getAccountsList(); + // Select a group from an account's contact list config + KConfigGroup getContactListConfig( const QString &accountHandle, const QString &groupName ); + // Select a group from the application-wide config + KConfigGroup getGlobalConfig( const QString &groupName ); + // Return the path for an MsnObject in the cache. + QString getMsnObjectFileName(const MsnObject& msnObject); + + 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 new file mode 100644 index 0000000..8179a25 --- /dev/null +++ b/src/utils/kmessdbus.cpp @@ -0,0 +1,211 @@ +/*************************************************************************** + kmessdbus.cpp - description + ------------------- + begin : Wed Jun 25 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 "currentaccount.h" +#include "kmess.h" +#include "kmessdbus.h" +#include "kmessdebug.h" +#include "chat/chatmaster.h" +#include "model/contactlist.h" +#include "utils/kmessdbusadaptor.h" +#include "utils/richtextparser.h" + +#include + + + +KMessDBus::KMessDBus( KMess *parent ) + : QObject( (QObject*) parent ), + kmess_( parent ) +{ + new RemoteControlAdaptor( this ); + QDBusConnection dbus = QDBusConnection::sessionBus(); + dbus.registerObject( "/remoteControl", this ); + + KMESSDBUS_REGISTER_DATATYPES +} + + + +// The destructor +KMessDBus::~KMessDBus() +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "DESTROYED."; +#endif +} + + + +// Connect +void KMessDBus::connect() +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "Connect() called"; +#endif + + if( ! kmess_->isConnected() ) + { + kmess_->checkAutologin( "" ); + } +} + + + +// Disconnect +void KMessDBus::disconnect() +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "Disconnect() called"; +#endif + + if( kmess_->isConnected() ) + { + kmess_->disconnectClicked(); + } +} + + + +// Check if KMess is connected +bool KMessDBus::isConnected() +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "isConnected() called"; +#endif + + return kmess_->isConnected(); +} + + + +// Set the status +void KMessDBus::setStatus( int status ) +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "setStatus( int ) called"; +#endif + + if( kmess_->isConnected() ) + { + kmess_->changeStatus( (Status) status ); + } +} + + + +// Get the status +int KMessDBus::getStatus() +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "getStatus() called"; +#endif + + 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 new file mode 100644 index 0000000..cf934cb --- /dev/null +++ b/src/utils/kmessdbus.h @@ -0,0 +1,59 @@ +/*************************************************************************** + kmessdbus.cpp - description + ------------------- + begin : Wed Jun 25 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 KMESSDBUS_H +#define KMESSDBUS_H + +#include +#include +#include +#include +#include "contact/contact.h" +#include "kmessdbusdatatypes.h" + +class KMess; + + + +class KMessDBus: public QObject +{ + Q_OBJECT + Q_CLASSINFO( "D-Bus Interface", "org.kmess.remoteControl" ) + + public: // Public methods + // The constructor + KMessDBus( KMess *parent ); + // The destructor + virtual ~KMessDBus(); + + public slots: + void connect(); + void disconnect(); + 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_; + +}; + +#endif 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..01a971b --- /dev/null +++ b/src/utils/kmessdbusadaptor.h @@ -0,0 +1,102 @@ +/*************************************************************************** + 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 + // The ;'s are not needed, but without them, Doxygen might get confused + 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/kmess/autologinview.h b/src/utils/kmessdbusdatatypes.cpp similarity index 52% rename from kmess/autologinview.h rename to src/utils/kmessdbusdatatypes.cpp index 639d7b0..70fc044 100644 --- a/kmess/autologinview.h +++ b/src/utils/kmessdbusdatatypes.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - autologinview.h - description + kmessdbusdatatypes.cpp - description ------------------- - begin : Mon Feb 10 2003 - copyright : (C) 2003 by Mike K. Bennett - email : mkb137b@hotmail.com + begin : Thursday July 09 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com ***************************************************************************/ /*************************************************************************** @@ -15,29 +15,28 @@ * * ***************************************************************************/ -#ifndef AUTOLOGINVIEW_H -#define AUTOLOGINVIEW_H +#include "kmessdbusdatatypes.h" -#include - -/** - * @brief The login status message widget. - * - * This class displays the "Logging in..." status message - * in the main window, and displays the KMess icon. - * - * @author Mike K. Bennett - * @ingroup Root - */ -class AutologinView : public QWidget +QDBusArgument &operator << ( QDBusArgument &argument, const DBusContact &account ) { - Q_OBJECT + argument.beginStructure(); + argument << account.friendlyName + << account.handle + << account.status; + argument.endStructure(); - public: - // The constructor - AutologinView(QWidget *parent=0, const char *name=0); - // The destructor - ~AutologinView(); -}; + return argument; +} -#endif + + +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 new file mode 100644 index 0000000..0572b38 --- /dev/null +++ b/src/utils/kmessshared.cpp @@ -0,0 +1,566 @@ +/*************************************************************************** + kmessshared.cpp - description + ------------------- + begin : Thu May 8 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 "kmessshared.h" + +#include "../kmess.h" +#include "../kmessapplication.h" +#include "../kmessdebug.h" +#include "../currentaccount.h" +#include "../network/soap/passportloginservice.h" +#include "kmessconfig.h" + +#include +#include +#include +#include + +#include +#include + +#ifdef KMESSDEBUG_SHAREDMETHODS + #define KMESSDEBUG_SHARED_OPENEXTERNAL +#endif + + + +// Create a HMACSha1 hash +QByteArray KMessShared::createHMACSha1 ( const QByteArray &keyForHash , const QByteArray &secret ) +{ + // The algorithm is definited into RFC 2104 + int blocksize = 64; + QByteArray key( keyForHash ); + QByteArray opad( blocksize, 0x5c ); + QByteArray ipad( blocksize, 0x36 ); + + // If key size is too larg, compute the hash + if( key.size() > blocksize ) + { + key = QCryptographicHash::hash( key, QCryptographicHash::Sha1 ); + } + + // If too small, pad with 0x00 + if( key.size() < blocksize ) + { + key += QByteArray( blocksize - key.size() , 0x00 ); + } + + // Compute the XOR operations + for(int i=0; i < key.size() - 1; i++ ) + { + ipad[i] = (char) ( ipad[i] ^ key[i] ); + opad[i] = (char) ( opad[i] ^ key[i] ); + } + + // Append the data to ipad + ipad += secret; + + // 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 ); +} + + + +// Create the html file to request the given service +QString KMessShared::createRequestFile( const QString &mailto, const QString &folder ) +{ + CurrentAccount *currentAccount = CurrentAccount::instance(); + + // Use one file for hml page with post method + QString filename( KMessConfig::instance()->getAccountDirectory( currentAccount-> getHandle() ) + + "/hotmail.htm" ); + + QFile file( filename ); + if ( ! file.open( QIODevice::WriteOnly | QIODevice::Text ) ) + { + 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 ); + + // Write the file contents + outBuffer << "\n" + "\n" + " \n" + " \n" + "
    getLanguageCode() + + "\" method=\"POST\">\n" + " \n" + " \n" + "
    \n" + " \n" + "\n"; + + // Then close the buffer + file.close(); + + return filename; +} + + + +// Return a derived key with HMACSha1 algorithm +QByteArray KMessShared::deriveKey ( const QByteArray &keyToDerive, const QByteArray &magic ) +{ + // create the four hashes needed for the implementation. + QByteArray hash1, hash2, hash3, hash4, temp; + QByteArray key(keyToDerive); + + // append the magic string. + temp.append ( magic ); + + // create the HMAC Sha1 hash and assign it. + hash1 = createHMACSha1 ( key, temp ); + temp.clear(); + + // append the first hash with the magic string. + temp.append ( hash1 + magic ); + + // create the HMAC Sha1 hash and assign it. + hash2 = createHMACSha1 ( key, temp ); + temp.clear(); + + // append the first hash. + temp.append ( hash1 ); + + // create the HMAC Sha1 hash and assign it. + hash3 = createHMACSha1 ( key, temp ); + temp.clear(); + + // assign the third hash with the magic string. + temp.append ( hash3 + magic ); + // create the HMAC Sha1 hash and assign it. + hash4 = createHMACSha1 ( key, temp ); + temp.clear(); + + // return the second hash with the first four bytes of the fourth hash. + return hash2 + hash4.left ( 4 ); +} + + + +/** + * @brief Generate a random GUID. + * + * This is used in MSNP2P for the Call ID and Branch ID. + * + * @return A randomly generated GUID value. + */ +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) + + "}" ); + return guid.toUpper(); +} + + + +/** + * @brief Generate an random number to use as ID. + * + * For use in MSNP2P, the value will not be below 4 + * + * @return A random value between 4 and 4294967295. + */ +quint32 KMessShared::generateID() +{ + return (rand() & 0x00FFFFFC); +} + + + +// Return the hash of a file name using the SHA1 algorithm +QByteArray KMessShared::generateFileHash( const QString &fileName ) +{ + // Read the file's contents into a byte array + QFile file( fileName ); + if( ! file.open( QIODevice::ReadOnly ) ) + { + return QByteArray(); + } + + QByteArray fileData( file.readAll() ); + + file.close(); + + // Retrieve and return the file's hash + return QCryptographicHash::hash( fileData, QCryptographicHash::Sha1 ); +} + + + +/** + * 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 + * + * The program which will open the URL is the one selected in the Global Settings + * + * @param url The URL to open + */ +void KMessShared::openBrowser( const KUrl &url ) +{ + // Open the options + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "General" ); + + QString browser; + QString fallbackBrowser( group.readEntry( "customBrowser", "konqueror" ) ); + + // Obtain the widget of the main KMess window, to correctly link it to the opened browser + KMessApplication *kmessApp = static_cast( kapp ); + QWidget *mainWindow = kmessApp->getContactListWindow()->window(); + + // Read which browser has to be opened + QString browserChoice( group.readEntry( "useBrowser", "KDE" ) ); + +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Opening URL" << url << "- The setting is" << browserChoice; +#endif + + // If the preference had an invalid choice, use the KDE default browser. + if( browserChoice != "custom" + && browserChoice != "listed" + && browserChoice != "KDE" ) + { + kWarning() << "Invalid browser choice:" << browserChoice << ", using KDE default."; + + browserChoice = "KDE"; + } + + // Launch the appropriate browser + if( browserChoice == "custom" ) + { + browser = group.readEntry( "customBrowser", fallbackBrowser ); +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Custom browser selected:" << browser; +#endif + } + else if( browserChoice == "listed" ) + { + browser = group.readEntry( "listedBrowser", fallbackBrowser ); +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Listed browser selected:" << browser; +#endif + } + + // If the option isn't valid use the KDE default + if( browser.isEmpty() ) + { +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Invalid browser option, using KDE default."; +#endif + browserChoice = "KDE"; + } + + if( browserChoice == "KDE" ) + { +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "KDE default browser selected."; +#endif + KToolInvocation::invokeBrowser( url.url() ); + return; + } + + // Replace the %u in the command line with the actual URL, and launch the browser. + browser.replace( "%u", KShell::quoteArg( url.url() ), Qt::CaseInsensitive ); + KRun::runCommand( browser, mainWindow ); +} + + + +/** + * @brief Open the given URL mail respecting the user's preference + * + * 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 email for this account. + */ +void KMessShared::openEmailClient( const QString &mailto, const QString &folder, bool isHotmailAvailable ) +{ + // Open the options + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "General" ); + + // When using Live! Mail accounts, the webmail can be used + if( isHotmailAvailable && group.readEntry( "useLiveMail", true ) ) + { + // Create the request file + QString filename( createRequestFile( mailto, folder ) ); + if( ! filename.isEmpty() ) + { + // Open the webmail in the browser + openBrowser( KUrl( "file://" + filename ) ); + } + + return; + } + + QString mailClient; + QString fallbackMailClient( group.readEntry( "customMailClient", "kmail" ) ); + + // Obtain the widget of the main KMess window, to correctly link it to the opened app + KMessApplication *kmessApp = static_cast( kapp ); + QWidget *mainWindow = kmessApp->getContactListWindow()->window(); + + // Read which mail client has to be opened + QString mailClientChoice( group.readEntry( "useMailClient", "KDE" ) ); + +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Opening mail at" << folder << "- The setting is" << mailClientChoice; +#endif + + // If the preference had an invalid choice, use the KDE default mail client. + if( mailClientChoice != "custom" + && mailClientChoice != "listed" + && mailClientChoice != "KDE" ) + { + kWarning() << "Invalid mail client choice:" << mailClientChoice << ", using KDE default."; + + mailClientChoice = "KDE"; + } + + // Launch the appropriate mail client + if( mailClientChoice == "custom" ) + { + mailClient = group.readEntry( "customMailClient", fallbackMailClient ); +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Custom mail client selected:" << mailClient; +#endif + } + else if( mailClientChoice == "listed" ) + { + mailClient = group.readEntry( "listedMailClient", fallbackMailClient ); +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Listed mail client selected:" << mailClient; +#endif + } + + // If the option isn't valid use the KDE default + if( mailClient.isEmpty() ) + { +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "Invalid mail client option, using KDE default."; +#endif + mailClientChoice = "KDE"; + } + + // Retrieve the mail address to open + if( mailClientChoice == "KDE" ) + { +#ifdef KMESSDEBUG_SHARED_OPENEXTERNAL + kDebug() << "KDE default mail client selected."; +#endif + KToolInvocation::invokeMailer( KUrl( "mailto:" + mailto ) ); + return; + } + + // Replace the %u in the command line with the contact address, and launch the application. + mailClient.replace( "%u", KShell::quoteArg( mailto ), Qt::CaseInsensitive ); + KRun::runCommand( mailClient, mainWindow ); +} + + + +/** + * 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", suffix, "ext", startingNumber ) 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, suffix = ".2", + * startingNumber = 3 + * + * @param directory Path where the files will be searched, followed by '/'. + * May be relative. + * @param baseName Common name for the files, without the extension, see above. + * @param suffix Append to the baseName to get the name of the last + * existing numbered file. + * @param extension Extension of the file to search for, see above. + * @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 path( directory + baseName + "." ); + + // "baseName.ext" doesn't exist, find the next available file + if( startingNumber == 0 && ! QFile::exists( path + extension ) ) + { +#ifdef KMESSDEBUG_SHAREDMETHODS + kDebug() << "Initial file" << ( path + 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; + } + +#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 new file mode 100644 index 0000000..6b1721b --- /dev/null +++ b/src/utils/kmessshared.h @@ -0,0 +1,72 @@ +/*************************************************************************** + kmessshared.h - description + ------------------- + begin : Thu May 8 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 KMESSSHARED_H +#define KMESSSHARED_H + +#include + + +// Forward declaration +class KUrl; + + + +/** + * @brief Shared globally useful methods for KMess + * + * This class is just a container for many methods which are useful throughout the entire + * application. + * + * @author Valerio Pilo + * @ingroup Utils + */ +class KMessShared +{ + + public: // Public static methods + // Create a HMACSha1 hash + static QByteArray createHMACSha1( const QByteArray &keyForHash, const QByteArray &secret ); + // Return a derived key with HMACSha1 algorithm + static QByteArray deriveKey( const QByteArray &keyToDerive, const QByteArray &magic ); + // Generate a random GUID. + static QString generateGUID(); + // Generate an random number to use as ID + 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 &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 &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..b1fda77 --- /dev/null +++ b/src/utils/likeback/likeback.cpp @@ -0,0 +1,522 @@ +/*************************************************************************** + * 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 + +#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->setBarVisible( true ); + } +} + + + +// 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++; + d->bar->setBarVisible( d->bar && d->disabledCount > 0 ); +} + + + +// 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 + + d->bar->setBarVisible( d->bar && d->disabledCount <= 0 ); +} + + + +// 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 ) +{ + LikeBackDialog *dialog = new LikeBackDialog( type, initialComment, windowPath, context, this ); + + if( userWantsToShowBar() ) + { + disableBar(); + connect( dialog, SIGNAL( destroyed(QObject*) ), + this, SLOT ( enableBar() ) ); + } + + dialog->show(); +} + + + +// 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(); +} + + + +// Create the menu actions +void LikeBack::createActions( KActionCollection *parent ) +{ + if( d->sendAction == 0 ) + { + d->sendAction = new KAction( KIcon("mail-message-new"), i18n("&Send a Comment to the Developers"), this ); + connect( d->sendAction, SIGNAL( triggered(bool) ), + this, SLOT ( execCommentDialog() ) ); + + parent->addAction( "likeBackSendComment", d->sendAction ); + } + + if( d->showBarAction == 0 ) + { + d->showBarAction = new KToggleAction( i18n("Show &Feedback Icons"), this ); + d->showBarAction->setChecked( userWantsToShowBar() ); + connect( d->showBarAction, SIGNAL( triggered(bool) ), + this, SLOT ( setUserWantsToShowBar(bool) ) ); + + parent->addAction( "likeBackShowIcons", d->showBarAction ); + } +} + + + +// Return whether the user wants to enable the likeback bar or not +bool LikeBack::userWantsToShowBar() +{ + // You can choose to store the button bar status per version. + // On debug builds from SVN, where the version changes at almost every build, + // it's very annoying to have the bar reappearing everytime. +// return d->config.readEntry( "userWantToShowBarForVersion_" + d->aboutData->version(), d->showBarByDefault ); + + return d->config.readEntry( "userWantToShowBar", 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; + + // You can choose to store the button bar status per version. + // On debug builds from SVN, where the version changes at almost every build, + // it's very annoying to have the bar reappearing everytime. +// d->config.writeEntry( "userWantToShowBarForVersion_" + d->aboutData->version(), showBar ); + + d->config.writeEntry( "userWantToShowBar", showBar ); + + d->config.sync(); // Make sure the option is saved, even if the application crashes after that. + + d->bar->setBarVisible( showBar ); +} + + + +// Show a dialog box to introduce the user to LikeBack +void LikeBack::showInformationMessage() +{ + // don't show the message if the bar isn't enabled. + // message doesn't make sense without the bar + if ( ! d->showBar ) return; + + // 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 on the appropriate face below the window title-bar, " + "briefly describe what you like or dislike and click on '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 on the smiling face below the window title-bar, " + "briefly describe what you like and click on 'Send'." ); + } + else + { + likeAndDislikePhrase = i18nc( "Welcome dialog text, explanation for the dislike button alone", + "Each time you have a frustrating experience, " + "please click on the frowning face below the window title-bar, " + "briefly describe what you dislike and click on '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 on " + "the broken-object icon in the top-right corner of the window, describe the " + "behavior and click on '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 this assistant. Too time consuming." ) + + "
    "; + } + if( buttons & LikeBack::Bug ) + { + examplesBlocks += "  " + "" + + i18nc( "Welcome dialog text, usage example", + "The application shows 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", + KMessageBox::Notify ); +} + + + +// 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..f39a1f2 --- /dev/null +++ b/src/utils/likeback/likeback.h @@ -0,0 +1,371 @@ +/*************************************************************************** + * 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(); + + /** + * Create the menu actions. + * They will be added to the given actionCollection(), so if you use KXmlGuiWindow, + * you can add them via XML in the Help menu (or any other!) like this: + * @code + * + * + * + * + * @endcode + * + * This will add the actions above "Report a Bug", if it's visible, and below "What's This?". + * 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. + * + * If you use KMainWindow, add them like this: + * @code + * KActionCollection *collection = new KActionCollection(); + * collection->addAssociatedWidget( this ); + * likeback->createActions( collection ); + * menu()->addAction( collection->action( "likeBackSendComment" ); + * menu()->addAction( collection->action( "likeBackShowIcons" ); + * @endcode + * + */ + void createActions( 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..95a81e5 --- /dev/null +++ b/src/utils/likeback/likeback_p.h @@ -0,0 +1,89 @@ +/*************************************************************************** + * 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 *sendAction; + KToggleAction *showBarAction; +}; + + + +// Constructor +LikeBackPrivate::LikeBackPrivate() + : bar(0) + , aboutData(0) + , buttons(LikeBack::DefaultButtons) + , hostName() + , remotePath() + , hostPort(80) + , acceptedLocales() + , windowListing(LikeBack::NoListing) + , showBar(false) + , disabledCount(0) + , fetchedEmail() + , sendAction(0) + , showBarAction(0) +{ +} + + + +// Destructor +LikeBackPrivate::~LikeBackPrivate() +{ + delete bar; + delete sendAction; + delete showBarAction; + + 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..ee38a8b --- /dev/null +++ b/src/utils/likeback/likebackbar.cpp @@ -0,0 +1,236 @@ +/*************************************************************************** + (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 + +#include "likebackbar.h" +#include "../../kmessdebug.h" + + +// Uncomment to enable debug output +// #define DEBUG_LIKEBACK + + + +// Constructor +LikeBackBar::LikeBackBar( LikeBack *likeBack ) +: QWidget( 0 ) +, Ui::LikeBackBar() +, connected_( false ) +, m_likeBack( likeBack ) +{ + // Set up the user interface + setupUi( this ); + resize( sizeHint() ); + setObjectName( "LikeBackBar" ); + + // 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 ); + +#ifdef DEBUG_LIKEBACK + kDebug() << "CREATED."; +#endif +} + + + +// Destructor +LikeBackBar::~LikeBackBar() +{ +#ifdef DEBUG_LIKEBACK + kDebug() << "DESTROYED."; +#endif +} + + + +// The Bug button has been clicked +void LikeBackBar::bugClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Bug ); +} + + + +// Move the bar to the new active window +void LikeBackBar::changeWindow( QWidget *oldWidget, QWidget *newWidget ) +{ + QWidget *oldWindow = ( oldWidget ? oldWidget->window() : 0 ); + QWidget *newWindow = ( newWidget ? newWidget->window() : 0 ); + +#ifdef DEBUG_LIKEBACK + kDebug() << "Focus change:" << oldWindow << "->" << newWindow; +#endif + + if( oldWindow == newWindow + || ( oldWindow == 0 && newWindow == 0 ) ) + { +#ifdef DEBUG_LIKEBACK + kDebug() << "Invalid/unchanged windows."; +#endif + return; + } + + // Do not detach if the old window is null, a popup or tool or whatever + if( oldWindow != 0 + && ( oldWindow->windowType() == Qt::Window + || oldWindow->windowType() == Qt::Dialog ) ) + { +#ifdef DEBUG_LIKEBACK + kDebug() << "Removing from old window:" << oldWindow; +#endif + oldWindow->removeEventFilter( this ); + // Reparenting allows the bar to not be destroyed if the window which + // has lost focus is being destroyed + setParent( 0 ); + hide(); + } + + // Do not perform the switch if the new window is null, a popup or tool etc, + // or if it's the send feedback window + if( newWindow != 0 + && newWindow->objectName() != "LikeBackFeedBack" + && ( newWindow->windowType() == Qt::Window + || newWindow->windowType() == Qt::Dialog ) ) + { +#ifdef DEBUG_LIKEBACK + kDebug() << "Adding to new window:" << newWindow; +#endif + setParent( newWindow ); + newWindow->installEventFilter( this ); + eventFilter( newWindow, new QResizeEvent( newWindow->size(), QSize() ) ); + show(); + } +} + + + +// The Dislike button has been clicked +void LikeBackBar::dislikeClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Dislike ); +} + + + +// Place the bar on the top right corner of the window +bool LikeBackBar::eventFilter(QObject *obj, QEvent *event) +{ + if( obj != parent() ) + { +#ifdef DEBUG_LIKEBACK + kDebug() << "Incorrect event source"; +#endif + return false; + } + + if( event->type() != QEvent::Resize ) + { + return false; + } + + QResizeEvent *resizeEvent = static_cast( event ); + +#ifdef DEBUG_LIKEBACK + kDebug() << "Resize event:" << resizeEvent->oldSize() << "->" << resizeEvent->size() << "my size:" << size(); +#endif + + // Move the feedback bar to the top right corner of the window + move( resizeEvent->size().width() - width(), 0 ); + return false; +} + + + +// The Feature button has been clicked +void LikeBackBar::featureClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Feature ); +} + + + +// The Like button has been clicked +void LikeBackBar::likeClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Like ); +} + + + +// Show or hide the bar +void LikeBackBar::setBarVisible( bool visible ) +{ + if( visible && ! isVisible() ) + { +#ifdef DEBUG_LIKEBACK + kDebug() << "Setting visible, connected?" << connected_; +#endif + + // Avoid duplicated connections + if( ! connected_ ) + { + connect( kapp, SIGNAL( focusChanged(QWidget*,QWidget*) ), + this, SLOT ( changeWindow(QWidget*,QWidget*) ) ); + connected_ = true; + } + + changeWindow( 0, kapp->activeWindow() ); + } + else if( ! visible && isVisible() ) + { +#ifdef DEBUG_LIKEBACK + kDebug() << "Setting hidden, connected?" << connected_; +#endif + hide(); + + if( connected_ ) + { + disconnect( kapp, SIGNAL( focusChanged(QWidget*,QWidget*) ), + this, SLOT ( changeWindow(QWidget*,QWidget*) ) ); + connected_ = false; + } + + if( parent() ) + { + parent()->removeEventFilter( this ); + setParent( 0 ); + } + } +#ifdef DEBUG_LIKEBACK + else + { + kDebug() << "Not changing status, connected?" << connected_; + } +#endif +} + + + +#include "likebackbar.moc" diff --git a/src/utils/likeback/likebackbar.h b/src/utils/likeback/likebackbar.h new file mode 100644 index 0000000..a41babb --- /dev/null +++ b/src/utils/likeback/likebackbar.h @@ -0,0 +1,49 @@ + + +#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(); + // Show or hide the bar + void setBarVisible( bool visible ); + + private slots: + // The Bug button has been clicked + void bugClicked(); + // Move the bar to the new active window + void changeWindow( QWidget *oldWidget, QWidget *newWidget ); + // The Dislike button has been clicked + void dislikeClicked(); + // Place the bar on the top right corner of the window + bool eventFilter( QObject *obj, QEvent *event ); + // The Feature button has been clicked + void featureClicked(); + // The Like button has been clicked + void likeClicked(); + + private: + // Whether we're connected to the window focus signal or not + bool connected_; + // The parent LikeBack instance + LikeBack *m_likeBack; + +}; + +#endif diff --git a/src/utils/likeback/likebackbar.ui b/src/utils/likeback/likebackbar.ui new file mode 100644 index 0000000..45d8709 --- /dev/null +++ b/src/utils/likeback/likebackbar.ui @@ -0,0 +1,172 @@ + + + LikeBackBar + + + + 0 + 0 + 96 + 24 + + + + + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + Click here to tell the developers about something you liked + + + <html>Click on one of these icons to send your feedback to the developers of this application. You can disable the icons with the "Show Feedback Icons" checkbox in the Help menu.</html> + + + + + + + true + + + + + + + Click here to tell the developers about something you did not like + + + <html>Click on one of these icons to send your feedback to the developers of this application. You can disable the icons with the "Show Feedback Icons" checkbox in the Help menu.</html> + + + + + + + true + + + + + + + Click here to tell the developers about a problem in the application + + + <html>Click on one of these icons to send your feedback to the developers of this application. You can disable the icons with the "Show Feedback Icons" checkbox in the Help menu.</html> + + + + + + + true + + + + + + + Click here to tell the developers about new features you would like to have in this application + + + <html>Click on one of these icons to send your feedback to the developers of this application. You can disable the icons with the "Show Feedback Icons" checkbox in the Help menu.</html> + + + + + + + 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..a68d428 --- /dev/null +++ b/src/utils/likeback/likebackdialog.cpp @@ -0,0 +1,315 @@ + +#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(); + + // Provide the initial status for email address widgets if available + emailAddressEdit_->setText( m_likeBack->emailAddress() ); + specifyEmailCheckBox_->setChecked( true ); + + // 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( 0, acceptedLocales.count() - 1 ) ).join( ", " ), + acceptedLocales.last(), + 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 the developers a brief description of your opinions about %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().toUtf8() ) + '&' + + "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 comment.

    " + "

    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..b4c912f --- /dev/null +++ b/src/utils/likeback/likebackdialog.ui @@ -0,0 +1,220 @@ + + + LikeBackDialog + + + + 0 + 0 + 500 + 530 + + + + + + + + + + + 0 + 0 + + + + + + + true + + + Qt::AlignJustify|Qt::AlignTop + + + true + + + + + + + + 0 + 0 + + + + Your comment: + + + + + + + + 150 + 100 + + + + 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 + + + + + + + + + 0 + 0 + + + + <html>Specifying an email address will allow the developers to ask you for more information on your report, or to tell you when your feature will be implemented.<br/> +<b>Your email address will not be used for anything else but this report.</b></html> + + + true + + + + + + + + + + + + + specifyEmailCheckBox_ + toggled(bool) + emailAddressEdit_ + setEnabled(bool) + + + 84 + 298 + + + 156 + 333 + + + + + diff --git a/src/utils/nowlisteningclient.cpp b/src/utils/nowlisteningclient.cpp new file mode 100644 index 0000000..c6962df --- /dev/null +++ b/src/utils/nowlisteningclient.cpp @@ -0,0 +1,417 @@ +/*************************************************************************** + nowlisteningclient.cpp - description + ------------------- + begin : Sat Nov 4 2006 + copyright : (C) 2006 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 "nowlisteningclient.h" + +#include "kmessdebug.h" + +#include + +#include +#include + + +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT + #define KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL +#endif + + +// This code is loosely inspired by the "now listening" plugin of Kopete. +// Therefore some parts are also +// (c) 2002-2006 the by Kopete developers + +// 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 + */ +NowListeningClient::NowListeningClient() + : playing_(false) +{ + qDBusRegisterMetaType(); + + // Connect the update timer event + connect( &timer_, SIGNAL(timeout()), this, SLOT(slotUpdate()) ); +} + + + +/** + * Enable or disable the update interval timer. + */ +void NowListeningClient::setEnabled( bool enable ) +{ + if( enable ) + { + if( ! timer_.isActive() ) + { + // Reset the fields to avoid problems when the "now listening information" is + // re-enabled. + artist_ = ""; + album_ = ""; + track_ = ""; + playing_ = false; + + // Query directly so the GUI is up to date + slotUpdate(); + + // check every 8 seconds + timer_.start( 8000 ); + } + } + else + { + // Emit a null changedSong signal to clean the GUI + emit changedSong( QString(), QString(), QString(), false ); + timer_.stop(); + } +} + + + +/** + * Update the current song + */ +void NowListeningClient::slotUpdate() +{ +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "Updating Now Playing status"; +#endif + + // Detect changes to reduce signal calls. + const QString prevArtist( artist_ ); + const QString prevAlbum ( album_ ); + const QString prevTrack ( track_ ); + bool prevPlaying = playing_; + + // Reset until proven otherwise. + playing_ = false; + + // Query all applications: the first found stops the search + if( queryAmarok1() + || queryMprisPlayers() + || queryJuk() + || queryKsCD() ) + { + // Found active media player! + +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "found song" << artist_ << "-" << track_ << "(extra info: album=" << album_ << ", playing=" << playing_ << ")"; +#endif + + // App found and playing, detect change. + // Check if player is playing ( and if the song was changed ) or if the player was stopped/paused + // and now play again. + if( ( playing_ && + ( prevArtist != artist_ + || prevAlbum != album_ + || prevTrack != track_ ) ) || ( ! prevPlaying && playing_ ) + ) + { +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "playing information changed, emitting changedSong()."; +#endif + if( artist_.isEmpty() && album_.isEmpty() && track_.isEmpty() && playing_ == true ) + { +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "any informations about this song.."; +#endif + emit changedSong( QString(), QString(), QString(), false ); + } + else + { + emit changedSong( artist_, album_, track_, playing_ ); + } + } + } + + // Emit a signal when the player was stopped. + if( prevPlaying && ! playing_ ) + { +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "player was stopped, emitting changedSong()."; +#endif + emit changedSong( QString(), QString(), QString(), false ); + } +} + + + +/** + * Query Amarok 1.x for track information. + */ +bool NowListeningClient::queryAmarok1() +{ + // Check for executable to avoid problem of defunct fork + if( KStandardDirs::findExe( "dcop" ).isEmpty() ) + { + return false; + } + + QStringList defaultParams( QStringList() << "dcop" << "amarok" << "default" ); + + KProcess proc; + proc.setOutputChannelMode( KProcess::OnlyStdoutChannel ); + + // Read the 'is playing' answer. This will filter out the case of a missing "dcop" command, and of + // a "amarok is not playing/paused" answer + proc.setProgram( defaultParams + QStringList( "isPlaying" ) ); + proc.execute( 250 ); + if( ! proc.readAllStandardOutput().contains( "true" ) ) + { + proc.kill(); + return false; + } + + playing_ = true; + + // Run the DCOP client and selectively ask the artist, album and title + proc.setProgram( defaultParams + QStringList( "artist" ) ); + proc.execute( 250 ); + artist_ = QString::fromUtf8( proc.readAllStandardOutput() ).simplified(); + + proc.setProgram( defaultParams + QStringList( "album" ) ); + proc.execute( 250 ); + album_ = QString::fromUtf8( proc.readAllStandardOutput() ).simplified(); + + proc.setProgram( defaultParams + QStringList( "title" ) ); + proc.execute( 250 ); + track_ = QString::fromUtf8( proc.readAllStandardOutput() ).simplified(); + + proc.kill(); + return true; +} + + + +/** + * Query Amarok for track information. + */ +bool NowListeningClient::queryMprisPlayers() +{ + 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; + } + + // Start the d-bus interface, needed to check the application status and make calls to it + QDBusInterface dbusMprisPlayer( services.at(0), "/Player", "org.freedesktop.MediaPlayer" ); + QDBusInterface dbusMprisRoot ( services.at(0), "/", "org.freedesktop.MediaPlayer" ); + + // See if the application is registered. + if( ! dbusMprisPlayer.isValid() ) + { + mutex_.unlock(); + return false; + } + + QString player; + + if (! dbusMprisRoot.isValid() ) + { + player = QString( "Unknown Player" ); + } + else + { + QDBusReply playerName( dbusMprisRoot.call( QDBus::BlockWithGui, "Identity" ) ); + player = playerName.value(); + } + +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "querying " << player << " for now listening information..."; +#endif + + // query the MPRIS player to know what is currently playing. + QDBusReply metadata( dbusMprisPlayer.call( QDBus::BlockWithGui, "GetMetadata" ) ); + QDBusReply isPlaying( dbusMprisPlayer.call( QDBus::BlockWithGui, "GetStatus" ) ); + + if( ! isPlaying.isValid() || ! metadata.isValid() ) + { +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "Invalid response from " << player << "!"; + kDebug() << "GetStatus Error: " << isPlaying.error().message(); + kDebug() << "GetMetadata Error: " << metadata.error().message(); +#endif + + mutex_.unlock(); + return false; + } + + // Get the list of properties from the map + const QVariantMap& map( metadata.value() ); + + // Save the returned values + album_ = map[ "album" ].toString(); + track_ = map[ "title" ].toString(); + artist_ = map[ "artist" ].toString(); + playing_ = ( isPlaying.value().Status == 0 ); // 0 playing, 1 paused, 2 stopped + + mutex_.unlock(); + return true; +} + + + +/** + * Query KsCD for track information. + */ +bool NowListeningClient::queryKsCD() +{ + 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" ); + + // See if the application is registered. + if( ! dbusKsCD.isValid() ) + { + mutex_.unlock(); + return false; + } + +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "querying KsCD for now listening information..."; +#endif + + // Call KsCD to know whether it's playing, and what + 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() ) + { +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "Invalid response from KsCD!"; +#endif + + mutex_.unlock(); + return false; + } + + // Save the returned values + album_ = album; + track_ = track; + artist_ = artist; + playing_ = isPlaying; + + mutex_.unlock(); + return true; +} + + + +/** + * Query Juk for track information. + */ +bool NowListeningClient::queryJuk() +{ + 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" ); + + // See if the application is registered. + if( ! dbusJuk.isValid() ) + { + mutex_.unlock(); + return false; + } + +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "querying Juk for now listening information..."; +#endif + + // Call KsCD to know whether it's playing, and what + 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() ) + { +#ifdef KMESSDEBUG_NOWLISTENINGCLIENT_GENERAL + kDebug() << "Invalid response from Juk!"; +#endif + + mutex_.unlock(); + return false; + } + + // Save the returned values + album_ = album; + track_ = track; + artist_ = artist; + playing_ = isPlaying; + + mutex_.unlock(); + return true; +} + + + +#include "nowlisteningclient.moc" diff --git a/kmess/nowlisteningclient.h b/src/utils/nowlisteningclient.h similarity index 58% rename from kmess/nowlisteningclient.h rename to src/utils/nowlisteningclient.h index 9e20ae6..d1bc60b 100644 --- a/kmess/nowlisteningclient.h +++ b/src/utils/nowlisteningclient.h @@ -18,23 +18,26 @@ #ifndef NOWLISTENINGCLIENT_H #define NOWLISTENINGCLIENT_H -#include +#include +#include + + +// Forward declarations +class QDBusInterface; -class DCOPClient; -class QCString; /** * @brief Helper class to query common media players for "now listening to" information. * - * It uses DCOP calls to other applications to query the information. + * It uses D-Bus calls to other applications to query the information. * The applications are polled for information every 5 seconds. - * The KMess class holds a reference to this helper, + * The KMess class holds a reference to this helper class, * and calls setEnabled() to start or stop the detection. * When the current song changed, the changedSong() signal will be fired. * - * @author Diederik van der Boor - * @ingroup Root + * @author Diederik van der Boor, Valerio Pilo + * @ingroup Utils */ class NowListeningClient : public QObject { @@ -43,8 +46,6 @@ class NowListeningClient : public QObject public: // The construtor NowListeningClient(); - // The destructor - virtual ~NowListeningClient(); public: // Enable or disable the update interval timer. @@ -53,50 +54,46 @@ class NowListeningClient : public QObject public slots: // Update the current song void slotUpdate(); - - private: - // Make a call to a boolean function - bool callDcop( const QCString &app, const QCString &object, const QCString &method, - const QByteArray &args, bool &returnValue ) const; - // Make a call to a integer function - bool callDcop( const QCString &app, const QCString &object, const QCString &method, - const QByteArray &args, int &returnValue ) const; - // Make a call to a QString function - bool callDcop( const QCString &app, const QCString &object, const QCString &method, - const QByteArray &args, QString &returnValue ) const; - // Make a call to a QString function with QString argument - bool callDcop( const QCString &app, const QCString &object, const QCString &method, - const QString &arg1, QString &returnValue ) const; - // Find a DCOP application that starts with the given app name. - QCString findDcopApplication( const QCString &appName ) const; - - // Query Amarok for track information - bool queryAmarok(); - // Query Juk for track information - bool queryJuk(); - // Query Kaffeine for track information - bool queryKaffeine(); + // Query Amarok 1 for track information + bool queryAmarok1(); + // Query Player mpris compliant for track information + bool queryMprisPlayers(); // Query KsCD for track information bool queryKsCD(); - // Query Noatun for track information - bool queryNoatun(); + // 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_; // The active artist QString artist_; - // The DCOP client - DCOPClient *client_; // Whether the user is currently playing a title. bool playing_; // The interval timer QTimer timer_; // The active track QString track_; + // 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 ); }; + + #endif diff --git a/src/utils/richtextparser.cpp b/src/utils/richtextparser.cpp new file mode 100644 index 0000000..dbedcb9 --- /dev/null +++ b/src/utils/richtextparser.cpp @@ -0,0 +1,1001 @@ +/*************************************************************************** + 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 + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "richtextparser.h" + +#include "../contact/contactbase.h" +#include "../utils/kmessshared.h" +#include "../currentaccount.h" +#include "../emoticonmanager.h" +#include "../kmessdebug.h" + +#include + +#include +#include +#include +#include + +#include +#include + + + +// Insert an optional line break () every WORDWRAP_EVERY characters +#define WORDWRAP_EVERY 30 + + + +// Initialize the list of MSN Plus colors +// Note that a whole lot of colors are still missing from the list +QStringList RichTextParser::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 RichTextParser::cleanedStringsCache_; +QHash RichTextParser::formattedStringsCache_; +// Initialize the MSN Plus tag matching regexp +QRegExp RichTextParser::colorMatch_( "\\[(c|a)=(#?[0-9a-z]+)\\](.*)\\[/\\1(?:=(#?[0-9a-z]+))?\\]", + Qt::CaseInsensitive ); +// Set the id counter for emoticons not yet received +int RichTextParser::lastPendingEmoticonId_ = 0; +// Set the pointer to the instance of the Emoticon Manager +EmoticonManager *RichTextParser::emoticonManager_ = 0; + + + +// Return the given string with MSN Plus! formatting stripped out +void RichTextParser::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() > MSN_PLUS_STRINGCACHESIZE ) + { + cleanedStringsCache_.remove( cleanedStringsCache_.constBegin().key() ); + } +} + + + +// Return the given string with MSN Plus! formatting parsed +void RichTextParser::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() > 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 RichTextParser::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 RichTextParser::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 RichTextParser::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 RichTextParser::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 RichTextParser::parseMsnString( QString &text, bool showEmoticons, bool showSmallEmoticons, bool showLinks, bool showFormatting, const QString &handle, QStringList &pendingEmoticonTags ) +{ + // Remove all HTML + KMessShared::htmlEscape( text ); + + bool allowAddingEmoticons = false; + + // Build a collection of all emoticon data + const QRegExp &emoticonRegExp = emoticonManager_->getHtmlPattern(); + const QHash &emoticonReplacements = emoticonManager_->getHtmlReplacements( showSmallEmoticons ); + + + QRegExp customRegExp; + QRegExp pendingRegExp; + QHash customReplacements; + QHash customHashes; + 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(); + customHashes = contact->getEmoticonHashes(); + pendingRegExp = contact->getPendingEmoticonPattern(); + customEmoticonsBlacklist = contact->getEmoticonBlackList(); + + allowAddingEmoticons = true; + } + } + } + + + // TODO: place these regexps at the beginning of this file and + // initialize them *once*! + QRegExp linkRegExp; + 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-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 + "(" // begin of word, start capture + "([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 + ); + + // these can also be initialized *once*! + QRegExp longWordsRegExp( QString( "([\\w\\d-_\\.]{%1})([\\w\\d-_\\.]+)" ).arg( WORDWRAP_EVERY ) ); + 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( + 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()) + { + 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() ) ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Ignoring blacklisted emoticon" << ei.key(); +#endif + ++ei; + continue; + } + + if( allowAddingEmoticons && ! emoticonManager_->emoticonIsAdded( customHashes.value( ei.key() ) ) ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Inserting emoticon additional link for " << ei.key() << " with hash " << customHashes.value( ei.key() ); +#endif + QString imagePath( ei.value() ); + QString urlCode( QUrl::toPercentEncoding( ei.key() ) ); + + // 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( "'" ) ); + + // 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 ); + + emoticonReplacementList.insert( ei.key(), + "" + + ei.value() + "" ); + } + else + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Not inserting emoticon additional link for " << ei.key() << ". allowAddingEmoticons=" << allowAddingEmoticons + << "; customHashes.value( ei.key() ) = " << customHashes.value( ei.key() ) << "; emoticonIsAdded=" << emoticonManager_->emoticonIsAdded( customHashes.value( 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; + } + else if( parseString.isEmpty() ) + { + continue; + } + + index = regexp->indexIn( parseString ); + + if( index != -1 ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Regexp" << i << "matches at character" << index << "in string" << j << ": " << parseString; +#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 normalizing: only allow ')' at the end if there's '(', same with ", etc + if( matched.endsWith(")") && ! matched.contains("(") ) + { + matched.chop( 1 ); + } + if( matched.endsWith(">") && ! matched.contains("<") ) + { + matched.chop( 4 ); + } + 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 ); + } + + // pre-wordwrap the link: make sure it word wraps nicely in KHTML :) + wordWrapLink = QString(); + for( int k = 0; k < matched.length(); k += WORDWRAP_EVERY ) + { + int nextSemi = matched.indexOf( ";", k + WORDWRAP_EVERY ); + if( nextSemi - (k + WORDWRAP_EVERY) >= 0 && nextSemi - (k + WORDWRAP_EVERY) <= 5 ) + { + // There's a ; just after this text piece, so this piece may end just inside a HTML entity. + // Therefore, we can't simply add here, we need to insert it just before + // the &. + int htmlEntityStarts = matched.lastIndexOf( "&", nextSemi ); + int htmlEntityLength = nextSemi - htmlEntityStarts; + + // all text before the entity, then a wbr, then the entity + wordWrapLink.append( matched.mid( k, htmlEntityStarts - k ) + "" + matched.mid( htmlEntityStarts, htmlEntityLength ) ); + + // then increase the current position just a little so the next run starts after the entity + k += nextSemi - ( k + WORDWRAP_EVERY ); + } else { + // otherwise, just append. + wordWrapLink.append( matched.mid( k, WORDWRAP_EVERY ) + "" ); + } + } + wordWrapLink.chop( 6 ); // chop off the last + + if( matched.startsWith( "www." ) ) + { + replacement = "" + + wordWrapLink + ""; + } + else + { + replacement = "" + + wordWrapLink + ""; + } + 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 ); + + // note that a regexp match starting with a html entity (such as a custom emoticon "&)" or the + // MSN emoticon "('.')" ) will appear as for example '&)' in the regexp; this will not collide + // with the emoticon ;) because it appears in the regexp as ;). So no worries, no hacks, no fixes needed. + + 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() ) + { + kError() << "Zero-length regexp match in regexp" << i << "- string:" << parseString; + kError() << "Regexp at this point: " << regexp->pattern(); +#ifdef KMESSTEST + KMESS_ASSERT( regexp->pattern() == regexps[i]->pattern() ); +#endif + // try to fix it by skipping this frame and leaving the rest the same... + j++; + continue; + } + +#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 + .replace( "> ", "> " ) + // Replace double spaces with double  s so that they'll show properly + .replace( " ", "  " ); + + // TODO: We don't want to remove MSN+ tags when showFormatting is disabled!! + // 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) +FormattedString::FormattedString( 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 &FormattedString::getString( FormattingMode mode ) const +{ + switch( mode ) + { + 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_; + } +} + + + +// Set a string, which will be formatted according to the given flags +void FormattedString::setString( const QString &string ) +{ + // Save the new string everywhere + cleaned_ = + escaped_ = + original_ = + 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 new file mode 100644 index 0000000..2b33420 --- /dev/null +++ b/src/utils/richtextparser.h @@ -0,0 +1,168 @@ +/*************************************************************************** + msnplus.h - adds MSN Plus! codes/features + ------------------- + 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 RICHTEXTPARSER_H +#define RICHTEXTPARSER_H + +#include "../emoticon.h" + +#include +#include + + +#define 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 FormattingMode +{ + 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 +}; + + + +/** + * @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 RichTextParser +{ + 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) ); + + + 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 FormattedString +{ + public: + // Constructor, can be told to not parse the initial string but just save it (during KMess initialization) + FormattedString( 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( FormattingMode mode = 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 diff --git a/kmess/thumbnailprovider.cpp b/src/utils/thumbnailprovider.cpp similarity index 70% rename from kmess/thumbnailprovider.cpp rename to src/utils/thumbnailprovider.cpp index 3940122..1d02f5f 100644 --- a/kmess/thumbnailprovider.cpp +++ b/src/utils/thumbnailprovider.cpp @@ -21,16 +21,14 @@ #include "kmessdebug.h" -#include -#include -#include -#include +#include +#include +#include -#include -#include -#include +#include +#include +#include -#include // for memset() /** @@ -42,16 +40,15 @@ * @param fileName Name of the file to request. * @param size Size of the thumbnails. Windows Live Messenger also uses 96x96 thumbnails for all files. * Depending on it's "file preview size" setting, it scales the received images down afterwards. - * @param fallback Whether to return a fallback icon instead. This is a generic file type icon also used in the Konqueror. */ ThumbnailProvider::ThumbnailProvider( const QString &fileName, int size ) -: QObject( 0, "ThumbnailProvider" ) +: QObject( 0 ) , fileName_( fileName ) , resultError_( false ) , size_( size ) { #ifdef KMESSDEBUG_THUMBNAILPROVIDER - kdDebug() << "ThumbnailProvider: requesting thumbnail for" << fileName << endl; + kDebug() << "requesting thumbnail for" << fileName; #endif // The quick method (also displays a transfer dialog): @@ -62,23 +59,23 @@ ThumbnailProvider::ThumbnailProvider( const QString &fileName, int size ) // The complex (but async) method: // Wrap file in a file list, use KIO::PreviewJob - KURL url( fileName ); - fileList_ = KURL::List( url ); + KUrl url( fileName ); + fileList_ = KUrl::List( url ); // Remove preview for text files // TODO: preview should work, but doesn't enabledPlugins_ = KIO::PreviewJob::availablePlugins(); - enabledPlugins_.remove( "textthumbnail" ); + enabledPlugins_.removeAll( "textthumbnail" ); #ifdef KMESSDEBUG_THUMBNAILPROVIDER - kdDebug() << "ThumbnailProvider: enabled preview plugins: " << enabledPlugins_ << endl; + kDebug() << "enabled preview plugins: " << enabledPlugins_; #endif // Get file type - KMimeType::Ptr type = KMimeType::findByURL( url ); + KMimeType::Ptr type = KMimeType::findByUrl( url ); #ifdef KMESSDEBUG_THUMBNAILPROVIDER - kdDebug() << "ThumbnailProvider: file mime type '" << type->name() << "'" << endl; + kDebug() << "file mime type '" << type->name() << "'"; #endif // For some file types, don't generate a preview @@ -86,7 +83,7 @@ ThumbnailProvider::ThumbnailProvider( const QString &fileName, int size ) if( type->name() == "text/plain" ) { #ifdef KMESSDEBUG_THUMBNAILPROVIDER - kdDebug() << "ThumbnailProvider: not creating previews for this file type." << endl; + kDebug() << "not creating previews for this file type."; #endif // Make slot call delayed, so clients can still connect to signals first. QTimer::singleShot( 0, this, SLOT(slotFailed()) ); @@ -101,10 +98,10 @@ ThumbnailProvider::ThumbnailProvider( const QString &fileName, int size ) &enabledPlugins_ ); // Connect signals. - connect( previewJob, SIGNAL( gotPreview(const KFileItem*, const QPixmap&) ), - this, SLOT( slotGotPreview(const KFileItem*, const QPixmap&) )); - connect( previewJob, SIGNAL( failed(const KFileItem*) ), - this, SLOT( slotFailed(const KFileItem*) )); + connect( previewJob, SIGNAL( gotPreview(const KFileItem&, const QPixmap&) ), + this, SLOT( slotGotPreview(const KFileItem&, const QPixmap&) )); + connect( previewJob, SIGNAL( failed(const KFileItem&) ), + this, SLOT( slotFailed(const KFileItem&) )); // The KIO::PreviewJob auto deletes itself. } @@ -139,9 +136,9 @@ const QByteArray &ThumbnailProvider::getData() const */ void ThumbnailProvider::generateFallbackImage() { - QString iconTitle = KMimeType::iconForURL( KURL( fileName_ ) ); - KIconLoader *loader = KGlobal::iconLoader(); - QString iconPath = loader->iconPath( iconTitle, -size_, false ); + QString iconTitle( KMimeType::iconNameForUrl( KUrl( fileName_ ) ) ); + KIconLoader *loader = KIconLoader::global(); + QString iconPath ( loader->iconPath( iconTitle, -size_, false ) ); storeImage( QImage( iconPath ) ); } @@ -167,11 +164,11 @@ QString ThumbnailProvider::getImageTag( const QString &altText ) const return QString::null; } - QString previewData = KCodecs::base64Encode( thumbnailData_ ); + QString previewData( thumbnailData_.toBase64() ); return "\"""; + " alt=\"" + Qt::escape( altText ) + "\" />"; } @@ -179,32 +176,33 @@ QString ThumbnailProvider::getImageTag( const QString &altText ) const /** * @brief Called when a preview is available. */ -void ThumbnailProvider::slotGotPreview( const KFileItem */*fileItem*/, const QPixmap &preview ) +void ThumbnailProvider::slotGotPreview( const KFileItem& /*fileItem*/, const QPixmap &preview ) { #ifdef KMESSDEBUG_THUMBNAILPROVIDER - kdDebug() << "ThumbnailProvider: thumbnail generated." << endl; + kDebug() << "thumbnail generated."; #endif // The KFileItem already gets deleted by KIO // Downloads QPixmap from the X server again to a QImage in the client memory. // So far this can't be avoided because KIO::PreviewJob already generates a QPixmap. - QImage image; - image = preview; // Resize canvas to square size for Windows Live Messenger. // This way the image is not chopped by the standard small preview size. - if( image.width() != image.height() ) + if( preview.width() != preview.height() ) { + int size = qMax( preview.width(), preview.height() ); + // The smooth transformation is slower but better than Qt::FastTransformation + QPixmap resized = preview.scaled( size, size, Qt::KeepAspectRatio, Qt::SmoothTransformation ); + storeImage( resized.toImage() ); + // Create square canvas with transparent background - int size = QMAX( image.width(), image.height() ); - QImage fixedImage( size, size, 32 ); - fixedImage.setAlphaBuffer( true ); - fixedImage.fill( qRgba( 0xff, 0xff, 0xff, 0xff ) ); // white transparent. +// QImage fixedImage( size, size, QImage::Format_ARGB32 ); +// fixedImage.fill( qRgba( 0xff, 0xff, 0xff, 0xff ) ); // white transparent. // Qt bug: the fill() works in stand-alone apps, but not here. // Found at openSUSE, Qt 3.3.8, KDE 3.5.6. The following the scanlines with the same color. - memset( fixedImage.bits(), 0, size * size * 4 ); +// memset( fixedImage.bits(), 0, size * size * 4 ); /* uint **imageBits = (uint**) fixedImage.jumpTable(); @@ -219,14 +217,14 @@ void ThumbnailProvider::slotGotPreview( const KFileItem */*fileItem*/, const QPi */ // Copy image data centered in new image. - bitBlt( &fixedImage, ( size - image.width() ) / 2, ( size - image.height() ) / 2, // dest, dx, dy - &image, 0, 0, -1, -1, 0 ); // src, x, y, width, height, conversion_flags +// bitBlt( &fixedImage, ( size - image.width() ) / 2, ( size - image.height() ) / 2, // dest, dx, dy +// &image, 0, 0, -1, -1, 0 ); // src, x, y, width, height, conversion_flags - storeImage( fixedImage ); +// storeImage( fixedImage ); } else { - storeImage( image ); + storeImage( preview.toImage() ); } // Store and emit result @@ -236,16 +234,30 @@ void ThumbnailProvider::slotGotPreview( const KFileItem */*fileItem*/, const QPi /** - * @brief Called when a preview could not be generated. + * @brief Called when a preview won't be generated. */ -void ThumbnailProvider::slotFailed( const KFileItem */*fileItem*/ ) +void ThumbnailProvider::slotFailed() { #ifdef KMESSDEBUG_THUMBNAILPROVIDER - kdDebug() << "ThumbnailProvider: thumbnail could not be generated." << endl; + kDebug() << "thumbnail won't not be generated."; #endif - // The KFileItem already gets deleted by KIO - // Note that the contructor currently can call slotFailed(0). + resultError_ = true; + emit gotResult(); +} + + + +/** + * @brief Called when a preview could not be generated. + */ +void ThumbnailProvider::slotFailed( const KFileItem &/*fileItem*/ ) +{ +#ifdef KMESSDEBUG_THUMBNAILPROVIDER + kDebug() << "thumbnail could not be generated."; +#endif + + // The KFileItem already gets deleted by KIO. // No file name, get generic file icon instead. resultError_ = true; @@ -267,12 +279,13 @@ void ThumbnailProvider::storeImage( const QImage &image ) // The client may scale the image down though depending on the settings. if( thumbnailImage_.width() > size_ || thumbnailImage_.height() > size_ ) { - thumbnailImage_ = thumbnailImage_.smoothScale( size_, size_, QImage::ScaleMin ); + // The smooth transformation is slower but better than Qt::FastTransformation + thumbnailImage_ = thumbnailImage_.scaled( size_, size_, Qt::KeepAspectRatio, Qt::SmoothTransformation ); } // Also save as PNG data for the file transfers. - QBuffer buffer( thumbnailData_ ); - buffer.open( IO_WriteOnly ); + QBuffer buffer( &thumbnailData_ ); + buffer.open( QIODevice::WriteOnly ); thumbnailImage_.save( &buffer, "PNG" ); } diff --git a/kmess/thumbnailprovider.h b/src/utils/thumbnailprovider.h similarity index 85% rename from kmess/thumbnailprovider.h rename to src/utils/thumbnailprovider.h index 916a278..dcc0edb 100644 --- a/kmess/thumbnailprovider.h +++ b/src/utils/thumbnailprovider.h @@ -20,23 +20,25 @@ #ifndef THUMBNAILPROVIDER_H #define THUMBNAILPROVIDER_H -#include -#include -#include -#include +#include +#include +#include -#include +#include + +// Forward declarations class KFileItem; + /** * @brief Utility class to generate thumbnails. * * The generated thumbnails are used for file transfer invitations. * - * @author Pedro Ferreira - * @ingroup Root + * @author Pedro Ferreira, Diederik van der Boor + * @ingroup Utils */ class ThumbnailProvider : public QObject { @@ -44,7 +46,7 @@ class ThumbnailProvider : public QObject public: // Constructor - ThumbnailProvider( const QString &fileName, int size = 96 ); + explicit ThumbnailProvider( const QString &fileName, int size = 96 ); // Return whether an image could be created bool isSuccessful() const; // Return the image data @@ -58,9 +60,11 @@ class ThumbnailProvider : public QObject private slots: // Called when a preview is available. - void slotGotPreview( const KFileItem *item, const QPixmap &preview ); + void slotGotPreview( const KFileItem& item, const QPixmap &preview ); + // Called when a preview won't be generated. + void slotFailed(); // Called when a preview could not be generated. - void slotFailed( const KFileItem *item = 0 ); + void slotFailed( const KFileItem &item ); private: // Store the image in the instance fields. @@ -72,7 +76,7 @@ class ThumbnailProvider : public QObject /// The file name QString fileName_; /// The file list (required to avoid KIO crashes) - KURL::List fileList_; + KUrl::List fileList_; /// Whether an error occured bool resultError_; /// The requested size diff --git a/kmess/xautolock.cpp b/src/utils/xautolock.cpp similarity index 65% rename from kmess/xautolock.cpp rename to src/utils/xautolock.cpp index fe66c28..af10e85 100644 --- a/kmess/xautolock.cpp +++ b/src/utils/xautolock.cpp @@ -1,4 +1,3 @@ - /*************************************************************************** xautolock.cpp - user inactivity timer ------------------- @@ -16,7 +15,13 @@ * * ***************************************************************************/ -#include "../config.h" + +#include +#include +#include + +#include "config-kmess.h" +#include "kmessdebug.h" #include "xautolock.h" #include @@ -25,33 +30,41 @@ #include #include +#ifdef Q_WS_X11 +#include #include #include #include /* The following include is to make --enable-final work */ #include -#ifdef HAVE_XSCREENSAVER -#include #endif -#include +#ifdef HAVE_XSCREENSAVER +#include +#else +// A special warning for all Gentoo users out there.. :-/ +#warning You are compiling KMess without support for the X11 screensaver extension. The auto-away feature will not work. +#endif + + +#ifdef KMESSDEBUG_AUTOLOCK +// #define KMESSDEBUG_AUTOLOCK_DBUS_QUERYING +#endif + -#include -#include -#include // Construct XAutoLock::XAutoLock() : active_( false ), idle_( false ), idleTime_( 0 ), - lastCheck_( time( 0 ) ), + lastCheck_( (uint)time( 0 ) ), mitAvailable_( false ), mitInfo_( 0 ), triggerTime_( 0 ) { - timer_ = new QTimer( this, "idleCheckTimer" ); + timer_ = new QTimer( this ); timer_->stop(); connect( timer_, SIGNAL( timeout() ), @@ -59,7 +72,7 @@ XAutoLock::XAutoLock() #ifdef HAVE_XSCREENSAVER int dummy; - mitAvailable_ = ( XScreenSaverQueryExtension( qt_xdisplay(), &dummy, &dummy ) != 0 ); + mitAvailable_ = ( XScreenSaverQueryExtension( QX11Info::display(), &dummy, &dummy ) != 0 ); #endif } @@ -70,7 +83,13 @@ XAutoLock::~XAutoLock() emit activity(); timer_->stop(); - delete mitInfo_; +#ifdef HAVE_XSCREENSAVER + if( mitInfo_ != 0 ) + { + XFree( mitInfo_ ); + } +#endif + delete timer_; } @@ -78,9 +97,10 @@ XAutoLock::~XAutoLock() // The main function which checks for idle status void XAutoLock::checkIdle() { - unsigned int now, timeIdle; + unsigned int now; + unsigned long timeIdle; - now = time( 0 ); + now = (uint)time( 0 ); if( abs( lastCheck_ - now ) > 120 ) { @@ -120,11 +140,11 @@ void XAutoLock::checkIdle() // Get idle time by asking the MIT-SCREEN-SAVER extension (if available) -unsigned int XAutoLock::getMitIdle() +unsigned long XAutoLock::getMitIdle() { #ifdef HAVE_XSCREENSAVER if ( !mitInfo_ ) mitInfo_ = XScreenSaverAllocInfo(); - XScreenSaverQueryInfo (qt_xdisplay(), DefaultRootWindow( qt_xdisplay() ), mitInfo_ ); + XScreenSaverQueryInfo (QX11Info::display(), DefaultRootWindow( QX11Info::display() ), mitInfo_ ); return mitInfo_->idle / 1000; #else @@ -149,11 +169,11 @@ bool XAutoLock::isMitScreenSaverActive() return false; XScreenSaverInfo *info = XScreenSaverAllocInfo(); - XScreenSaverQueryInfo( qt_xdisplay(), DefaultRootWindow( qt_xdisplay() ), info ); + XScreenSaverQueryInfo( QX11Info::display(), DefaultRootWindow( QX11Info::display() ), info ); bool state = ( info->state == ScreenSaverOn ); - delete info; + XFree( info ); return state; #else return false; @@ -164,23 +184,40 @@ bool XAutoLock::isMitScreenSaverActive() // Get screen saver status by asking the KDE Screen Saver or X extensions bool XAutoLock::isScreenSaverActive() { - QCString replyType; - QByteArray args, replyData; - DCOPClient *dcop = kapp->dcopClient(); +#ifdef KMESSDEBUG_AUTOLOCK_DBUS_QUERYING + kDebug() << "Calling D-Bus for screensaver status..."; +#endif - // Call KScreenSaver with DCOP to find if it's on (timeouts after 1s) - if( dcop - && dcop->call( "kdesktop", "KScreensaverIface", "isBlanked", args, replyType, replyData, true, 1000 ) - && replyType == "bool" ) + // Get on the bus + const QDBusConnection& dbus( QDBusConnection::sessionBus() ); + + if( ! dbus.isConnected() ) { - // Extract data - bool returnValue; - QDataStream reply( replyData, IO_ReadOnly ); - reply >> returnValue; - - return returnValue; +#ifdef KMESSDEBUG_AUTOLOCK_DBUS_QUERYING + kDebug() << "D-Bus is not connected! Falling back to the X screensaver extension."; +#endif + return isMitScreenSaverActive(); } + // Generate the message we'll send to the active Screen Saver service + const QDBusMessage& message( QDBusMessage::createMethodCall( "org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", "GetActive" ) ); + + // Call the service and wait for it to answer + const QDBusReply& reply( dbus.call( message ) ); + + // Check if the answer is valid, and if so return the obtained value + if( reply.isValid() ) + { +#ifdef KMESSDEBUG_AUTOLOCK_DBUS_QUERYING + kDebug() << "Screensaver is" << ( reply ? "" : "not" ) << "active"; +#endif + return reply; + } + +#ifdef KMESSDEBUG_AUTOLOCK_DBUS_QUERYING + kDebug() << "Got error screensaver response:" << reply.error() << ". Falling back to the X screensaver extension."; +#endif + // As a fallback, when the DCOP call fails, ask the MIT-SCREEN-SAVER extension. return isMitScreenSaverActive(); } @@ -190,7 +227,7 @@ bool XAutoLock::isScreenSaverActive() void XAutoLock::resetTimer() { idle_ = false; - idleTime_ = time( 0 ); + idleTime_ = (uint)time( 0 ); emit activity(); } diff --git a/kmess/xautolock.h b/src/utils/xautolock.h similarity index 96% rename from kmess/xautolock.h rename to src/utils/xautolock.h index 5a66e0f..c2fac84 100644 --- a/kmess/xautolock.h +++ b/src/utils/xautolock.h @@ -19,9 +19,7 @@ #ifndef XAUTOLOCK_H #define XAUTOLOCK_H - -#include -#include +#include #ifdef HAVE_XSCREENSAVER #include @@ -38,7 +36,7 @@ * but heavily modified and rewritten since. * * @author Michael Curtis - * @ingroup Root + * @ingroup Utils */ class XAutoLock : public QObject { @@ -48,7 +46,7 @@ class XAutoLock : public QObject // Constructor XAutoLock(); // Destructor - ~XAutoLock(); + virtual ~XAutoLock(); // Set the timeout void setTimeOut( unsigned int timeOut ); // Start the idle timer @@ -75,7 +73,7 @@ class XAutoLock : public QObject // Get idle time by detecting time since last mouse movement unsigned int getMouseIdle(); // Get idle time by asking the MIT-SCREEN-SAVER extension (if available) - unsigned int getMitIdle(); + unsigned long getMitIdle(); // Reset the timer (after we've just become active again, for example) void resetTimer(); diff --git a/kmess/network/extra/xmlfunctions.cpp b/src/utils/xmlfunctions.cpp similarity index 72% rename from kmess/network/extra/xmlfunctions.cpp rename to src/utils/xmlfunctions.cpp index 4cc34e6..fb2286c 100644 --- a/kmess/network/extra/xmlfunctions.cpp +++ b/src/utils/xmlfunctions.cpp @@ -16,23 +16,26 @@ ***************************************************************************/ #include "xmlfunctions.h" -#include "../../kmessdebug.h" -#include +#include "../kmessdebug.h" + +#include +#include + // Helper function, get a specific node QDomNode XmlFunctions::getNode( const QDomNode &rootNode, const QString &path ) { #ifdef KMESSTEST - ASSERT( ! rootNode.isNull() ); - ASSERT( ! path.isEmpty() ); + KMESS_ASSERT( ! rootNode.isNull() ); + KMESS_ASSERT( ! path.isEmpty() ); #endif - QStringList pathItems = QStringList::split( "/", path, false ); - 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 - uint i = 1; + int i = 1; while( i < pathItems.count() ) { if( childNode.isNull() ) @@ -41,14 +44,13 @@ QDomNode XmlFunctions::getNode( const QDomNode &rootNode, const QString &path ) } childNode = childNode.namedItem( pathItems[ i ] ); - i++; // not using for loop so i is always correct for kdDebug() below. + i++; // not using for loop so i is always correct for kDebug() below. } #ifdef KMESSDEBUG_XMLFUNCTIONS - if( childNode.isNull() ) { - kdDebug() << "XmlFunctions::getNode() - notice: node '" << pathItems[ i - 1 ] << "'" - << " does not exist (root=" << rootNode.nodeName() << " path=" << path << ")." << endl; - } + QString message( "reading node \"" + rootNode.nodeName() + "/" + pathItems.join("/") + "\": " + + ( ! childNode.isNull() ? "found" : "not found: " + pathItems[ i - 1 ] ) ); + kDebug() << message.toLatin1().data(); #endif return childNode; @@ -60,8 +62,8 @@ QDomNode XmlFunctions::getNode( const QDomNode &rootNode, const QString &path ) QString XmlFunctions::getNodeAttribute( const QDomNode &node, const QString &attribute ) { #ifdef KMESSTEST - ASSERT( ! node.isNull() ); - ASSERT( ! attribute.isEmpty() ); + KMESS_ASSERT( ! node.isNull() ); + KMESS_ASSERT( ! attribute.isEmpty() ); #endif // Writing this is not funny @@ -75,13 +77,13 @@ QString XmlFunctions::getNodeAttribute( const QDomNode &node, const QString &att QDomNode XmlFunctions::getNodeChildByKey( const QDomNodeList &childNodes, const QString &keyTagName, const QString &keyValue ) { #ifdef KMESSTEST - ASSERT( ! keyTagName .isEmpty() ); - ASSERT( ! keyValue .isEmpty() ); + KMESS_ASSERT( ! keyTagName .isEmpty() ); + KMESS_ASSERT( ! keyValue .isEmpty() ); #endif - for( uint i = 0; i < childNodes.count(); i++ ) + for( int i = 0; i < childNodes.count(); i++ ) { -// kdDebug() << "node " << childNodes.item(i).nodeName() << "/" << keyTagName +// kDebug() << "node " << childNodes.item(i).nodeName() << "/" << keyTagName // << "=" << childNodes.item(i).namedItem(keyTagName).toElement().text() << " == " << keyValue << "?" << endl; // If the node has an childname with a certain value... e.g. value .. @@ -102,27 +104,29 @@ QDomNode XmlFunctions::getNodeChildByKey( const QDomNodeList &childNodes, const QString XmlFunctions::getNodeValue( const QDomNode &rootNode, const QString &path ) { #ifdef KMESSTEST - ASSERT( ! rootNode.isNull() ); - ASSERT( ! path.isEmpty() ); + KMESS_ASSERT( ! rootNode.isNull() ); + KMESS_ASSERT( ! path.isEmpty() ); // Added code to avoid more assertion errors, and trace the cause. if( rootNode.isNull() ) { - kdWarning() << "XmlFunctions::getNodeValue: Attempted to request '" << path << "' on null root node." << endl; + kWarning() << "Attempted to request '" << path << "' on null root node."; return QString::null; } #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(); } + // Helper function, get the source XML of a node. QString XmlFunctions::getSource( const QDomNode &node, int indent ) { QString source; - QTextStream textStream( &source, IO_WriteOnly ); + QTextStream textStream( &source, QIODevice::WriteOnly ); node.save( textStream, indent ); return source; } diff --git a/kmess/network/extra/xmlfunctions.h b/src/utils/xmlfunctions.h similarity index 93% rename from kmess/network/extra/xmlfunctions.h rename to src/utils/xmlfunctions.h index 6080cd0..c04e6ef 100644 --- a/kmess/network/extra/xmlfunctions.h +++ b/src/utils/xmlfunctions.h @@ -18,13 +18,19 @@ #ifndef XMLFUNCTIONS_H #define XMLFUNCTIONS_H -#include +#include + + +// Forward declarations +class QDomNodeList; + + /** - * Some helper functions to make the handling of QDom easier. + * @brief Helper functions to make the use of QDom easier. * * @author Diederik van der Boor - * @ingroup NetworkExtra + * @ingroup Utils */ class XmlFunctions { diff --git a/stamp-h.in b/stamp-h.in deleted file mode 100644 index e69de29..0000000 diff --git a/subdirs b/subdirs deleted file mode 100644 index 9033076..0000000 --- a/subdirs +++ /dev/null @@ -1,3 +0,0 @@ -doc -kmess -po 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 a52a676..20a37ed 100644 --- a/templates/h +++ b/templates/h @@ -1,8 +1,8 @@ /*************************************************************************** (filename).h - description ------------------- - begin : (Weekday) (Month) (day) 2008 - copyright : (C) 2007 by (yourname) + begin : (Weekday) (Month) (day) 2009 + copyright : (C) 2009 by (yourname) email : (e-mail address) ***************************************************************************/ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..f789ac3 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1 @@ +# Do nothing here :) diff --git a/tests/modeltest/LICENSE.GPL b/tests/modeltest/LICENSE.GPL new file mode 100644 index 0000000..4ccd714 --- /dev/null +++ b/tests/modeltest/LICENSE.GPL @@ -0,0 +1,342 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +------------------------------------------------------------------------- diff --git a/tests/modeltest/README b/tests/modeltest/README new file mode 100644 index 0000000..f13e2af --- /dev/null +++ b/tests/modeltest/README @@ -0,0 +1,30 @@ +ModelTest provides a way to check for common errors in implementations of http://doc.trolltech.com/4/qabstractitemmodel.html. + + +ModelTest continuously checks a model as it changes, helping to verify the state and catching many common errors the moment they show up such as: +
      +
    • Verifing X number of rows have been inserted in the correct place after the signal rowsAboutToBeInserted() says X rows will be inserted.
    • +
    • The parent of the first index of the first row is a QModelIndex()
    • +
    • Calling index() twice in a row with the same values will return the same QModelIndex
    • +
    • If rowCount() says there are X number of rows, model test will verify that is true. +
    • Many possible off by one bugs
    • +
    • hasChildren() returns true if rowCount() is greater then zero.
    • +
    • and many more...
    • +
    + +--- + +To Use the model test do the following: + +1) Include the pri file at the end of your project pro file using the include() command like so: + +include(../path/to/dir/modeltest.pri) + +2) Then in your source include "modeltest.h" and instantiate ModelTest with your model so the test can live for the lifetime of your model. For example: + +#include + +QDirModel *model = new QDirModel(this); +new ModelTest(model, this); + +3) That is it. When the test finds a problem it will assert. modeltest.cpp contains some hints on how to fix problems that the test finds. diff --git a/tests/modeltest/README.kmess b/tests/modeltest/README.kmess new file mode 100644 index 0000000..c9e583d --- /dev/null +++ b/tests/modeltest/README.kmess @@ -0,0 +1,5 @@ +** KMess Developers info ** + +You can find the ModelTest repository at: +svn://labs.trolltech.com/svn/itemviews/modeltest +We didn't just export it because it's not so important to have it always updated. diff --git a/tests/modeltest/modeltest.cpp b/tests/modeltest/modeltest.cpp new file mode 100644 index 0000000..7b4dfaf --- /dev/null +++ b/tests/modeltest/modeltest.cpp @@ -0,0 +1,525 @@ +/**************************************************************************** +** +** Copyright (C) 2007 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Concurrent project on Trolltech Labs. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include "modeltest.h" + +Q_DECLARE_METATYPE(QModelIndex) + +/*! + Connect to all of the models signals. Whenever anything happens recheck everything. +*/ +ModelTest::ModelTest(QAbstractItemModel *_model, QObject *parent) : QObject(parent), model(_model), fetchingMore(false) +{ + Q_ASSERT(model); + + connect(model, SIGNAL(columnsAboutToBeInserted(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(columnsAboutToBeRemoved(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(columnsInserted(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(columnsRemoved(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(headerDataChanged(Qt::Orientation, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(layoutAboutToBeChanged ()), this, SLOT(runAllTests())); + connect(model, SIGNAL(layoutChanged ()), this, SLOT(runAllTests())); + connect(model, SIGNAL(modelReset ()), this, SLOT(runAllTests())); + connect(model, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + connect(model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), + this, SLOT(runAllTests())); + + // Special checks for inserting/removing + connect(model, SIGNAL(layoutAboutToBeChanged()), + this, SLOT(layoutAboutToBeChanged())); + connect(model, SIGNAL(layoutChanged()), + this, SLOT(layoutChanged())); + + connect(model, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)), + this, SLOT(rowsAboutToBeInserted(const QModelIndex &, int, int))); + connect(model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), + this, SLOT(rowsAboutToBeRemoved(const QModelIndex &, int, int))); + connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), + this, SLOT(rowsInserted(const QModelIndex &, int, int))); + connect(model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), + this, SLOT(rowsRemoved(const QModelIndex &, int, int))); + + runAllTests(); +} + +void ModelTest::runAllTests() +{ + if (fetchingMore) + return; + nonDestructiveBasicTest(); + rowCount(); + columnCount(); + hasIndex(); + index(); + parent(); + data(); +} + +/*! + nonDestructiveBasicTest tries to call a number of the basic functions (not all) + to make sure the model doesn't outright segfault, testing the functions that makes sense. +*/ +void ModelTest::nonDestructiveBasicTest() +{ + Q_ASSERT(model->buddy(QModelIndex()) == QModelIndex()); + model->canFetchMore(QModelIndex()); + Q_ASSERT(model->columnCount(QModelIndex()) >= 0); + Q_ASSERT(model->data(QModelIndex()) == QVariant()); + fetchingMore = true; + model->fetchMore(QModelIndex()); + fetchingMore = false; + Qt::ItemFlags flags = model->flags(QModelIndex()); + Q_ASSERT(flags == Qt::ItemIsDropEnabled || flags == 0); + model->hasChildren(QModelIndex()); + model->hasIndex(0, 0); + model->headerData(0, Qt::Horizontal); + model->index(0, 0); + model->itemData(QModelIndex()); + QVariant cache; + model->match(QModelIndex(), -1, cache); + model->mimeTypes(); + Q_ASSERT(model->parent(QModelIndex()) == QModelIndex()); + Q_ASSERT(model->rowCount() >= 0); + QVariant variant; + model->setData(QModelIndex(), variant, -1); + model->setHeaderData(-1, Qt::Horizontal, QVariant()); + model->setHeaderData(999999, Qt::Horizontal, QVariant()); + QMap roles; + model->sibling(0, 0, QModelIndex()); + model->span(QModelIndex()); + model->supportedDropActions(); +} + +/*! + Tests model's implementation of QAbstractItemModel::rowCount() and hasChildren() + + Models that are dynamically populated are not as fully tested here. + */ +void ModelTest::rowCount() +{ + // check top row + QModelIndex topIndex = model->index(0, 0, QModelIndex()); + int rows = model->rowCount(topIndex); + Q_ASSERT(rows >= 0); + if (rows > 0) + Q_ASSERT(model->hasChildren(topIndex) == true); + + QModelIndex secondLevelIndex = model->index(0, 0, topIndex); + if (secondLevelIndex.isValid()) { // not the top level + // check a row count where parent is valid + rows = model->rowCount(secondLevelIndex); + Q_ASSERT(rows >= 0); + if (rows > 0) + Q_ASSERT(model->hasChildren(secondLevelIndex) == true); + } + + // The models rowCount() is tested more extensively in checkChildren(), + // but this catches the big mistakes +} + +/*! + Tests model's implementation of QAbstractItemModel::columnCount() and hasChildren() + */ +void ModelTest::columnCount() +{ + // check top row + QModelIndex topIndex = model->index(0, 0, QModelIndex()); + Q_ASSERT(model->columnCount(topIndex) >= 0); + + // check a column count where parent is valid + QModelIndex childIndex = model->index(0, 0, topIndex); + if (childIndex.isValid()) + Q_ASSERT(model->columnCount(childIndex) >= 0); + + // columnCount() is tested more extensively in checkChildren(), + // but this catches the big mistakes +} + +/*! + Tests model's implementation of QAbstractItemModel::hasIndex() + */ +void ModelTest::hasIndex() +{ + // Make sure that invalid values returns an invalid index + Q_ASSERT(model->hasIndex(-2, -2) == false); + Q_ASSERT(model->hasIndex(-2, 0) == false); + Q_ASSERT(model->hasIndex(0, -2) == false); + + int rows = model->rowCount(); + int columns = model->columnCount(); + + // check out of bounds + Q_ASSERT(model->hasIndex(rows, columns) == false); + Q_ASSERT(model->hasIndex(rows + 1, columns + 1) == false); + + if (rows > 0) + Q_ASSERT(model->hasIndex(0, 0) == true); + + // hasIndex() is tested more extensively in checkChildren(), + // but this catches the big mistakes +} + +/*! + Tests model's implementation of QAbstractItemModel::index() + */ +void ModelTest::index() +{ + // Make sure that invalid values returns an invalid index + Q_ASSERT(model->index(-2, -2) == QModelIndex()); + Q_ASSERT(model->index(-2, 0) == QModelIndex()); + Q_ASSERT(model->index(0, -2) == QModelIndex()); + + int rows = model->rowCount(); + int columns = model->columnCount(); + + if (rows == 0) + return; + + // Catch off by one errors + Q_ASSERT(model->index(rows, columns) == QModelIndex()); + Q_ASSERT(model->index(0, 0).isValid() == true); + + // Make sure that the same index is *always* returned + QModelIndex a = model->index(0, 0); + QModelIndex b = model->index(0, 0); + Q_ASSERT(a == b); + + // index() is tested more extensively in checkChildren(), + // but this catches the big mistakes +} + +/*! + Tests model's implementation of QAbstractItemModel::parent() + */ +void ModelTest::parent() +{ + // Make sure the model wont crash and will return an invalid QModelIndex + // when asked for the parent of an invalid index. + Q_ASSERT(model->parent(QModelIndex()) == QModelIndex()); + + if (model->rowCount() == 0) + return; + + // Column 0 | Column 1 | + // QModelIndex() | | + // \- topIndex | topIndex1 | + // \- childIndex | childIndex1 | + + // Common error test #1, make sure that a top level index has a parent + // that is a invalid QModelIndex. + QModelIndex topIndex = model->index(0, 0, QModelIndex()); + Q_ASSERT(model->parent(topIndex) == QModelIndex()); + + // Common error test #2, make sure that a second level index has a parent + // that is the first level index. + if (model->rowCount(topIndex) > 0) { + QModelIndex childIndex = model->index(0, 0, topIndex); + Q_ASSERT(model->parent(childIndex) == topIndex); + } + + // Common error test #3, the second column should NOT have the same children + // as the first column in a row. + // Usually the second column shouldn't have children. + QModelIndex topIndex1 = model->index(0, 1, QModelIndex()); + if (model->rowCount(topIndex1) > 0) { + QModelIndex childIndex = model->index(0, 0, topIndex); + QModelIndex childIndex1 = model->index(0, 0, topIndex1); + Q_ASSERT(childIndex != childIndex1); + } + + // Full test, walk n levels deep through the model making sure that all + // parent's children correctly specify their parent. + checkChildren(QModelIndex()); +} + +/*! + Called from the parent() test. + + A model that returns an index of parent X should also return X when asking + for the parent of the index. + + This recursive function does pretty extensive testing on the whole model in an + effort to catch edge cases. + + This function assumes that rowCount(), columnCount() and index() already work. + If they have a bug it will point it out, but the above tests should have already + found the basic bugs because it is easier to figure out the problem in + those tests then this one. + */ +void ModelTest::checkChildren(const QModelIndex &parent, int currentDepth) +{ + // First just try walking back up the tree. + QModelIndex p = parent; + while (p.isValid()) + p = p.parent(); + + // For models that are dynamically populated + if (model->canFetchMore(parent)) { + fetchingMore = true; + model->fetchMore(parent); + fetchingMore = false; + } + + int rows = model->rowCount(parent); + int columns = model->columnCount(parent); + + if (rows > 0) + Q_ASSERT(model->hasChildren(parent)); + + // Some further testing against rows(), columns(), and hasChildren() + Q_ASSERT(rows >= 0); + Q_ASSERT(columns >= 0); + if (rows > 0) + Q_ASSERT(model->hasChildren(parent) == true); + + //qDebug() << "parent:" << model->data(parent).toString() << "rows:" << rows + // << "columns:" << columns << "parent column:" << parent.column(); + + Q_ASSERT(model->hasIndex(rows + 1, 0, parent) == false); + for (int r = 0; r < rows; ++r) { + if (model->canFetchMore(parent)) { + fetchingMore = true; + model->fetchMore(parent); + fetchingMore = false; + } + Q_ASSERT(model->hasIndex(r, columns + 1, parent) == false); + for (int c = 0; c < columns; ++c) { + Q_ASSERT(model->hasIndex(r, c, parent) == true); + QModelIndex index = model->index(r, c, parent); + // rowCount() and columnCount() said that it existed... + Q_ASSERT(index.isValid() == true); + + // index() should always return the same index when called twice in a row + QModelIndex modifiedIndex = model->index(r, c, parent); + Q_ASSERT(index == modifiedIndex); + + // Make sure we get the same index if we request it twice in a row + QModelIndex a = model->index(r, c, parent); + QModelIndex b = model->index(r, c, parent); + Q_ASSERT(a == b); + + // Some basic checking on the index that is returned + Q_ASSERT(index.model() == model); + Q_ASSERT(index.row() == r); + Q_ASSERT(index.column() == c); + // While you can technically return a QVariant usually this is a sign + // of an bug in data() Disable if this really is ok in your model. + Q_ASSERT(model->data(index, Qt::DisplayRole).isValid() == true); + + // If the next test fails here is some somewhat useful debug you play with. + /* + if (model->parent(index) != parent) { + qDebug() << r << c << currentDepth << model->data(index).toString() + << model->data(parent).toString(); + qDebug() << index << parent << model->parent(index); + // And a view that you can even use to show the model. + //QTreeView view; + //view.setModel(model); + //view.show(); + }*/ + + // Check that we can get back our real parent. + Q_ASSERT(model->parent(index) == parent); + + // recursively go down the children + if (model->hasChildren(index) && currentDepth < 10 ) { + //qDebug() << r << c << "has children" << model->rowCount(index); + checkChildren(index, ++currentDepth); + }/* else { if (currentDepth >= 10) qDebug() << "checked 10 deep"; };*/ + + // make sure that after testing the children that the index doesn't change. + QModelIndex newerIndex = model->index(r, c, parent); + Q_ASSERT(index == newerIndex); + } + } +} + +/*! + Tests model's implementation of QAbstractItemModel::data() + */ +void ModelTest::data() +{ + // Invalid index should return an invalid qvariant + Q_ASSERT(!model->data(QModelIndex()).isValid()); + + if (model->rowCount() == 0) + return; + + // A valid index should have a valid QVariant data + Q_ASSERT(model->index(0, 0).isValid()); + + // shouldn't be able to set data on an invalid index + Q_ASSERT(model->setData(QModelIndex(), QLatin1String("foo"), Qt::DisplayRole) == false); + + // General Purpose roles that should return a QString + QVariant variant = model->data(model->index(0, 0), Qt::ToolTipRole); + if (variant.isValid()) { + Q_ASSERT(qVariantCanConvert(variant)); + } + variant = model->data(model->index(0, 0), Qt::StatusTipRole); + if (variant.isValid()) { + Q_ASSERT(qVariantCanConvert(variant)); + } + variant = model->data(model->index(0, 0), Qt::WhatsThisRole); + if (variant.isValid()) { + Q_ASSERT(qVariantCanConvert(variant)); + } + + // General Purpose roles that should return a QSize + variant = model->data(model->index(0, 0), Qt::SizeHintRole); + if (variant.isValid()) { + Q_ASSERT(qVariantCanConvert(variant)); + } + + // General Purpose roles that should return a QFont + QVariant fontVariant = model->data(model->index(0, 0), Qt::FontRole); + if (fontVariant.isValid()) { + Q_ASSERT(qVariantCanConvert(fontVariant)); + } + + // Check that the alignment is one we know about + QVariant textAlignmentVariant = model->data(model->index(0, 0), Qt::TextAlignmentRole); + if (textAlignmentVariant.isValid()) { + int alignment = textAlignmentVariant.toInt(); + Q_ASSERT(alignment == (alignment & (Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask))); + } + + // General Purpose roles that should return a QColor + QVariant colorVariant = model->data(model->index(0, 0), Qt::BackgroundColorRole); + if (colorVariant.isValid()) { + Q_ASSERT(qVariantCanConvert(colorVariant)); + } + + colorVariant = model->data(model->index(0, 0), Qt::TextColorRole); + if (colorVariant.isValid()) { + Q_ASSERT(qVariantCanConvert(colorVariant)); + } + + // Check that the "check state" is one we know about. + QVariant checkStateVariant = model->data(model->index(0, 0), Qt::CheckStateRole); + if (checkStateVariant.isValid()) { + int state = checkStateVariant.toInt(); + Q_ASSERT(state == Qt::Unchecked || + state == Qt::PartiallyChecked || + state == Qt::Checked); + } +} + +/*! + Store what is about to be inserted to make sure it actually happens + + \sa rowsInserted() + */ +void ModelTest::rowsAboutToBeInserted(const QModelIndex &parent, int start, int end) +{ + Q_UNUSED(end); + Changing c; + c.parent = parent; + c.oldSize = model->rowCount(parent); + c.last = model->data(model->index(start - 1, 0, parent)); + c.next = model->data(model->index(start, 0, parent)); + insert.push(c); +} + +/*! + Confirm that what was said was going to happen actually did + + \sa rowsAboutToBeInserted() + */ +void ModelTest::rowsInserted(const QModelIndex & parent, int start, int end) +{ + Changing c = insert.pop(); + Q_ASSERT(c.parent == parent); + Q_ASSERT(c.oldSize + (end - start + 1) == model->rowCount(parent)); + Q_ASSERT(c.last == model->data(model->index(start - 1, 0, c.parent))); + /* + if (c.next != model->data(model->index(end + 1, 0, c.parent))) { + qDebug() << start << end; + for (int i=0; i < model->rowCount(); ++i) + qDebug() << model->index(i, 0).data().toString(); + qDebug() << c.next << model->data(model->index(end + 1, 0, c.parent)); + } + */ + Q_ASSERT(c.next == model->data(model->index(end + 1, 0, c.parent))); +} + +void ModelTest::layoutAboutToBeChanged() +{ + for (int i = 0; i < qBound(0, model->rowCount(), 100); ++i) + changing.append(QPersistentModelIndex(model->index(i, 0))); +} + +void ModelTest::layoutChanged() +{ + for (int i = 0; i < changing.count(); ++i) { + QPersistentModelIndex p = changing[i]; + Q_ASSERT(p == model->index(p.row(), p.column(), p.parent())); + } + changing.clear(); +} + +/*! + Store what is about to be inserted to make sure it actually happens + + \sa rowsRemoved() + */ +void ModelTest::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) +{ + Changing c; + c.parent = parent; + c.oldSize = model->rowCount(parent); + c.last = model->data(model->index(start - 1, 0, parent)); + c.next = model->data(model->index(end + 1, 0, parent)); + remove.push(c); +} + +/*! + Confirm that what was said was going to happen actually did + + \sa rowsAboutToBeRemoved() + */ +void ModelTest::rowsRemoved(const QModelIndex & parent, int start, int end) +{ + Changing c = remove.pop(); + Q_ASSERT(c.parent == parent); + Q_ASSERT(c.oldSize - (end - start + 1) == model->rowCount(parent)); + Q_ASSERT(c.last == model->data(model->index(start - 1, 0, c.parent))); + Q_ASSERT(c.next == model->data(model->index(start, 0, c.parent))); +} + + +#include "modeltest.moc" diff --git a/tests/modeltest/modeltest.h b/tests/modeltest/modeltest.h new file mode 100644 index 0000000..38b6b2b --- /dev/null +++ b/tests/modeltest/modeltest.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2007 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt Concurrent project on Trolltech Labs. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.trolltech.com/products/qt/opensource.html +** +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://www.trolltech.com/products/qt/licensing.html or contact the +** sales department at sales@trolltech.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef MODELTEST_H +#define MODELTEST_H + +#include +#include +#include + +class ModelTest : public QObject +{ + Q_OBJECT + +public: + ModelTest(QAbstractItemModel *model, QObject *parent = 0); + +private Q_SLOTS: + void nonDestructiveBasicTest(); + void rowCount(); + void columnCount(); + void hasIndex(); + void index(); + void parent(); + void data(); + +protected Q_SLOTS: + void runAllTests(); + void layoutAboutToBeChanged(); + void layoutChanged(); + void rowsAboutToBeInserted(const QModelIndex &parent, int start, int end); + void rowsInserted(const QModelIndex & parent, int start, int end); + void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end); + void rowsRemoved(const QModelIndex & parent, int start, int end); + +private: + void checkChildren(const QModelIndex &parent, int currentDepth = 0); + + QAbstractItemModel *model; + + struct Changing + { + QModelIndex parent; + int oldSize; + QVariant last; + QVariant next; + }; + QStack insert; + QStack remove; + + bool fetchingMore; + + QList changing; +}; + +#endif 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